Skip to main content

mnemo/
filter.rs

1/// Détection des commandes sensibles.
2///
3/// Une commande est considérée sensible si elle contient l'un des mots-clés
4/// (comparaison insensible à la casse).
5pub 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}