Upgraded drupal core with security updates
[yaffs-website] / web / core / modules / system / src / MachineNameController.php
1 <?php
2
3 namespace Drupal\system;
4
5 use Drupal\Component\Transliteration\TransliterationInterface;
6 use Drupal\Component\Utility\Unicode;
7 use Drupal\Core\Access\CsrfTokenGenerator;
8 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
9 use Symfony\Component\HttpFoundation\JsonResponse;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
12 use Symfony\Component\DependencyInjection\ContainerInterface;
13
14 /**
15  * Controller routines for machine name transliteration routes.
16  */
17 class MachineNameController implements ContainerInjectionInterface {
18
19   /**
20    * The transliteration helper.
21    *
22    * @var \Drupal\Component\Transliteration\TransliterationInterface
23    */
24   protected $transliteration;
25
26   /**
27    * The token generator.
28    *
29    * @var \Drupal\Core\Access\CsrfTokenGenerator
30    */
31   protected $tokenGenerator;
32
33   /**
34    * Constructs a MachineNameController object.
35    *
36    * @param \Drupal\Component\Transliteration\TransliterationInterface $transliteration
37    *   The transliteration helper.
38    * @param \Drupal\Core\Access\CsrfTokenGenerator $token_generator
39    *   The token generator.
40    */
41   public function __construct(TransliterationInterface $transliteration, CsrfTokenGenerator $token_generator) {
42     $this->transliteration = $transliteration;
43     $this->tokenGenerator = $token_generator;
44   }
45
46   /**
47    * {@inheritdoc}
48    */
49   public static function create(ContainerInterface $container) {
50     return new static(
51       $container->get('transliteration'),
52       $container->get('csrf_token')
53     );
54   }
55
56   /**
57    * Transliterates a string in given language. Various postprocessing possible.
58    *
59    * @param \Symfony\Component\HttpFoundation\Request $request
60    *   The input string and language for the transliteration.
61    *   Optionally may contain the replace_pattern, replace, lowercase parameters.
62    *
63    * @return \Symfony\Component\HttpFoundation\JsonResponse
64    *   The transliterated string.
65    */
66   public function transliterate(Request $request) {
67     $text = $request->query->get('text');
68     $langcode = $request->query->get('langcode');
69     $replace_pattern = $request->query->get('replace_pattern');
70     $replace_token = $request->query->get('replace_token');
71     $replace = $request->query->get('replace');
72     $lowercase = $request->query->get('lowercase');
73
74     $transliterated = $this->transliteration->transliterate($text, $langcode, '_');
75     if ($lowercase) {
76       $transliterated = Unicode::strtolower($transliterated);
77     }
78
79     if (isset($replace_pattern) && isset($replace)) {
80       if (!isset($replace_token)) {
81         throw new AccessDeniedHttpException("Missing 'replace_token' query parameter.");
82       }
83       elseif (!$this->tokenGenerator->validate($replace_token, $replace_pattern)) {
84         throw new AccessDeniedHttpException("Invalid 'replace_token' query parameter.");
85       }
86
87       // Quote the pattern delimiter and remove null characters to avoid the e
88       // or other modifiers being injected.
89       $transliterated = preg_replace('@' . strtr($replace_pattern, ['@' => '\@', chr(0) => '']) . '@', $replace, $transliterated);
90     }
91     return new JsonResponse($transliterated);
92   }
93
94 }