Skip to content

Commit fc04375

Browse files
authored
Merge pull request #267 from magento/1.0-develop
Sync master with develop branch
2 parents 2fdfcec + 39f934e commit fc04375

File tree

36 files changed

+580
-76
lines changed

36 files changed

+580
-76
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\ReCaptchaAdminUi\Model;
9+
10+
use Magento\Framework\App\Config\ScopeConfigInterface;
11+
use Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface;
12+
use Magento\Store\Model\ScopeInterface;
13+
14+
/**
15+
* @inheritdoc
16+
*/
17+
class ErrorMessageConfig implements ErrorMessageConfigInterface
18+
{
19+
private const XML_PATH_VALIDATION = 'recaptcha_backend/failure_messages/validation_failure_message';
20+
private const XML_PATH_TECHNICAL = 'recaptcha_backend/failure_messages/technical_failure_message';
21+
22+
/**
23+
* @var ScopeConfigInterface
24+
*/
25+
private $scopeConfig;
26+
27+
/**
28+
* @param ScopeConfigInterface $scopeConfig
29+
*/
30+
public function __construct(
31+
ScopeConfigInterface $scopeConfig
32+
) {
33+
$this->scopeConfig = $scopeConfig;
34+
}
35+
36+
/**
37+
* @inheritdoc
38+
*/
39+
public function getTechnicalFailureMessage(): string
40+
{
41+
return $this->scopeConfig->getValue(
42+
self::XML_PATH_TECHNICAL,
43+
ScopeInterface::SCOPE_STORE
44+
);
45+
}
46+
47+
/**
48+
* @inheritdoc
49+
*/
50+
public function getValidationFailureMessage(): string
51+
{
52+
return $this->scopeConfig->getValue(
53+
self::XML_PATH_VALIDATION,
54+
ScopeInterface::SCOPE_STORE
55+
);
56+
}
57+
}

ReCaptchaAdminUi/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"php": "~7.3.0||~7.4.0",
66
"magento/framework": "*",
77
"magento/module-config": "*",
8-
"magento/module-re-captcha-ui": "*"
8+
"magento/module-re-captcha-ui": "*",
9+
"magento/module-store": "*"
910
},
1011
"type": "magento2-module",
1112
"license": "OSL-3.0",

ReCaptchaAdminUi/etc/adminhtml/di.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@
99
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
1010
<preference for="Magento\ReCaptchaUi\Model\CaptchaTypeResolverInterface"
1111
type="Magento\ReCaptchaAdminUi\Model\CaptchaTypeResolver"/>
12+
<preference for="Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface"
13+
type="Magento\ReCaptchaAdminUi\Model\ErrorMessageConfig"/>
1214
</config>

ReCaptchaAdminUi/etc/adminhtml/system.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,21 @@
2727
<frontend_model>Magento\ReCaptchaAdminUi\Block\Adminhtml\System\Config\Form\Field\Notice</frontend_model>
2828
</field>
2929
</group>
30+
31+
<group id="failure_messages" translate="label" type="text" sortOrder="950" showInDefault="1" showInWebsite="1"
32+
showInStore="1">
33+
<label>reCAPTCHA Failure Messages</label>
34+
35+
<field id="validation_failure_message" translate="label" type="textarea" sortOrder="10" showInDefault="1"
36+
showInWebsite="0" showInStore="0" canRestore="1">
37+
<label>reCAPTCHA Validation Failure Message</label>
38+
</field>
39+
40+
<field id="technical_failure_message" translate="label" type="textarea" sortOrder="20" showInDefault="1"
41+
showInWebsite="0" showInStore="0" canRestore="1">
42+
<label>reCAPTCHA Technical Failure Message</label>
43+
</field>
44+
</group>
3045
</section>
3146

3247
<section id="recaptcha_frontend" translate="label" type="text" sortOrder="700" showInDefault="1"

ReCaptchaAdminUi/etc/config.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
10+
<default>
11+
<recaptcha_backend>
12+
<failure_messages>
13+
<validation_failure_message>reCAPTCHA verification failed.</validation_failure_message>
14+
<technical_failure_message>Something went wrong with reCAPTCHA. Please contact the store owner.</technical_failure_message>
15+
</failure_messages>
16+
</recaptcha_backend>
17+
</default>
18+
</config>

ReCaptchaContact/Test/Integration/ContactFormTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ private function checkFailedPostResponse(array $postValues = []): void
210210
$this->makePostRequest($postValues);
211211

212212
$this->assertSessionMessages(
213-
$this->equalTo(['reCAPTCHA verification failed']),
213+
$this->equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
214214
MessageInterface::TYPE_ERROR
215215
);
216216
}

ReCaptchaCustomer/Model/AjaxLogin/ErrorProcessor.php

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@
99

1010
use Magento\Framework\App\Action\Action;
1111
use Magento\Framework\App\ActionFlag;
12+
use Magento\Framework\App\ObjectManager;
1213
use Magento\Framework\App\ResponseInterface;
1314
use Magento\Framework\Serialize\SerializerInterface;
15+
use Magento\ReCaptchaUi\Model\ErrorMessageConfigInterface;
16+
use Magento\ReCaptchaValidationApi\Model\ValidationErrorMessagesProvider;
17+
use Psr\Log\LoggerInterface;
1418

1519
/**
1620
* Process error during ajax login
@@ -29,27 +33,73 @@ class ErrorProcessor
2933
*/
3034
private $serializer;
3135

