Skip to content

Commit 9ac667b

Browse files
[Magento Community Engineering] Community Contributions - 2.4-develop
- merged latest code from mainline branch
2 parents 4d82a5b + c35093a commit 9ac667b

File tree

31 files changed

+1151
-195
lines changed

31 files changed

+1151
-195
lines changed

app/code/Magento/AdminAnalytics/Test/Mftf/Test/TrackingScriptTest.xml

Lines changed: 0 additions & 26 deletions
This file was deleted.

app/code/Magento/Catalog/Test/Unit/Ui/DataProvider/Product/Form/Modifier/CategoriesTest.php

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77

88
namespace Magento\Catalog\Test\Unit\Ui\DataProvider\Product\Form\Modifier;
99

10-
use Magento\Catalog\Model\ResourceModel\Category\Collection as CategoryCollection;
11-
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory;
1210
use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Categories;
11+
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory;
12+
use Magento\Catalog\Model\ResourceModel\Category\Collection as CategoryCollection;
1313
use Magento\Framework\AuthorizationInterface;
1414
use Magento\Framework\DB\Helper as DbHelper;
1515
use Magento\Framework\UrlInterface;
1616
use Magento\Store\Model\Store;
17+
use Magento\Backend\Model\Auth\Session;
18+
use Magento\Authorization\Model\Role;
19+
use Magento\User\Model\User;
1720
use PHPUnit\Framework\MockObject\MockObject;
1821

1922
/**
@@ -51,6 +54,11 @@ class CategoriesTest extends AbstractModifierTest
5154
*/
5255
private $authorizationMock;
5356

57+
/**
58+
* @var Session|MockObject
59+
*/
60+
private $sessionMock;
61+
5462
protected function setUp(): void
5563
{
5664
parent::setUp();
@@ -72,7 +80,10 @@ protected function setUp(): void
7280
$this->authorizationMock = $this->getMockBuilder(AuthorizationInterface::class)
7381
->disableOriginalConstructor()
7482
->getMockForAbstractClass();
75-
83+
$this->sessionMock = $this->getMockBuilder(Session::class)
84+
->setMethods(['getUser'])
85+
->disableOriginalConstructor()
86+
->getMock();
7687
$this->categoryCollectionFactoryMock->expects($this->any())
7788
->method('create')
7889
->willReturn($this->categoryCollectionMock);
@@ -88,6 +99,26 @@ protected function setUp(): void
8899
$this->categoryCollectionMock->expects($this->any())
89100
->method('getIterator')
90101
->willReturn(new \ArrayIterator([]));
102+
103+
$roleAdmin = $this->getMockBuilder(Role::class)
104+
->setMethods(['getId'])
105+
->disableOriginalConstructor()
106+
->getMock();
107+
$roleAdmin->expects($this->any())
108+
->method('getId')
109+
->willReturn(0);
110+
111+
$userAdmin = $this->getMockBuilder(User::class)
112+
->setMethods(['getRole'])
113+
->disableOriginalConstructor()
114+
->getMock();
115+
$userAdmin->expects($this->any())
116+
->method('getRole')
117+
->willReturn($roleAdmin);
118+
119+
$this->sessionMock->expects($this->any())
120+
->method('getUser')
121+
->willReturn($userAdmin);
91122
}
92123

