@@ -132,6 +132,21 @@ public static function legitimateNamesProvider(): array
132132 'TV episode ' => ['Show.Name.S03E05.720p.HDTV.x264-GROUP ' , 'alt.binaries.hdtv ' ],
133133 'Music album ' => ['Artist.Name-Album.Title-2024-FLAC-GROUP ' , 'alt.binaries.sounds.mp3 ' ],
134134 'Game release ' => ['Starfield-RUNE ' , 'alt.binaries.games ' ],
135+ 'Readable software package ' => ['Microsoft Office Suite Installer ' , 'alt.binaries.warez ' ],
136+ 'Adobe msix bundle ' => ['Adobe Express Photos.Msixbundle ' , 'alt.binaries.erotica.divx ' ],
137+ ];
138+ }
139+
140+ /**
141+ * Readable software-like names that must not be classified as hashed by the misc categorizer.
142+ *
143+ * @return array<string, array{0: string}>
144+ */
145+ public static function readableSoftwareNamesProvider (): array
146+ {
147+ return [
148+ 'Adobe msix bundle ' => ['Adobe Express Photos.Msixbundle ' ],
149+ 'Office installer words ' => ['Microsoft Office Suite Installer ' ],
135150 ];
136151 }
137152
@@ -202,6 +217,18 @@ public function test_misc_categorizer_detects_gibberish_names(string $name, stri
202217 $ this ->assertSame (Category::OTHER_HASHED , $ result ->categoryId , "Expected OTHER_HASHED for: $ name " );
203218 }
204219
220+ #[DataProvider('readableSoftwareNamesProvider ' )]
221+ public function test_misc_categorizer_does_not_hash_readable_software_names (string $ name ): void
222+ {
223+ $ categorizer = new MiscCategorizer ;
224+ $ context = new ReleaseContext (releaseName: $ name , groupId: 0 );
225+ $ result = $ categorizer ->categorize ($ context );
226+
227+ $ this ->assertFalse ($ result ->isSuccessful (), "Readable software name ' $ name' should not be matched by misc hash heuristics " );
228+ $ this ->assertSame (Category::OTHER_MISC , $ result ->categoryId );
229+ $ this ->assertSame ('no_match ' , $ result ->matchedBy );
230+ }
231+
205232 // ------------------------------------------------------------------
206233 // Tests: MiscPipe lock mechanism
207234 // ------------------------------------------------------------------
@@ -289,6 +316,15 @@ public function test_legitimate_releases_are_not_locked(string $name, string $gr
289316 );
290317 }
291318
319+ public function test_adobe_msix_bundle_reaches_pc_0day_in_full_pipeline (): void
320+ {
321+ $ passable = $ this ->runPipeline ('Adobe Express Photos.Msixbundle ' , 'alt.binaries.erotica.divx ' );
322+
323+ $ this ->assertFalse ($ passable ->lockedToMisc );
324+ $ this ->assertSame (Category::PC_0DAY , $ passable ->bestResult ->categoryId );
325+ $ this ->assertSame ('0day_msix_installer ' , $ passable ->bestResult ->matchedBy );
326+ }
327+
292328 // ------------------------------------------------------------------
293329 // Tests: shouldStopProcessing() respects the lock
294330 // ------------------------------------------------------------------
0 commit comments