Skip to content

Commit 6bc8dc4

Browse files
authored
Merge pull request #6283 from magento-tsg/MC-38620
[Arrows] MC-38620: Merge release branch into 2.4-develop
2 parents 9a655bb + 22b2587 commit 6bc8dc4

File tree

275 files changed

+17112
-5428
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

275 files changed

+17112
-5428
lines changed

app/code/Magento/Authorization/Model/CompositeUserContext.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ protected function add(UserContextInterface $userContext)
5656
}
5757

5858
/**
59-
* {@inheritdoc}
59+
* @inheritDoc
6060
*/
6161
public function getUserId()
6262
{
6363
return $this->getUserContext() ? $this->getUserContext()->getUserId() : null;
6464
}
6565

6666
/**
67-
* {@inheritdoc}
67+
* @inheritDoc
6868
*/
6969
public function getUserType()
7070
{
@@ -78,7 +78,7 @@ public function getUserType()
7878
*/
7979
protected function getUserContext()
8080
{
81-
if ($this->chosenUserContext === null) {
81+
if (!$this->chosenUserContext) {
8282
/** @var UserContextInterface $userContext */
8383
foreach ($this->userContexts as $userContext) {
8484
if ($userContext->getUserType() && $userContext->getUserId() !== null) {

app/code/Magento/Authorization/Model/ResourceModel/Role.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ protected function _afterDelete(\Magento\Framework\Model\AbstractModel $role)
119119

120120
$connection->delete($this->_ruleTable, ['role_id = ?' => (int)$role->getId()]);
121121

122+
$this->_cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [\Magento\Backend\Block\Menu::CACHE_TAGS]);
123+
122124
return $this;
123125
}
124126

app/code/Magento/Authorization/Model/Role.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class Role extends \Magento\Framework\Model\AbstractModel
3333
*/
3434
protected $_eventPrefix = 'authorization_roles';
3535

36+
/**
37+
* @var string
38+
*/
39+
protected $_cacheTag = 'user_assigned_role';
40+
3641
/**
3742
* @param \Magento\Framework\Model\Context $context
3843
* @param \Magento\Framework\Registry $registry

app/code/Magento/Backend/Model/Auth/Session.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
*/
66
namespace Magento\Backend\Model\Auth;
77

8+
use Magento\Framework\App\ObjectManager;
89
use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
910
use Magento\Framework\Stdlib\CookieManagerInterface;
11+
use Magento\Framework\Message\ManagerInterface;
1012

1113
/**
1214
* Backend Auth session model
@@ -56,6 +58,11 @@ class Session extends \Magento\Framework\Session\SessionManager implements \Mage
5658
*/
5759
protected $_config;
5860

61+
/**
62+
* @var ManagerInterface
63+
*/
64+
private $messageManager;
65+
5966
/**
6067
* @param \Magento\Framework\App\Request\Http $request
6168
* @param \Magento\Framework\Session\SidResolverInterface $sidResolver
@@ -69,6 +76,7 @@ class Session extends \Magento\Framework\Session\SessionManager implements \Mage
6976
* @param \Magento\Framework\Acl\Builder $aclBuilder
7077
* @param \Magento\Backend\Model\UrlInterface $backendUrl
7178
* @param \Magento\Backend\App\ConfigInterface $config
79+
* @param ManagerInterface $messageManager
7280
* @throws \Magento\Framework\Exception\SessionException
7381
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
7482
*/
@@ -84,11 +92,13 @@ public function __construct(
8492
\Magento\Framework\App\State $appState,
8593
\Magento\Framework\Acl\Builder $aclBuilder,
8694
\Magento\Backend\Model\UrlInterface $backendUrl,
87-
\Magento\Backend\App\ConfigInterface $config
95+
\Magento\Backend\App\ConfigInterface $config,
96+
ManagerInterface $messageManager = null
8897
) {
8998
$this->_config = $config;
9099
$this->_aclBuilder = $aclBuilder;
91100
$this->_backendUrl = $backendUrl;
101+
$this->messageManager = $messageManager ?? ObjectManager::getInstance()->get(ManagerInterface::class);
92102
parent::__construct(
93103
$request,
94104
$sidResolver,
@@ -171,6 +181,25 @@ public function isLoggedIn()
171181
*/
172182
public function prolong()
173183
{
184+
$sessionUser = $this->getUser();
185+
$errorMessage = '';
186+
if ($sessionUser !== null) {
187+
if ((int)$sessionUser->getIsActive() !== 1) {
188+
$errorMessage = 'The account sign-in was incorrect or your account is disabled temporarily. '
189+
. 'Please wait and try again later.';
190+
}
191+
if (!$sessionUser->hasAssigned2Role($sessionUser->getId())) {
192+
$errorMessage = 'More permissions are needed to access this.';
193+
}
194+
195+
if (!empty($errorMessage)) {
196+
$this->destroy();
197+
$this->messageManager->addErrorMessage(__($errorMessage));
198+
199+
return;
200+
}
201+
}
202+
174203
$lifetime = $this->_config->getValue(self::XML_PATH_SESSION_LIFETIME);
175204
$cookieValue = $this->cookieManager->getCookie($this->getName());
176205

app/code/Magento/Backend/view/adminhtml/web/js/media-uploader.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ define([
3737
progressTmpl = mageTemplate('[data-template="uploader"]'),
3838
isResizeEnabled = this.options.isResizeEnabled,
3939
resizeConfiguration = {
40-
action: 'resize',
40+
action: 'resizeImage',
4141
maxWidth: this.options.maxWidth,
4242
maxHeight: this.options.maxHeight
4343
};
4444

4545
if (!isResizeEnabled) {
4646
resizeConfiguration = {
47-
action: 'resize'
47+
action: 'resizeImage'
4848
};
4949
}
5050

@@ -131,13 +131,13 @@ define([
131131
});
132132

133133
this.element.find('input[type=file]').fileupload('option', {
134-
process: [{
135-
action: 'load',
134+
processQueue: [{
135+
action: 'loadImage',
136136
fileTypes: /^image\/(gif|jpeg|png)$/
137137
},
138138
resizeConfiguration,
139139
{
140-
action: 'save'
140+
action: 'saveImage'
141141
}]
142142
});
143143
}

app/code/Magento/Captcha/Model/DefaultModel.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
namespace Magento\Captcha\Model;
99

10+
use Magento\Authorization\Model\UserContextInterface;
1011
use Magento\Captcha\Helper\Data;
12+
use Magento\Framework\App\ObjectManager;
1113
use Magento\Framework\Math\Random;
1214

1315
/**
@@ -93,27 +95,35 @@ class DefaultModel extends \Laminas\Captcha\Image implements \Magento\Captcha\Mo
9395
*/
9496
private $randomMath;
9597

98+
/**
99+
* @var UserContextInterface
100+
*/
101+
private $userContext;
102+
96103
/**
97104
* @param \Magento\Framework\Session\SessionManagerInterface $session
98105
* @param \Magento\Captcha\Helper\Data $captchaData
99106
* @param ResourceModel\LogFactory $resLogFactory
100107
* @param string $formId
101108
* @param Random $randomMath
109+
* @param UserContextInterface|null $userContext
102110
* @throws \Laminas\Captcha\Exception\ExtensionNotLoadedException
103111
*/
104112
public function __construct(
105113
\Magento\Framework\Session\SessionManagerInterface $session,
106114
\Magento\Captcha\Helper\Data $captchaData,
107115
\Magento\Captcha\Model\ResourceModel\LogFactory $resLogFactory,
108116
$formId,
109-
Random $randomMath = null
117+
Random $randomMath = null,
118+
?UserContextInterface $userContext = null
110119
) {
111120
parent::__construct();
112121
$this->session = $session;
113122
$this->captchaData = $captchaData;
114123
$this->resLogFactory = $resLogFactory;
115124
$this->formId = $formId;
116-
$this->randomMath = $randomMath ?? \Magento\Framework\App\ObjectManager::getInstance()->get(Random::class);
125+
$this->randomMath = $randomMath ?? ObjectManager::getInstance()->get(Random::class);
126+
$this->userContext = $userContext ?? ObjectManager::getInstance()->get(UserContextInterface::class);
117127
}
118128

119129
/**
@@ -152,6 +162,7 @@ public function isRequired($login = null)
152162
$this->formId,
153163
$this->getTargetForms()
154164
)
165+
|| $this->userContext->getUserType() === UserContextInterface::USER_TYPE_INTEGRATION
155166
) {
156167
return false;
157168
}
@@ -241,7 +252,7 @@ private function isOverLimitLoginAttempts($login)
241252
*/
242253
private function isUserAuth()
243254
{
244-
return $this->session->isLoggedIn();
255+
return $this->session->isLoggedIn() || $this->userContext->getUserId();
245256
}
246257

247258
/**
@@ -427,7 +438,7 @@ public function getWordLen()
427438
$to = self::DEFAULT_WORD_LENGTH_TO;
428439
}
429440

430-
return \Magento\Framework\Math\Random::getRandomNumber($from, $to);
441+
return Random::getRandomNumber($from, $to);
431442
}
432443

433444
/**
@@ -549,7 +560,7 @@ private function clearWord()
549560
*/
550561
protected function randomSize()
551562
{
552-
return \Magento\Framework\Math\Random::getRandomNumber(280, 300) / 100;
563+
return Random::getRandomNumber(280, 300) / 100;
553564
}
554565

555566
/**

app/code/Magento/Captcha/Observer/CaptchaStringResolver.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
7+
declare(strict_types=1);
8+
69
namespace Magento\Captcha\Observer;
710

811
use Magento\Framework\App\RequestInterface;
912
use Magento\Framework\App\Request\Http as HttpRequest;
13+
use Magento\Captcha\Helper\Data as CaptchaHelper;
1014

1115
/**
1216
* Extract given captcha word.
@@ -22,12 +26,13 @@ class CaptchaStringResolver
2226
*/
2327
public function resolve(RequestInterface $request, $formId)
2428
{
25-
$captchaParams = $request->getPost(\Magento\Captcha\Helper\Data::INPUT_NAME_FIELD_VALUE);
29+
$value = '';
30+
$captchaParams = $request->getPost(CaptchaHelper::INPUT_NAME_FIELD_VALUE);
2631
if (!empty($captchaParams) && !empty($captchaParams[$formId])) {
2732
$value = $captchaParams[$formId];
28-
} else {
29-
//For Web APIs
30-
$value = $request->getHeader('X-Captcha');
33+
} elseif ($headerValue = $request->getHeader('X-Captcha')) {
34+
//CAPTCHA was provided via header for this XHR/web API request.
35+
$value = $headerValue;
3136
}
3237

3338
return $value;

app/code/Magento/Captcha/Test/Unit/Model/DefaultTest.php

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Magento\Captcha\Test\Unit\Model;
99

10+
use Magento\Authorization\Model\UserContextInterface;
1011
use Magento\Captcha\Block\Captcha\DefaultCaptcha;
1112
use Magento\Captcha\Helper\Data;
1213
use Magento\Captcha\Model\DefaultModel;
@@ -93,10 +94,15 @@ class DefaultTest extends TestCase
9394
protected $session;
9495

9596
/**
96-
* @var MockObject
97+
* @var MockObject|LogFactory
9798
*/
9899
protected $_resLogFactory;
99100

101+
/**
102+
* @var UserContextInterface|MockObject
103+
*/
104+
private $userContextMock;
105+
100106
/**
101107
* Sets up the fixture, for example, opens a network connection.
102108
* This method is called before a test is executed.
@@ -139,11 +145,18 @@ protected function setUp(): void
139145
$this->_getResourceModelStub()
140146
);
141147

148+
$randomMock = $this->createMock(Random::class);
149+
$randomMock->method('getRandomString')->willReturn('random-string');
150+
151+
$this->userContextMock = $this->getMockForAbstractClass(UserContextInterface::class);
152+
142153
$this->_object = new DefaultModel(
143154
$this->session,
144155
$this->_getHelperStub(),
145156
$this->_resLogFactory,
146-
'user_create'
157+
'user_create',
158+
$randomMock,
159+
$this->userContextMock
147160
);
148161
}
149162

@@ -163,6 +176,19 @@ public function testIsRequired()
163176
$this->assertTrue($this->_object->isRequired());
164177
}
165178

179+
/**
180+
* Validate that CAPTCHA is disabled for integrations.
181+
*
182+
* @return void
183+
*/
184+
public function testIsRequiredForIntegration(): void
185+
{
186+
$this->userContextMock->method('getUserType')->willReturn(UserContextInterface::USER_TYPE_INTEGRATION);
187+
$this->userContextMock->method('getUserId')->willReturn(1);
188+
189+
$this->assertFalse($this->_object->isRequired());
190+
}
191+
166192
/**
167193
* @covers \Magento\Captcha\Model\DefaultModel::isCaseSensitive
168194
*/

app/code/Magento/Captcha/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"magento/module-checkout": "*",
1212
"magento/module-customer": "*",
1313
"magento/module-store": "*",
14+
"magento/module-authorization": "*",
1415
"laminas/laminas-captcha": "^2.7.1",
1516
"laminas/laminas-db": "^2.8.2",
1617
"laminas/laminas-session": "^2.7.3"

app/code/Magento/Captcha/i18n/en_US.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Always,Always
99
"Reload captcha","Reload captcha"
1010
"Please type the letters and numbers below","Please type the letters and numbers below"
1111
"Attention: Captcha is case sensitive.","Attention: Captcha is case sensitive."
12+
"Please provide CAPTCHA code and try again","Please provide CAPTCHA code and try again"
1213
CAPTCHA,CAPTCHA
1314
"Enable CAPTCHA in Admin","Enable CAPTCHA in Admin"
1415
Font,Font

0 commit comments

Comments
 (0)