Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions ReCaptchaAdminUi/Model/ErrorMessageConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\ReCaptchaAdminUi\Model;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface;
use Magento\Store\Model\ScopeInterface;

/**
* @inheritdoc
*/
class ErrorMessageConfig implements ErrorMessageConfigInterface
{
private const XML_PATH_VALIDATION = 'recaptcha_backend/failure_messages/validation_failure_message';
private const XML_PATH_TECHNICAL = 'recaptcha_backend/failure_messages/technical_failure_message';

/**
* @var ScopeConfigInterface
*/
private $scopeConfig;

/**
* @param ScopeConfigInterface $scopeConfig
*/
public function __construct(
ScopeConfigInterface $scopeConfig
) {
$this->scopeConfig = $scopeConfig;
}

/**
* @inheritdoc
*/
public function getTechnicalFailureMessage(): string
{
return $this->scopeConfig->getValue(
self::XML_PATH_TECHNICAL,
ScopeInterface::SCOPE_STORE
);
}

/**
* @inheritdoc
*/
public function getValidationFailureMessage(): string
{
return $this->scopeConfig->getValue(
self::XML_PATH_VALIDATION,
ScopeInterface::SCOPE_STORE
);
}
}
3 changes: 2 additions & 1 deletion ReCaptchaAdminUi/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
"php": "~7.3.0||~7.4.0",
"magento/framework": "*",
"magento/module-config": "*",
"magento/module-re-captcha-ui": "*"
"magento/module-re-captcha-ui": "*",
"magento/module-store": "*"
},
"type": "magento2-module",
"license": "OSL-3.0",
Expand Down
2 changes: 2 additions & 0 deletions ReCaptchaAdminUi/etc/adminhtml/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\ReCaptchaUi\Model\CaptchaTypeResolverInterface"
type="Magento\ReCaptchaAdminUi\Model\CaptchaTypeResolver"/>
<preference for="Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface"
type="Magento\ReCaptchaAdminUi\Model\ErrorMessageConfig"/>
</config>
15 changes: 15 additions & 0 deletions ReCaptchaAdminUi/etc/adminhtml/system.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,21 @@
<frontend_model>Magento\ReCaptchaAdminUi\Block\Adminhtml\System\Config\Form\Field\Notice</frontend_model>
</field>
</group>

<group id="failure_messages" translate="label" type="text" sortOrder="950" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>reCAPTCHA Failure Messages</label>

<field id="validation_failure_message" translate="label" type="textarea" sortOrder="10" showInDefault="1"
showInWebsite="0" showInStore="0" canRestore="1">
<label>reCAPTCHA Validation Failure Message</label>
</field>

<field id="technical_failure_message" translate="label" type="textarea" sortOrder="20" showInDefault="1"
showInWebsite="0" showInStore="0" canRestore="1">
<label>reCAPTCHA Technical Failure Message</label>
</field>
</group>
</section>

<section id="recaptcha_frontend" translate="label" type="text" sortOrder="700" showInDefault="1"
Expand Down
18 changes: 18 additions & 0 deletions ReCaptchaAdminUi/etc/config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<recaptcha_backend>
<failure_messages>
<validation_failure_message>reCAPTCHA verification failed.</validation_failure_message>
<technical_failure_message>Something went wrong with reCAPTCHA. Please contact the store owner.</technical_failure_message>
</failure_messages>
</recaptcha_backend>
</default>
</config>
2 changes: 1 addition & 1 deletion ReCaptchaContact/Test/Integration/ContactFormTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ private function checkFailedPostResponse(array $postValues = []): void
$this->makePostRequest($postValues);

$this->assertSessionMessages(
$this->equalTo(['reCAPTCHA verification failed']),
$this->equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
MessageInterface::TYPE_ERROR
);
}
Expand Down
67 changes: 64 additions & 3 deletions ReCaptchaCustomer/Model/AjaxLogin/ErrorProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\ActionFlag;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Serialize\SerializerInterface;
use Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface;
use Magento\ReCaptchaValidationApi\Model\ValidationErrorMessagesProvider;
use Psr\Log\LoggerInterface;

/**
* Process error during ajax login
Expand All @@ -29,27 +33,73 @@ class ErrorProcessor
*/
private $serializer;

/**
* @var LoggerInterface
*/
private $logger;

/**
* @var ErrorMessageConfigInterface
*/
private $errorMessageConfig;

/**
* @var ValidationErrorMessagesProvider
*/
private $validationErrorMessagesProvider;

/**
* @param ActionFlag $actionFlag
* @param SerializerInterface $serializer
* @param LoggerInterface|null $logger
* @param ErrorMessageConfigInterface|null $errorMessageConfig
* @param ValidationErrorMessagesProvider|null $validationErrorMessagesProvider
*/
public function __construct(
ActionFlag $actionFlag,
SerializerInterface $serializer
SerializerInterface $serializer,
?LoggerInterface $logger = null,
?ErrorMessageConfigInterface $errorMessageConfig = null,
?ValidationErrorMessagesProvider $validationErrorMessagesProvider = null
) {
$this->actionFlag = $actionFlag;
$this->serializer = $serializer;
$this->logger = $logger
?? ObjectManager::getInstance()->get(LoggerInterface::class);
$this->errorMessageConfig = $errorMessageConfig
?? ObjectManager::getInstance()->get(ErrorMessageConfigInterface::class);
$this->validationErrorMessagesProvider = $validationErrorMessagesProvider
?? ObjectManager::getInstance()->get(ValidationErrorMessagesProvider::class);
}

