vendor/pimcore/pimcore/bundles/AdminBundle/Controller/Admin/LogController.php line 196

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\AdminBundle\Controller\Admin;
  15. use Doctrine\DBAL\Connection;
  16. use Doctrine\DBAL\Types\Types;
  17. use Pimcore\Bundle\AdminBundle\Controller\AdminAbstractController;
  18. use Pimcore\Bundle\AdminBundle\Helper\QueryParams;
  19. use Pimcore\Controller\KernelControllerEventInterface;
  20. use Pimcore\Log\Handler\ApplicationLoggerDb;
  21. use Pimcore\Tool\Storage;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\HttpFoundation\StreamedResponse;
  26. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  27. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. /**
  30.  * @internal
  31.  */
  32. class LogController extends AdminAbstractController implements KernelControllerEventInterface
  33. {
  34.     /**
  35.      * @param ControllerEvent $event
  36.      */
  37.     public function onKernelControllerEvent(ControllerEvent $event)
  38.     {
  39.         if (!$this->getAdminUser()->isAllowed('application_logging')) {
  40.             throw new AccessDeniedHttpException("Permission denied, user needs 'application_logging' permission.");
  41.         }
  42.     }
  43.     /**
  44.      * @Route("/log/show", name="pimcore_admin_log_show", methods={"GET", "POST"})
  45.      *
  46.      * @param Request $request
  47.      *
  48.      * @return JsonResponse
  49.      */
  50.     public function showAction(Request $requestConnection $db)
  51.     {
  52.         $qb $db->createQueryBuilder();
  53.         $qb
  54.             ->select('*')
  55.             ->from(ApplicationLoggerDb::TABLE_NAME)
  56.             ->setFirstResult($request->get('start'0))
  57.             ->setMaxResults($request->get('limit'50));
  58.         $sortingSettings QueryParams::extractSortingSettings(array_merge(
  59.             $request->request->all(),
  60.             $request->query->all()
  61.         ));
  62.         if ($sortingSettings['orderKey']) {
  63.             $qb->orderBy($db->quoteIdentifier($sortingSettings['orderKey']), $sortingSettings['order']);
  64.         } else {
  65.             $qb->orderBy('id''DESC');
  66.         }
  67.         $priority $request->get('priority');
  68.         if(!empty($priority)) {
  69.             $qb->andWhere($qb->expr()->eq('priority'':priority'));
  70.             $qb->setParameter('priority'$priority);
  71.         }
  72.         if ($fromDate $this->parseDateObject($request->get('fromDate'), $request->get('fromTime'))) {
  73.             $qb->andWhere('timestamp > :fromDate');
  74.             $qb->setParameter('fromDate'$fromDateTypes::DATETIME_MUTABLE);
  75.         }
  76.         if ($toDate $this->parseDateObject($request->get('toDate'), $request->get('toTime'))) {
  77.             $qb->andWhere('timestamp <= :toDate');
  78.             $qb->setParameter('toDate'$toDateTypes::DATETIME_MUTABLE);
  79.         }
  80.         if (!empty($component $request->get('component'))) {
  81.             $qb->andWhere('component = ' $qb->createNamedParameter($component));
  82.         }
  83.         if (!empty($relatedObject $request->get('relatedobject'))) {
  84.             $qb->andWhere('relatedobject = ' $qb->createNamedParameter($relatedObject));
  85.         }
  86.         if (!empty($message $request->get('message'))) {
  87.             $qb->andWhere('message LIKE ' $qb->createNamedParameter('%' $message '%'));
  88.         }
  89.         if (!empty($pid $request->get('pid'))) {
  90.             $qb->andWhere('pid LIKE ' $qb->createNamedParameter('%' $pid '%'));
  91.         }
  92.         $totalQb = clone $qb;
  93.         $totalQb->setMaxResults(null)
  94.             ->setFirstResult(0)
  95.             ->select('COUNT(id) as count');
  96.         $total $totalQb->execute()->fetch();
  97.         $total = (int) $total['count'];
  98.         $stmt $qb->execute();
  99.         $result $stmt->fetchAllAssociative();
  100.         $logEntries = [];
  101.         foreach ($result as $row) {
  102.             $fileobject null;
  103.             if ($row['fileobject']) {
  104.                 $fileobject str_replace(PIMCORE_PROJECT_ROOT''$row['fileobject']);
  105.             }
  106.             $logEntry = [
  107.                 'id' => $row['id'],
  108.                 'pid' => $row['pid'],
  109.                 'message' => $row['message'],
  110.                 'timestamp' => $row['timestamp'],
  111.                 'priority' => $row['priority'],
  112.                 'fileobject' => $fileobject,
  113.                 'relatedobject' => $row['relatedobject'],
  114.                 'relatedobjecttype' => $row['relatedobjecttype'],
  115.                 'component' => $row['component'],
  116.                 'source' => $row['source'],
  117.             ];
  118.             $logEntries[] = $logEntry;
  119.         }
  120.         return $this->adminJson([
  121.             'p_totalCount' => $total,
  122.             'p_results' => $logEntries,
  123.         ]);
  124.     }
  125.     /**
  126.      * @param string|null $date
  127.      * @param string|null $time
  128.      *
  129.      * @return \DateTime|null
  130.      */
  131.     private function parseDateObject($date null$time null)
  132.     {
  133.         if (empty($date)) {
  134.             return null;
  135.         }
  136.         $pattern '/^(?P<date>\d{4}\-\d{2}\-\d{2})T(?P<time>\d{2}:\d{2}:\d{2})$/';
  137.         $dateTime null;
  138.         if (preg_match($pattern$date$dateMatches)) {
  139.             if (!empty($time) && preg_match($pattern$time$timeMatches)) {
  140.                 $dateTime = new \DateTime(sprintf('%sT%s'$dateMatches['date'], $timeMatches['time']));
  141.             } else {
  142.                 $dateTime = new \DateTime($date);
  143.             }
  144.         }
  145.         return $dateTime;
  146.     }
  147.     /**
  148.      * @Route("/log/priority-json", name="pimcore_admin_log_priorityjson", methods={"GET"})
  149.      *
  150.      * @param Request $request
  151.      *
  152.      * @return JsonResponse
  153.      */
  154.     public function priorityJsonAction(Request $request)
  155.     {
  156.         $priorities[] = ['key' => '''value' => '-'];
  157.         foreach (ApplicationLoggerDb::getPriorities() as $key => $p) {
  158.             $priorities[] = ['key' => $key'value' => $p];
  159.         }
  160.         return $this->adminJson(['priorities' => $priorities]);
  161.     }
  162.     /**
  163.      * @Route("/log/component-json", name="pimcore_admin_log_componentjson", methods={"GET"})
  164.      *
  165.      * @param Request $request
  166.      *
  167.      * @return JsonResponse
  168.      */
  169.     public function componentJsonAction(Request $request)
  170.     {
  171.         $components[] = ['key' => '''value' => '-'];
  172.         foreach (ApplicationLoggerDb::getComponents() as $p) {
  173.             $components[] = ['key' => $p'value' => $p];
  174.         }
  175.         return $this->adminJson(['components' => $components]);
  176.     }
  177.     /**
  178.      * @Route("/log/show-file-object", name="pimcore_admin_log_showfileobject", methods={"GET"})
  179.      *
  180.      * @param Request $request
  181.      *
  182.      * @return Response
  183.      *
  184.      * @throws \Exception
  185.      */
  186.     public function showFileObjectAction(Request $request)
  187.     {
  188.         $filePath $request->get('filePath');
  189.         $storage Storage::get('application_log');
  190.         if ($storage->fileExists($filePath)) {
  191.             $fileHandle $storage->readStream($filePath);
  192.             $response $this->getResponseForFileHandle($fileHandle);
  193.             $response->headers->set('Content-Type''text/plain');
  194.         } else {
  195.             // Fallback to local path when file is not found in flysystem that might still be using the constant
  196.             if (!filter_var($filePathFILTER_VALIDATE_URL)) {
  197.                 if (!file_exists($filePath)) {
  198.                     $filePath PIMCORE_PROJECT_ROOT.DIRECTORY_SEPARATOR.$filePath;
  199.                 }
  200.                 $filePath realpath($filePath);
  201.                 $fileObjectPath realpath(PIMCORE_LOG_FILEOBJECT_DIRECTORY);
  202.             } else {
  203.                 $fileObjectPath PIMCORE_LOG_FILEOBJECT_DIRECTORY;
  204.             }
  205.             if (!str_starts_with($filePath$fileObjectPath)) {
  206.                 throw new AccessDeniedHttpException('Accessing file out of scope');
  207.             }
  208.             if (file_exists($filePath)) {
  209.                 $fileHandle fopen($filePath'rb');
  210.                 $response $this->getResponseForFileHandle($fileHandle);
  211.                 $response->headers->set('Content-Type''text/plain');
  212.             } else {
  213.                 $response = new Response();
  214.                 $response->headers->set('Content-Type''text/plain');
  215.                 $response->setContent('Path `'.$filePath.'` not found.');
  216.                 $response->setStatusCode(404);
  217.             }
  218.         }
  219.         return $response;
  220.     }
  221.     /**
  222.      * @param resource $fileHandle
  223.      *
  224.      * @return StreamedResponse
  225.      */
  226.     private function getResponseForFileHandle($fileHandle)
  227.     {
  228.         return new StreamedResponse(
  229.             static function () use ($fileHandle) {
  230.                 while (!feof($fileHandle)) {
  231.                     echo fread($fileHandle8192);
  232.                 }
  233.                 fclose($fileHandle);
  234.             }
  235.         );
  236.     }
  237. }