Skip to content

Commit d28b5d0

Browse files
authored
Merge pull request #834 from magento-troll/MAGETWO-62334
MAGETWO-62334: Remove uses of unserialize in \Magento\Swatches\Helper\Data attribute additional_data MAGETWO-58599: Remove uses of unserialize in Magento_User MAGETWO-62333: Remove uses of unserialize in \Magento\Sales\Model\Order\Creditmemo\Item attribute tax_ratio MAGETWO-64587: getRelativePath issue in \Magento\Catalog\Model\View\Asset\Image
2 parents 2d2d18d + 53c72a2 commit d28b5d0

File tree

26 files changed

+463
-70
lines changed

26 files changed

+463
-70
lines changed

app/bootstrap.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,7 @@
5858
}
5959

6060
date_default_timezone_set('UTC');
61+
62+
/* Adjustment of precision value for several versions of PHP */
63+
ini_set('precision', 17);
64+
ini_set('serialize_precision', 17);

app/code/Magento/Catalog/Model/View/Asset/Image.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public function getContentType()
9595
*/
9696
public function getPath()
9797
{
98-
return $this->getRelativePath($this->context->getPath());
98+
return $this->getAbsolutePath($this->context->getPath());
9999
}
100100

101101
/**
@@ -175,6 +175,21 @@ private function getMiscPath()
175175
return $this->encryptor->hash(implode('_', $this->miscParams), Encryptor::HASH_VERSION_MD5);
176176
}
177177

178+
/**
179+
* Generate absolute path
180+
*
181+
* @param string $result
182+
* @return string
183+
*/
184+
private function getAbsolutePath($result)
185+
{
186+
$prefix = (substr($result, 0, 1) == DIRECTORY_SEPARATOR) ? DIRECTORY_SEPARATOR : '';
187+
$result = $this->join($result, $this->getModule());
188+
$result = $this->join($result, $this->getMiscPath());
189+
$result = $this->join($result, $this->getFilePath());
190+
return $prefix . $result;
191+
}
192+
178193
/**
179194
* Generate relative path
180195
*

app/code/Magento/Catalog/Test/Unit/Model/View/Asset/ImageTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,30 @@ public function testGetPath($filePath, $miscParams)
9797
);
9898
}
9999

100+
/**
101+
* @param string $filePath
102+
* @param array $miscParams
103+
* @dataProvider getPathDataProvider
104+
*/
105+
public function testGetNotUnixPath($filePath, $miscParams)
106+
{
107+
$imageModel = new Image(
108+
$this->mediaConfig,
109+
$this->imageContext,
110+
$this->encryptor,
111+
$filePath,
112+
$miscParams
113+
);
114+
$absolutePath = 'C:\www\magento2ce\pub\media\catalog\product';
115+
$hashPath = md5(implode('_', $miscParams));
116+
$this->imageContext->expects($this->once())->method('getPath')->willReturn($absolutePath);
117+
$this->encryptor->expects($this->once())->method('hash')->willReturn($hashPath);
118+
$this->assertEquals(
119+
$absolutePath . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . $hashPath . $filePath,
120+
$imageModel->getPath()
121+
);
122+
}
123+
100124
/**
101125
* @param string $filePath
102126
* @param array $miscParams

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
*/
66
namespace Magento\Sales\Setup;
77

8+
use Magento\Framework\App\ObjectManager;
9+
use Magento\Framework\DB\FieldDataConverterFactory;
10+
use Magento\Framework\DB\DataConverter\SerializedToJson;
11+
812
/**
913
* Data upgrade script
1014
*/
@@ -27,21 +31,30 @@ class UpgradeData implements \Magento\Framework\Setup\UpgradeDataInterface
2731
*/
2832
private $convertSerializedDataToJsonFactory;
2933

34+
/**
35+
* @var FieldDataConverterFactory
36+
*/
37+
private $fieldDataConverterFactory;
38+
3039
/**
3140
* Constructor
3241
*
3342
* @param \Magento\Sales\Setup\SalesSetupFactory $salesSetupFactory
3443
* @param \Magento\Sales\Setup\ConvertSerializedDataToJsonFactory $convertSerializedDataToJsonFactory
3544
* @param \Magento\Eav\Model\Config $eavConfig
45+
* @param FieldDataConverterFactory $fieldDataConverterFactory
3646
*/
3747
public function __construct(
3848
\Magento\Sales\Setup\SalesSetupFactory $salesSetupFactory,
3949
\Magento\Sales\Setup\ConvertSerializedDataToJsonFactory $convertSerializedDataToJsonFactory,
40-
\Magento\Eav\Model\Config $eavConfig
50+
\Magento\Eav\Model\Config $eavConfig,
51+
FieldDataConverterFactory $fieldDataConverterFactory = null
4152
) {
4253
$this->salesSetupFactory = $salesSetupFactory;
4354
$this->convertSerializedDataToJsonFactory = $convertSerializedDataToJsonFactory;
4455
$this->eavConfig = $eavConfig;
56+
$this->fieldDataConverterFactory = $fieldDataConverterFactory ?: ObjectManager::getInstance()
57+
->get(FieldDataConverterFactory::class);
4558
}
4659

