use super::DelegatedToken;
use crate::{
dto::{page::Page, prelude::*},
ids::{CanisterRole, FleetKey},
};
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ApplicationSessionRequest {
pub delegated_token: DelegatedToken,
pub requested_scopes: Vec<String>,
pub requested_ttl_secs: Option<u64>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ApplicationSessionView {
pub authenticated_subject: Principal,
pub issuer: Principal,
pub scopes: Vec<String>,
pub established_at_ns: u64,
pub expires_at_ns: u64,
pub authority_generation: u64,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum InactiveApplicationSession {
Missing,
Expired {
expired_at_ns: u64,
},
StaleFleet,
StaleRole,
StaleGeneration {
session_generation: u64,
current_generation: u64,
},
InadmissibleSubject,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ApplicationSessionStatus {
Active(ApplicationSessionView),
Inactive(InactiveApplicationSession),
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ApplicationSessionVerifierPolicyView {
pub root_canister_id: Principal,
pub minimum_accepted_registry_epoch: Option<u64>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ApplicationSessionPolicyView {
pub fleet: FleetKey,
pub role: CanisterRole,
pub authority_generation: u64,
pub allowed_scopes: Vec<String>,
pub default_session_ttl_secs: u64,
pub maximum_session_ttl_secs: u64,
pub proof_lifetime_ceiling_ns: u64,
pub verifier: ApplicationSessionVerifierPolicyView,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ApplicationSessionAuditEntry {
pub transport_caller: Principal,
pub status: ApplicationSessionStatus,
}
#[derive(CandidType, Clone, Debug, Deserialize)]
pub struct ApplicationSessionAuditResponse {
pub policy: ApplicationSessionPolicyView,
pub sessions: Page<ApplicationSessionAuditEntry>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[expect(
clippy::large_enum_variant,
reason = "the bounded Candid command keeps its accepted direct request shape"
)]
pub enum ApplicationSessionCommand {
Establish(ApplicationSessionRequest),
Clear,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum ApplicationSessionCommandResponse {
Established(ApplicationSessionView),
Cleared,
}