Skip to content

Commit beec605

Browse files
committed
FilterLists: only import entries with a valid version constraint
1 parent 424c257 commit beec605

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

src/FilterList/List/AikidoMalwareFilterList.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use App\FilterList\FilterLists;
1616
use App\FilterList\FilterSources;
1717
use App\FilterList\RemoteFilterListEntry;
18+
use Composer\Semver\VersionParser;
1819
use Psr\Log\LoggerInterface;
1920
use Symfony\Contracts\HttpClient\HttpClientInterface;
2021

@@ -44,6 +45,7 @@ public function getListEntries(): ?array
4445
return null;
4546
}
4647

48+
$versionParser = new VersionParser();
4749
$entries = [];
4850
foreach ($data as $entry) {
4951
$packageName = strtolower($entry['package_name']);
@@ -53,6 +55,17 @@ public function getListEntries(): ?array
5355
continue;
5456
}
5557

58+
try {
59+
$versionParser->parseConstraints($entry['version']);
60+
} catch (\UnexpectedValueException $e) {
61+
$this->logger->warning('Skipping Aikido malware entry with invalid version constraint', [
62+
'package' => $packageName,
63+
'version' => $entry['version'],
64+
'exception' => $e,
65+
]);
66+
continue;
67+
}
68+
5669
$entries[] = new RemoteFilterListEntry(
5770
$packageName,
5871
$entry['version'],

tests/FilterList/List/AikidoMalwareFilterListTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,22 @@ public function testGetListEntriesPreservesOriginalVersion(): void
119119
$this->assertSame('v1.2.3-beta', $result[0]->version);
120120
}
121121

122+
public function testGetListEntriesSkipsInvalidVersionConstraints(): void
123+
{
124+
$feed = new AikidoMalwareFilterList($this->createHttpClient(json_encode([
125+
['package_name' => 'vendor/good', 'version' => '1.0.0', 'reason' => 'malware'],
126+
['package_name' => 'vendor/bad', 'version' => 'not-a-valid-constraint!@#', 'reason' => 'malware'],
127+
['package_name' => 'vendor/also-good', 'version' => '>=2.0,<3.0', 'reason' => 'malware'],
128+
], \JSON_THROW_ON_ERROR)), new NullLogger());
129+
130+
$result = $feed->getListEntries();
131+
132+
$this->assertNotNull($result);
133+
$this->assertCount(2, $result);
134+
$this->assertSame('vendor/good', $result[0]->packageName);
135+
$this->assertSame('vendor/also-good', $result[1]->packageName);
136+
}
137+
122138
private function createHttpClient(string $responseBody): HttpClientInterface
123139
{
124140
return new MockHttpClient([new MockResponse($responseBody)]);

0 commit comments

Comments
 (0)