4760
/**
@@ -59,6 +72,21 @@ public function upgrade(
5972
$this->convertSerializedDataToJsonFactory->create(['salesSetup' => $salesSetup])
6073
->convert();
6174
}
75+
if (version_compare($context->getVersion(), '2.0.6', '<')) {
76+
$fieldDataConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class);
77+
$fieldDataConverter->convert(
78+
$salesSetup->getConnection(),
79+
$salesSetup->getTable('sales_invoice_item'),
80+
'entity_id',
81+
'tax_ratio'
82+
);
83+
$fieldDataConverter->convert(
84+
$salesSetup->getConnection(),
85+
$salesSetup->getTable('sales_creditmemo_item'),
86+
'entity_id',
87+
'tax_ratio'
88+
);
89+
}
6290
$this->eavConfig->clear();
6391
}
6492

app/code/Magento/Sales/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_Sales" setup_version="2.0.5">
9+
<module name="Magento_Sales" setup_version="2.0.6">
1010
<sequence>
1111
<module name="Magento_Rule"/>
1212
<module name="Magento_Catalog"/>

app/code/Magento/Swatches/Block/Adminhtml/Product/Attribute/Edit/Form.php

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,45 @@
66

77
namespace Magento\Swatches\Block\Adminhtml\Product\Attribute\Edit;
88

9+
use Magento\Framework\Data\Form\Element\CollectionFactory as ElementCollectionFactory;
10+
use Magento\Framework\Data\Form\Element\Factory;
11+
use Magento\Framework\Data\Form\FormKey;
912
use Magento\Swatches\Model\Swatch;
13+
use Magento\Framework\Serialize\Serializer\Json;
14+
use Magento\Framework\App\ObjectManager;
1015

1116
/**
1217
* Class Form
1318
*/
1419
class Form extends \Magento\Framework\Data\Form
1520
{
21+
/**
22+
* Serializer that allow convert arrays to string.
23+
*
24+
* @var Json
25+
*/
26+
private $serializer;
27+
28+
/**
29+
* Form constructor.
30+
*
31+
* @param Factory $factoryElement
32+
* @param ElementCollectionFactory $factoryCollection
33+
* @param FormKey $formKey
34+
* @param array $data
35+
* @param Json|null $serializer
36+
*/
37+
public function __construct(
38+
Factory $factoryElement,
39+
ElementCollectionFactory $factoryCollection,
40+
FormKey $formKey,
41+
array $data = [],
42+
Json $serializer = null
43+
) {
44+
parent::__construct($factoryElement, $factoryCollection, $formKey, $data);
45+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
46+
}
47+
1648
/**
1749
* @param array $values
1850
* @return $this
@@ -43,7 +75,7 @@ protected function getAdditionalData(array $values)
4375
{
4476
$additionalData = [];
4577
if (isset($values['additional_data'])) {
46-
$additionalData = unserialize($values['additional_data']);
78+
$additionalData = $this->serializer->unserialize($values['additional_data']);
4779
if (!is_array($additionalData)) {
4880
$additionalData = [];
4981
}

app/code/Magento/Swatches/Helper/Data.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
use Magento\Catalog\Helper\Image;
99
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
1010
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
11-
use Magento\Framework\App\Helper\Context;
1211
use Magento\Catalog\Api\Data\ProductInterface as Product;
1312
use Magento\Catalog\Model\Product as ModelProduct;
1413
use Magento\Store\Model\StoreManagerInterface;
1514
use Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory as SwatchCollectionFactory;
1615
use Magento\Swatches\Model\Swatch;
1716
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
18-
use Magento\Framework\Exception\InputException;
1917
use Magento\Catalog\Api\ProductRepositoryInterface;
2018
use Magento\Catalog\Model\ResourceModel\Product\Collection as ProductCollection;
19+
use Magento\Framework\Serialize\Serializer\Json;
20+
use Magento\Framework\App\ObjectManager;
2121

2222
/**
2323
* Class Helper Data
@@ -81,25 +81,35 @@ class Data
8181
'use_product_image_for_swatch'
8282
];
8383

84+
/**
85+
* Serializer to/from JSON.
86+
*
87+
* @var Json
88+
*/
89+
private $serializer;
90+
8491
/**
8592
* @param CollectionFactory $productCollectionFactory
8693
* @param ProductRepositoryInterface $productRepository
8794
* @param StoreManagerInterface $storeManager
8895
* @param SwatchCollectionFactory $swatchCollectionFactory
8996
* @param Image $imageHelper
97+
* @param Json|null $serializer
9098
*/
9199
public function __construct(
92100
CollectionFactory $productCollectionFactory,
93101
ProductRepositoryInterface $productRepository,
94102
StoreManagerInterface $storeManager,
95103
SwatchCollectionFactory $swatchCollectionFactory,
96-
Image $imageHelper
104+
Image $imageHelper,
105+
Json $serializer = null
97106
) {
98107
$this->productCollectionFactory = $productCollectionFactory;
99108
$this->productRepository = $productRepository;
100109
$this->storeManager = $storeManager;
101110
$this->swatchCollectionFactory = $swatchCollectionFactory;
102111
$this->imageHelper = $imageHelper;
112+
$this->serializer = $serializer ?: ObjectManager::getInstance()->create(Json::class);
103113
}
104114

105115
/**
@@ -111,7 +121,7 @@ public function assembleAdditionalDataEavAttribute(Attribute $attribute)
111121
$initialAdditionalData = [];
112122
$additionalData = (string) $attribute->getData('additional_data');
113123
if (!empty($additionalData)) {
114-
$additionalData = unserialize($additionalData);
124+
$additionalData = $this->serializer->unserialize($additionalData);
115125
if (is_array($additionalData)) {
116126
$initialAdditionalData = $additionalData;
117127
}
@@ -125,7 +135,7 @@ public function assembleAdditionalDataEavAttribute(Attribute $attribute)
125135
}
126136
}
127137
$additionalData = array_merge($initialAdditionalData, $dataToAdd);
128-
$attribute->setData('additional_data', serialize($additionalData));
138+
$attribute->setData('additional_data', $this->serializer->serialize($additionalData));
129139
return $this;
130140
}
131141

@@ -135,7 +145,7 @@ public function assembleAdditionalDataEavAttribute(Attribute $attribute)
135145
*/
136146
private function populateAdditionalDataEavAttribute(Attribute $attribute)
137147
{
138-
$additionalData = unserialize($attribute->getData('additional_data'));
148+
$additionalData = $this->serializer->unserialize($attribute->getData('additional_data'));
139149
if (isset($additionalData) && is_array($additionalData)) {
140150
foreach ($this->eavAttributeAdditionalDataKeys as $key) {
141151
if (isset($additionalData[$key])) {

app/code/Magento/Swatches/Model/Plugin/EavAttribute.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
99
use Magento\Swatches\Model\Swatch;
1010
use Magento\Framework\Exception\InputException;
11+
use Magento\Framework\Serialize\Serializer\Json;
12+
use Magento\Framework\App\ObjectManager;
1113

1214
/**
1315
* Plugin model for Catalog Resource Attribute
@@ -50,19 +52,29 @@ class EavAttribute
5052
*/
5153
protected $isSwatchExists;
5254

55+
/**
56+
* Serializer from arrays to string.
57+
*
58+
* @var Json
59+
*/
60+
private $serializer;
61+
5362
/**
5463
* @param \Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory $collectionFactory
5564
* @param \Magento\Swatches\Model\SwatchFactory $swatchFactory
5665
* @param \Magento\Swatches\Helper\Data $swatchHelper
66+
* @param Json|null $serializer
5767
*/
5868
public function __construct(
5969
\Magento\Swatches\Model\ResourceModel\Swatch\CollectionFactory $collectionFactory,
6070
\Magento\Swatches\Model\SwatchFactory $swatchFactory,
61-
\Magento\Swatches\Helper\Data $swatchHelper
71+
\Magento\Swatches\Helper\Data $swatchHelper,
72+
Json $serializer = null
6273
) {
6374
$this->swatchCollectionFactory = $collectionFactory;
6475
$this->swatchFactory = $swatchFactory;
6576
$this->swatchHelper = $swatchHelper;
77+
$this->serializer = $serializer ?: ObjectManager::getInstance()->create(Json::class);
6678
}
6779

6880
/**
@@ -135,10 +147,10 @@ protected function convertSwatchToDropdown(Attribute $attribute)
135147
if ($attribute->getData(Swatch::SWATCH_INPUT_TYPE_KEY) == Swatch::SWATCH_INPUT_TYPE_DROPDOWN) {
136148
$additionalData = $attribute->getData('additional_data');
137149
if (!empty($additionalData)) {
138-
$additionalData = unserialize($additionalData);
150+
$additionalData = $this->serializer->unserialize($additionalData);
139151
if (is_array($additionalData) && isset($additionalData[Swatch::SWATCH_INPUT_TYPE_KEY])) {
140152
unset($additionalData[Swatch::SWATCH_INPUT_TYPE_KEY]);
141-
$attribute->setData('additional_data', serialize($additionalData));
153+
$attribute->setData('additional_data', $this->serializer->serialize($additionalData));
142154
}
143155
}
144156
}

0 commit comments

Comments
 (0)