Skip to content

Commit 3e329ca

Browse files
committed
cli: detect source maps, keys, and htpasswd as sensitive
1 parent d908f9f commit 3e329ca

3 files changed

Lines changed: 80 additions & 0 deletions

File tree

crates/opencodecommit/src/context.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@ static SENSITIVE_FILE_PATTERNS: LazyLock<Vec<regex::Regex>> = LazyLock::new(|| {
9090
r"(?:^|/)secrets?\.\w+$",
9191
r"(?:^|/)\.netrc$",
9292
r"(?:^|/)service[-_]?account.*\.json$",
93+
// Source maps — can expose full unminified source code
94+
r"\.(?:js|css)\.map$",
95+
r"(?:^|/)[^/]+\.map$",
96+
// Private keys and certificates
97+
r"\.pem$",
98+
r"\.p12$",
99+
r"\.pfx$",
100+
r"\.key$",
101+
r"\.keystore$",
102+
r"\.jks$",
103+
// SSH private keys (not .pub)
104+
r"(?:^|/)id_(?:rsa|ed25519|ecdsa|dsa)$",
105+
r"(?:^|/)\.ssh/",
106+
// Auth files
107+
r"(?:^|/)\.htpasswd$",
93108
]
94109
.iter()
95110
.map(|p| regex::Regex::new(p).unwrap())
@@ -449,6 +464,33 @@ mod tests {
449464
assert!(!detect_sensitive_content(diff, &["app.ts".to_owned()]));
450465
}
451466

467+
#[test]
468+
fn detects_source_map_files() {
469+
assert!(detect_sensitive_content("diff", &["bundle.js.map".to_owned()]));
470+
assert!(detect_sensitive_content("diff", &["styles.css.map".to_owned()]));
471+
assert!(detect_sensitive_content("diff", &["dist/app.map".to_owned()]));
472+
}
473+
474+
#[test]
475+
fn detects_private_key_files() {
476+
assert!(detect_sensitive_content("diff", &["server.pem".to_owned()]));
477+
assert!(detect_sensitive_content("diff", &["cert.p12".to_owned()]));
478+
assert!(detect_sensitive_content("diff", &["ssl.key".to_owned()]));
479+
assert!(detect_sensitive_content("diff", &["app.keystore".to_owned()]));
480+
}
481+
482+
#[test]
483+
fn detects_ssh_private_keys() {
484+
assert!(detect_sensitive_content("diff", &["id_rsa".to_owned()]));
485+
assert!(detect_sensitive_content("diff", &["id_ed25519".to_owned()]));
486+
assert!(detect_sensitive_content("diff", &[".ssh/config".to_owned()]));
487+
}
488+
489+
#[test]
490+
fn detects_htpasswd() {
491+
assert!(detect_sensitive_content("diff", &[".htpasswd".to_owned()]));
492+
}
493+
452494
// --- skip patterns ---
453495

454496
#[test]

extension/src/inline/context.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,21 @@ const SENSITIVE_FILE_PATTERNS = [
5353
/(?:^|\/)secrets?\.\w+$/,
5454
/(?:^|\/)\.netrc$/,
5555
/(?:^|\/)service[-_]?account.*\.json$/,
56+
// Source maps — can expose full unminified source code
57+
/\.(?:js|css)\.map$/,
58+
/(?:^|\/)[^/]+\.map$/,
59+
// Private keys and certificates
60+
/\.pem$/,
61+
/\.p12$/,
62+
/\.pfx$/,
63+
/\.key$/,
64+
/\.keystore$/,
65+
/\.jks$/,
66+
// SSH private keys (not .pub)
67+
/(?:^|\/)id_(?:rsa|ed25519|ecdsa|dsa)$/,
68+
/(?:^|\/)\.ssh\//,
69+
// Auth files
70+
/(?:^|\/)\.htpasswd$/,
5671
]
5772

5873
const SENSITIVE_LINE_PATTERNS = [

extension/src/test/inline.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,29 @@ describe("detectSensitiveContent", () => {
526526
const diff = `+ const result = await fetchData()`
527527
assert.strictEqual(detectSensitiveContent(diff, ["app.ts"]), false)
528528
})
529+
530+
it("detects source map files", () => {
531+
assert.strictEqual(detectSensitiveContent("diff", ["bundle.js.map"]), true)
532+
assert.strictEqual(detectSensitiveContent("diff", ["styles.css.map"]), true)
533+
assert.strictEqual(detectSensitiveContent("diff", ["dist/app.map"]), true)
534+
})
535+
536+
it("detects private key files", () => {
537+
assert.strictEqual(detectSensitiveContent("diff", ["server.pem"]), true)
538+
assert.strictEqual(detectSensitiveContent("diff", ["cert.p12"]), true)
539+
assert.strictEqual(detectSensitiveContent("diff", ["ssl.key"]), true)
540+
assert.strictEqual(detectSensitiveContent("diff", ["app.keystore"]), true)
541+
})
542+
543+
it("detects SSH private keys", () => {
544+
assert.strictEqual(detectSensitiveContent("diff", ["id_rsa"]), true)
545+
assert.strictEqual(detectSensitiveContent("diff", ["id_ed25519"]), true)
546+
assert.strictEqual(detectSensitiveContent("diff", [".ssh/config"]), true)
547+
})
548+
549+
it("detects htpasswd", () => {
550+
assert.strictEqual(detectSensitiveContent("diff", [".htpasswd"]), true)
551+
})
529552
})
530553

531554
// --- buildBranchPrompt ---

0 commit comments

Comments
 (0)