Skip to content

Commit 86c1f07

Browse files
committed
better validation
1 parent cdbb244 commit 86c1f07

File tree

2 files changed

+81
-18
lines changed

2 files changed

+81
-18
lines changed

src/OpenMage/ComposerPlugin/Copy/Unpkg/Config.php

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,21 @@ public function getValidatedConfig($packageConfig): ?array
4343
return null;
4444
}
4545

46-
if (!$this->validateConfigFiles($packageConfig)) {
46+
$files = $this->validateConfigFiles($packageConfig);
47+
if (!$files) {
4748
return null;
4849
}
4950

50-
if (!$this->validateConfigVersion($packageConfig)) {
51+
$version = $this->validateConfigVersion($packageConfig);
52+
if (!$version) {
5153
return null;
5254
}
5355

54-
$source = '';
55-
if (array_key_exists(self::CONFIG_SOURCE, $packageConfig) && is_string($packageConfig[self::CONFIG_SOURCE])) {
56-
$source = $packageConfig[self::CONFIG_SOURCE];
57-
}
58-
59-
$target = '';
60-
if (array_key_exists(self::CONFIG_TARGET, $packageConfig) && is_string($packageConfig[self::CONFIG_TARGET])) {
61-
$target = $packageConfig[self::CONFIG_TARGET];
62-
}
56+
$source = $this->validateConfigSource($packageConfig);
57+
$target = $this->validateConfigTarget($packageConfig);
6358

64-
/** @var string[] $files */
65-
$files = $packageConfig[self::CONFIG_FILES];
6659
return [
67-
'version' => $packageConfig[self::CONFIG_VERSION],
60+
'version' => $version,
6861
'source' => $source,
6962
'target' => $target,
7063
'files' => $files,
@@ -73,18 +66,50 @@ public function getValidatedConfig($packageConfig): ?array
7366

7467
/**
7568
* @param array<mixed> $packageConfig
69+
* @return string[]|null
7670
*/
77-
private function validateConfigFiles(array $packageConfig): bool
71+
private function validateConfigFiles(array $packageConfig): ?array
7872
{
79-
return array_key_exists(self::CONFIG_FILES, $packageConfig) && is_array($packageConfig[self::CONFIG_FILES]);
73+
if (array_key_exists(self::CONFIG_FILES, $packageConfig) && is_array($packageConfig[self::CONFIG_FILES])) {
74+
/** @var string[] $files */
75+
$files = $packageConfig[self::CONFIG_FILES];
76+
return $files;
77+
}
78+
return null;
8079
}
8180

8281
/**
8382
* @param array<mixed> $packageConfig
8483
*/
85-
private function validateConfigVersion(array $packageConfig): bool
84+
private function validateConfigVersion(array $packageConfig): ?string
8685
{
87-
return array_key_exists(self::CONFIG_VERSION, $packageConfig) && is_string($packageConfig[self::CONFIG_VERSION]);
86+
if (array_key_exists(self::CONFIG_VERSION, $packageConfig) && is_string($packageConfig[self::CONFIG_VERSION])) {
87+
return trim($packageConfig[self::CONFIG_VERSION]);
88+
}
89+
return null;
90+
}
91+
92+
/**
93+
* @param array<mixed> $packageConfig
94+
*/
95+
private function validateConfigSource(array $packageConfig): string
96+
{
97+
if (array_key_exists(self::CONFIG_SOURCE, $packageConfig) && is_string($packageConfig[self::CONFIG_SOURCE])) {
98+
return trim($packageConfig[self::CONFIG_SOURCE]);
99+
}
100+
return '';
101+
}
102+
103+
/**
104+
* @param array<mixed> $packageConfig
105+
*/
106+
private function validateConfigTarget(array $packageConfig): string
107+
{
108+
if (array_key_exists(self::CONFIG_TARGET, $packageConfig) && is_string($packageConfig[self::CONFIG_TARGET])) {
109+
$target = str_replace(['../', './'], '', $packageConfig[self::CONFIG_TARGET]);
110+
return trim($target);
111+
}
112+
return '';
88113
}
89114

90115
public function getUnpkgName(): string

tests/unit/Copy/Unpkg/ConfigTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,44 @@ public function provideGetValidatedConfig(): Generator
104104
'target' => 'target',
105105
],
106106
];
107+
108+
yield 'target sub-directory' => [
109+
[
110+
'version' => '1',
111+
'source' => 'source',
112+
'target' => 'target',
113+
'files' => [
114+
'test.file',
115+
],
116+
],
117+
[
118+
'files' => [
119+
'test.file',
120+
],
121+
'version' => '1',
122+
'source' => 'source',
123+
'target' => './../target',
124+
],
125+
];
126+
127+
yield 'target w/ spaces' => [
128+
[
129+
'version' => '1',
130+
'source' => 'source',
131+
'target' => 'target',
132+
'files' => [
133+
'test.file',
134+
],
135+
],
136+
[
137+
'files' => [
138+
'test.file',
139+
],
140+
'version' => '1',
141+
'source' => 'source',
142+
'target' => ' target ',
143+
],
144+
];
107145
}
108146

109147
/**

0 commit comments

Comments
 (0)