36+
/**
37+
* @var LoggerInterface
38+
*/
39+
private $logger;
40+
41+
/**
42+
* @var ErrorMessageConfigInterface
43+
*/
44+
private $errorMessageConfig;
45+
46+
/**
47+
* @var ValidationErrorMessagesProvider
48+
*/
49+
private $validationErrorMessagesProvider;
50+
3251
/**
3352
* @param ActionFlag $actionFlag
3453
* @param SerializerInterface $serializer
54+
* @param LoggerInterface|null $logger
55+
* @param ErrorMessageConfigInterface|null $errorMessageConfig
56+
* @param ValidationErrorMessagesProvider|null $validationErrorMessagesProvider
3557
*/
3658
public function __construct(
3759
ActionFlag $actionFlag,
38-
SerializerInterface $serializer
60+
SerializerInterface $serializer,
61+
?LoggerInterface $logger = null,
62+
?ErrorMessageConfigInterface $errorMessageConfig = null,
63+
?ValidationErrorMessagesProvider $validationErrorMessagesProvider = null
3964
) {
4065
$this->actionFlag = $actionFlag;
4166
$this->serializer = $serializer;
67+
$this->logger = $logger
68+
?? ObjectManager::getInstance()->get(LoggerInterface::class);
69+
$this->errorMessageConfig = $errorMessageConfig
70+
?? ObjectManager::getInstance()->get(ErrorMessageConfigInterface::class);
71+
$this->validationErrorMessagesProvider = $validationErrorMessagesProvider
72+
?? ObjectManager::getInstance()->get(ValidationErrorMessagesProvider::class);
4273
}
4374

4475
/**
4576
* Set "no dispatch" flag and error message to Response
4677
*
4778
* @param ResponseInterface $response
48-
* @param string $message
79+
* @param array $errorMessages
80+
* @param string $sourceKey
4981
* @return void
5082
*/
51-
public function processError(ResponseInterface $response, string $message): void
83+
public function processError(ResponseInterface $response, array $errorMessages, string $sourceKey): void
5284
{
85+
$validationErrorText = $this->errorMessageConfig->getValidationFailureMessage();
86+
$technicalErrorText = $this->errorMessageConfig->getTechnicalFailureMessage();
87+
88+
$message = $errorMessages ? $validationErrorText : $technicalErrorText;
89+
90+
foreach ($errorMessages as $errorMessageCode => $errorMessageText) {
91+
if (!$this->isValidationError($errorMessageCode)) {
92+
$message = $technicalErrorText;
93+
$this->logger->error(
94+
__(
95+
'reCAPTCHA \'%1\' form error: %2',
96+
$sourceKey,
97+
$errorMessageText
98+
)
99+
);
100+
}
101+
}
102+
53103
$this->actionFlag->set('', Action::FLAG_NO_DISPATCH, true);
54104

55105
$jsonPayload = $this->serializer->serialize([
@@ -58,4 +108,15 @@ public function processError(ResponseInterface $response, string $message): void
58108
]);
59109
$response->representJson($jsonPayload);
60110
}
111+
112+
/**
113+
* Check if error code present in validation errors list.
114+
*
115+
* @param string $errorMessageCode
116+
* @return bool
117+
*/
118+
private function isValidationError(string $errorMessageCode): bool
119+
{
120+
return $errorMessageCode !== $this->validationErrorMessagesProvider->getErrorMessage($errorMessageCode);
121+
}
61122
}

ReCaptchaCustomer/Observer/AjaxLoginObserver.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use Psr\Log\LoggerInterface;
2121

2222
/**
23-
* AjaxLoginObserver
23+
* Observer of ajax login.
2424
*/
2525
class AjaxLoginObserver implements ObserverInterface
2626
{
@@ -79,8 +79,8 @@ public function __construct(
7979
}
8080

8181
/**
82-
* @param Observer $observer
83-
* @return void
82+
* @inheritdoc
83+
*
8484
* @throws LocalizedException
8585
*/
8686
public function execute(Observer $observer): void
@@ -100,7 +100,8 @@ public function execute(Observer $observer): void
100100
$this->logger->error($e);
101101
$this->errorProcessor->processError(
102102
$response,
103-
$validationConfig->getValidationFailureMessage()
103+
[],
104+
$key
104105
);
105106
return;
106107
}
@@ -109,7 +110,8 @@ public function execute(Observer $observer): void
109110
if (false === $validationResult->isValid()) {
110111
$this->errorProcessor->processError(
111112
$response,
112-
$validationConfig->getValidationFailureMessage()
113+
$validationResult->getErrors(),
114+
$key
113115
);
114116
}
115117
}

ReCaptchaCustomer/Test/Integration/AjaxLoginFormTest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,12 @@ private function checkFailedPostResponse(array $postValues = []): void
218218
{
219219
$this->makePostRequest($postValues);
220220

221-
$expected = json_encode(['errors' => true, 'message' => 'reCAPTCHA verification failed']);
221+
$expected = json_encode(
222+
[
223+
'errors' => true,
224+
'message' => 'Something went wrong with reCAPTCHA. Please contact the store owner.'
225+
]
226+
);
222227

223228
$this->assertEquals(
224229
$expected,

ReCaptchaCustomer/Test/Integration/CreateCustomerFormTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ private function checkFailedPostResponse(array $postValues = []): void
238238
// Customer should not be created
239239
}
240240
$this->assertSessionMessages(
241-
self::equalTo(['reCAPTCHA verification failed']),
241+
self::equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
242242
MessageInterface::TYPE_ERROR
243243
);
244244
}

0 commit comments

Comments
 (0)