use crate::frame::VerifiedRequest;
use crate::profile::Profile;
use crate::ucan::{self, Context, Policy, Refusal, Request};
const CODE_UNAUTHORIZED: &str = "unauthorized";
const CODE_MALFORMED_FRAME: &str = "malformed_frame";
pub(super) fn authorize(
profile: Profile,
policy: Option<&Policy>,
request: &VerifiedRequest,
) -> Option<&'static str> {
let policy = policy?;
let Some(token) = &request.token else {
return Some(CODE_UNAUTHORIZED);
};
let ctx = Context {
caller: request.caller,
profile,
now: ucan::now_seconds(),
request: Some(Request {
realm: request.realm,
procedure: request.procedure.clone(),
}),
proofs: Context::keyed_proofs(request.proofs.as_deref().unwrap_or(&[])),
};
match ucan::authorize(token, policy, &ctx) {
Ok(_) => None,
Err(Refusal::UnreferencedProof) => Some(CODE_MALFORMED_FRAME),
Err(_) => Some(CODE_UNAUTHORIZED),
}
}