diff --git a/CHANGELOG.md b/CHANGELOG.md index 96bfe77..c90e1b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ All notable changes to Diskern are documented here. The format follows ### Fixed +- Chrome caches under macOS `~/Library/Caches` now appear in scan reports - Restoring a quarantined file across filesystems no longer fails with `EXDEV` - Restore refuses when something is already at the original path, rather diff --git a/crates/diskern-core/rules/base.json b/crates/diskern-core/rules/base.json index d391a38..c85af92 100644 --- a/crates/diskern-core/rules/base.json +++ b/crates/diskern-core/rules/base.json @@ -24,7 +24,7 @@ }, { "id": "chrome-cache", - "patterns": ["**/google/chrome/user data/*/cache/**", "**/.cache/google-chrome/**"], + "patterns": ["**/google/chrome/user data/*/cache/**", "**/.cache/google-chrome/**", "**/library/caches/google/chrome/*/cache/**"], "category": "browser_cache", "verdict": "safe", "description": "Chrome browser cache. Fully regenerated on next use; no effect on installed applications or saved data." diff --git a/crates/diskern-core/src/rules.rs b/crates/diskern-core/src/rules.rs index 2cc81dc..50f3f09 100644 --- a/crates/diskern-core/src/rules.rs +++ b/crates/diskern-core/src/rules.rs @@ -265,6 +265,29 @@ mod tests { } } + #[test] + fn chrome_cache_is_safe_to_remove_on_each_platform() { + let db = RulesDb::embedded(); + for path in [ + "/home/u/.cache/google-chrome/Default/Cache/data_0", + "C:\\Users\\x\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cache\\data_0", + "/Users/x/Library/Caches/Google/Chrome/Default/Cache/data_0", + ] { + let (cat, verdict, rule) = db.classify(std::path::Path::new(path)); + assert_eq!(cat, Category::BrowserCache, "{path} matched {rule:?}"); + assert_eq!(verdict, Verdict::Safe, "{path} matched {rule:?}"); + } + } + + #[test] + fn chrome_profile_data_is_not_safe_to_remove() { + let db = RulesDb::embedded(); + let path = "/Users/x/Library/Application Support/Google/Chrome/Default/History"; + let (cat, verdict, rule) = db.classify(std::path::Path::new(path)); + assert_eq!(cat, Category::Unknown, "{path} matched {rule:?}"); + assert_ne!(verdict, Verdict::Safe, "{path} matched {rule:?}"); + } + /// Issue #40. `/mozilla/firefox/profiles` covered the whole profile /// directory, so bookmarks, history, logins and cookies were listed /// under "Safe to remove" and `quarantine_finding` accepted them. diff --git a/docs/RULES.md b/docs/RULES.md index 50e1949..67adf2a 100644 --- a/docs/RULES.md +++ b/docs/RULES.md @@ -10,7 +10,7 @@ time from [`crates/diskern-core/rules/base.json`](../crates/diskern-core/rules/b ```json { "id": "chrome-cache", - "patterns": ["**/google/chrome/user data/*/cache/**", "**/.cache/google-chrome/**"], + "patterns": ["**/google/chrome/user data/*/cache/**", "**/.cache/google-chrome/**", "**/library/caches/google/chrome/*/cache/**"], "category": "browser_cache", "verdict": "safe", "description": "Chrome browser cache. Fully regenerated on next use."