use std::sync::{Arc, Mutex};
use cylinder::{jwt::JsonWebTokenParser, Verifier};
use crate::error::InternalError;
use crate::rest_api::auth::{AuthorizationHeader, BearerToken};
use super::{Identity, IdentityProvider};
#[derive(Clone)]
pub struct CylinderKeyIdentityProvider {
verifier: Arc<Mutex<Box<dyn Verifier>>>,
}
impl CylinderKeyIdentityProvider {
pub fn new(verifier: Arc<Mutex<Box<dyn Verifier>>>) -> Self {
Self { verifier }
}
}
impl IdentityProvider for CylinderKeyIdentityProvider {
fn get_identity(
&self,
authorization: &AuthorizationHeader,
) -> Result<Option<Identity>, InternalError> {
let token = match authorization {
AuthorizationHeader::Bearer(BearerToken::Cylinder(token)) => token,
_ => return Ok(None),
};
Ok(
JsonWebTokenParser::new(&**self.verifier.lock().map_err(|_| {
InternalError::with_message(
"Cylinder key identity provider's verifier lock poisoned".into(),
)
})?)
.parse(token)
.map(|parsed_token| Identity::Key(parsed_token.issuer().as_hex()))
.ok(),
)
}
fn clone_box(&self) -> Box<dyn IdentityProvider> {
Box::new(self.clone())
}
}