1010namespace OCA \Libresign \Service \Crl ;
1111
1212final 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