use std::str::FromStr;
use kovra_core::{
Coordinate, CoreError, EnvSegment, Scope, SecretRecord, SecretValue, Sensitivity, seal,
};
use kovra_core::{
AccessRequest, AgentScope, Clock, Decision, DenyReason, KeyAlgorithm, MockClock, Operation,
Origin, PackagePayload, Surface, decide, enforce_no_prod_unattended, generate, open_attended,
seal_package,
};
#[test]
fn ac_coordinate_three_segments_and_env_only_interpolation() {
let c = Coordinate::from_str("secret:prod/db/password").unwrap();
assert_eq!(c.scope, Scope::Default);
assert_eq!(c.environment, EnvSegment::Literal("prod".to_string()));
let c = Coordinate::from_str("secret:${ENV}/db/password").unwrap();
assert_eq!(c.environment, EnvSegment::Placeholder);
let c = Coordinate::from_str("secret://global/prod/db/password").unwrap();
assert_eq!(c.scope, Scope::Global);
for bad in [
"secret:prod/db", "secret:prod/db/password/extra", "secret:${FOO}/db/password", "secret:prod/${COMPONENT}/pw", "prod/db/password", "secret://local/p/c/k", ] {
assert!(
matches!(
Coordinate::from_str(bad),
Err(CoreError::InvalidCoordinate(_))
),
"expected `{bad}` to be rejected"
);
}
}
#[test]
fn ac_malformed_never_silently_resolves() {
assert!(Coordinate::from_str("secret:prod//password").is_err());
assert!(Coordinate::from_str("secret:").is_err());
assert!(Coordinate::from_str("").is_err());
}
#[test]
fn ac_anti_leak_i12() {
let value = "s3cr3t-token";
let sv = SecretValue::from(value);
assert_eq!(format!("{sv:?}"), "SecretValue(REDACTED)");
let record = SecretRecord::Literal {
value: sv,
sensitivity: Sensitivity::High,
revealable: false,
environment: "prod".to_string(),
component: "api".to_string(),
key: "token".to_string(),
description: None,
created: "2026-05-30T00:00:00Z".to_string(),
updated: "2026-05-30T00:00:00Z".to_string(),
};
assert!(!format!("{record:?}").contains(value));
let sealed = seal(&record, &[3u8; kovra_core::KEY_LEN]).unwrap();
assert!(!contains(&sealed.ciphertext, value.as_bytes()));
}
#[test]
fn ac_i6_value_never_in_coordinate() {
assert!(Coordinate::from_str("secret:prod/db/password/hunter2").is_err());
assert!(Coordinate::from_str("secret:prod/db/password=hunter2").is_ok());
let c = Coordinate::from_str("secret:prod/db/password=hunter2").unwrap();
assert_eq!(c.key, "password=hunter2");
}
fn contains(haystack: &[u8], needle: &[u8]) -> bool {
haystack.windows(needle.len()).any(|w| w == needle)
}
fn req<'a>(
coordinate: &'a Coordinate,
sensitivity: Sensitivity,
operation: Operation,
surface: Surface,
origin: Origin,
) -> AccessRequest<'a> {
AccessRequest {
coordinate,
project: None,
sensitivity,
revealable: false,
operation,
surface,
origin,
}
}
fn lit_record(env: &str, key: &str, value: &str) -> SecretRecord {
SecretRecord::Literal {
value: SecretValue::from(value),
sensitivity: Sensitivity::Medium,
revealable: false,
environment: env.to_string(),
component: "app".to_string(),
key: key.to_string(),
description: None,
created: "2026-05-30T00:00:00Z".to_string(),
updated: "2026-05-30T00:00:00Z".to_string(),
}
}
#[test]
fn ac_i1_webui_never_reveals_high() {
let c = Coordinate::from_str("secret:dev/app/key").unwrap();
let d = decide(
&req(
&c,
Sensitivity::High,
Operation::Reveal,
Surface::WebUi,
Origin::Human,
),
&AgentScope::full(),
);
assert_eq!(d, Decision::Deny(DenyReason::WebUiCriticalMasked));
}
#[test]
fn ac_i2_inject_only_never_revealed_on_any_surface() {
let c = Coordinate::from_str("secret:dev/app/key").unwrap();
for surface in [Surface::Cli, Surface::WebUi, Surface::Mcp] {
let d = decide(
&req(
&c,
Sensitivity::InjectOnly,
Operation::Reveal,
surface,
Origin::Human,
),
&AgentScope::full(),
);
assert_eq!(d, Decision::Deny(DenyReason::InjectOnlyNeverRevealed));
}
}
#[test]
fn ac_i11_mcp_never_reveals_critical_reason_only() {
let prod = Coordinate::from_str("secret:prod/db/password").unwrap();
let high = Coordinate::from_str("secret:dev/app/key").unwrap();
for (coord, sensitivity) in [(&prod, Sensitivity::Medium), (&high, Sensitivity::High)] {
let d = decide(
&req(
coord,
sensitivity,
Operation::Reveal,
Surface::Mcp,
Origin::Agent,
),
&AgentScope::full(),
);
assert_eq!(d, Decision::Deny(DenyReason::McpCriticalForbidden));
}
}
#[test]
fn ac_i14_prod_into_agent_denied_human_confirms() {
let c = Coordinate::from_str("secret:prod/db/password").unwrap();
assert_eq!(
decide(
&req(
&c,
Sensitivity::Medium,
Operation::Reveal,
Surface::Cli,
Origin::Agent
),
&AgentScope::full()
),
Decision::Deny(DenyReason::ProdRevealIntoAgentContext)
);
assert_eq!(
decide(
&req(
&c,
Sensitivity::High,
Operation::Reveal,
Surface::Cli,
Origin::Human
),
&AgentScope::full()
),
Decision::RequireConfirmation
);
}
#[test]
fn ac_i4a_package_refuses_prod_without_leaking_value() {
let recipient = generate(KeyAlgorithm::Ed25519).unwrap();
let payload = PackagePayload::new(
"prod",
"2026-05-30T00:00:00Z",
9_999_999_999,
vec![lit_record("prod", "db", "prod-only-secret")],
);
let err = seal_package(payload, &recipient.public_openssh).unwrap_err();
let msg = format!("{err}");
assert!(msg.contains("I4a"), "names the invariant: {msg}");
assert!(msg.contains("prod/app/db"), "names the coordinate: {msg}");
assert!(
!msg.contains("prod-only-secret"),
"the error must never carry the value"
);
}
#[test]
fn ac_i4b_unattended_refuses_prod_entry() {
let payload = PackagePayload::new(
"prod",
"2026-05-30T00:00:00Z",
9_999_999_999,
vec![lit_record("prod", "db", "x")],
);
let err = enforce_no_prod_unattended(&payload).unwrap_err();
assert!(format!("{err}").contains("I4b"));
}
#[test]
fn ac_i8_reference_travels_as_pointer() {
let recipient = generate(KeyAlgorithm::Ed25519).unwrap();
let clock = MockClock::default();
let reference = SecretRecord::Reference {
reference: "azure-kv://corp-kv/api-key".to_string(),
sensitivity: Sensitivity::Medium,
revealable: false,
environment: "dev".to_string(),
component: "app".to_string(),
key: "api".to_string(),
description: None,
created: "2026-05-30T00:00:00Z".to_string(),
updated: "2026-05-30T00:00:00Z".to_string(),
};
let payload = PackagePayload::new(
"dev",
"2026-05-30T00:00:00Z",
clock.unix_secs() + 3600,
vec![reference],
);
let (package, _token) = seal_package(payload, &recipient.public_openssh).unwrap();
let opened = open_attended(&package, &recipient.private_openssh, &clock).unwrap();
assert_eq!(
opened.entries[0].reference(),
Some("azure-kv://corp-kv/api-key"),
"the reference survives as a pointer, with no value attached"
);
}