use axum::response::Response;
use serde_json::Value;
use trust_tasks_rs::{RejectReason, TrustTask};
use vta_sdk::protocols::auth::{RevokeSessionRequest, RevokeSessionResponse};
use crate::acl::Role;
use crate::audit::audit;
use crate::auth::AuthClaims;
use crate::auth::session::{delete_session, get_session};
use crate::server::AppState;
use super::helpers::{reject_with, success_response};
#[allow(dead_code)] pub(super) const DISPATCHED_URIS: &[&str] = &[vta_sdk::trust_tasks::TASK_AUTH_REVOKE_SESSION_0_1];
pub(super) async fn handle_revoke_session(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> Response {
let req: RevokeSessionRequest = match serde_json::from_value(doc.payload.clone()) {
Ok(r) => r,
Err(e) => {
return reject_with(
&doc,
RejectReason::MalformedRequest {
reason: format!("revoke-session payload parse: {e}"),
},
);
}
};
let session = match get_session(&state.sessions_ks, &req.session_id).await {
Ok(Some(s)) => s,
Ok(None) => {
return reject_with(
&doc,
RejectReason::TaskFailed {
reason: format!("session not found: {}", req.session_id),
details: None,
},
);
}
Err(e) => {
tracing::error!(error = %e, "session lookup failed in revoke-session");
return reject_with(
&doc,
RejectReason::InternalError {
reason: format!("session lookup: {e}"),
},
);
}
};
if session.did != auth.did && auth.role != Role::Admin {
tracing::warn!(
caller = %auth.did,
session_did = %session.did,
session_id = %req.session_id,
"revoke-session rejected: caller is not owner or admin"
);
return reject_with(
&doc,
RejectReason::PermissionDenied {
reason: "cannot revoke another user's session".to_string(),
},
);
}
if let Err(e) = delete_session(&state.sessions_ks, &req.session_id).await {
tracing::error!(error = %e, session_id = %req.session_id, "session delete failed");
return reject_with(
&doc,
RejectReason::InternalError {
reason: format!("session delete: {e}"),
},
);
}
audit!(
"session.revoke",
actor = &auth.did,
resource = &req.session_id,
outcome = "success"
);
tracing::info!(
caller = %auth.did,
session_id = %req.session_id,
"session revoked via trust-task"
);
success_response(&doc, RevokeSessionResponse::default())
}