1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use super::{AuthorizationAddon, AuthorizationRequest, AccessTokenAddon, AccessTokenRequest};
use super::{AddonResult, Value};

pub use crate::code_grant::extensions::Pkce;

impl AuthorizationAddon for Pkce {
    fn execute(&self, request: &dyn AuthorizationRequest) -> AddonResult {
        let method = request.extension("code_challenge_method");
        let challenge = request.extension("code_challenge");

        let encoded = match self.challenge(method, challenge) {
            Err(()) => return AddonResult::Err,
            Ok(None) => return AddonResult::Ok,
            Ok(Some(encoded)) => encoded,
        };

        AddonResult::Data(encoded)
    }
}

impl AccessTokenAddon for Pkce {
    fn execute(&self, request: &dyn AccessTokenRequest, data: Option<Value>) -> AddonResult {
        let verifier = request.extension("code_verifier");

        match self.verify(data, verifier) {
            Ok(_) => AddonResult::Ok,
            Err(_) => AddonResult::Err,
        }
    }
}