/**
* Set "no dispatch" flag and error message to Response
*
* @param ResponseInterface $response
* @param string $message
* @param array $errorMessages
* @param string $sourceKey
* @return void
*/
public function processError(ResponseInterface $response, string $message): void
public function processError(ResponseInterface $response, array $errorMessages, string $sourceKey): void
{
$validationErrorText = $this->errorMessageConfig->getValidationFailureMessage();
$technicalErrorText = $this->errorMessageConfig->getTechnicalFailureMessage();

$message = $errorMessages ? $validationErrorText : $technicalErrorText;

foreach ($errorMessages as $errorMessageCode => $errorMessageText) {
if (!$this->isValidationError($errorMessageCode)) {
$message = $technicalErrorText;
$this->logger->error(
__(
'reCAPTCHA \'%1\' form error: %2',
$sourceKey,
$errorMessageText
)
);
}
}

$this->actionFlag->set('', Action::FLAG_NO_DISPATCH, true);

$jsonPayload = $this->serializer->serialize([
Expand All @@ -58,4 +108,15 @@ public function processError(ResponseInterface $response, string $message): void
]);
$response->representJson($jsonPayload);
}

/**
* Check if error code present in validation errors list.
*
* @param string $errorMessageCode
* @return bool
*/
private function isValidationError(string $errorMessageCode): bool
{
return $errorMessageCode !== $this->validationErrorMessagesProvider->getErrorMessage($errorMessageCode);
}
}
12 changes: 7 additions & 5 deletions ReCaptchaCustomer/Observer/AjaxLoginObserver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
use Psr\Log\LoggerInterface;

/**
* AjaxLoginObserver
* Observer of ajax login.
*/
class AjaxLoginObserver implements ObserverInterface
{
Expand Down Expand Up @@ -79,8 +79,8 @@ public function __construct(
}

/**
* @param Observer $observer
* @return void
* @inheritdoc
*
* @throws LocalizedException
*/
public function execute(Observer $observer): void
Expand All @@ -100,7 +100,8 @@ public function execute(Observer $observer): void
$this->logger->error($e);
$this->errorProcessor->processError(
$response,
$validationConfig->getValidationFailureMessage()
[],
$key
);
return;
}
Expand All @@ -109,7 +110,8 @@ public function execute(Observer $observer): void
if (false === $validationResult->isValid()) {
$this->errorProcessor->processError(
$response,
$validationConfig->getValidationFailureMessage()
$validationResult->getErrors(),
$key
);
}
}
Expand Down
7 changes: 6 additions & 1 deletion ReCaptchaCustomer/Test/Integration/AjaxLoginFormTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,12 @@ private function checkFailedPostResponse(array $postValues = []): void
{
$this->makePostRequest($postValues);

$expected = json_encode(['errors' => true, 'message' => 'reCAPTCHA verification failed']);
$expected = json_encode(
[
'errors' => true,
'message' => 'Something went wrong with reCAPTCHA. Please contact the store owner.'
]
);

$this->assertEquals(
$expected,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ private function checkFailedPostResponse(array $postValues = []): void
// Customer should not be created
}
$this->assertSessionMessages(
self::equalTo(['reCAPTCHA verification failed']),
self::equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
MessageInterface::TYPE_ERROR
);
}
Expand Down
2 changes: 1 addition & 1 deletion ReCaptchaCustomer/Test/Integration/EditFromTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ private function checkFailedPostResponse(array $postValues = []): void

$this->assertRedirect(self::stringStartsWith($this->url->getRouteUrl('customer/account/edit')));
$this->assertSessionMessages(
self::equalTo(['reCAPTCHA verification failed']),
self::equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
MessageInterface::TYPE_ERROR
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ private function checkFailedPostResponse(array $postValues = []): void

$this->assertRedirect(self::equalTo($this->url->getRouteUrl('customer/account/forgotpassword')));
$this->assertSessionMessages(
self::equalTo(['reCAPTCHA verification failed']),
self::equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
MessageInterface::TYPE_ERROR
);

Expand Down
2 changes: 1 addition & 1 deletion ReCaptchaCustomer/Test/Integration/LoginFromTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ private function checkFailedPostResponse(array $postValues = []): void

$this->assertRedirect(self::stringStartsWith($this->url->getRouteUrl('customer/account/login')));
$this->assertSessionMessages(
self::equalTo(['reCAPTCHA verification failed']),
self::equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
MessageInterface::TYPE_ERROR
);

Expand Down
57 changes: 57 additions & 0 deletions ReCaptchaFrontendUi/Model/ErrorMessageConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\ReCaptchaFrontendUi\Model;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface;
use Magento\Store\Model\ScopeInterface;

/**
* @inheritdoc
*/
class ErrorMessageConfig implements ErrorMessageConfigInterface
{
private const XML_PATH_VALIDATION = 'recaptcha_frontend/failure_messages/validation_failure_message';
private const XML_PATH_TECHNICAL = 'recaptcha_frontend/failure_messages/technical_failure_message';

/**
* @var ScopeConfigInterface
*/
private $scopeConfig;

/**
* @param ScopeConfigInterface $scopeConfig
*/
public function __construct(
ScopeConfigInterface $scopeConfig
) {
$this->scopeConfig = $scopeConfig;
}

/**
* @inheritdoc
*/
public function getTechnicalFailureMessage(): string
{
return $this->scopeConfig->getValue(
self::XML_PATH_TECHNICAL,
ScopeInterface::SCOPE_STORE
);
}

/**
* @inheritdoc
*/
public function getValidationFailureMessage(): string
{
return $this->scopeConfig->getValue(
self::XML_PATH_VALIDATION,
ScopeInterface::SCOPE_STORE
);
}
}
Loading