oauth2_dropbox/extensions/
builder.rs1use 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#[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}