oauth2_dropbox/extensions/
builder.rs

1use oauth2_client::{
2    extensions::{
3        AccessTokenResponseSuccessfulBody, Builder, BuilderObtainUserInfoError,
4        BuilderObtainUserInfoOutput, GrantInfo, UserInfo,
5    },
6    oauth2_core::types::ScopeParameter,
7    re_exports::Scope,
8};
9
10use crate::DropboxScope;
11
12use super::DropboxUserInfoEndpoint;
13
14//
15#[derive(Debug, Clone)]
16pub struct DropboxExtensionsBuilder;
17
18impl<SCOPE> Builder<SCOPE> for DropboxExtensionsBuilder
19where
20    SCOPE: Scope,
21{
22    fn obtain_user_info(
23        &self,
24        _grant_info: GrantInfo<SCOPE>,
25        access_token: &AccessTokenResponseSuccessfulBody<SCOPE>,
26    ) -> Result<BuilderObtainUserInfoOutput, BuilderObtainUserInfoError> {
27        let extra = access_token
28            .extra()
29            .ok_or("extra missing")
30            .map_err(BuilderObtainUserInfoError::Unreachable)?;
31
32        let uid = extra
33            .get("uid")
34            .ok_or("uid missing")
35            .map_err(BuilderObtainUserInfoError::Unreachable)?
36            .as_str()
37            .ok_or("uid mismatch")
38            .map_err(BuilderObtainUserInfoError::Unreachable)?
39            .to_owned();
40
41        let scopes = access_token
42            .scope
43            .to_owned()
44            .map(|x| ScopeParameter::<String>::from(&x).0)
45            .unwrap_or_default();
46
47        if scopes.contains(&DropboxScope::SharingRead.to_string()) {
48            let account_id = extra
49                .get("account_id")
50                .ok_or("account_id missing")
51                .map_err(BuilderObtainUserInfoError::Unreachable)?
52                .as_str()
53                .ok_or("account_id mismatch")
54                .map_err(BuilderObtainUserInfoError::Unreachable)?
55                .to_owned();
56
57            return Ok(BuilderObtainUserInfoOutput::Respond(Box::new(
58                DropboxUserInfoEndpoint::new(&access_token.access_token, account_id, uid),
59            )));
60        }
61
62        Ok(BuilderObtainUserInfoOutput::Static(UserInfo {
63            uid,
64            name: None,
65            email: None,
66            raw: extra.to_owned(),
67        }))
68    }
69}