Skip to content

Commit 320357a

Browse files
cursoragentscript3r
andcommitted
Refactor AST detectors to use PatternRegistry
This commit refactors the AST-based detectors to properly load and utilize the PatternRegistry. This allows for more flexible and dynamic pattern management, moving away from hardcoded patterns. The changes include updating the CLI, tests, and the core scanner logic to integrate the registry effectively. Co-authored-by: script3r <[email protected]>
1 parent 4bfd4a3 commit 320357a

File tree

7 files changed

+5578
-102
lines changed

7 files changed

+5578
-102
lines changed

crates/cli/src/main.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use anyhow::{Context, Result};
22
use clap::{ArgAction, Parser};
33
use indicatif::{ProgressBar, ProgressStyle};
4-
use scanner_core::{Config, Detector, Language, AstBasedDetector, AstDetector, Scanner, CryptoFindings};
4+
use scanner_core::{Config, Detector, Language, AstBasedDetector, PatternRegistry, Scanner, CryptoFindings};
55
use std::fs;
66
use std::path::PathBuf;
77
use std::sync::Arc;
@@ -57,40 +57,42 @@ fn main() -> Result<()> {
5757
}
5858

5959
// Load patterns from file
60-
let patterns = AstDetector::load_patterns_from_file(args.patterns.to_str().unwrap())
61-
.with_context(|| format!("Failed to load patterns from {}", args.patterns.display()))?;
60+
let patterns_content = fs::read_to_string(&args.patterns)
61+
.with_context(|| format!("Failed to read patterns file: {}", args.patterns.display()))?;
62+
let registry = Arc::new(PatternRegistry::load(&patterns_content)
63+
.with_context(|| "Failed to parse patterns.toml")?);
6264

