MachineNameController.php 3.1 KB

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