use super::helpers::TrustTaskOutcome;
use serde_json::Value;
use trust_tasks_rs::TrustTask;
use vti_common::trust_task::discovery;
use crate::auth::AuthClaims;
use crate::server::AppState;
use super::helpers::{parse_payload, success_response};
pub(super) async fn handle_trust_task_discovery(
_state: &AppState,
_auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
use trust_tasks_rs::specs::trust_task_discovery::v0_1 as wire;
let req: wire::Payload = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
success_response(
&doc,
discovery::respond_v0_1(super::dispatched_uris(), &req),
)
}
pub(super) async fn handle_trust_task_discovery_v0_3(
_state: &AppState,
_auth: &AuthClaims,
doc: TrustTask<Value>,
) -> TrustTaskOutcome {
use trust_tasks_rs::specs::trust_task_discovery::v0_3 as wire;
let req: wire::Payload = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
success_response(
&doc,
discovery::respond_v0_3(super::dispatched_uris(), &req),
)
}
#[cfg(test)]
mod tests {
use trust_tasks_rs::specs::trust_task_discovery::v0_3;
use vti_common::trust_task::acceptance::AcceptanceWindow;
fn advertised() -> AcceptanceWindow {
let response = vti_common::trust_task::discovery::respond_v0_3(
crate::trust_tasks::dispatched_uris(),
&v0_3::Payload::default(),
);
AcceptanceWindow::from_advertised(
response
.acceptance_window
.as_ref()
.expect("VTI-TRN-047: a VTA SHOULD advertise its window"),
)
}
#[test]
fn vti_trn_047_the_advertised_window_is_the_applied_window() {
let advertised = advertised();
let applied = super::super::freshness_policy();
assert_eq!(Some(advertised.max_age), applied.max_age);
assert_eq!(advertised.clock_skew, applied.skew);
}
#[test]
fn vti_trn_047_a_document_at_the_advertised_edge_is_accepted_and_one_past_it_refused() {
let w = advertised();
let now = chrono::SubsecRound::trunc_subsecs(chrono::Utc::now(), 0);
let doc = |issued| {
let mut d = trust_tasks_rs::TrustTask::new(
"urn:uuid:00000000-0000-4000-8000-000000000000".to_string(),
"https://trusttasks.org/spec/acl/list/0.1".parse().unwrap(),
serde_json::json!({}),
);
d.issued_at = Some(issued);
d
};
let policy = super::super::freshness_policy();
let edge = now - w.max_age - w.clock_skew;
assert!(doc(edge).validate_freshness(now, &policy).is_ok());
assert!(
doc(edge - chrono::TimeDelta::seconds(1))
.validate_freshness(now, &policy)
.is_err()
);
}
#[test]
fn discovery_draws_on_the_real_dispatch_table() {
let all = crate::trust_tasks::dispatched_uris();
assert!(
all.len() > 50,
"only {} dispatched URIs — discovery would under-report; fix the \
table rather than this floor",
all.len()
);
for version in [
vta_sdk::trust_tasks::TASK_TRUST_TASK_DISCOVERY_0_1,
vta_sdk::trust_tasks::TASK_TRUST_TASK_DISCOVERY_0_3,
] {
assert!(
all.contains(&version),
"discovery must advertise itself ({version}) — a client that \
cannot see it cannot know to ask again"
);
}
}
}