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

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