-
Notifications
You must be signed in to change notification settings - Fork 9.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Refactor ConfigGenerator to replace/set crypt key instead of append #11155
Changes from 28 commits
13daa74
f50ad05
4f3e981
2718be3
b517623
345a7f3
ae06955
43e9751
4b748cf
010097d
2316cd8
c7ca261
eb33d60
61d9767
aec956f
e440946
885ecf8
91ee875
3faf8b5
1fd5b0e
a2ae382
c868fa2
d78ae56
b2146db
bab5e31
c638fd7
62eff1d
58aab5e
e8fe7ed
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
|
||
namespace Magento\Framework\Config\Data; | ||
|
||
use Magento\Framework\App\ObjectManager; | ||
use Magento\Framework\ObjectManagerInterface; | ||
|
||
/** | ||
* Factory for ConfigData | ||
*/ | ||
class ConfigDataFactory | ||
{ | ||
/** | ||
* @var ObjectManager | ||
*/ | ||
private $objectManager; | ||
|
||
/** | ||
* Factory constructor | ||
* | ||
* @param ObjectManagerInterface $objectManager | ||
*/ | ||
public function __construct(ObjectManagerInterface $objectManager) | ||
{ | ||
$this->objectManager = $objectManager; | ||
} | ||
|
||
/** | ||
* Returns a new instance of ConfigData on every call. | ||
* | ||
* @param string $fileKey | ||
* @return ConfigData | ||
*/ | ||
public function create($fileKey) | ||
{ | ||
return $this->objectManager->create(ConfigData::class, ['fileKey' => $fileKey]); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,13 +6,14 @@ | |
|
||
namespace Magento\Setup\Model; | ||
|
||
use Magento\Framework\App\ObjectManager; | ||
use Magento\Framework\Config\Data\ConfigData; | ||
use Magento\Framework\Config\Data\ConfigDataFactory; | ||
use Magento\Framework\Config\File\ConfigFilePool; | ||
use Magento\Framework\Math\Random; | ||
use Magento\Framework\App\DeploymentConfig; | ||
use Magento\Framework\Config\ConfigOptionsListConstants; | ||
use Magento\Framework\App\State; | ||
use Magento\Framework\App\ObjectManagerFactory; | ||
use Magento\Framework\Math\Random; | ||
|
||
/** | ||
* Creates deployment config data based on user input array | ||
|
@@ -26,39 +27,58 @@ class ConfigGenerator | |
* @var array | ||
*/ | ||
private static $paramMap = [ | ||
ConfigOptionsListConstants::INPUT_KEY_DB_HOST => ConfigOptionsListConstants::KEY_HOST, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_NAME => ConfigOptionsListConstants::KEY_NAME, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_USER => ConfigOptionsListConstants::KEY_USER, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD => ConfigOptionsListConstants::KEY_PASSWORD, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX => ConfigOptionsListConstants::KEY_PREFIX, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_MODEL => ConfigOptionsListConstants::KEY_MODEL, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_ENGINE => ConfigOptionsListConstants::KEY_ENGINE, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_HOST => ConfigOptionsListConstants::KEY_HOST, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_NAME => ConfigOptionsListConstants::KEY_NAME, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_USER => ConfigOptionsListConstants::KEY_USER, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_PASSWORD => ConfigOptionsListConstants::KEY_PASSWORD, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_PREFIX => ConfigOptionsListConstants::KEY_PREFIX, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_MODEL => ConfigOptionsListConstants::KEY_MODEL, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_ENGINE => ConfigOptionsListConstants::KEY_ENGINE, | ||
ConfigOptionsListConstants::INPUT_KEY_DB_INIT_STATEMENTS => ConfigOptionsListConstants::KEY_INIT_STATEMENTS, | ||
ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => ConfigOptionsListConstants::KEY_ENCRYPTION_KEY, | ||
ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => ConfigOptionsListConstants::KEY_SAVE, | ||
ConfigOptionsListConstants::INPUT_KEY_RESOURCE => ConfigOptionsListConstants::KEY_RESOURCE, | ||
ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY => ConfigOptionsListConstants::KEY_ENCRYPTION_KEY, | ||
ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE => ConfigOptionsListConstants::KEY_SAVE, | ||
ConfigOptionsListConstants::INPUT_KEY_RESOURCE => ConfigOptionsListConstants::KEY_RESOURCE, | ||
]; | ||
|
||
/** | ||
* @var DeploymentConfig | ||
*/ | ||
protected $deploymentConfig; | ||
|
||
/** | ||
* @var Random | ||
* @deprecated since 100.2.0 | ||
*/ | ||
protected $random; | ||
|
||
/** | ||
* @var DeploymentConfig | ||
* @var ConfigDataFactory | ||
*/ | ||
protected $deploymentConfig; | ||
private $configDataFactory; | ||
|
||
/** | ||
* @var CryptKeyGeneratorInterface | ||
*/ | ||
private $cryptKeyGenerator; | ||
|
||
/** | ||
* Constructor | ||
* | ||
* @param Random $random | ||
* @param Random $random Deprecated since 100.2.0 | ||
* @param DeploymentConfig $deploymentConfig | ||
* @param ConfigDataFactory|null $configDataFactory | ||
* @param CryptKeyGeneratorInterface|null $cryptKeyGenerator | ||
*/ | ||
public function __construct(Random $random, DeploymentConfig $deploymentConfig) | ||
{ | ||
public function __construct( | ||
Random $random, | ||
DeploymentConfig $deploymentConfig, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As mentioned we need to keep the |
||
ConfigDataFactory $configDataFactory = null, | ||
CryptKeyGeneratorInterface $cryptKeyGenerator = null | ||
) { | ||
$this->random = $random; | ||
$this->deploymentConfig = $deploymentConfig; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately we still need to assign There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Aah, I thought I added id back. |
||
$this->configDataFactory = $configDataFactory ?? ObjectManager::getInstance()->get(ConfigDataFactory::class); | ||
$this->cryptKeyGenerator = $cryptKeyGenerator ?? ObjectManager::getInstance()->get(CryptKeyGenerator::class); | ||
} | ||
|
||
/** | ||
|
@@ -70,23 +90,17 @@ public function createCryptConfig(array $data) | |
{ | ||
$currentKey = $this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY); | ||
|
||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
if (isset($data[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY])) { | ||
if ($currentKey !== null) { | ||
$key = $currentKey . "\n" . $data[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY]; | ||
} else { | ||
$key = $data[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY]; | ||
} | ||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
$configData->set(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, $key); | ||
} else { | ||
if ($currentKey === null) { | ||
$configData->set( | ||
ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, | ||
md5($this->random->getRandomString(ConfigOptionsListConstants::STORE_KEY_RANDOM_STRING_SIZE)) | ||
); | ||
} | ||
} | ||
// Use given key if set, else use current | ||
$key = $data[ConfigOptionsListConstants::INPUT_KEY_ENCRYPTION_KEY] ?? $currentKey; | ||
|
||
// If there is no key given or currently set, generate a new one | ||
$key = $key ?? $this->cryptKeyGenerator->generate(); | ||
|
||
// Chaining of ".. ?? .." is not used to keep it simpler to understand | ||
|
||
$configData->set(ConfigOptionsListConstants::CONFIG_PATH_CRYPT_KEY, $key); | ||
|
||
return $configData; | ||
} | ||
|
@@ -99,7 +113,7 @@ public function createCryptConfig(array $data) | |
*/ | ||
public function createSessionConfig(array $data) | ||
{ | ||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nice work, good to see this being moved out to a factory. |
||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
if (isset($data[ConfigOptionsListConstants::INPUT_KEY_SESSION_SAVE])) { | ||
$configData->set( | ||
|
@@ -132,7 +146,7 @@ public function createDefinitionsConfig(array $data) | |
*/ | ||
public function createDbConfig(array $data) | ||
{ | ||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
$optional = [ | ||
ConfigOptionsListConstants::INPUT_KEY_DB_HOST, | ||
|
@@ -151,25 +165,18 @@ public function createDbConfig(array $data) | |
); | ||
} | ||
|
||
$dbConnectionPrefix = ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . '/'; | ||
|
||
foreach ($optional as $key) { | ||
if (isset($data[$key])) { | ||
$configData->set( | ||
ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . '/' . self::$paramMap[$key], | ||
$data[$key] | ||
); | ||
$configData->set($dbConnectionPrefix . self::$paramMap[$key], $data[$key]); | ||
} | ||
} | ||
|
||
$currentStatus = $this->deploymentConfig->get( | ||
ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT . '/' . ConfigOptionsListConstants::KEY_ACTIVE | ||
); | ||
$currentStatus = $this->deploymentConfig->get($dbConnectionPrefix . ConfigOptionsListConstants::KEY_ACTIVE); | ||
|
||
if ($currentStatus === null) { | ||
$configData->set( | ||
ConfigOptionsListConstants::CONFIG_PATH_DB_CONNECTION_DEFAULT | ||
. '/' . ConfigOptionsListConstants::KEY_ACTIVE, | ||
'1' | ||
); | ||
$configData->set($dbConnectionPrefix . ConfigOptionsListConstants::KEY_ACTIVE, '1'); | ||
} | ||
|
||
return $configData; | ||
|
@@ -182,7 +189,7 @@ public function createDbConfig(array $data) | |
*/ | ||
public function createResourceConfig() | ||
{ | ||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
if ($this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_RESOURCE_DEFAULT_SETUP) === null) { | ||
$configData->set(ConfigOptionsListConstants::CONFIG_PATH_RESOURCE_DEFAULT_SETUP, 'default'); | ||
|
@@ -198,10 +205,12 @@ public function createResourceConfig() | |
*/ | ||
public function createXFrameConfig() | ||
{ | ||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
if ($this->deploymentConfig->get(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT) === null) { | ||
$configData->set(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT, 'SAMEORIGIN'); | ||
} | ||
|
||
return $configData; | ||
} | ||
|
||
|
@@ -212,10 +221,12 @@ public function createXFrameConfig() | |
*/ | ||
public function createModeConfig() | ||
{ | ||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
if ($this->deploymentConfig->get(State::PARAM_MODE) === null) { | ||
$configData->set(State::PARAM_MODE, State::MODE_DEFAULT); | ||
} | ||
|
||
return $configData; | ||
} | ||
|
||
|
@@ -227,21 +238,29 @@ public function createModeConfig() | |
*/ | ||
public function createCacheHostsConfig(array $data) | ||
{ | ||
$configData = new ConfigData(ConfigFilePool::APP_ENV); | ||
$configData = $this->configDataFactory->create(ConfigFilePool::APP_ENV); | ||
|
||
if (isset($data[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS])) { | ||
$hostData = explode(',', $data[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS]); | ||
$hosts = []; | ||
foreach ($hostData as $data) { | ||
$dataArray = explode(':', trim($data)); | ||
$host = []; | ||
$host['host'] = $dataArray[0]; | ||
if (isset($dataArray[1])) { | ||
$host['port'] = $dataArray[1]; | ||
} | ||
$hosts[] = $host; | ||
} | ||
$hosts = explode(',', $data[ConfigOptionsListConstants::INPUT_KEY_CACHE_HOSTS]); | ||
|
||
$hosts = array_map( | ||
function ($hostData) { | ||
$hostDataParts = explode(':', trim($hostData)); | ||
|
||
$tmp = ['host' => $hostDataParts[0]]; | ||
|
||
if (isset($hostDataParts[1])) { | ||
$tmp['port'] = $hostDataParts[1]; | ||
} | ||
|
||
return $tmp; | ||
}, | ||
$hosts | ||
); | ||
|
||
$configData->set(ConfigOptionsListConstants::CONFIG_PATH_CACHE_HOSTS, $hosts); | ||
} | ||
|
||
$configData->setOverrideWhenSave(true); | ||
return $configData; | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
|
||
namespace Magento\Setup\Model; | ||
|
||
use Magento\Framework\Config\ConfigOptionsListConstants; | ||
use Magento\Framework\Math\Random; | ||
|
||
/** | ||
* Generates a crypt | ||
*/ | ||
class CryptKeyGenerator implements CryptKeyGeneratorInterface | ||
{ | ||
/** | ||
* @var Random | ||
*/ | ||
private $random; | ||
|
||
/** | ||
* CryptKeyGenerator constructor. | ||
* | ||
* @param Random $random | ||
*/ | ||
public function __construct(Random $random) | ||
{ | ||
$this->random = $random; | ||
} | ||
|
||
/** | ||
* Generates & returns a string to be used as crypt key. | ||
* | ||
* The key length is not a parameter, but an implementation detail. | ||
* | ||
* @return string | ||
* | ||
* @throws \Magento\Framework\Exception\LocalizedException | ||
*/ | ||
public function generate() | ||
{ | ||
return md5($this->getRandomString()); | ||
} | ||
|
||
/** | ||
* Returns a random string. | ||
* | ||
* @return string | ||
*/ | ||
private function getRandomString() | ||
{ | ||
return $this->random->getRandomString(ConfigOptionsListConstants::STORE_KEY_RANDOM_STRING_SIZE); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
|
||
namespace Magento\Setup\Model; | ||
|
||
/** | ||
* Interface for crypt key generators. | ||
*/ | ||
interface CryptKeyGeneratorInterface | ||
{ | ||
/** | ||
* Generates & returns a string to be used as crypt key. | ||
* | ||
* The key length is not a parameter, but an implementation detail. | ||
* | ||
* @return string | ||
*/ | ||
public function generate(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry I missed this before but this factory should either be updated to match the standard defined in http://devdocs.magento.com/guides/v2.2/extension-dev-guide/factories.html or actually it might be possible to use the autogenerated factory here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Autogenerated factories are not allowed in
Magento\Framework
as far as I know. But, the best option is to commit autogenerated factory here.