6365
// Prepare AST-based detectors for each language
6466
let dets: Vec<Box<dyn Detector>> = vec![
65-
Box::new(AstBasedDetector::with_patterns(
67+
Box::new(AstBasedDetector::new(
6668
"ast-detector-c",
6769
&[Language::C],
68-
patterns.clone(),
70+
registry.clone(),
6971
).with_context(|| "Failed to create C AST detector")?),
70-
Box::new(AstBasedDetector::with_patterns(
72+
Box::new(AstBasedDetector::new(
7173
"ast-detector-cpp",
7274
&[Language::Cpp],
73-
patterns.clone(),
75+
registry.clone(),
7476
).with_context(|| "Failed to create C++ AST detector")?),
75-
Box::new(AstBasedDetector::with_patterns(
77+
Box::new(AstBasedDetector::new(
7678
"ast-detector-rust",
7779
&[Language::Rust],
78-
patterns.clone(),
80+
registry.clone(),
7981
).with_context(|| "Failed to create Rust AST detector")?),
80-
Box::new(AstBasedDetector::with_patterns(
82+
Box::new(AstBasedDetector::new(
8183
"ast-detector-python",
8284
&[Language::Python],
83-
patterns.clone(),
85+
registry.clone(),
8486
).with_context(|| "Failed to create Python AST detector")?),
85-
Box::new(AstBasedDetector::with_patterns(
87+
Box::new(AstBasedDetector::new(
8688
"ast-detector-java",
8789
&[Language::Java],
88-
patterns.clone(),
90+
registry.clone(),
8991
).with_context(|| "Failed to create Java AST detector")?),
90-
Box::new(AstBasedDetector::with_patterns(
92+
Box::new(AstBasedDetector::new(
9193
"ast-detector-go",
9294
&[Language::Go],
93-
patterns.clone(),
95+
registry.clone(),
9496
).with_context(|| "Failed to create Go AST detector")?),
9597
];
9698

@@ -122,9 +124,7 @@ fn main() -> Result<()> {
122124
}));
123125
}
124126

125-
// Create a dummy registry for the scanner (AST detectors don't use it)
126-
let dummy_registry = scanner_core::PatternRegistry::empty();
127-
let scanner = Scanner::new(&dummy_registry, dets, cfg);
127+
let scanner = Scanner::new(&registry, dets, cfg);
128128
let findings = scanner.run(&args.paths)?;
129129

130130
// Clear progress bar if it was shown

crates/cli/tests/ast_ground_truth.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,48 @@ use std::path::PathBuf;
77
fn compare_ast_ground_truth() {
88
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
99

10+
// Load patterns for AST-based detectors
11+
let patterns_path = workspace.join("patterns.toml");
12+
let patterns_content = fs::read_to_string(patterns_path).unwrap();
13+
let registry = std::sync::Arc::new(PatternRegistry::load(&patterns_content).unwrap());
14+
1015
// Use AST-based detectors
1116
let dets: Vec<Box<dyn Detector>> = vec![
1217
Box::new(AstBasedDetector::new(
1318
"ast-detector-c",
1419
&[Language::C],
20+
registry.clone(),
1521
).unwrap()),
1622
Box::new(AstBasedDetector::new(
1723
"ast-detector-cpp",
1824
&[Language::Cpp],
25+
registry.clone(),
1926
).unwrap()),
2027
Box::new(AstBasedDetector::new(
2128
"ast-detector-rust",
2229
&[Language::Rust],
30+
registry.clone(),
2331
).unwrap()),
2432
Box::new(AstBasedDetector::new(
2533
"ast-detector-python",
2634
&[Language::Python],
35+
registry.clone(),
2736
).unwrap()),
2837
Box::new(AstBasedDetector::new(
2938
"ast-detector-java",
3039
&[Language::Java],
40+
registry.clone(),
3141
).unwrap()),
3242
Box::new(AstBasedDetector::new(
3343
"ast-detector-go",
3444
&[Language::Go],
45+
registry.clone(),
3546
).unwrap()),
3647
];
3748

38-
let reg = PatternRegistry::empty();
3949
let mut config = Config::default();
4050
config.deterministic = true; // Ensure reproducible results
41-
let scanner = Scanner::new(&reg, dets, config);
51+
let scanner = Scanner::new(&registry, dets, config);
4252

4353
let fixtures_root = workspace.join("fixtures");
4454

crates/cli/tests/integration.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,46 @@ use std::path::PathBuf;
55
fn scan_fixtures() {
66
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
77

8+
// Load patterns for AST-based detectors
9+
let patterns_path = workspace.join("patterns.toml");
10+
let patterns_content = std::fs::read_to_string(patterns_path).unwrap();
11+
let registry = std::sync::Arc::new(PatternRegistry::load(&patterns_content).unwrap());
12+
813
// Use AST-based detectors
914
let dets: Vec<Box<dyn Detector>> = vec![
1015
Box::new(AstBasedDetector::new(
1116
"ast-detector-c",
1217
&[Language::C],
18+
registry.clone(),
1319
).unwrap()),
1420
Box::new(AstBasedDetector::new(
1521
"ast-detector-cpp",
1622
&[Language::Cpp],
23+
registry.clone(),
1724
).unwrap()),
1825
Box::new(AstBasedDetector::new(
1926
"ast-detector-rust",
2027
&[Language::Rust],
28+
registry.clone(),
2129
).unwrap()),
2230
Box::new(AstBasedDetector::new(
2331
"ast-detector-python",
2432
&[Language::Python],
33+
registry.clone(),
2534
).unwrap()),
2635
Box::new(AstBasedDetector::new(
2736
"ast-detector-java",
2837
&[Language::Java],
38+
registry.clone(),
2939
).unwrap()),
3040
Box::new(AstBasedDetector::new(
3141
"ast-detector-go",
3242
&[Language::Go],
43+
registry.clone(),
3344
).unwrap()),
3445
];
3546

36-
let reg = PatternRegistry::empty();
37-
let scanner = Scanner::new(&reg, dets, Config::default());
47+
let scanner = Scanner::new(&registry, dets, Config::default());
3848
let fixtures = workspace.join("fixtures");
3949
let findings = scanner.run(std::slice::from_ref(&fixtures)).unwrap();
4050

@@ -78,36 +88,46 @@ fn scan_fixtures() {
7888
fn scan_nested_general_fixtures() {
7989
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
8090

91+
// Load patterns for AST-based detectors
92+
let patterns_path = workspace.join("patterns.toml");
93+
let patterns_content = std::fs::read_to_string(patterns_path).unwrap();
94+
let registry = std::sync::Arc::new(PatternRegistry::load(&patterns_content).unwrap());
95+
8196
// Use AST-based detectors
8297
let dets: Vec<Box<dyn Detector>> = vec![
8398
Box::new(AstBasedDetector::new(
8499
"ast-detector-c",
85100
&[Language::C],
101+
registry.clone(),
86102
).unwrap()),
87103
Box::new(AstBasedDetector::new(
88104
"ast-detector-cpp",
89105
&[Language::Cpp],
106+
registry.clone(),
90107
).unwrap()),
91108
Box::new(AstBasedDetector::new(
92109
"ast-detector-rust",
93110
&[Language::Rust],
111+
registry.clone(),
94112
).unwrap()),
95113
Box::new(AstBasedDetector::new(
96114
"ast-detector-python",
97115
&[Language::Python],
116+
registry.clone(),
98117
).unwrap()),
99118
Box::new(AstBasedDetector::new(
100119
"ast-detector-java",
101120
&[Language::Java],
121+
registry.clone(),
102122
).unwrap()),
103123
Box::new(AstBasedDetector::new(
104124
"ast-detector-go",
105125
&[Language::Go],
126+
registry.clone(),
106127
).unwrap()),
107128
];
108129

109-
let reg = PatternRegistry::empty();
110-
let scanner = Scanner::new(&reg, dets, Config::default());
130+
let scanner = Scanner::new(&registry, dets, Config::default());
111131

112132
// Scan the nested general fixtures root; test should not rely on per-file targets
113133
let root = workspace.join("fixtures/general");

crates/cli/tests/progress_reporting.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,38 @@ impl ProgressCapture {
4444

4545
#[test]
4646
fn test_progress_reporting_accuracy() {
47+
// Load patterns for AST-based detectors
48+
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
49+
let patterns_path = workspace.join("patterns.toml");
50+
let patterns_content = std::fs::read_to_string(patterns_path).unwrap();
51+
let registry = std::sync::Arc::new(PatternRegistry::load(&patterns_content).unwrap());
52+
4753
// Create AST-based detectors
4854
let detectors: Vec<Box<dyn Detector>> = vec![
4955
Box::new(AstBasedDetector::new(
5056
"ast-detector-c",
5157
&[Language::C],
58+
registry.clone(),
5259
).unwrap()),
5360
Box::new(AstBasedDetector::new(
5461
"ast-detector-java",
5562
&[Language::Java],
63+
registry.clone(),
5664
).unwrap()),
5765
Box::new(AstBasedDetector::new(
5866
"ast-detector-python",
5967
&[Language::Python],
68+
registry.clone(),
6069
).unwrap()),
6170
Box::new(AstBasedDetector::new(
6271
"ast-detector-rust",
6372
&[Language::Rust],
73+
registry.clone(),
6474
).unwrap()),
6575
Box::new(AstBasedDetector::new(
6676
"ast-detector-go",
6777
&[Language::Go],
78+
registry.clone(),
6879
).unwrap()),
6980
];
7081

@@ -77,11 +88,9 @@ fn test_progress_reporting_accuracy() {
7788
..Default::default()
7889
};
7990

80-
let registry = PatternRegistry::empty();
8191
let scanner = Scanner::new(&registry, detectors, config);
8292

8393
// Scan the fixtures directory
84-
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
8594
let fixtures_dir = workspace.join("fixtures");
8695

8796
let _findings = scanner.run(&[fixtures_dir]).unwrap();
@@ -103,11 +112,18 @@ fn test_progress_reporting_accuracy() {
103112

104113
#[test]
105114
fn test_progress_monotonic_increase() {
115+
// Load patterns for AST-based detectors
116+
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
117+
let patterns_path = workspace.join("patterns.toml");
118+
let patterns_content = std::fs::read_to_string(patterns_path).unwrap();
119+
let registry = std::sync::Arc::new(PatternRegistry::load(&patterns_content).unwrap());
120+
106121
// Test that progress counts only increase (never decrease)
107122
let detectors: Vec<Box<dyn Detector>> = vec![
108123
Box::new(AstBasedDetector::new(
109124
"ast-detector-rust",
110125
&[Language::Rust],
126+
registry.clone(),
111127
).unwrap()),
112128
];
113129

@@ -120,7 +136,6 @@ fn test_progress_monotonic_increase() {
120136
..Default::default()
121137
};
122138

123-
let registry = PatternRegistry::empty();
124139
let scanner = Scanner::new(&registry, detectors, config);
125140

126141
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
@@ -166,11 +181,18 @@ fn test_progress_monotonic_increase() {
166181

167182
#[test]
168183
fn test_progress_file_extension_accuracy() {
184+
// Load patterns for AST-based detectors
185+
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
186+
let patterns_path = workspace.join("patterns.toml");
187+
let patterns_content = std::fs::read_to_string(patterns_path).unwrap();
188+
let registry = std::sync::Arc::new(PatternRegistry::load(&patterns_content).unwrap());
189+
169190
// Test that file extension filtering works correctly with progress reporting
170191
let detectors: Vec<Box<dyn Detector>> = vec![
171192
Box::new(AstBasedDetector::new(
172193
"ast-detector-java",
173194
&[Language::Java],
195+
registry.clone(),
174196
).unwrap()),
175197
];
176198

@@ -183,7 +205,6 @@ fn test_progress_file_extension_accuracy() {
183205
..Default::default()
184206
};
185207

186-
let registry = PatternRegistry::empty();
187208
let scanner = Scanner::new(&registry, detectors, config);
188209

189210
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");

0 commit comments

Comments
 (0)