use super::{
LocalApplicationAuthorizationDecision, LocalApplicationAuthorizationDenial,
LocalApplicationAuthorizationRequest, authorize_with_values,
};
use crate::{
cdk::types::Principal,
ids::{CanisterRole, CanonicalNetworkId, FleetId, FleetKey},
model::auth::application_authorization::{
ApplicationScope, ApplicationScopeRef, CanonicalApplicationScopes,
LocalApplicationAuthoritySnapshot, LocalApplicationSession,
},
};
#[must_use]
pub fn measure_local_application_authorization_denial(
expected: LocalApplicationAuthorizationDenial,
) -> LocalApplicationAuthorizationDecision {
let caller = Principal::from_slice(&[7; 29]);
let other = Principal::from_slice(&[8; 29]);
let fleet = FleetKey {
canonical_network_id: CanonicalNetworkId::ic_mainnet(),
fleet_id: FleetId::from_generated_bytes([9; 32]),
};
let role = CanisterRole::from("application");
let authority = LocalApplicationAuthoritySnapshot::new(fleet, role.clone(), 4);
let session_generation = if expected == LocalApplicationAuthorizationDenial::StaleAuthority {
3
} else {
4
};
let session = LocalApplicationSession::new(
caller,
caller,
Principal::from_slice(&[10; 29]),
fleet,
role,
CanonicalApplicationScopes::for_session(vec![
ApplicationScope::parse("application:read").expect("canonical fixture scope"),
])
.expect("bounded fixture scopes"),
session_generation,
10,
100,
[11; 32],
[12; 32],
)
.expect("valid fixture session");
let actual_caller = if expected == LocalApplicationAuthorizationDenial::Anonymous {
Principal::anonymous()
} else if expected == LocalApplicationAuthorizationDenial::CallerMismatch {
other
} else {
caller
};
let capability_enabled = expected != LocalApplicationAuthorizationDenial::Disabled;
let authority = (expected != LocalApplicationAuthorizationDenial::AuthorityUnavailable)
.then_some(&authority);
let session =
(expected != LocalApplicationAuthorizationDenial::MissingSession).then_some(&session);
let now_ns = if expected == LocalApplicationAuthorizationDenial::Expired {
100
} else {
20
};
let subject_admissible = expected != LocalApplicationAuthorizationDenial::InadmissibleSubject;
let required_scope = if expected == LocalApplicationAuthorizationDenial::MissingScope {
ApplicationScopeRef::from_static("application:write")
} else {
ApplicationScopeRef::from_static("application:read")
};
let decision = authorize_with_values(
LocalApplicationAuthorizationRequest {
observed_transport_caller: caller,
required_scope,
},
actual_caller,
now_ns,
capability_enabled,
authority,
session,
subject_admissible,
);
assert_eq!(
decision,
LocalApplicationAuthorizationDecision::Deny(expected)
);
decision
}