use crate::token::{TokenManager, constant_time_eq};
#[must_use]
pub fn admin_access_granted(
manager: &TokenManager,
provided: Option<&str>,
admin_key: Option<&str>,
allow_anonymous: bool,
) -> bool {
if let Some(provided) = provided {
if manager.validate_admin_token(provided).is_ok() {
return true;
}
if let Some(required) = admin_key
&& constant_time_eq(provided, required)
{
return true;
}
}
allow_anonymous
}
#[cfg(test)]
mod tests {
use super::*;
use crate::token::{IssueRequest, TokenError};
fn manager() -> TokenManager {
TokenManager::new("secret-for-admin-auth-tests")
}
#[test]
fn unauthenticated_request_is_refused_when_no_credential_is_configured() {
assert!(!admin_access_granted(&manager(), None, None, false));
}
#[test]
fn unauthenticated_request_is_refused_when_an_admin_key_is_configured() {
assert!(!admin_access_granted(
&manager(),
None,
Some("s3cret"),
false
));
}
#[test]
fn anonymous_access_requires_an_explicit_opt_out() {
assert!(admin_access_granted(&manager(), None, None, true));
}
#[test]
fn admin_scoped_token_is_accepted() {
let mgr = manager();
let token = mgr
.issue_admin_token(1, "ops")
.expect("should issue admin token");
assert!(admin_access_granted(&mgr, Some(&token), None, false));
}
#[test]
fn ordinary_client_token_is_rejected() {
let mgr = manager();
let token = mgr.issue_token(1, "client").expect("should issue");
assert!(matches!(
mgr.validate_admin_token(&token),
Err(TokenError::InsufficientScope)
));
assert!(!admin_access_granted(&mgr, Some(&token), None, false));
}
#[test]
fn revoked_admin_token_is_rejected() {
let mgr = manager();
let token = mgr.issue_admin_token(1, "ops").expect("should issue");
let claims = mgr.validate_token(&token).expect("should validate");
mgr.revoke_token(&claims.sub).expect("should revoke");
assert!(!admin_access_granted(&mgr, Some(&token), None, false));
}
#[test]
fn expired_admin_token_is_rejected() {
let mgr = manager();
let token = mgr
.issue(&IssueRequest {
ttl_hours: -1,
label: "stale",
scope: crate::token::ADMIN_SCOPE,
..IssueRequest::default()
})
.expect("should issue");
assert!(!admin_access_granted(&mgr, Some(&token), None, false));
}
#[test]
fn flat_admin_key_still_works_as_a_bootstrap_credential() {
let mgr = manager();
assert!(admin_access_granted(
&mgr,
Some("s3cret"),
Some("s3cret"),
false
));
assert!(!admin_access_granted(
&mgr,
Some("wrong"),
Some("s3cret"),
false
));
}
}