1pub fn is_sensitive(command: &str, keywords: &[String]) -> bool {
6 let lower = command.to_lowercase();
7 keywords.iter().any(|kw| {
8 let kw = kw.trim();
9 !kw.is_empty() && lower.contains(&kw.to_lowercase())
10 })
11}
12
13#[cfg(test)]
14mod tests {
15 use super::*;
16
17 fn keywords() -> Vec<String> {
18 [
19 "password",
20 "passwd",
21 "token",
22 "secret",
23 "api_key",
24 "bearer",
25 "private_key",
26 "sshpass",
27 ]
28 .iter()
29 .map(|s| s.to_string())
30 .collect()
31 }
32
33 #[test]
34 fn detecte_les_commandes_sensibles() {
35 let kw = keywords();
36 assert!(is_sensitive("export API_KEY=123", &kw));
37 assert!(is_sensitive("mysql -u root -p password", &kw));
38 assert!(is_sensitive("curl -H 'Authorization: Bearer abc'", &kw));
39 assert!(is_sensitive("sshpass -p secret ssh host", &kw));
40 assert!(is_sensitive("cat private_key.pem", &kw));
41 }
42
43 #[test]
44 fn laisse_passer_les_commandes_normales() {
45 let kw = keywords();
46 assert!(!is_sensitive("ls -la", &kw));
47 assert!(!is_sensitive("git commit -m 'fix'", &kw));
48 assert!(!is_sensitive("cargo build --release", &kw));
49 }
50
51 #[test]
52 fn ignore_les_mots_cles_vides() {
53 let kw = vec!["".to_string(), " ".to_string()];
54 assert!(!is_sensitive("nimporte quelle commande", &kw));
55 }
56}