use async_trait::async_trait;
use oxide_auth::endpoint::{OAuthError, Template, WebRequest, OwnerConsent, Solicitation, Scopes};
pub use crate::code_grant::access_token::{Extension as AccessTokenExtension};
pub use crate::code_grant::authorization::Extension as AuthorizationExtension;
pub use crate::code_grant::client_credentials::{Extension as ClientCredentialsExtension};
use crate::primitives::{Authorizer, Registrar, Issuer};
pub mod authorization;
pub mod access_token;
pub mod client_credentials;
pub mod refresh;
pub mod resource;
pub trait Endpoint<Request>
where
Request: WebRequest,
{
type Error;
fn registrar(&self) -> Option<&(dyn Registrar + Sync)>;
fn authorizer_mut(&mut self) -> Option<&mut (dyn Authorizer + Send)>;
fn issuer_mut(&mut self) -> Option<&mut (dyn Issuer + Send)>;
fn owner_solicitor(&mut self) -> Option<&mut (dyn OwnerSolicitor<Request> + Send)>;
fn scopes(&mut self) -> Option<&mut dyn Scopes<Request>>;
fn response(
&mut self, request: &mut Request, kind: Template,
) -> Result<Request::Response, Self::Error>;
fn error(&mut self, err: OAuthError) -> Self::Error;
fn web_error(&mut self, err: Request::Error) -> Self::Error;
fn extension(&mut self) -> Option<&mut (dyn Extension + Send)> {
None
}
}
pub trait Extension {
fn authorization(&mut self) -> Option<&mut (dyn AuthorizationExtension + Send)> {
None
}
fn access_token(&mut self) -> Option<&mut (dyn AccessTokenExtension + Send)> {
None
}
fn client_credentials(&mut self) -> Option<&mut (dyn ClientCredentialsExtension + Send)> {
None
}
}
#[async_trait]
pub trait OwnerSolicitor<Request: WebRequest> {
async fn check_consent(
&mut self, req: &mut Request, solicitation: Solicitation<'_>,
) -> OwnerConsent<Request::Response>;
}
#[async_trait]
impl<T, Request: WebRequest> OwnerSolicitor<Request> for T
where
T: oxide_auth::endpoint::OwnerSolicitor<Request> + ?Sized + Send,
Request: Send,
{
async fn check_consent(
&mut self, req: &mut Request, solicitation: Solicitation<'_>,
) -> OwnerConsent<Request::Response> {
oxide_auth::endpoint::OwnerSolicitor::check_consent(self, req, solicitation)
}
}