use alibi_core::{AuthConfig, AuthContext, AuthRequest, AuthResult, AuthSchema, ContextExtensions};
use async_trait::async_trait;
pub struct ApiKeyCallbackContext<'a> {
pub request: Option<&'a AuthRequest>,
pub endpoint: Option<alibi_core::endpoint::EndpointCall>,
pub auth_config: &'a AuthConfig,
pub extensions: &'a ContextExtensions,
pub configuration_id: &'a str,
pub verification_input: Option<&'a super::VerifyApiKey<'a>>,
}
impl std::fmt::Debug for ApiKeyCallbackContext<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ApiKeyCallbackContext")
.finish_non_exhaustive()
}
}
impl<'a> ApiKeyCallbackContext<'a> {
pub(super) fn with_endpoint(mut self, endpoint: &alibi_core::endpoint::EndpointCall) -> Self {
self.endpoint = Some(endpoint.clone());
self
}
#[must_use]
pub(super) fn new(
request: Option<&'a AuthRequest>,
ctx: &'a AuthContext<impl AuthSchema>,
configuration_id: &'a str,
) -> Self {
Self {
request,
endpoint: alibi_core::endpoint::current_endpoint_call_context(),
auth_config: &ctx.config,
extensions: &ctx.extensions,
configuration_id,
verification_input: None,
}
}
#[must_use]
pub(super) const fn with_verification_input(
mut self,
input: &'a super::VerifyApiKey<'a>,
) -> Self {
self.verification_input = Some(input);
self
}
}
pub trait ApiKeyGetter: Send + Sync {
fn get_key(&self, context: &ApiKeyCallbackContext<'_>) -> AuthResult<Option<String>>;
}
#[async_trait]
pub trait ApiKeyValidator: Send + Sync {
async fn validate(&self, context: &ApiKeyCallbackContext<'_>, key: &str) -> AuthResult<bool>;
}
pub type ApiKeyPermissions = indexmap::IndexMap<String, Vec<String>>;
pub struct ApiKeyGenerationOptions<'a> {
pub length: f64,
pub prefix: Option<&'a str>,
}
impl std::fmt::Debug for ApiKeyGenerationOptions<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ApiKeyGenerationOptions")
.finish_non_exhaustive()
}
}
#[async_trait]
pub trait ApiKeyGenerator: Send + Sync {
async fn generate_key(&self, options: &ApiKeyGenerationOptions<'_>) -> AuthResult<String>;
}
#[async_trait]
pub trait ApiKeyDefaultPermissions: Send + Sync {
async fn default_permissions(
&self,
reference_id: &str,
context: &ApiKeyCallbackContext<'_>,
) -> AuthResult<ApiKeyPermissions>;
}