use std::sync::Arc;
use crate::actix_web::HttpRequest;
use crate::biome::rest_api::resources::authorize::AuthorizationResult;
use crate::biome::rest_api::BiomeRestConfig;
use crate::rest_api::get_authorization_token;
use crate::rest_api::secrets::SecretManager;
use crate::rest_api::sessions::{validate_token, TokenValidationError};
pub(crate) fn authorize_user(
request: &HttpRequest,
user_id: &str,
secret_manager: &Arc<dyn SecretManager>,
rest_config: &BiomeRestConfig,
) -> AuthorizationResult {
let auth_token = match get_authorization_token(&request) {
Ok(token) => token,
Err(err) => {
debug!("Failed to get token: {}", err);
return AuthorizationResult::Unauthorized("User is not authorized".to_string());
}
};
let secret = match secret_manager.secret() {
Ok(secret) => secret,
Err(err) => {
debug!("Failed to fetch secret {}", err);
return AuthorizationResult::Failed;
}
};
if let Err(err) = validate_token(&auth_token, &secret, &rest_config.issuer(), |claim| {
if user_id != claim.user_id() {
return Err(TokenValidationError::InvalidClaim(format!(
"User is not update keys for user {}",
user_id
)));
}
Ok(())
}) {
debug!("Invalid token: {}", err);
return AuthorizationResult::Unauthorized("User is not authorized".to_string());
};
AuthorizationResult::Authorized
}