vendor/pimcore/pimcore/bundles/AdminBundle/Controller/Admin/MiscController.php line 40

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 Pimcore\Bundle\AdminBundle\Controller\AdminController;
  16. use Pimcore\Config;
  17. use Pimcore\Controller\Config\ControllerDataProvider;
  18. use Pimcore\Db;
  19. use Pimcore\File;
  20. use Pimcore\Localization\LocaleServiceInterface;
  21. use Pimcore\Tool;
  22. use Pimcore\Tool\Storage;
  23. use Pimcore\Translation\Translator;
  24. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpKernel\Profiler\Profiler;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. /**
  32.  * @Route("/misc")
  33.  *
  34.  * @internal
  35.  */
  36. class MiscController extends AdminController
  37. {
  38.     /**
  39.      * @Route("/get-available-controller-references", name="pimcore_admin_misc_getavailablecontroller_references", methods={"GET"})
  40.      *
  41.      * @param Request $request
  42.      * @param ControllerDataProvider $provider
  43.      *
  44.      * @return JsonResponse
  45.      */
  46.     public function getAvailableControllerReferencesAction(Request $requestControllerDataProvider $provider)
  47.     {
  48.         $controllerReferences $provider->getControllerReferences();
  49.         $result array_map(function ($controller) {
  50.             return [
  51.                 'name' => $controller,
  52.             ];
  53.         }, $controllerReferences);
  54.         return $this->adminJson([
  55.             'success' => true,
  56.             'data' => $result,
  57.             'total' => count($result),
  58.         ]);
  59.     }
  60.     /**
  61.      * @Route("/get-available-templates", name="pimcore_admin_misc_getavailabletemplates", methods={"GET"})
  62.      *
  63.      * @param ControllerDataProvider $provider
  64.      *
  65.      * @return JsonResponse
  66.      */
  67.     public function getAvailableTemplatesAction(ControllerDataProvider $provider)
  68.     {
  69.         $templates $provider->getTemplates();
  70.         sort($templatesSORT_NATURAL SORT_FLAG_CASE);
  71.         $result array_map(static function ($template) {
  72.             return [
  73.                 'path' => $template,
  74.             ];
  75.         }, $templates);
  76.         return $this->adminJson([
  77.             'data' => $result,
  78.         ]);
  79.     }
  80.     /**
  81.      * @Route("/json-translations-system", name="pimcore_admin_misc_jsontranslationssystem", methods={"GET"})
  82.      *
  83.      * @param Request $request
  84.      *
  85.      * @return Response
  86.      */
  87.     public function jsonTranslationsSystemAction(Request $requestTranslatorInterface $translator)
  88.     {
  89.         $language $request->get('language');
  90.         /** @var Translator $translator */
  91.         $translator->lazyInitialize('admin'$language);
  92.         $translations $translator->getCatalogue($language)->all('admin');
  93.         if ($language != 'en') {
  94.             // add en as a fallback
  95.             $translator->lazyInitialize('admin''en');
  96.             foreach ($translator->getCatalogue('en')->all('admin') as $key => $value) {
  97.                 if (!isset($translations[$key]) || empty($translations[$key])) {
  98.                     $translations[$key] = $value;
  99.                 }
  100.             }
  101.         }
  102.         $response = new Response('pimcore.system_i18n = ' $this->encodeJson($translations) . ';');
  103.         $response->headers->set('Content-Type''text/javascript');
  104.         return $response;
  105.     }
  106.     /**
  107.      * @Route("/script-proxy", name="pimcore_admin_misc_scriptproxy", methods={"GET"})
  108.      *
  109.      * @param Request $request
  110.      *
  111.      * @return Response
  112.      */
  113.     public function scriptProxyAction(Request $request)
  114.     {
  115.         if ($storageFile $request->get('storageFile')) {
  116.             $fileExtension \Pimcore\File::getFileExtension($storageFile);
  117.             $storage Storage::get('admin');
  118.             $scriptsContent $storage->read($storageFile);
  119.         } else {
  120.             trigger_deprecation('pimcore/pimcore''10.1''Calling /admin/misc/script-proxy without the parameter storageFile is deprecated and will not work in Pimcore 11.');
  121.             $allowedFileTypes = ['js''css'];
  122.             $scripts explode(','$request->get('scripts'));
  123.             if ($request->get('scriptPath')) {
  124.                 $scriptPath PIMCORE_WEB_ROOT $request->get('scriptPath');
  125.             } else {
  126.                 $scriptPath PIMCORE_SYSTEM_TEMP_DIRECTORY '/';
  127.             }
  128.             $scriptsContent '';
  129.             foreach ($scripts as $script) {
  130.                 $filePath $scriptPath $script;
  131.                 if (is_file($filePath) && is_readable($filePath) && in_array(\Pimcore\File::getFileExtension($script), $allowedFileTypes)) {
  132.                     $scriptsContent .= file_get_contents($filePath);
  133.                 }
  134.             }
  135.             $fileExtension \Pimcore\File::getFileExtension($scripts[0]);
  136.         }
  137.         if (!empty($scriptsContent)) {
  138.             $contentType 'text/javascript';
  139.             if ($fileExtension == 'css') {
  140.                 $contentType 'text/css';
  141.             }
  142.             $lifetime 86400;
  143.             $response = new Response($scriptsContent);
  144.             $response->headers->set('Cache-Control''max-age=' $lifetime);
  145.             $response->headers->set('Pragma''');
  146.             $response->headers->set('Content-Type'$contentType);
  147.             $response->headers->set('Expires'gmdate('D, d M Y H:i:s'time() + $lifetime) . ' GMT');
  148.             return $response;
  149.         } else {
  150.             throw $this->createNotFoundException('Scripts not found');
  151.         }
  152.     }
  153.     /**
  154.      * @Route("/admin-css", name="pimcore_admin_misc_admincss", methods={"GET"})
  155.      *
  156.      * @param Request $request
  157.      * @param Config $config
  158.      *
  159.      * @return Response
  160.      */
  161.     public function adminCssAction(Request $requestConfig $config)
  162.     {
  163.         // customviews config
  164.         $cvData \Pimcore\CustomView\Config::get();
  165.         // languages
  166.         $languages \Pimcore\Tool::getValidLanguages();
  167.         $adminLanguages \Pimcore\Tool\Admin::getLanguages();
  168.         $languages array_unique(array_merge($languages$adminLanguages));
  169.         $response $this->render('@PimcoreAdmin/Admin/Misc/admin-css.html.twig', [
  170.             'customviews' => $cvData,
  171.             'config' => $config,
  172.             'languages' => $languages,
  173.         ]);
  174.         $response->headers->set('Content-Type''text/css; charset=UTF-8');
  175.         return $response;
  176.     }
  177.     /**
  178.      * @Route("/ping", name="pimcore_admin_misc_ping", methods={"GET"})
  179.      *
  180.      * @param Request $request
  181.      *
  182.      * @return JsonResponse
  183.      */
  184.     public function pingAction(Request $request)
  185.     {
  186.         $response = [
  187.             'success' => true,
  188.         ];
  189.         return $this->adminJson($response);
  190.     }
  191.     /**
  192.      * @Route("/available-languages", name="pimcore_admin_misc_availablelanguages", methods={"GET"})
  193.      *
  194.      * @param Request $request
  195.      *
  196.      * @return Response
  197.      */
  198.     public function availableLanguagesAction(Request $request)
  199.     {
  200.         $locales Tool::getSupportedLocales();
  201.         $response = new Response('pimcore.available_languages = ' $this->encodeJson($locales) . ';');
  202.         $response->headers->set('Content-Type''text/javascript');
  203.         return $response;
  204.     }
  205.     /**
  206.      * @Route("/get-valid-filename", name="pimcore_admin_misc_getvalidfilename", methods={"GET"})
  207.      *
  208.      * @param Request $request
  209.      *
  210.      * @return JsonResponse
  211.      */
  212.     public function getValidFilenameAction(Request $request)
  213.     {
  214.         return $this->adminJson([
  215.             'filename' => \Pimcore\Model\Element\Service::getValidKey($request->get('value'), $request->get('type')),
  216.         ]);
  217.     }
  218.     // FILEEXPLORER
  219.     /**
  220.      * @Route("/fileexplorer-tree", name="pimcore_admin_misc_fileexplorertree", methods={"GET"})
  221.      *
  222.      * @param Request $request
  223.      *
  224.      * @return JsonResponse
  225.      */
  226.     public function fileexplorerTreeAction(Request $request)
  227.     {
  228.         $this->checkPermission('fileexplorer');
  229.         $referencePath $this->getFileexplorerPath($request'node');
  230.         $items scandir($referencePath);
  231.         $contents = [];
  232.         foreach ($items as $item) {
  233.             if ($item == '.' || $item == '..') {
  234.                 continue;
  235.             }
  236.             $file $referencePath '/' $item;
  237.             $file str_replace('//''/'$file);
  238.             if (is_dir($file) || is_file($file)) {
  239.                 $itemConfig = [
  240.                     'id' => '/fileexplorer' str_replace(PIMCORE_PROJECT_ROOT''$file),
  241.                     'text' => $item,
  242.                     'leaf' => true,
  243.                     'writeable' => is_writable($file),
  244.                 ];
  245.                 if (is_dir($file)) {
  246.                     $itemConfig['leaf'] = false;
  247.                     $itemConfig['type'] = 'folder';
  248.                     if (is_dir_empty($file)) {
  249.                         $itemConfig['loaded'] = true;
  250.                     }
  251.                     $itemConfig['expandable'] = true;
  252.                 } elseif (is_file($file)) {
  253.                     $itemConfig['type'] = 'file';
  254.                 }
  255.                 $contents[] = $itemConfig;
  256.             }
  257.         }
  258.         return $this->adminJson($contents);
  259.     }
  260.     /**
  261.      * @Route("/fileexplorer-content", name="pimcore_admin_misc_fileexplorercontent", methods={"GET"})
  262.      *
  263.      * @param Request $request
  264.      *
  265.      * @return JsonResponse
  266.      */
  267.     public function fileexplorerContentAction(Request $request)
  268.     {
  269.         $this->checkPermission('fileexplorer');
  270.         $success false;
  271.         $writeable false;
  272.         $file $this->getFileexplorerPath($request'path');
  273.         $content null;
  274.         if (is_file($file)) {
  275.             if (is_readable($file)) {
  276.                 $content file_get_contents($file);
  277.                 $success true;
  278.                 $writeable is_writable($file);
  279.             }
  280.         }
  281.         return $this->adminJson([
  282.             'success' => $success,
  283.             'content' => $content,
  284.             'writeable' => $writeable,
  285.             'filename' => basename($file),
  286.             'path' => preg_replace('@^' preg_quote(PIMCORE_PROJECT_ROOT'@') . '@'''$file),
  287.         ]);
  288.     }
  289.     /**
  290.      * @Route("/fileexplorer-content-save", name="pimcore_admin_misc_fileexplorercontentsave", methods={"PUT"})
  291.      *
  292.      * @param Request $request
  293.      *
  294.      * @return JsonResponse
  295.      */
  296.     public function fileexplorerContentSaveAction(Request $request)
  297.     {
  298.         $this->checkPermission('fileexplorer');
  299.         $success false;
  300.         if ($request->get('content') && $request->get('path')) {
  301.             $file $this->getFileexplorerPath($request'path');
  302.             if (is_file($file) && is_writable($file)) {
  303.                 File::put($file$request->get('content'));
  304.                 $success true;
  305.             }
  306.         }
  307.         return $this->adminJson([
  308.             'success' => $success,
  309.         ]);
  310.     }
  311.     /**
  312.      * @Route("/fileexplorer-add", name="pimcore_admin_misc_fileexploreradd", methods={"POST"})
  313.      *
  314.      * @param Request $request
  315.      *
  316.      * @return JsonResponse
  317.      *
  318.      * @throws \Exception
  319.      */
  320.     public function fileexplorerAddAction(Request $request)
  321.     {
  322.         $this->checkPermission('fileexplorer');
  323.         $success false;
  324.         if ($request->get('filename') && $request->get('path')) {
  325.             $path $this->getFileexplorerPath($request'path');
  326.             $file $path '/' $request->get('filename');
  327.             $file resolvePath($file);
  328.             if (strpos($filePIMCORE_PROJECT_ROOT) !== 0) {
  329.                 throw new \Exception('not allowed');
  330.             }
  331.             if (is_writable(dirname($file))) {
  332.                 File::put($file'');
  333.                 $success true;
  334.             }
  335.         }
  336.         return $this->adminJson([
  337.             'success' => $success,
  338.         ]);
  339.     }
  340.     /**
  341.      * @Route("/fileexplorer-add-folder", name="pimcore_admin_misc_fileexploreraddfolder", methods={"POST"})
  342.      *
  343.      * @param Request $request
  344.      *
  345.      * @return JsonResponse
  346.      *
  347.      * @throws \Exception
  348.      */
  349.     public function fileexplorerAddFolderAction(Request $request)
  350.     {
  351.         $this->checkPermission('fileexplorer');
  352.         $success false;
  353.         if ($request->get('filename') && $request->get('path')) {
  354.             $path $this->getFileexplorerPath($request'path');
  355.             $file $path '/' $request->get('filename');
  356.             $file resolvePath($file);
  357.             if (strpos($filePIMCORE_PROJECT_ROOT) !== 0) {
  358.                 throw new \Exception('not allowed');
  359.             }
  360.             if (is_writable(dirname($file))) {
  361.                 File::mkdir($file);
  362.                 $success true;
  363.             }
  364.         }
  365.         return $this->adminJson([
  366.             'success' => $success,
  367.         ]);
  368.     }
  369.     /**
  370.      * @Route("/fileexplorer-delete", name="pimcore_admin_misc_fileexplorerdelete", methods={"DELETE"})
  371.      *
  372.      * @param Request $request
  373.      *
  374.      * @return JsonResponse
  375.      */
  376.     public function fileexplorerDeleteAction(Request $request)
  377.     {
  378.         $this->checkPermission('fileexplorer');
  379.         $success false;
  380.         if ($request->get('path')) {
  381.             $file $this->getFileexplorerPath($request'path');
  382.             if (is_writable($file)) {
  383.                 unlink($file);
  384.                 $success true;
  385.             }
  386.         }
  387.         return $this->adminJson([
  388.             'success' => $success,
  389.         ]);
  390.     }
  391.     /**
  392.      * @Route("/fileexplorer-rename", name="pimcore_admin_misc_fileexplorerrename", methods={"PUT"})
  393.      *
  394.      * @param Request $request
  395.      *
  396.      * @return JsonResponse
  397.      */
  398.     public function fileexplorerRenameAction(Request $request)
  399.     {
  400.         $this->checkPermission('fileexplorer');
  401.         $success false;
  402.         if ($request->get('path') && $request->get('newPath')) {
  403.             $file $this->getFileexplorerPath($request'path');
  404.             $newFile $this->getFileexplorerPath($request'newPath');
  405.             $success rename($file$newFile);
  406.         }
  407.         return $this->adminJson([
  408.             'success' => $success,
  409.         ]);
  410.     }
  411.     /**
  412.      * @param Request $request
  413.      * @param string $paramName
  414.      *
  415.      * @return string
  416.      *
  417.      * @throws \Exception
  418.      */
  419.     private function getFileexplorerPath(Request $request$paramName 'node')
  420.     {
  421.         $path preg_replace("/^\/fileexplorer/"''$request->get($paramName));
  422.         $path resolvePath(PIMCORE_PROJECT_ROOT $path);
  423.         if (strpos($pathPIMCORE_PROJECT_ROOT) !== 0) {
  424.             throw new \Exception('operation permitted, permission denied');
  425.         }
  426.         return $path;
  427.     }
  428.     /**
  429.      * @Route("/maintenance", name="pimcore_admin_misc_maintenance", methods={"POST"})
  430.      *
  431.      * @param Request $request
  432.      *
  433.      * @return JsonResponse
  434.      */
  435.     public function maintenanceAction(Request $request)
  436.     {
  437.         $this->checkPermission('maintenance_mode');
  438.         if ($request->get('activate')) {
  439.             Tool\Admin::activateMaintenanceMode(Tool\Session::getSessionId());
  440.         }
  441.         if ($request->get('deactivate')) {
  442.             Tool\Admin::deactivateMaintenanceMode();
  443.         }
  444.         return $this->adminJson([
  445.             'success' => true,
  446.         ]);
  447.     }
  448.     /**
  449.      * @Route("/http-error-log", name="pimcore_admin_misc_httperrorlog", methods={"POST"})
  450.      *
  451.      * @param Request $request
  452.      *
  453.      * @return JsonResponse
  454.      */
  455.     public function httpErrorLogAction(Request $request)
  456.     {
  457.         $this->checkPermission('http_errors');
  458.         $db Db::get();
  459.         $limit = (int)$request->get('limit');
  460.         $offset = (int)$request->get('start');
  461.         $sortInfo = ($request->get('sort') ? json_decode($request->get('sort'), true)[0] : []);
  462.         $sort $sortInfo['property'] ?? null;
  463.         $dir $sortInfo['direction'] ?? null;
  464.         $filter $request->get('filter');
  465.         if (!$limit) {
  466.             $limit 20;
  467.         }
  468.         if (!$offset) {
  469.             $offset 0;
  470.         }
  471.         if (!$sort || !in_array($sort, ['code''uri''date''count'])) {
  472.             $sort 'count';
  473.         }
  474.         if (!$dir || !in_array($dir, ['DESC''ASC'])) {
  475.             $dir 'DESC';
  476.         }
  477.         $condition '';
  478.         if ($filter) {
  479.             $filter $db->quote('%' $filter '%');
  480.             $conditionParts = [];
  481.             foreach (['uri''code''parametersGet''parametersPost''serverVars''cookies'] as $field) {
  482.                 $conditionParts[] = $field ' LIKE ' $filter;
  483.             }
  484.             $condition ' WHERE ' implode(' OR '$conditionParts);
  485.         }
  486.         $logs $db->fetchAllAssociative('SELECT code,uri,`count`,date FROM http_error_log ' $condition ' ORDER BY ' $sort ' ' $dir ' LIMIT ' $offset ',' $limit);
  487.         $total $db->fetchOne('SELECT count(*) FROM http_error_log ' $condition);
  488.         return $this->adminJson([
  489.             'items' => $logs,
  490.             'total' => $total,
  491.             'success' => true,
  492.         ]);
  493.     }
  494.     /**
  495.      * @Route("/http-error-log-flush", name="pimcore_admin_misc_httperrorlogflush", methods={"DELETE"})
  496.      *
  497.      * @param Request $request
  498.      *
  499.      * @return JsonResponse
  500.      */
  501.     public function httpErrorLogFlushAction(Request $request)
  502.     {
  503.         $this->checkPermission('http_errors');
  504.         $db Db::get();
  505.         $db->executeQuery('TRUNCATE TABLE http_error_log');
  506.         return $this->adminJson([
  507.             'success' => true,
  508.         ]);
  509.     }
  510.     /**
  511.      * @Route("/http-error-log-detail", name="pimcore_admin_misc_httperrorlogdetail", methods={"GET"})
  512.      *
  513.      * @param Request $request
  514.      * @param Profiler|null $profiler
  515.      *
  516.      * @return Response
  517.      */
  518.     public function httpErrorLogDetailAction(Request $request, ?Profiler $profiler)
  519.     {
  520.         $this->checkPermission('http_errors');
  521.         if ($profiler) {
  522.             $profiler->disable();
  523.         }
  524.         $db Db::get();
  525.         $data $db->fetchAssociative('SELECT * FROM http_error_log WHERE uri = ?', [$request->get('uri')]);
  526.         foreach ($data as $key => &$value) {
  527.             if (in_array($key, ['parametersGet''parametersPost''serverVars''cookies'])) {
  528.                 $value unserialize($value);
  529.             }
  530.         }
  531.         $response $this->render('@PimcoreAdmin/Admin/Misc/http-error-log-detail.html.twig', ['data' => $data]);
  532.         return $response;
  533.     }
  534.     /**
  535.      * @Route("/country-list", name="pimcore_admin_misc_countrylist", methods={"GET"})
  536.      *
  537.      * @param LocaleServiceInterface $localeService
  538.      *
  539.      * @return JsonResponse
  540.      */
  541.     public function countryListAction(LocaleServiceInterface $localeService)
  542.     {
  543.         $countries $localeService->getDisplayRegions();
  544.         asort($countries);
  545.         $options = [];
  546.         foreach ($countries as $short => $translation) {
  547.             if (strlen($short) == 2) {
  548.                 $options[] = [
  549.                     'name' => $translation,
  550.                     'code' => $short,
  551.                 ];
  552.             }
  553.         }
  554.         return $this->adminJson(['data' => $options]);
  555.     }
  556.     /**
  557.      * @Route("/language-list", name="pimcore_admin_misc_languagelist", methods={"GET"})
  558.      *
  559.      * @param Request $request
  560.      *
  561.      * @return JsonResponse
  562.      */
  563.     public function languageListAction(Request $request)
  564.     {
  565.         $locales Tool::getSupportedLocales();
  566.         $options = [];
  567.         foreach ($locales as $short => $translation) {
  568.             $options[] = [
  569.                 'name' => $translation,
  570.                 'code' => $short,
  571.             ];
  572.         }
  573.         return $this->adminJson(['data' => $options]);
  574.     }
  575.     /**
  576.      * @Route("/phpinfo", name="pimcore_admin_misc_phpinfo", methods={"GET"})
  577.      *
  578.      * @param Request $request
  579.      * @param Profiler|null $profiler
  580.      *
  581.      * @throws \Exception
  582.      *
  583.      * @return Response
  584.      */
  585.     public function phpinfoAction(Request $request, ?Profiler $profiler)
  586.     {
  587.         if ($profiler) {
  588.             $profiler->disable();
  589.         }
  590.         if (!$this->getAdminUser()->isAdmin()) {
  591.             throw new \Exception('Permission denied');
  592.         }
  593.         ob_start();
  594.         phpinfo();
  595.         $content ob_get_clean();
  596.         return new Response($content);
  597.     }
  598.     /**
  599.      * @Route("/get-language-flag", name="pimcore_admin_misc_getlanguageflag", methods={"GET"})
  600.      *
  601.      * @param Request $request
  602.      *
  603.      * @return BinaryFileResponse
  604.      */
  605.     public function getLanguageFlagAction(Request $request)
  606.     {
  607.         $iconPath Tool::getLanguageFlagFile($request->get('language'));
  608.         $response = new BinaryFileResponse($iconPath);
  609.         $response->headers->set('Content-Type''image/svg+xml');
  610.         return $response;
  611.     }
  612.     /**
  613.      * @Route("/icon-list", name="pimcore_admin_misc_iconlist", methods={"GET"})
  614.      *
  615.      * @param Request $request
  616.      * @param Profiler|null $profiler
  617.      *
  618.      * @return Response
  619.      */
  620.     public function iconListAction(Request $request, ?Profiler $profiler)
  621.     {
  622.         if ($profiler) {
  623.             $profiler->disable();
  624.         }
  625.         $publicDir PIMCORE_WEB_ROOT '/bundles/pimcoreadmin';
  626.         $iconDir $publicDir '/img';
  627.         $colorIcons rscandir($iconDir '/flat-color-icons/');
  628.         $whiteIcons rscandir($iconDir '/flat-white-icons/');
  629.         $twemoji rscandir($iconDir '/twemoji/');
  630.         //flag icons for locales
  631.         $locales Tool::getSupportedLocales();
  632.         $languageOptions = [];
  633.         foreach ($locales as $short => $translation) {
  634.             if (!empty($short)) {
  635.                 $languageOptions[] = [
  636.                     'language' => $short,
  637.                     'display' => $translation " ($short)",
  638.                     'flag' => \Pimcore\Tool::getLanguageFlagFile($shorttrue),
  639.                 ];
  640.             }
  641.         }
  642.         $iconsCss file_get_contents($publicDir '/css/icons.css');
  643.         return $this->render('@PimcoreAdmin/Admin/Misc/iconList.html.twig', [
  644.             'colorIcons' => $colorIcons,
  645.             'whiteIcons' => $whiteIcons,
  646.             'twemoji' => $twemoji,
  647.             'languageOptions' => $languageOptions,
  648.             'iconsCss' => $iconsCss,
  649.         ]);
  650.     }
  651.     /**
  652.      * @Route("/test", name="pimcore_admin_misc_test")
  653.      *
  654.      * @param Request $request
  655.      *
  656.      * @return Response
  657.      */
  658.     public function testAction(Request $request)
  659.     {
  660.         return new Response('done');
  661.     }
  662. }