use super::*;
const FAKE_API_KEY: &str = "sk-or-v1-0000000000000000000000000000FAKE";
const FAKE_BOT_TOKEN: &str = "1234567890:AAFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKE";
fn assert_value_never_echoed(text: &str) {
assert!(
!text.contains(FAKE_API_KEY),
"output must name the key, never the value: {text}"
);
assert!(
!text.contains("sk-or-"),
"output must not carry a credential prefix: {text}"
);
}
fn plist_with_credential() -> String {
format!(
"<plist version=\"1.0\">\n<dict>\n \
<key>Label</key>\n <string>com.trusty.mpm</string>\n \
<key>EnvironmentVariables</key>\n <dict>\n \
<key>PATH</key>\n <string>/usr/bin</string>\n \
<key>OPENROUTER_API_KEY</key>\n <string>{FAKE_API_KEY}</string>\n \
<key>RUST_LOG</key>\n <string>info</string>\n \
</dict>\n</dict>\n</plist>\n"
)
}
#[test]
fn credential_keys_are_detected() {
for key in [
"OPENROUTER_API_KEY",
"TELEGRAM_BOT_TOKEN",
"ANTHROPIC_API_KEY",
"GITHUB_TOKEN",
"GH_TOKEN",
"SLACK_BOT_TOKEN",
"AWS_SECRET_ACCESS_KEY",
"AWS_SESSION_TOKEN",
"DB_PASSWORD",
"SSH_PASSPHRASE",
"TOKEN",
"openrouter_api_key",
] {
assert!(is_credential_env_key(key), "{key} must read as credential");
}
}
#[test]
fn tunable_keys_are_not_credentials() {
for key in [
"PATH",
"RUST_LOG",
"HF_HOME",
"FASTEMBED_CACHE_DIR",
"TRUSTY_MEMORY_LIMIT_MB",
"TRUSTY_MAX_BATCH_SIZE",
"TRUSTY_MPM_SUPERVISOR_INTERVAL",
"MAX_TOKENS",
"TRUSTY_TOKEN_BUDGET",
"",
] {
assert!(
!is_credential_env_key(key),
"{key} must not read as credential"
);
}
}
#[test]
fn credential_reference_keys_are_not_credentials() {
for key in [
"TRUSTY_BUGREPORT_GH_APP_KEY_FILE",
"AWS_ACCESS_KEY_ID",
"OPENROUTER_API_KEY_PATH",
"GITHUB_TOKEN_ENV",
"SLACK_TOKEN_NAME",
] {
assert!(
!is_credential_env_key(key),
"{key} points at a credential; it is not one"
);
}
}
#[test]
fn credential_values_are_detected_by_prefix() {
for value in [
FAKE_API_KEY,
"ghp_0000000000000000000000000000000FAKE",
"xoxb-0000000000-0000000000-000000FAKE",
"AKIA0000000000000FAKE",
] {
assert!(
looks_like_credential_value(value),
"a vendor-prefixed value must read as a credential"
);
}
}
#[test]
fn credential_values_are_detected_for_telegram_shape() {
assert!(looks_like_credential_value(FAKE_BOT_TOKEN));
}
#[test]
fn ordinary_arguments_are_not_credential_values() {
for value in [
"daemon",
"--addr",
"127.0.0.1:7880",
"/Users/x/.cargo/bin/trusty-search",
"sk-",
"12:34",
"/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin",
] {
assert!(
!looks_like_credential_value(value),
"{value} must not read as a credential"
);
}
}
#[test]
fn strip_credential_env_removes_only_the_credential_pair() {
let mut pairs = vec![
("PATH".to_string(), "/usr/bin".to_string()),
("OPENROUTER_API_KEY".to_string(), FAKE_API_KEY.to_string()),
("RUST_LOG".to_string(), "info".to_string()),
("TELEGRAM_BOT_TOKEN".to_string(), FAKE_BOT_TOKEN.to_string()),
];
let removed = strip_credential_env(&mut pairs);
assert_eq!(removed, vec!["OPENROUTER_API_KEY", "TELEGRAM_BOT_TOKEN"]);
assert_eq!(
pairs,
vec![
("PATH".to_string(), "/usr/bin".to_string()),
("RUST_LOG".to_string(), "info".to_string()),
]
);
for key in &removed {
assert!(
!key.contains("FAKE"),
"a finding must name the key, never the value"
);
}
}
#[test]
fn strip_credential_env_is_a_noop_when_clean() {
let mut pairs = vec![("PATH".to_string(), "/usr/bin".to_string())];
assert!(strip_credential_env(&mut pairs).is_empty());
assert_eq!(pairs.len(), 1);
}
#[test]
fn plist_credential_env_keys_names_the_key() {
let keys = plist_credential_env_keys(&plist_with_credential()).expect("parses");
assert_eq!(keys, vec!["OPENROUTER_API_KEY"]);
}
#[test]
fn scrub_removes_the_credential_entry_and_keeps_the_rest() {
let scrubbed = scrub_plist_credential_env(&plist_with_credential()).expect("parses");
assert_eq!(scrubbed.keys, vec!["OPENROUTER_API_KEY"]);
assert!(
!scrubbed.xml.contains(FAKE_API_KEY),
"the value must be gone"
);
assert!(!scrubbed.xml.contains("OPENROUTER_API_KEY"));
assert!(scrubbed.xml.contains("<key>PATH</key>"));
assert!(scrubbed.xml.contains("<key>RUST_LOG</key>"));
assert!(scrubbed.xml.contains("<string>info</string>"));
assert!(
!scrubbed.xml.contains("\n\n"),
"the deletion must not leave a blank line: {}",
scrubbed.xml
);
}
#[test]
fn scrub_is_byte_identical_when_clean() {
let xml = "<plist version=\"1.0\">\n<dict>\n <key>EnvironmentVariables</key>\n \
<dict>\n <key>PATH</key>\n <string>/usr/bin</string>\n \
</dict>\n</dict>\n</plist>\n";
let scrubbed = scrub_plist_credential_env(xml).expect("parses");
assert!(scrubbed.keys.is_empty());
assert_eq!(scrubbed.xml, xml);
}
#[test]
fn scrub_ignores_keys_outside_the_environment_dict() {
let xml = "<plist version=\"1.0\">\n<dict>\n <key>KeepAlive</key>\n \
<dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n \
<key>Password</key>\n <string>not-an-env-var</string>\n</dict>\n</plist>\n";
let scrubbed = scrub_plist_credential_env(xml).expect("parses");
assert!(scrubbed.keys.is_empty());
assert_eq!(scrubbed.xml, xml);
}
#[test]
fn scrub_removes_a_self_closing_value() {
let xml = "<key>EnvironmentVariables</key>\n<dict>\n<key>API_KEY</key>\n<true/>\n\
<key>PATH</key>\n<string>/usr/bin</string>\n</dict>\n";
let scrubbed = scrub_plist_credential_env(xml).expect("parses");
assert_eq!(scrubbed.keys, vec!["API_KEY"]);
assert!(!scrubbed.xml.contains("<true/>"));
assert!(scrubbed.xml.contains("<key>PATH</key>"));
}
#[test]
fn scrub_reports_an_unterminated_environment_dict() {
let xml =
"<key>EnvironmentVariables</key>\n<dict>\n<key>PATH</key>\n<string>/usr/bin</string>\n";
let err = scrub_plist_credential_env(xml).expect_err("an unterminated dict is an error");
assert!(err.reason.contains("unterminated"), "was: {}", err.reason);
assert!(
!format!("{err}").contains("/usr/bin"),
"an error must not echo plist content"
);
}
#[test]
fn scrub_reports_a_key_with_no_value_element() {
let xml = "<key>EnvironmentVariables</key>\n<dict>\n<key>OPENROUTER_API_KEY</key>\n</dict>\n";
let err = scrub_plist_credential_env(xml).expect_err("a dangling key is an error");
assert!(
err.reason.contains("no value element"),
"was: {}",
err.reason
);
}
#[test]
fn scrub_reports_environment_variables_with_no_dict() {
let xml = "<plist version=\"1.0\">\n<key>EnvironmentVariables</key>\n \
<string>truncated</string>\n</plist>\n";
let err = scrub_plist_credential_env(xml).expect_err("a dictless environment is an error");
assert!(
err.reason.contains("not followed by a <dict>"),
"was: {}",
err.reason
);
}
#[test]
fn scrub_reports_an_unterminated_key() {
let xml = "<key>EnvironmentVariables</key>\n<dict>\n<key>OPENROUTER_API_KEY\n\
<string>x</string>\n</dict>\n";
let err = scrub_plist_credential_env(xml).expect_err("an unterminated key is an error");
assert!(
err.reason.contains("<key> is unterminated"),
"was: {}",
err.reason
);
assert_value_never_echoed(&format!("{err}"));
}
#[test]
fn scrub_reports_a_value_element_with_no_closing_tag() {
let xml = format!(
"<key>EnvironmentVariables</key>\n<dict>\n<key>OPENROUTER_API_KEY</key>\n\
<string>{FAKE_API_KEY}\n</dict>\n"
);
let err = scrub_plist_credential_env(&xml).expect_err("an unterminated value is an error");
assert!(
err.reason.contains("no value element"),
"was: {}",
err.reason
);
assert_value_never_echoed(&format!("{err}"));
}
#[test]
fn scrub_accepts_a_plist_with_no_environment_dict() {
let xml = "<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n \
<string>com.trusty.mpm</string>\n</dict>\n</plist>\n";
let scrubbed = scrub_plist_credential_env(xml).expect("parses");
assert!(scrubbed.keys.is_empty());
assert_eq!(scrubbed.xml, xml);
}
#[test]
fn every_registry_name_is_detected_as_a_credential() {
for (provider, var) in crate::credential_registry::REGISTRY {
assert!(
is_credential_env_key(var),
"registered credential {var} (provider {provider}) is not detected"
);
}
}
#[test]
fn a_binary_plist_is_detected_by_magic() {
let mut bytes = b"bplist00".to_vec();
bytes.extend_from_slice(&[0xd1, 0x01, 0x02, 0x5f]);
assert!(is_binary_plist(&bytes));
}
#[test]
fn an_xml_plist_is_not_mistaken_for_a_binary_one() {
assert!(!is_binary_plist(plist_with_credential().as_bytes()));
assert!(!is_binary_plist(b""));
}
#[test]
fn entries_carry_the_value_only_inside_the_wrapper() {
let xml = plist_with_credential();
let entries = credential_entries(&xml).expect("parses");
assert_eq!(entries.len(), 1);
assert_eq!(entries[0].key, "OPENROUTER_API_KEY");
assert_eq!(entries[0].value.expose(), FAKE_API_KEY);
assert_value_never_echoed(&format!("{:?}", entries[0]));
}
#[test]
fn plist_secret_never_renders_its_value() {
let secret = PlistSecret::new(FAKE_API_KEY);
assert_value_never_echoed(&format!("{secret:?} {secret}"));
assert_eq!(format!("{secret}"), "<redacted>");
assert!(!secret.is_empty());
}
#[test]
fn entries_are_empty_for_a_clean_plist() {
let xml = "<plist version=\"1.0\">\n<dict>\n <key>EnvironmentVariables</key>\n \
<dict>\n <key>PATH</key>\n <string>/usr/bin</string>\n \
</dict>\n</dict>\n</plist>\n";
assert!(credential_entries(xml).expect("parses").is_empty());
}
#[test]
fn scrub_plist_keys_removes_only_the_named_key() {
let xml = format!(
"<plist version=\"1.0\">\n<dict>\n \
<key>EnvironmentVariables</key>\n <dict>\n \
<key>OPENROUTER_API_KEY</key>\n <string>{FAKE_API_KEY}</string>\n \
<key>AWS_SECRET_ACCESS_KEY</key>\n <string>unmapped-fake</string>\n \
</dict>\n</dict>\n</plist>\n"
);
let scrubbed = scrub_plist_keys(&xml, &["OPENROUTER_API_KEY".to_string()]).expect("parses");
assert_eq!(scrubbed.keys, vec!["OPENROUTER_API_KEY".to_string()]);
assert!(!scrubbed.xml.contains("OPENROUTER_API_KEY"));
assert!(
scrubbed.xml.contains("AWS_SECRET_ACCESS_KEY"),
"an unmigrated key was stripped: {}",
scrubbed.xml
);
assert_value_never_echoed(&scrubbed.xml);
}
#[test]
fn scrub_plist_keys_with_no_names_is_byte_identical() {
let xml = plist_with_credential();
let scrubbed = scrub_plist_keys(&xml, &[]).expect("parses");
assert!(scrubbed.keys.is_empty());
assert_eq!(scrubbed.xml, xml);
}