RegisterFormKeyFromCookie.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. declare(strict_types=1);
  8. namespace Magento\PageCache\Plugin;
  9. use Magento\Framework\App\PageCache\FormKey as CacheFormKey;
  10. use Magento\Framework\Escaper;
  11. use Magento\Framework\Data\Form\FormKey;
  12. use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
  13. use Magento\Framework\Session\Config\ConfigInterface;
  14. /**
  15. * Allow for registration of a form key through cookies.
  16. */
  17. class RegisterFormKeyFromCookie
  18. {
  19. /**
  20. * @var CacheFormKey
  21. */
  22. private $cookieFormKey;
  23. /**
  24. * @var Escaper
  25. */
  26. private $escaper;
  27. /**
  28. * @var FormKey
  29. */
  30. private $formKey;
  31. /**
  32. * @var CookieMetadataFactory
  33. */
  34. private $cookieMetadataFactory;
  35. /**
  36. * @var ConfigInterface
  37. */
  38. private $sessionConfig;
  39. /**
  40. * @param CacheFormKey $formKey
  41. * @param Escaper $escaper
  42. * @param FormKey $formKey
  43. * @param CookieMetadataFactory $cookieMetadataFactory
  44. * @param ConfigInterface $sessionConfig
  45. */
  46. public function __construct(
  47. CacheFormKey $cacheFormKey,
  48. Escaper $escaper,
  49. FormKey $formKey,
  50. CookieMetadataFactory $cookieMetadataFactory,
  51. ConfigInterface $sessionConfig
  52. ) {
  53. $this->cookieFormKey = $cacheFormKey;
  54. $this->escaper = $escaper;
  55. $this->formKey = $formKey;
  56. $this->cookieMetadataFactory = $cookieMetadataFactory;
  57. $this->sessionConfig = $sessionConfig;
  58. }
  59. /**
  60. * Set form key from the cookie.
  61. *
  62. * @return void
  63. *
  64. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  65. */
  66. public function beforeDispatch(): void
  67. {
  68. if ($this->cookieFormKey->get()) {
  69. $this->updateCookieFormKey($this->cookieFormKey->get());
  70. $this->formKey->set(
  71. $this->escaper->escapeHtml($this->cookieFormKey->get())
  72. );
  73. }
  74. }
  75. /**
  76. * @param string $formKey
  77. * @return void
  78. */
  79. private function updateCookieFormKey(string $formKey): void
  80. {
  81. $cookieMetadata = $this->cookieMetadataFactory
  82. ->createPublicCookieMetadata();
  83. $cookieMetadata->setDomain($this->sessionConfig->getCookieDomain());
  84. $cookieMetadata->setPath($this->sessionConfig->getCookiePath());
  85. $lifetime = $this->sessionConfig->getCookieLifetime();
  86. if ($lifetime !== 0) {
  87. $cookieMetadata->setDuration($lifetime);
  88. }
  89. $this->cookieFormKey->set(
  90. $formKey,
  91. $cookieMetadata
  92. );
  93. }
  94. }