#![cfg(all(feature = "webvh", feature = "didcomm"))]
use axum::response::Response;
use serde_json::Value;
use trust_tasks_rs::TrustTask;
use vta_sdk::protocols::did_management::passkey_vms::{
EnrollPasskeyChallengeBody, EnrollPasskeySubmitBody, ListPasskeyVmsBody, RevokePasskeyVmBody,
RevokePasskeyVmResponse,
};
use crate::auth::AuthClaims;
use crate::error::AppError;
use crate::operations;
use crate::server::AppState;
use super::helpers::{TRANSPORT_TRUST_TASK, app_error_to_reject, parse_payload, success_response};
#[allow(dead_code)] pub(super) const DISPATCHED_URIS: &[&str] = &[
vta_sdk::trust_tasks::TASK_PASSKEY_VMS_ENROLL_CHALLENGE_1_0,
vta_sdk::trust_tasks::TASK_PASSKEY_VMS_ENROLL_SUBMIT_1_0,
vta_sdk::trust_tasks::TASK_PASSKEY_VMS_LIST_1_0,
vta_sdk::trust_tasks::TASK_PASSKEY_VMS_REVOKE_1_0,
];
pub(super) async fn handle_enroll_challenge(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> Response {
let req: EnrollPasskeyChallengeBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
let config = state.config.read().await;
match operations::passkey_vms::start_enrollment(
&state.webvh_ks,
&state.passkey_vms_ks,
&config,
auth,
&req.did,
req.label,
)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, AppError::from(e)),
}
}
pub(super) async fn handle_enroll_submit(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> Response {
let req: EnrollPasskeySubmitBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
let did_resolver = match state.did_resolver.as_ref() {
Some(r) => r,
None => {
return app_error_to_reject(
&doc,
AppError::Internal("DID resolver not available".into()),
);
}
};
let vta_did = state.config.read().await.vta_did.clone();
let config = state.config.read().await.clone();
match operations::passkey_vms::finish_enrollment(
&state.keys_ks,
&state.imported_ks,
&state.contexts_ks,
&state.webvh_ks,
&state.audit_ks,
&state.passkey_vms_ks,
&*state.seed_store,
auth,
req,
did_resolver,
&state.didcomm_bridge,
vta_did.as_deref(),
&state.webvh_auth_locks,
&config,
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, AppError::from(e)),
}
}
pub(super) async fn handle_list(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> Response {
let req: ListPasskeyVmsBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
match operations::passkey_vms::list_passkeys(&state.webvh_ks, auth, &req.did).await {
Ok(body) => success_response(&doc, body),
Err(e) => app_error_to_reject(&doc, AppError::from(e)),
}
}
pub(super) async fn handle_revoke(
state: &AppState,
auth: &AuthClaims,
doc: TrustTask<Value>,
) -> Response {
let req: RevokePasskeyVmBody = match parse_payload(&doc) {
Ok(r) => r,
Err(resp) => return resp,
};
let did_resolver = match state.did_resolver.as_ref() {
Some(r) => r,
None => {
return app_error_to_reject(
&doc,
AppError::Internal("DID resolver not available".into()),
);
}
};
let vta_did = state.config.read().await.vta_did.clone();
match operations::passkey_vms::revoke_passkey(
&state.keys_ks,
&state.imported_ks,
&state.contexts_ks,
&state.webvh_ks,
&state.audit_ks,
&*state.seed_store,
auth,
&req.did,
&req.fragment,
did_resolver,
&state.didcomm_bridge,
vta_did.as_deref(),
&state.webvh_auth_locks,
TRANSPORT_TRUST_TASK,
)
.await
{
Ok(()) => success_response(&doc, RevokePasskeyVmResponse::default()),
Err(e) => app_error_to_reject(&doc, AppError::from(e)),
}
}