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