93124
/**
@@ -101,11 +132,28 @@ protected function createModel()
101132
'locator' => $this->locatorMock,
102133
'categoryCollectionFactory' => $this->categoryCollectionFactoryMock,
103134
'arrayManager' => $this->arrayManagerMock,
104-
'authorization' => $this->authorizationMock
135+
'authorization' => $this->authorizationMock,
136+
'session' => $this->sessionMock
105137
]
106138
);
107139
}
108140

141+
/**
142+
* @param object $object
143+
* @param string $method
144+
* @param array $args
145+
* @return mixed
146+
* @throws \ReflectionException
147+
*/
148+
private function invokeMethod($object, $method, $args = [])
149+
{
150+
$class = new \ReflectionClass(Categories::class);
151+
$method = $class->getMethod($method);
152+
$method->setAccessible(true);
153+
154+
return $method->invokeArgs($object, $args);
155+
}
156+
109157
public function testModifyData()
110158
{
111159
$this->assertSame([], $this->getModel()->modifyData([]));
@@ -176,4 +224,44 @@ public function modifyMetaLockedDataProvider()
176224
{
177225
return [[true], [false]];
178226
}
227+
228+
/**
229+
* Asserts that a user with an ACL role ID of 0 and a user with an ACL role ID of 1 do not have the same cache IDs
230+
* Assumes a store ID of 0
231+
*
232+
* @throws \ReflectionException
233+
*/
234+
public function testAclCacheIds()
235+
{
236+
$categoriesAdmin = $this->createModel();
237+
$cacheIdAdmin = $this->invokeMethod($categoriesAdmin, 'getCategoriesTreeCacheId', [0]);
238+
239+
$roleAclUser = $this->getMockBuilder(Role::class)
240+
->disableOriginalConstructor()
241+
->getMock();
242+
$roleAclUser->expects($this->any())
243+
->method('getId')
244+
->willReturn(1);
245+
246+
$userAclUser = $this->getMockBuilder(User::class)
247+
->disableOriginalConstructor()
248+
->getMock();
249+
$userAclUser->expects($this->any())
250+
->method('getRole')
251+
->will($this->returnValue($roleAclUser));
252+
253+
$this->sessionMock = $this->getMockBuilder(Session::class)
254+
->setMethods(['getUser'])
255+
->disableOriginalConstructor()
256+
->getMock();
257+
258+
$this->sessionMock->expects($this->any())
259+
->method('getUser')
260+
->will($this->returnValue($userAclUser));
261+
262+
$categoriesAclUser = $this->createModel();
263+
$cacheIdAclUser = $this->invokeMethod($categoriesAclUser, 'getCategoriesTreeCacheId', [0]);
264+
265+
$this->assertNotEquals($cacheIdAdmin, $cacheIdAclUser);
266+
}
179267
}

app/code/Magento/Catalog/Ui/DataProvider/Product/Form/Modifier/Categories.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
use Magento\Framework\UrlInterface;
1919
use Magento\Framework\Stdlib\ArrayManager;
2020
use Magento\Framework\AuthorizationInterface;
21+
use Magento\Backend\Model\Auth\Session;
2122

2223
/**
2324
* Data provider for categories field of product page
2425
*
2526
* @api
2627
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
28+
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
2729
* @since 101.0.0
2830
*/
2931
class Categories extends AbstractModifier
@@ -86,6 +88,11 @@ class Categories extends AbstractModifier
8688
*/
8789
private $authorization;
8890

