From 6d4eaef85502e069763334eefcbd256a09a22c87 Mon Sep 17 00:00:00 2001 From: guvra Date: Tue, 28 Jan 2025 13:24:36 +0100 Subject: [PATCH] Move query validation to the dumper namespace --- app/config/services.yaml | 3 - .../Processor/QueryValidationProcessor.php | 52 -------------- src/Dumper/Config/DumperConfig.php | 35 +++++++++- .../Config/Validation}/QueryValidator.php | 2 +- .../Config/Validation/WhereExprValidator.php | 1 - .../QueryValidationProcessorTest.php | 68 ------------------- tests/unit/Dumper/Config/DumperConfigTest.php | 27 ++++++++ .../Config/Validation/QueryValidatorTest.php | 2 +- 8 files changed, 62 insertions(+), 128 deletions(-) delete mode 100644 src/Config/Compiler/Processor/QueryValidationProcessor.php rename src/{Util => Dumper/Config/Validation}/QueryValidator.php (98%) delete mode 100644 tests/unit/Config/Compiler/Processor/QueryValidationProcessorTest.php diff --git a/app/config/services.yaml b/app/config/services.yaml index 3bc7ccf4..a9c4575c 100644 --- a/app/config/services.yaml +++ b/app/config/services.yaml @@ -78,9 +78,6 @@ services: config.compiler.processor.env_var: class: 'Smile\GdprDump\Config\Compiler\Processor\EnvVarProcessor' - config.compiler.processor.query_validation: - class: 'Smile\GdprDump\Config\Compiler\Processor\QueryValidationProcessor' - config.compiler.processor.version: class: 'Smile\GdprDump\Config\Compiler\Processor\VersionProcessor' diff --git a/src/Config/Compiler/Processor/QueryValidationProcessor.php b/src/Config/Compiler/Processor/QueryValidationProcessor.php deleted file mode 100644 index b65c30ea..00000000 --- a/src/Config/Compiler/Processor/QueryValidationProcessor.php +++ /dev/null @@ -1,52 +0,0 @@ -validateVarQueries($config); - $this->validateInitCommands($config); - } catch (Exception $e) { - throw new ConfigException($e->getMessage(), $e); - } - } - - /** - * Validate SQL queries found in the "variables" section of the config. - */ - private function validateVarQueries(ConfigInterface $config): void - { - $selectQueryValidator = new QueryValidator(['select']); - $varQueries = (array) $config->get('variables'); - - foreach ($varQueries as $query) { - $selectQueryValidator->validate($query); - } - } - - /** - * Validate SQL queries found in the "dump.init_commands" section of the config. - */ - private function validateInitCommands(ConfigInterface $config): void - { - $selectQueryValidator = new QueryValidator(['set']); - $dumpSettings = (array) $config->get('dump'); - - foreach ($dumpSettings['init_commands'] as $query) { - $selectQueryValidator->validate($query); - } - } -} diff --git a/src/Dumper/Config/DumperConfig.php b/src/Dumper/Config/DumperConfig.php index 8c75e37c..bde60961 100644 --- a/src/Dumper/Config/DumperConfig.php +++ b/src/Dumper/Config/DumperConfig.php @@ -9,6 +9,7 @@ use Smile\GdprDump\Dumper\Config\Definition\FilterPropagationSettings; use Smile\GdprDump\Dumper\Config\Definition\TableConfig; use Smile\GdprDump\Dumper\Config\Definition\TableConfigCollection; +use Smile\GdprDump\Dumper\Config\Validation\QueryValidator; final class DumperConfig implements DumperConfigInterface { @@ -49,8 +50,8 @@ final class DumperConfig implements DumperConfigInterface public function __construct(ConfigInterface $config) { - $this->varQueries = (array) $config->get('variables', []); - $this->dumpSettings = (array) $config->get('dump', []); + $this->prepareDumpSettings($config); + $this->prepareVarQueries($config); $this->prepareFakerSettings($config); $this->prepareFilterPropagationSettings($config); $this->prepareTableSettings($config); @@ -144,6 +145,36 @@ public function getTablesToSort(): array return $this->tablesToSort; } + /** + * Prepare dump settings. + */ + private function prepareDumpSettings(ConfigInterface $config): void + { + $this->dumpSettings = (array) $config->get('dump', []); + + // Validate init commands + $queryValidator = new QueryValidator(['set']); + $initCommands = (array) ($this->dumpSettings['init_commands'] ?? []); + + foreach ($initCommands as $query) { + $queryValidator->validate($query); + } + } + + /** + * Prepare SQL variables. + */ + private function prepareVarQueries(ConfigInterface $config): void + { + $this->varQueries = (array) $config->get('variables', []); + + // Validate SQL queries + $queryValidator = new QueryValidator(['select']); + foreach ($this->varQueries as $query) { + $queryValidator->validate($query); + } + } + /** * Prepare faker settings. */ diff --git a/src/Util/QueryValidator.php b/src/Dumper/Config/Validation/QueryValidator.php similarity index 98% rename from src/Util/QueryValidator.php rename to src/Dumper/Config/Validation/QueryValidator.php index ccd21428..c2996e6f 100644 --- a/src/Util/QueryValidator.php +++ b/src/Dumper/Config/Validation/QueryValidator.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Smile\GdprDump\Util; +namespace Smile\GdprDump\Dumper\Config\Validation; use TheSeer\Tokenizer\TokenCollection; use TheSeer\Tokenizer\Tokenizer; diff --git a/src/Dumper/Config/Validation/WhereExprValidator.php b/src/Dumper/Config/Validation/WhereExprValidator.php index 63551352..ad819ce2 100644 --- a/src/Dumper/Config/Validation/WhereExprValidator.php +++ b/src/Dumper/Config/Validation/WhereExprValidator.php @@ -4,7 +4,6 @@ namespace Smile\GdprDump\Dumper\Config\Validation; -use Smile\GdprDump\Util\QueryValidator; use TheSeer\Tokenizer\Token; use UnexpectedValueException; diff --git a/tests/unit/Config/Compiler/Processor/QueryValidationProcessorTest.php b/tests/unit/Config/Compiler/Processor/QueryValidationProcessorTest.php deleted file mode 100644 index f31e7117..00000000 --- a/tests/unit/Config/Compiler/Processor/QueryValidationProcessorTest.php +++ /dev/null @@ -1,68 +0,0 @@ -getData(); - $data['variables'][] = 'select `id` from `table1` where `value` = "bar"'; - $data['dump']['init_commands'][] = - 'SET SESSION SQL_MODE="STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"'; - $config = new Config($data); - - $processor = new QueryValidationProcessor(); - $this->expectNotToPerformAssertions(); - $processor->process($config); - } - - /** - * Assert that an exception is thrown when the "variables" param contains an invalid SQL query. - */ - public function testInvalidVariableQuery(): void - { - $data = $this->getData(); - $data['variables'][] = 'update `table1` set `value` = "bar" where `id` = 1'; - $config = new Config($data); - - $processor = new QueryValidationProcessor(); - $this->expectException(ConfigException::class); - $processor->process($config); - } - - /** - * Assert that an exception is thrown when the "init_commands" param contains an invalid SQL query. - */ - public function testInvalidInitQuery(): void - { - $data = $this->getData(); - $data['dump']['init_commands'][] = 'update `table1` set `value` = "bar" where `id` = 1'; - $config = new Config($data); - - $processor = new QueryValidationProcessor(); - $this->expectException(ConfigException::class); - $processor->process($config); - } - - /** - * Get sample config data. - */ - private function getData(): array - { - return [ - 'dump' => ['init_commands' => []], - 'variables' => [], - ]; - } -} diff --git a/tests/unit/Dumper/Config/DumperConfigTest.php b/tests/unit/Dumper/Config/DumperConfigTest.php index 225a0640..7d013154 100644 --- a/tests/unit/Dumper/Config/DumperConfigTest.php +++ b/tests/unit/Dumper/Config/DumperConfigTest.php @@ -7,6 +7,7 @@ use Smile\GdprDump\Config\Config; use Smile\GdprDump\Dumper\Config\DumperConfig; use Smile\GdprDump\Tests\Unit\TestCase; +use UnexpectedValueException; final class DumperConfigTest extends TestCase { @@ -131,6 +132,32 @@ public function testDefaultValues(): void $this->assertSame('', $config->getFakerSettings()->getLocale()); } + /** + * Assert that an exception is thrown when a var query contains a forbidden statement. + */ + public function testInvalidStatementInVariableQuery(): void + { + $this->expectException(UnexpectedValueException::class); + $this->createConfig([ + 'variables' => ['my_var' => 'select my_col from my_table; delete from my_table'], + ]); + } + + /** + * Assert that an exception is thrown when an init command contains a forbidden statement. + */ + public function testInvalidStatementInInitCommand(): void + { + $this->expectException(UnexpectedValueException::class); + $this->createConfig([ + 'dump' => [ + 'init_commands' => [ + 'my_var' => 'select my_col from my_table; delete from my_table', + ], + ], + ]); + } + /** * Create a dumper config object that stores the specified data. */ diff --git a/tests/unit/Dumper/Config/Validation/QueryValidatorTest.php b/tests/unit/Dumper/Config/Validation/QueryValidatorTest.php index 46c400c6..85a303f4 100644 --- a/tests/unit/Dumper/Config/Validation/QueryValidatorTest.php +++ b/tests/unit/Dumper/Config/Validation/QueryValidatorTest.php @@ -5,8 +5,8 @@ namespace Smile\GdprDump\Tests\Unit\Dumper\Config\Validation; use RuntimeException; +use Smile\GdprDump\Dumper\Config\Validation\QueryValidator; use Smile\GdprDump\Tests\Unit\TestCase; -use Smile\GdprDump\Util\QueryValidator; use TheSeer\Tokenizer\Token; use UnexpectedValueException;