AjaxLogin.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Captcha\Model\Customer\Plugin;
  7. use Magento\Captcha\Helper\Data as CaptchaHelper;
  8. use Magento\Framework\Session\SessionManagerInterface;
  9. use Magento\Framework\Controller\Result\JsonFactory;
  10. /**
  11. * Around plugin for login action.
  12. */
  13. class AjaxLogin
  14. {
  15. /**
  16. * @var \Magento\Captcha\Helper\Data
  17. */
  18. protected $helper;
  19. /**
  20. * @var \Magento\Framework\Session\SessionManagerInterface
  21. */
  22. protected $sessionManager;
  23. /**
  24. * @var JsonFactory
  25. */
  26. protected $resultJsonFactory;
  27. /**
  28. * @var \Magento\Framework\Serialize\Serializer\Json
  29. */
  30. protected $serializer;
  31. /**
  32. * @var array
  33. */
  34. protected $formIds;
  35. /**
  36. * @param CaptchaHelper $helper
  37. * @param SessionManagerInterface $sessionManager
  38. * @param JsonFactory $resultJsonFactory
  39. * @param array $formIds
  40. * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer
  41. * @throws \RuntimeException
  42. */
  43. public function __construct(
  44. CaptchaHelper $helper,
  45. SessionManagerInterface $sessionManager,
  46. JsonFactory $resultJsonFactory,
  47. array $formIds,
  48. \Magento\Framework\Serialize\Serializer\Json $serializer = null
  49. ) {
  50. $this->helper = $helper;
  51. $this->sessionManager = $sessionManager;
  52. $this->resultJsonFactory = $resultJsonFactory;
  53. $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()
  54. ->get(\Magento\Framework\Serialize\Serializer\Json::class);
  55. $this->formIds = $formIds;
  56. }
  57. /**
  58. * Check captcha data on login action.
  59. *
  60. * @param \Magento\Customer\Controller\Ajax\Login $subject
  61. * @param \Closure $proceed
  62. * @return $this
  63. * @SuppressWarnings(PHPMD.NPathComplexity)
  64. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  65. */
  66. public function aroundExecute(
  67. \Magento\Customer\Controller\Ajax\Login $subject,
  68. \Closure $proceed
  69. ) {
  70. $captchaFormIdField = 'captcha_form_id';
  71. $captchaInputName = 'captcha_string';
  72. /** @var \Magento\Framework\App\RequestInterface $request */
  73. $request = $subject->getRequest();
  74. $loginParams = [];
  75. $content = $request->getContent();
  76. if ($content) {
  77. $loginParams = $this->serializer->unserialize($content);
  78. }
  79. $username = $loginParams['username'] ?? null;
  80. $captchaString = $loginParams[$captchaInputName] ?? null;
  81. $loginFormId = $loginParams[$captchaFormIdField] ?? null;
  82. if (!in_array($loginFormId, $this->formIds) && $this->helper->getCaptcha($loginFormId)->isRequired($username)) {
  83. return $this->returnJsonError(__('Provided form does not exist'));
  84. }
  85. foreach ($this->formIds as $formId) {
  86. if ($formId === $loginFormId) {
  87. $captchaModel = $this->helper->getCaptcha($formId);
  88. if ($captchaModel->isRequired($username)) {
  89. if (!$captchaModel->isCorrect($captchaString)) {
  90. $this->sessionManager->setUsername($username);
  91. $captchaModel->logAttempt($username);
  92. return $this->returnJsonError(__('Incorrect CAPTCHA'));
  93. }
  94. }
  95. $captchaModel->logAttempt($username);
  96. }
  97. }
  98. return $proceed();
  99. }
  100. /**
  101. * Format JSON response.
  102. *
  103. * @param \Magento\Framework\Phrase $phrase
  104. * @return \Magento\Framework\Controller\Result\Json
  105. */
  106. private function returnJsonError(\Magento\Framework\Phrase $phrase): \Magento\Framework\Controller\Result\Json
  107. {
  108. $resultJson = $this->resultJsonFactory->create();
  109. return $resultJson->setData(['errors' => true, 'message' => $phrase]);
  110. }
  111. }