91+
/**
92+
* @var Session
93+
*/
94+
private $session;
95+
8996
/**
9097
* @param LocatorInterface $locator
9198
* @param CategoryCollectionFactory $categoryCollectionFactory
@@ -94,6 +101,7 @@ class Categories extends AbstractModifier
94101
* @param ArrayManager $arrayManager
95102
* @param SerializerInterface $serializer
96103
* @param AuthorizationInterface $authorization
104+
* @param Session $session
97105
*/
98106
public function __construct(
99107
LocatorInterface $locator,
@@ -102,7 +110,8 @@ public function __construct(
102110
UrlInterface $urlBuilder,
103111
ArrayManager $arrayManager,
104112
SerializerInterface $serializer = null,
105-
AuthorizationInterface $authorization = null
113+
AuthorizationInterface $authorization = null,
114+
Session $session = null
106115
) {
107116
$this->locator = $locator;
108117
$this->categoryCollectionFactory = $categoryCollectionFactory;
@@ -111,6 +120,7 @@ public function __construct(
111120
$this->arrayManager = $arrayManager;
112121
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
113122
$this->authorization = $authorization ?: ObjectManager::getInstance()->get(AuthorizationInterface::class);
123+
$this->session = $session ?: ObjectManager::getInstance()->get(Session::class);
114124
}
115125

116126
/**
@@ -370,10 +380,16 @@ protected function getCategoriesTree($filter = null)
370380
* @param string $filter
371381
* @return string
372382
*/
373-
private function getCategoriesTreeCacheId(int $storeId, string $filter = '') : string
383+
private function getCategoriesTreeCacheId(int $storeId, string $filter = ''): string
374384
{
385+
if ($this->session->getUser() !== null) {
386+
return self::CATEGORY_TREE_ID
387+
. '_' . (string)$storeId
388+
. '_' . $this->session->getUser()->getAclRole()
389+
. '_' . $filter;
390+
}
375391
return self::CATEGORY_TREE_ID
376-
. '_' . (string) $storeId
392+
. '_' . (string)$storeId
377393
. '_' . $filter;
378394
}
379395

app/code/Magento/CmsUrlRewrite/Plugin/Cms/Model/Store/View.php

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

88
namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;
99

10+
use Magento\Cms\Api\Data\PageInterface;
1011
use Magento\Cms\Api\PageRepositoryInterface;
1112
use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator;
1213
use Magento\Framework\Api\SearchCriteriaBuilder;
@@ -21,6 +22,8 @@
2122
*/
2223
class View
2324
{
25+
private const ALL_STORE_VIEWS = '0';
26+
2427
/**
2528
* @var UrlPersistInterface
2629
*/
@@ -89,14 +92,27 @@ private function generateCmsPagesUrls(int $storeId): array
8992
{
9093
$rewrites = [];
9194
$urls = [];
92-
$searchCriteria = $this->searchCriteriaBuilder->create();
93-
$cmsPagesCollection = $this->pageRepository->getList($searchCriteria)->getItems();
94-
foreach ($cmsPagesCollection as $page) {
95+
96+
foreach ($this->getCmsPageItems() as $page) {
9597
$page->setStoreId($storeId);
9698
$rewrites[] = $this->cmsPageUrlRewriteGenerator->generate($page);
9799
}
98100
$urls = array_merge($urls, ...$rewrites);
99101

100102
return $urls;
101103
}
104+
105+
/**
106+
* Return cms page items for all store view
107+
*
108+
* @return PageInterface[]
109+
*/
110+
private function getCmsPageItems(): array
111+
{
112+
$searchCriteria = $this->searchCriteriaBuilder->addFilter('store_id', self::ALL_STORE_VIEWS)
113+
->create();
114+
$list = $this->pageRepository->getList($searchCriteria);
115+
116+
return $list->getItems();
117+
}
102118
}

app/code/Magento/Customer/Model/Plugin/CustomerAuthorization.php

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
namespace Magento\Customer\Model\Plugin;
88

99
use Magento\Authorization\Model\UserContextInterface;
10+
use Magento\Customer\Model\CustomerFactory;
11+
use Magento\Customer\Model\ResourceModel\Customer as CustomerResource;
1012
use Magento\Integration\Api\AuthorizationServiceInterface as AuthorizationService;
13+
use Magento\Store\Model\StoreManagerInterface;
1114

1215
/**
1316
* Plugin around \Magento\Framework\Authorization::isAllowed
@@ -19,16 +22,41 @@ class CustomerAuthorization
1922
/**
2023
* @var UserContextInterface
2124
*/
22-
protected $userContext;
25+
private $userContext;
26+
27+
/**
28+
* @var CustomerFactory
29+
*/
30+
private $customerFactory;
31+
32+
/**
33+
* @var CustomerResource
34+
*/
35+
private $customerResource;
36+
37+
/**
38+
* @var StoreManagerInterface
39+
*/
40+
private $storeManager;
2341

2442
/**
2543
* Inject dependencies.
2644
*
2745
* @param UserContextInterface $userContext
46+
* @param CustomerFactory $customerFactory
47+
* @param CustomerResource $customerResource
48+
* @param StoreManagerInterface $storeManager
2849
*/
29-
public function __construct(UserContextInterface $userContext)
30-
{
50+
public function __construct(
51+
UserContextInterface $userContext,
52+
CustomerFactory $customerFactory,
53+
CustomerResource $customerResource,
54+
StoreManagerInterface $storeManager
55+
) {
3156
$this->userContext = $userContext;
57+
$this->customerFactory = $customerFactory;
58+
$this->customerResource = $customerResource;
59+
$this->storeManager = $storeManager;
3260
}
3361

3462
/**
@@ -53,9 +81,15 @@ public function aroundIsAllowed(
5381
&& $this->userContext->getUserId()
5482
&& $this->userContext->getUserType() === UserContextInterface::USER_TYPE_CUSTOMER
5583
) {
56-
return true;
57-
} else {
58-
return $proceed($resource, $privilege);
84+
$customer = $this->customerFactory->create();
85+
$this->customerResource->load($customer, $this->userContext->getUserId());
86+
$currentStoreId = $this->storeManager->getStore()->getId();
87+
$sharedStoreIds = $customer->getSharedStoreIds();
88+
if (in_array($currentStoreId, $sharedStoreIds)) {
89+
return true;
90+
}
5991
}
92+
93+
return $proceed($resource, $privilege);
6094
}
6195
}

app/code/Magento/Developer/Console/Command/patch_template.php.dist

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
67

78
namespace %moduleName%\Setup\Patch\%patchType%;
89

@@ -36,20 +37,18 @@ class %class% implements %implementsInterfaces%
3637
}
3738
%revertFunction%
3839
/**
39-
* {@inheritdoc}
40+
* @inheritdoc
4041
*/
4142
public function getAliases()
4243
{
4344
return [];
4445
}
4546

4647
/**
47-
* {@inheritdoc}
48+
* @inheritdoc
4849
*/
4950
public static function getDependencies()
5051
{
51-
return [
52-
53-
];
52+
return [];
5453
}
5554
}

0 commit comments

Comments
 (0)