@@ -40,30 +40,56 @@ type Scanner struct {
4040 context * regexp.Regexp
4141}
4242
43- // NewScanner initializes a Scanner with patterns from a JSON file.
44- func NewScanner (patternFilePath string ) (* Scanner , error ) {
45- data , err := os .ReadFile (patternFilePath )
43+ // NewScanner initializes a Scanner with patterns from one or more JSON files.
44+ func NewScanner (patternPath string ) (* Scanner , error ) {
45+ var patternFiles []string
46+
47+ info , err := os .Stat (patternPath )
4648 if err != nil {
47- return nil , fmt .Errorf ("failed to read pattern file : %w" , err )
49+ return nil , fmt .Errorf ("failed to access pattern path : %w" , err )
4850 }
4951
50- var config struct {
51- Patterns []Pattern `json:"patterns"`
52- }
53- if err := json .Unmarshal (data , & config ); err != nil {
54- return nil , fmt .Errorf ("failed to unmarshal patterns: %w" , err )
52+ if info .IsDir () {
53+ files , err := os .ReadDir (patternPath )
54+ if err != nil {
55+ return nil , fmt .Errorf ("failed to read pattern directory: %w" , err )
56+ }
57+ for _ , f := range files {
58+ if ! f .IsDir () && filepath .Ext (f .Name ()) == ".json" {
59+ patternFiles = append (patternFiles , filepath .Join (patternPath , f .Name ()))
60+ }
61+ }
62+ } else {
63+ patternFiles = append (patternFiles , patternPath )
5564 }
5665
57- for i := range config .Patterns {
58- re , err := regexp .Compile (config .Patterns [i ].Regex )
66+ var allPatterns []Pattern
67+ for _ , pf := range patternFiles {
68+ data , err := os .ReadFile (pf )
5969 if err != nil {
60- return nil , fmt . Errorf ( "invalid regex for pattern %s: %w" , config . Patterns [ i ]. Name , err )
70+ continue // Skip unreadable files
6171 }
62- config .Patterns [i ].Compiled = re
72+
73+ var config struct {
74+ Patterns []Pattern `json:"patterns"`
75+ }
76+ if err := json .Unmarshal (data , & config ); err == nil {
77+ for i := range config .Patterns {
78+ re , err := regexp .Compile (config .Patterns [i ].Regex )
79+ if err == nil {
80+ config .Patterns [i ].Compiled = re
81+ allPatterns = append (allPatterns , config .Patterns [i ])
82+ }
83+ }
84+ }
85+ }
86+
87+ if len (allPatterns ) == 0 {
88+ return nil , fmt .Errorf ("no valid patterns found in %s" , patternPath )
6389 }
6490
6591 return & Scanner {
66- Patterns : config . Patterns ,
92+ Patterns : allPatterns ,
6793 resolver : analyzer .NewObfuscationResolver (),
6894 context : regexp .MustCompile (`(?i)(api|key|secret|token|auth|pwd|pass|private|access)` ),
6995 }, nil
0 commit comments