MachineNameController.php 3.1 KB

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