Skip to content

Commit bbd4b4c

Browse files
Merge pull request #587 from magento-nord/NORD-PR
Fixed issues: - MAGETWO-55605: Security Issue with referrer - MAGETWO-58222: Cron separate process - MAGETWO-56863: [GitHub] Saving CMS page does not create URL rewrite in Magento 2.1.0 with single-store mode #5923 - MAGETWO-60037: User is able to create empty URL key for category which leads to numerous errors
2 parents 4e14f2e + f5d8ad2 commit bbd4b4c

File tree

18 files changed

+600
-187
lines changed

18 files changed

+600
-187
lines changed

app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,18 @@ public function __construct(
4242
/**
4343
* @param \Magento\Framework\Event\Observer $observer
4444
* @return void
45+
* @throws \Magento\Framework\Exception\LocalizedException
4546
*/
4647
public function execute(\Magento\Framework\Event\Observer $observer)
4748
{
4849
/** @var Category $category */
4950
$category = $observer->getEvent()->getCategory();
5051
if ($category->getUrlKey() !== false) {
51-
$category->setUrlKey($this->categoryUrlPathGenerator->getUrlKey($category))
52+
$resultUrlKey = $this->categoryUrlPathGenerator->getUrlKey($category);
53+
if (empty($resultUrlKey)) {
54+
throw new \Magento\Framework\Exception\LocalizedException(__('Invalid URL key'));
55+
}
56+
$category->setUrlKey($resultUrlKey)
5257
->setUrlPath($this->categoryUrlPathGenerator->getUrlPath($category));
5358
if (!$category->isObjectNew()) {
5459
$category->getResource()->saveAttribute($category, 'url_path');

app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,38 @@ class Save extends \Magento\Backend\App\Action
3030
*/
3131
protected $dataPersistor;
3232

33+
/**
34+
* @var \Magento\Cms\Model\PageFactory
35+
*/
36+
private $pageFactory;
37+
38+
/**
39+
* @var \Magento\Cms\Api\PageRepositoryInterface
40+
*/
41+
private $pageRepository;
42+
3343
/**
3444
* @param Action\Context $context
3545
* @param PostDataProcessor $dataProcessor
3646
* @param DataPersistorInterface $dataPersistor
47+
* @param \Magento\Cms\Model\PageFactory $pageFactory
48+
* @param \Magento\Cms\Api\PageRepositoryInterface $pageRepository
49+
*
3750
*/
3851
public function __construct(
3952
Action\Context $context,
4053
PostDataProcessor $dataProcessor,
41-
DataPersistorInterface $dataPersistor
54+
DataPersistorInterface $dataPersistor,
55+
\Magento\Cms\Model\PageFactory $pageFactory = null,
56+
\Magento\Cms\Api\PageRepositoryInterface $pageRepository = null
4257
) {
4358
$this->dataProcessor = $dataProcessor;
4459
$this->dataPersistor = $dataPersistor;
60+
$this->pageFactory = $pageFactory
61+
?: \Magento\Framework\App\ObjectManager::getInstance()->get(\Magento\Cms\Model\PageFactory::class);
62+
$this->pageRepository = $pageRepository
63+
?: \Magento\Framework\App\ObjectManager::getInstance()
64+
->get(\Magento\Cms\Api\PageRepositoryInterface::class);
4565
parent::__construct($context);
4666
}
4767

@@ -66,7 +86,7 @@ public function execute()
6686
}
6787

6888
/** @var \Magento\Cms\Model\Page $model */
69-
$model = $this->_objectManager->create(\Magento\Cms\Model\Page::class);
89+
$model = $this->pageFactory->create();
7090

7191
$id = $this->getRequest()->getParam('page_id');
7292
if ($id) {
@@ -85,7 +105,7 @@ public function execute()
85105
}
86106

87107
try {
88-
$model->save();
108+
$this->pageRepository->save($model);
89109
$this->messageManager->addSuccess(__('You saved the page.'));
90110
$this->dataPersistor->clear('cms_page');
91111
if ($this->getRequest()->getParam('back')) {

app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php

Lines changed: 67 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -13,73 +13,61 @@ class SaveTest extends \PHPUnit_Framework_TestCase
1313
/**
1414
* @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
1515
*/
16-
protected $requestMock;
16+
private $requestMock;
1717

1818
/**
1919
* @var \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor|\PHPUnit_Framework_MockObject_MockObject
2020
*/
21-
protected $dataProcessorMock;
21+
private $dataProcessorMock;
2222

2323
/**
2424
* @var \Magento\Framework\App\Request\DataPersistorInterface|\PHPUnit_Framework_MockObject_MockObject
2525
*/
26-
protected $dataPersistorMock;
26+
private $dataPersistorMock;
2727

2828
/**
2929
* @var \Magento\Backend\Model\View\Result\RedirectFactory|\PHPUnit_Framework_MockObject_MockObject
3030
*/
31-
protected $resultRedirectFactory;
31+
private $resultRedirectFactory;
3232

3333
/**
3434
* @var \Magento\Backend\Model\View\Result\Redirect|\PHPUnit_Framework_MockObject_MockObject
3535
*/
36-
protected $resultRedirect;
36+
private $resultRedirect;
3737

3838
/**
39-
* @var \Magento\Backend\App\Action\Context|\PHPUnit_Framework_MockObject_MockObject
40-
*/
41-
protected $contextMock;
42-
43-
/**
44-
* @var \Magento\Framework\ObjectManager\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
45-
*/
46-
protected $objectManagerMock;
47-
48-
/**
49-
* @var \Magento\Cms\Model\Page|\PHPUnit_Framework_MockObject_MockObject $pageMock
39+
* @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
5040
*/
51-
protected $pageMock;
41+
private $messageManagerMock;
5242

5343
/**
54-
* @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
44+
* @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
5545
*/
56-
protected $messageManagerMock;
46+
private $eventManagerMock;
5747

5848
/**
59-
* @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
49+
* @var \Magento\Cms\Model\PageFactory|\PHPUnit_Framework_MockObject_MockObject
6050
*/
61-
protected $eventManagerMock;
51+
private $pageFactory;
6252

6353
/**
64-
* @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
54+
* @var \Magento\Cms\Api\PageRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
6555
*/
66-
protected $objectManager;
56+
private $pageRepository;
6757

6858
/**
6959
* @var \Magento\Cms\Controller\Adminhtml\Page\Save
7060
*/
71-
protected $saveController;
61+
private $saveController;
7262

7363
/**
7464
* @var int
7565
*/
76-
protected $pageId = 1;
66+
private $pageId = 1;
7767

7868
protected function setUp()
7969
{
80-
$this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
81-
82-
$this->contextMock = $this->getMock(\Magento\Backend\App\Action\Context::class, [], [], '', false);
70+
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
8371

8472
$this->resultRedirectFactory = $this->getMockBuilder(\Magento\Backend\Model\View\Result\RedirectFactory::class)
8573
->disableOriginalConstructor()
@@ -91,69 +79,37 @@ protected function setUp()
9179
$this->resultRedirectFactory->expects($this->atLeastOnce())
9280
->method('create')
9381
->willReturn($this->resultRedirect);
94-
95-
$this->dataProcessorMock = $this->getMock(
96-
\Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor::class,
97-
['filter'],
98-
[],
99-
'',
100-
false
101-
);
102-
82+
$this->dataProcessorMock = $this->getMockBuilder(
83+
\Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor::class
84+
)->setMethods(['filter'])->disableOriginalConstructor()->getMock();
10385
$this->dataPersistorMock = $this->getMockBuilder(\Magento\Framework\App\Request\DataPersistorInterface::class)
10486
->getMock();
105-
106-
$this->requestMock = $this->getMockForAbstractClass(
107-
\Magento\Framework\App\RequestInterface::class,
108-
[],
109-
'',
110-
false,
111-
true,
112-
true,
113-
['getParam', 'getPostValue']
114-
);
115-
116-
$this->pageMock = $this->getMockBuilder(
117-
\Magento\Cms\Model\Page::class
118-
)->disableOriginalConstructor()->getMock();
119-
120-
$this->messageManagerMock = $this->getMock(
121-
\Magento\Framework\Message\ManagerInterface::class,
122-
[],
123-
[],
124-
'',
125-
false
126-
);
127-
128-
$this->eventManagerMock = $this->getMockForAbstractClass(
129-
\Magento\Framework\Event\ManagerInterface::class,
130-
[],
131-
'',
132-
false,
133-
true,
134-
true,
135-
['dispatch']
136-
);
137-
138-
$this->objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManager\ObjectManager::class)
87+
$this->requestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class)
88+
->setMethods(['getParam', 'getPostValue'])
89+
->getMockForAbstractClass();
90+
$this->messageManagerMock = $this->getMockBuilder(\Magento\Framework\Message\ManagerInterface::class)
91+
->getMockForAbstractClass();
92+
$this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
93+
->setMethods(['dispatch'])
94+
->getMockForAbstractClass();
95+
$this->pageFactory = $this->getMockBuilder(\Magento\Cms\Model\PageFactory::class)
13996
->disableOriginalConstructor()
140-
->setMethods(['get', 'create'])
97+
->setMethods(['create'])
14198
->getMock();
142-
143-
$this->contextMock->expects($this->any())->method('getRequest')->willReturn($this->requestMock);
144-
$this->contextMock->expects($this->any())->method('getObjectManager')->willReturn($this->objectManagerMock);
145-
$this->contextMock->expects($this->any())->method('getMessageManager')->willReturn($this->messageManagerMock);
146-
$this->contextMock->expects($this->any())->method('getEventManager')->willReturn($this->eventManagerMock);
147-
$this->contextMock->expects($this->any())
148-
->method('getResultRedirectFactory')
149-
->willReturn($this->resultRedirectFactory);
150-
151-
$this->saveController = $this->objectManager->getObject(
99+
$this->pageRepository = $this->getMockBuilder(\Magento\Cms\Api\PageRepositoryInterface::class)
100+
->disableOriginalConstructor()
101+
->getMockForAbstractClass();
102+
$this->saveController = $objectManager->getObject(
152103
\Magento\Cms\Controller\Adminhtml\Page\Save::class,
153104
[
154-
'context' => $this->contextMock,
105+
'request' => $this->requestMock,
106+
'messageManager' => $this->messageManagerMock,
107+
'eventManager' => $this->eventManagerMock,
108+
'resultRedirectFactory' => $this->resultRedirectFactory,
155109
'dataProcessor' => $this->dataProcessorMock,
156110
'dataPersistor' => $this->dataPersistorMock,
111+
'pageFactory' => $this->pageFactory,
112+
'pageRepository' => $this->pageRepository
157113
]
158114
);
159115
}
@@ -190,20 +146,21 @@ public function testSaveAction()
190146
['back', null, false],
191147
]
192148
);
193-
194-
$this->objectManagerMock->expects($this->atLeastOnce())
149+
$page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
150+
->disableOriginalConstructor()
151+
->getMock();
152+
$this->pageFactory->expects($this->atLeastOnce())
195153
->method('create')
196-
->with($this->equalTo(\Magento\Cms\Model\Page::class))
197-
->willReturn($this->pageMock);
154+
->willReturn($page);
198155

199-
$this->pageMock->expects($this->any())
156+
$page->expects($this->any())
200157
->method('load')
201158
->willReturnSelf();
202-
$this->pageMock->expects($this->any())
159+
$page->expects($this->any())
203160
->method('getId')
204161
->willReturn(true);
205-
$this->pageMock->expects($this->once())->method('setData');
206-
$this->pageMock->expects($this->once())->method('save');
162+
$page->expects($this->once())->method('setData');
163+
$this->pageRepository->expects($this->once())->method('save')->with($page);
207164

208165
$this->dataPersistorMock->expects($this->any())
209166
->method('clear')
@@ -240,20 +197,21 @@ public function testSaveAndContinue()
240197
$this->dataProcessorMock->expects($this->any())
241198
->method('filter')
242199
->willReturnArgument(0);
243-
244-
$this->objectManagerMock->expects($this->atLeastOnce())
200+
$page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
201+
->disableOriginalConstructor()
202+
->getMock();
203+
$this->pageFactory->expects($this->atLeastOnce())
245204
->method('create')
246-
->with($this->equalTo(\Magento\Cms\Model\Page::class))
247-
->willReturn($this->pageMock);
205+
->willReturn($page);
248206

249-
$this->pageMock->expects($this->any())
207+
$page->expects($this->any())
250208
->method('load')
251209
->willReturnSelf();
252-
$this->pageMock->expects($this->any())
210+
$page->expects($this->any())
253211
->method('getId')
254212
->willReturn(true);
255-
$this->pageMock->expects($this->once())->method('setData');
256-
$this->pageMock->expects($this->once())->method('save');
213+
$page->expects($this->once())->method('setData');
214+
$this->pageRepository->expects($this->once())->method('save')->with($page);
257215

258216
$this->messageManagerMock->expects($this->once())
259217
->method('addSuccess')
@@ -286,20 +244,22 @@ public function testSaveActionThrowsException()
286244
$this->dataProcessorMock->expects($this->any())
287245
->method('filter')
288246
->willReturnArgument(0);
289-
290-
$this->objectManagerMock->expects($this->atLeastOnce())
247+
$page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
248+
->disableOriginalConstructor()
249+
->getMock();
250+
$this->pageFactory->expects($this->atLeastOnce())
291251
->method('create')
292-
->with($this->equalTo(\Magento\Cms\Model\Page::class))
293-
->willReturn($this->pageMock);
252+
->willReturn($page);
294253

295-
$this->pageMock->expects($this->any())
254+
$page->expects($this->any())
296255
->method('load')
297256
->willReturnSelf();
298-
$this->pageMock->expects($this->any())
257+
$page->expects($this->any())
299258
->method('getId')
300259
->willReturn(true);
301-
$this->pageMock->expects($this->once())->method('setData');
302-
$this->pageMock->expects($this->once())->method('save')->willThrowException(new \Exception('Error message.'));
260+
$page->expects($this->once())->method('setData');
261+
$this->pageRepository->expects($this->once())->method('save')->with($page)
262+
->willThrowException(new \Exception('Error message.'));
303263

304264
$this->messageManagerMock->expects($this->never())
305265
->method('addSuccess');

0 commit comments

Comments
 (0)