const SECRET_SUBSTRINGS: &[&str] = &[
"secret",
"password",
"passwd",
"token",
"key",
"api_key",
"dsn",
"private",
"credential",
];
pub fn is_secret_key(key: &str) -> bool {
let lower = key.to_ascii_lowercase();
let non_url_hit = SECRET_SUBSTRINGS.iter().any(|n| lower.contains(n));
if lower.ends_with("_url") {
let head = &lower[..lower.len() - 4];
return SECRET_SUBSTRINGS.iter().any(|n| head.contains(n));
}
non_url_hit
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_secret_key_stripe_secret_key() {
assert!(is_secret_key("STRIPE_SECRET_KEY"));
}
#[test]
fn is_secret_key_api_token() {
assert!(is_secret_key("API_TOKEN"));
}
#[test]
fn is_secret_key_db_password() {
assert!(is_secret_key("DB_PASSWORD"));
}
#[test]
fn is_secret_key_passwd() {
assert!(is_secret_key("USER_PASSWD"));
}
#[test]
fn is_secret_key_dsn() {
assert!(is_secret_key("SENTRY_DSN"));
}
#[test]
fn is_secret_key_private() {
assert!(is_secret_key("PRIVATE_RSA"));
}
#[test]
fn is_secret_key_credential() {
assert!(is_secret_key("DB_CREDENTIAL"));
}
#[test]
fn is_secret_key_api_key() {
assert!(is_secret_key("MY_API_KEY"));
}
#[test]
fn is_secret_key_database_url_carve_out() {
assert!(!is_secret_key("DATABASE_URL"));
}
#[test]
fn is_secret_key_redis_url_carve_out() {
assert!(!is_secret_key("REDIS_URL"));
}
#[test]
fn is_secret_key_stripe_secret_url_still_secret() {
assert!(is_secret_key("STRIPE_SECRET_URL"));
}
#[test]
fn is_secret_key_app_name_not_secret() {
assert!(!is_secret_key("APP_NAME"));
}
}