Skip to content

Commit 59f16b8

Browse files
committed
Merge branch 'MAGETWO-58599' of github.com:magento-troll/magento2ce into MAGETWO-62334
2 parents 3002ec8 + f8916a7 commit 59f16b8

File tree

7 files changed

+172
-12
lines changed

7 files changed

+172
-12
lines changed

app/code/Magento/User/Model/ResourceModel/User.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public function hasAssigned2Role($user)
174174
*/
175175
protected function _afterSave(\Magento\Framework\Model\AbstractModel $user)
176176
{
177-
$user->setExtra(unserialize($user->getExtra()));
177+
$user->setExtra($this->getSerializer()->unserialize($user->getExtra()));
178178
if ($user->hasRoleId()) {
179179
$this->_clearUserRoles($user);
180180
$this->_createUserRole($user->getRoleId(), $user);
@@ -239,7 +239,7 @@ protected function _createUserRole($parentId, ModelUser $user)
239239
protected function _afterLoad(\Magento\Framework\Model\AbstractModel $user)
240240
{
241241
if (is_string($user->getExtra())) {
242-
$user->setExtra(unserialize($user->getExtra()));
242+
$user->setExtra($this->getSerializer()->unserialize($user->getExtra()));
243243
}
244244
return parent::_afterLoad($user);
245245
}

app/code/Magento/User/Model/User.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77

88
use Magento\Backend\App\Area\FrontNameResolver;
99
use Magento\Backend\Model\Auth\Credential\StorageInterface;
10+
use Magento\Framework\App\ObjectManager;
1011
use Magento\Framework\Model\AbstractModel;
1112
use Magento\Framework\Exception\AuthenticationException;
13+
use Magento\Framework\Serialize\Serializer\Json;
1214
use Magento\Store\Model\Store;
1315
use Magento\User\Api\Data\UserInterface;
1416

@@ -113,6 +115,11 @@ class User extends AbstractModel implements StorageInterface, UserInterface
113115
*/
114116
protected $validationRules;
115117

118+
/**
119+
* @var Json
120+
*/
121+
private $serializer;
122+
116123
/**
117124
* @param \Magento\Framework\Model\Context $context
118125
* @param \Magento\Framework\Registry $registry
@@ -123,10 +130,11 @@ class User extends AbstractModel implements StorageInterface, UserInterface
123130
* @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
124131
* @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
125132
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
126-
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
127133
* @param UserValidationRules $validationRules
134+
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
128135
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
129136
* @param array $data
137+
* @param Json $serializer
130138
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
131139
*/
132140
public function __construct(
@@ -142,7 +150,8 @@ public function __construct(
142150
UserValidationRules $validationRules,
143151
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
144152
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
145-
array $data = []
153+
array $data = [],
154+
Json $serializer = null
146155
) {
147156
$this->_encryptor = $encryptor;
148157
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
@@ -153,6 +162,7 @@ public function __construct(
153162
$this->_transportBuilder = $transportBuilder;
154163
$this->_storeManager = $storeManager;
155164
$this->validationRules = $validationRules;
165+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
156166
}
157167

158168
/**
@@ -194,6 +204,7 @@ public function __wakeup()
194204
{
195205
parent::__wakeup();
196206
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
207+
$this->serializer = $objectManager->get(Json::class);
197208
$this->_eventManager = $objectManager->get(\Magento\Framework\Event\ManagerInterface::class);
198209
$this->_userData = $objectManager->get(\Magento\User\Helper\Data::class);
199210
$this->_config = $objectManager->get(\Magento\Backend\App\ConfigInterface::class);
@@ -213,7 +224,7 @@ public function __wakeup()
213224
public function beforeSave()
214225
{
215226
$data = [
216-
'extra' => serialize($this->getExtra()),
227+
'extra' => $this->serializer->serialize($this->getExtra()),
217228
];
218229

219230
if ($this->_willSavePassword()) {
@@ -327,7 +338,7 @@ public function afterSave()
327338
public function saveExtra($data)
328339
{
329340
if (is_array($data)) {
330-
$data = serialize($data);
341+
$data = $this->serializer->serialize($data);
331342
}
332343
$this->_getResource()->saveExtra($this, $data);
333344
return $this;

app/code/Magento/User/Setup/UpgradeData.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,30 @@
55
*/
66
namespace Magento\User\Setup;
77

8+
use Magento\Framework\DB\DataConverter\SerializedToJson;
9+
use Magento\Framework\DB\FieldDataConverterFactory;
810
use Magento\Framework\Encryption\Encryptor;
911
use Magento\Framework\Setup\ModuleContextInterface;
1012
use Magento\Framework\Setup\ModuleDataSetupInterface;
1113
use Magento\Framework\Setup\UpgradeDataInterface;
1214

1315
class UpgradeData implements UpgradeDataInterface
1416
{
17+
/**
18+
* @var FieldDataConverterFactory
19+
*/
20+
private $fieldDataConverterFactory;
21+
22+
/**
23+
* UpgradeData constructor.
24+
*
25+
* @param FieldDataConverterFactory $fieldDataConverterFactory
26+
*/
27+
public function __construct(
28+
FieldDataConverterFactory $fieldDataConverterFactory
29+
) {
30+
$this->fieldDataConverterFactory = $fieldDataConverterFactory;
31+
}
1532

1633
/**
1734
* @inheritdoc
@@ -24,6 +41,10 @@ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface
2441
$this->upgradeHash($setup);
2542
}
2643

44+
if (version_compare($context->getVersion(), '2.0.2', '<')) {
45+
$this->upgradeSerializedFields($setup);
46+
}
47+
2748
$setup->endSetup();
2849
}
2950

@@ -56,4 +77,23 @@ private function upgradeHash($setup)
5677
$setup->getConnection()->update($customerEntityTable, $bind, $where);
5778
}
5879
}
80+
81+
/**
82+
* Convert serialized data in fields to json format
83+
*
84+
* @param ModuleDataSetupInterface $setup
85+
*
86+
* @return void
87+
*/
88+
private function upgradeSerializedFields($setup)
89+
{
90+
$fieldDataConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class);
91+
92+
$fieldDataConverter->convert(
93+
$setup->getConnection(),
94+
$setup->getTable('admin_user'),
95+
'user_id',
96+
'extra'
97+
);
98+
}
5999
}

app/code/Magento/User/Test/Unit/Model/ResourceModel/UserTest.php

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
namespace Magento\User\Test\Unit\Model\ResourceModel;
88

9+
use Magento\Framework\Serialize\Serializer\Json;
10+
911
/**
1012
* Test class for \Magento\User\Model\ResourceModel\User testing
1113
*
@@ -414,10 +416,30 @@ public function testAfterSave()
414416
$roleId = 123;
415417
$methodUserMock = $this->getMockBuilder(\Magento\User\Model\User::class)
416418
->disableOriginalConstructor()
417-
->setMethods(['hasRoleId', 'getRoleId'])
419+
->setMethods(['hasRoleId', 'getRoleId', 'getExtra', 'setExtra'])
418420
->getMock();
419421
$methodUserMock->expects($this->once())->method('hasRoleId')->willReturn(true);
420422
$methodUserMock->expects($this->once())->method('getRoleId')->willReturn($roleId);
423+
$extraData = ['user', 'extra', 'data'];
424+
425+
$serializerMock = $this->getMock(Json::class, ['serialize', 'unserialize'], [], '', false);
426+
$serializerMock->expects($this->once())
427+
->method('unserialize')
428+
->with(json_encode($extraData))
429+
->will($this->returnValue($extraData));
430+
431+
$methodUserMock->expects($this->once())
432+
->method('getExtra')
433+
->will($this->returnValue(json_encode($extraData)));
434+
435+
$methodUserMock->expects($this->once())
436+
->method('setExtra')
437+
->with($extraData);
438+
439+
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
440+
441+
$objectManager->setBackwardCompatibleProperty($this->model, 'serializer', $serializerMock);
442+
421443
$this->resourceMock->expects($this->atLeastOnce())->method('getConnection')->willReturn($this->dbAdapterMock);
422444
$this->roleFactoryMock->expects($this->once())->method('create')->willReturn($this->roleMock);
423445
$this->roleMock->expects($this->once())->method('load')->willReturn($this->roleMock);
@@ -430,6 +452,67 @@ public function testAfterSave()
430452
);
431453
}
432454

455+
public function testAfterLoad()
456+
{
457+
$methodUserMock = $this->getMockBuilder(\Magento\User\Model\User::class)
458+
->disableOriginalConstructor()
459+
->setMethods(['getExtra', 'setExtra'])
460+
->getMock();
461+
$extraData = ['user', 'extra', 'data'];
462+
463+
$serializerMock = $this->getMock(Json::class, ['serialize', 'unserialize'], [], '', false);
464+
$serializerMock->expects($this->once())
465+
->method('unserialize')
466+
->with(json_encode($extraData))
467+
->will($this->returnValue($extraData));
468+
469+
$methodUserMock->expects($this->exactly(2))
470+
->method('getExtra')
471+
->will($this->returnValue(json_encode($extraData)));
472+
473+
$methodUserMock->expects($this->once())
474+
->method('setExtra')
475+
->with($extraData);
476+
477+
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
478+
479+
$objectManager->setBackwardCompatibleProperty($this->model, 'serializer', $serializerMock);
480+
481+
$this->assertInstanceOf(
482+
\Magento\User\Model\ResourceModel\User::class,
483+
$this->invokeMethod($this->model, '_afterLoad', [$methodUserMock])
484+
);
485+
}
486+
487+
public function testAfterLoadNoExtra()
488+
{
489+
$methodUserMock = $this->getMockBuilder(\Magento\User\Model\User::class)
490+
->disableOriginalConstructor()
491+
->setMethods(['getExtra', 'setExtra'])
492+
->getMock();
493+
$extraData = null;
494+
495+
$serializerMock = $this->getMock(Json::class, ['serialize', 'unserialize'], [], '', false);
496+
$serializerMock->expects($this->never())
497+
->method('unserialize');
498+
499+
$methodUserMock->expects($this->exactly(1))
500+
->method('getExtra')
501+
->will($this->returnValue($extraData));
502+
503+
$methodUserMock->expects($this->never())
504+
->method('setExtra');
505+
506+
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
507+
508+
$objectManager->setBackwardCompatibleProperty($this->model, 'serializer', $serializerMock);
509+
510+
$this->assertInstanceOf(
511+
\Magento\User\Model\ResourceModel\User::class,
512+
$this->invokeMethod($this->model, '_afterLoad', [$methodUserMock])
513+
);
514+
}
515+
433516
/**
434517
* Call protected/private method of a class.
435518
*

app/code/Magento/User/Test/Unit/Model/UserTest.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66

77
namespace Magento\User\Test\Unit\Model;
88

9-
use Magento\User\Model\UserValidationRules;
9+
use Magento\Framework\Serialize\Serializer\Json;
1010

1111
/**
1212
* Test class for \Magento\User\Model\User testing
1313
*
1414
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
15+
* @SuppressWarnings(PHPMD.TooManyFields)
1516
*/
1617
class UserTest extends \PHPUnit_Framework_TestCase
1718
{
@@ -60,6 +61,11 @@ class UserTest extends \PHPUnit_Framework_TestCase
6061
/** @var \Magento\Authorization\Model\RoleFactory|\PHPUnit_Framework_MockObject_MockObject */
6162
protected $roleFactoryMock;
6263

64+
/**
65+
* @var Json|\PHPUnit_Framework_MockObject_MockObject
66+
*/
67+
private $serializer;
68+
6369
/**
6470
* Set required values
6571
* @return void
@@ -128,6 +134,8 @@ protected function setUp()
128134
->setMethods(['validateHash'])
129135
->getMockForAbstractClass();
130136

137+
$this->serializer = $this->getMock(Json::class, ['serialize', 'unserialize'], [], '', false);
138+
131139
$objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
132140
$this->model = $objectManagerHelper->getObject(
133141
\Magento\User\Model\User::class,
@@ -143,7 +151,8 @@ protected function setUp()
143151
'storeManager' => $this->storeManagerMock,
144152
'validationRules' => $this->validationRulesMock,
145153
'config' => $this->configMock,
146-
'encryptor' => $this->encryptorMock
154+
'encryptor' => $this->encryptorMock,
155+
'serializer' => $this->serializer
147156
]
148157
);
149158
}
@@ -450,7 +459,15 @@ public function testValidateInvalid()
450459
public function testSaveExtra()
451460
{
452461
$data = [1, 2, 3];
453-
$this->resourceMock->expects($this->once())->method('saveExtra')->with($this->model, serialize($data));
462+
$this->resourceMock->expects($this->once())
463+
->method('saveExtra')
464+
->with($this->model, json_encode($data));
465+
466+
$this->serializer->expects($this->once())
467+
->method('serialize')
468+
->with($data)
469+
->will($this->returnValue(json_encode($data)));
470+
454471
$this->assertInstanceOf(\Magento\User\Model\User::class, $this->model->saveExtra($data));
455472
}
456473

app/code/Magento/User/etc/module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9-
<module name="Magento_User" setup_version="2.0.1">
9+
<module name="Magento_User" setup_version="2.0.2">
1010
<sequence>
1111
<module name="Magento_Backend"/>
1212
</sequence>

dev/tests/integration/testsuite/Magento/User/Model/UserTest.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// @codingStandardsIgnoreFile
88

99
namespace Magento\User\Model;
10+
use Magento\Framework\Serialize\Serializer\Json;
1011

1112
/**
1213
* @magentoAppArea adminhtml
@@ -28,6 +29,11 @@ class UserTest extends \PHPUnit_Framework_TestCase
2829
*/
2930
protected static $_newRole;
3031

32+
/**
33+
* @var Json
34+
*/
35+
private $serializer;
36+
3137
protected function setUp()
3238
{
3339
$this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
@@ -36,6 +42,9 @@ protected function setUp()
3642
$this->_dateTime = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
3743
\Magento\Framework\Stdlib\DateTime::class
3844
);
45+
$this->serializer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
46+
Json::class
47+
);
3948
}
4049

4150
/**
@@ -113,7 +122,7 @@ public function testSaveExtra()
113122
$this->_model->loadByUsername(\Magento\TestFramework\Bootstrap::ADMIN_NAME);
114123
$this->_model->saveExtra(['test' => 'val']);
115124
$this->_model->loadByUsername(\Magento\TestFramework\Bootstrap::ADMIN_NAME);
116-
$extra = unserialize($this->_model->getExtra());
125+
$extra = $this->serializer->unserialize($this->_model->getExtra());
117126
$this->assertEquals($extra['test'], 'val');
118127
}
119128

0 commit comments

Comments
 (0)