oxide_auth_async/frontends/simple/extensions/
list.rs

1use async_trait::async_trait;
2use oxide_auth::code_grant::authorization::Request;
3use oxide_auth::code_grant::accesstoken::Request as TokenRequest;
4use oxide_auth::code_grant::client_credentials::Request as ClientCredentialsRequest;
5use oxide_auth::frontends::simple::extensions::{AddonList, AddonResult};
6use oxide_auth::primitives::grant::Extensions;
7
8use crate::endpoint::Extension;
9use crate::code_grant::access_token::{Extension as AccessTokenExtension};
10use crate::code_grant::authorization::Extension as AuthorizationExtension;
11use crate::code_grant::client_credentials::{Extension as ClientCredentialsExtension};
12
13impl Extension for AddonList {
14    fn authorization(&mut self) -> Option<&mut (dyn AuthorizationExtension + Send)> {
15        Some(self)
16    }
17
18    fn access_token(&mut self) -> Option<&mut (dyn AccessTokenExtension + Send)> {
19        Some(self)
20    }
21
22    fn client_credentials(&mut self) -> Option<&mut (dyn ClientCredentialsExtension + Send)> {
23        Some(self)
24    }
25}
26
27#[async_trait]
28impl AuthorizationExtension for AddonList {
29    async fn extend(&mut self, request: &(dyn Request + Sync)) -> std::result::Result<Extensions, ()> {
30        let mut result_data = Extensions::new();
31
32        for ext in self.authorization.iter() {
33            let result = ext.execute(request);
34
35            match result {
36                AddonResult::Ok => (),
37                AddonResult::Data(data) => result_data.set(ext, data),
38                AddonResult::Err => return Err(()),
39            }
40        }
41
42        Ok(result_data)
43    }
44}
45
46#[async_trait]
47impl AccessTokenExtension for AddonList {
48    async fn extend(
49        &mut self, request: &(dyn TokenRequest + Sync), mut data: Extensions,
50    ) -> std::result::Result<Extensions, ()> {
51        let mut result_data = Extensions::new();
52
53        for ext in self.access_token.iter() {
54            let ext_data = data.remove(ext);
55            let result = ext.execute(request, ext_data);
56
57            match result {
58                AddonResult::Ok => (),
59                AddonResult::Data(data) => result_data.set(ext, data),
60                AddonResult::Err => return Err(()),
61            }
62        }
63
64        Ok(result_data)
65    }
66}
67
68#[async_trait]
69impl ClientCredentialsExtension for AddonList {
70    async fn extend(
71        &mut self, request: &(dyn ClientCredentialsRequest + Sync),
72    ) -> std::result::Result<Extensions, ()> {
73        let mut result_data = Extensions::new();
74
75        for ext in self.client_credentials.iter() {
76            let result = ext.execute(request);
77
78            match result {
79                AddonResult::Ok => (),
80                AddonResult::Data(data) => result_data.set(ext, data),
81                AddonResult::Err => return Err(()),
82            }
83        }
84
85        Ok(result_data)
86    }
87}