helper = $helper; $this->sessionManager = $sessionManager; $this->resultJsonFactory = $resultJsonFactory; $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Serialize\Serializer\Json::class); $this->formIds = $formIds; } /** * Check captcha data on login action. * * @param \Magento\Customer\Controller\Ajax\Login $subject * @param \Closure $proceed * @return $this * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function aroundExecute( \Magento\Customer\Controller\Ajax\Login $subject, \Closure $proceed ) { $captchaFormIdField = 'captcha_form_id'; $captchaInputName = 'captcha_string'; /** @var \Magento\Framework\App\RequestInterface $request */ $request = $subject->getRequest(); $loginParams = []; $content = $request->getContent(); if ($content) { $loginParams = $this->serializer->unserialize($content); } $username = $loginParams['username'] ?? null; $captchaString = $loginParams[$captchaInputName] ?? null; $loginFormId = $loginParams[$captchaFormIdField] ?? null; if (!in_array($loginFormId, $this->formIds) && $this->helper->getCaptcha($loginFormId)->isRequired($username)) { return $this->returnJsonError(__('Provided form does not exist')); } foreach ($this->formIds as $formId) { if ($formId === $loginFormId) { $captchaModel = $this->helper->getCaptcha($formId); if ($captchaModel->isRequired($username)) { if (!$captchaModel->isCorrect($captchaString)) { $this->sessionManager->setUsername($username); $captchaModel->logAttempt($username); return $this->returnJsonError(__('Incorrect CAPTCHA')); } } $captchaModel->logAttempt($username); } } return $proceed(); } /** * Format JSON response. * * @param \Magento\Framework\Phrase $phrase * @return \Magento\Framework\Controller\Result\Json */ private function returnJsonError(\Magento\Framework\Phrase $phrase): \Magento\Framework\Controller\Result\Json { $resultJson = $this->resultJsonFactory->create(); return $resultJson->setData(['errors' => true, 'message' => $phrase]); } }