Skip to content

Commit ec4b884

Browse files
committed
refactor: optimize CRL distribution point extraction
Signed-off-by: Vitor Mattos <[email protected]>
1 parent fc89d71 commit ec4b884

1 file changed

Lines changed: 38 additions & 21 deletions

File tree

lib/Service/Crl/CrlDistributionPointsExtractor.php

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,52 +10,48 @@
1010
namespace OCA\Libresign\Service\Crl;
1111

1212
final class CrlDistributionPointsExtractor {
13-
/** @var list<string> */
13+
/** @var array<string, true> */
1414
private const ACCEPTED_EXTENSION_NAMES = [
15-
'crldistributionpoints',
16-
'x509v3 crl distribution points',
17-
'2.5.29.31',
15+
'crldistributionpoints' => true,
16+
'x509v3 crl distribution points' => true,
17+
'2.5.29.31' => true,
1818
];
1919

20+
private const URI_PATTERN = '/URI\s*:\s*([^\s\n]+)/i';
21+
2022
/**
2123
* @param array<array-key, mixed> $extensions
2224
* @return array{hasExtension: bool, urls: list<string>}
2325
*/
2426
public function extractFromExtensions(array $extensions): array {
25-
$values = [];
27+
$hasCrlExtension = false;
28+
$urls = [];
2629
foreach ($extensions as $extensionName => $extensionValue) {
2730
if (!is_string($extensionName)) {
2831
continue;
2932
}
3033

3134
$normalizedName = strtolower(trim($extensionName));
32-
if (!in_array($normalizedName, self::ACCEPTED_EXTENSION_NAMES, true)) {
35+
if (!isset(self::ACCEPTED_EXTENSION_NAMES[$normalizedName])) {
3336
continue;
3437
}
38+
$hasCrlExtension = true;
3539

3640
if (is_string($extensionValue)) {
37-
$values[] = $extensionValue;
41+
$this->appendUrlsFromText($extensionValue, $urls);
3842
} elseif (is_array($extensionValue)) {
39-
$values[] = implode("\n", array_filter($extensionValue, 'is_string'));
43+
foreach ($extensionValue as $extensionPart) {
44+
if (is_string($extensionPart)) {
45+
$this->appendUrlsFromText($extensionPart, $urls);
46+
}
47+
}
4048
}
4149
}
4250

43-
if (empty($values)) {
51+
if (!$hasCrlExtension) {
4452
return ['hasExtension' => false, 'urls' => []];
4553
}
4654

47-
$urls = [];
48-
foreach ($values as $value) {
49-
preg_match_all('/URI\s*:\s*([^\s\n]+)/i', $value, $matches);
50-
if (!empty($matches[1])) {
51-
$normalizedUrls = array_map(
52-
static fn (string $url): string => rtrim($url, ")]"),
53-
$matches[1],
54-
);
55-
$urls = [...$urls, ...$normalizedUrls];
56-
}
57-
}
58-
5955
/** @var list<string> $uniqueUrls */
6056
$uniqueUrls = array_values(array_unique($urls));
6157

@@ -64,4 +60,25 @@ public function extractFromExtensions(array $extensions): array {
6460
'urls' => $uniqueUrls,
6561
];
6662
}
63+
64+
/**
65+
* @param list<string> $urls
66+
*/
67+
private function appendUrlsFromText(string $value, array &$urls): void {
68+
preg_match_all(self::URI_PATTERN, $value, $matches);
69+
if (empty($matches[1])) {
70+
return;
71+
}
72+
73+
foreach ($matches[1] as $url) {
74+
$normalizedUrl = $this->normalizeUrlToken($url);
75+
if ($normalizedUrl !== '') {
76+
$urls[] = $normalizedUrl;
77+
}
78+
}
79+
}
80+
81+
private function normalizeUrlToken(string $url): string {
82+
return rtrim($url, ")]");
83+
}
6784
}

0 commit comments

Comments
 (0)