Skip to main content

bitwarden_core/auth/api/response/
identity_token_response.rs

1use bitwarden_api_base::ResponseContent;
2use reqwest::StatusCode;
3use serde::{Deserialize, Serialize};
4
5use crate::auth::{
6    api::response::{
7        IdentityTokenFailResponse, IdentityTokenPayloadResponse, IdentityTokenRefreshResponse,
8        IdentityTokenSuccessResponse, IdentityTwoFactorResponse,
9    },
10    login::LoginError,
11};
12
13#[derive(Debug, Serialize, Deserialize, PartialEq)]
14pub(crate) enum IdentityTokenResponse {
15    Authenticated(IdentityTokenSuccessResponse),
16    Payload(IdentityTokenPayloadResponse),
17    Refreshed(IdentityTokenRefreshResponse),
18    TwoFactorRequired(Box<IdentityTwoFactorResponse>),
19}
20
21pub(crate) fn parse_identity_response(
22    status: StatusCode,
23    response: String,
24) -> Result<IdentityTokenResponse, LoginError> {
25    if let Ok(r) = serde_json::from_str::<IdentityTokenSuccessResponse>(&response) {
26        Ok(IdentityTokenResponse::Authenticated(r))
27    } else if let Ok(r) = serde_json::from_str::<IdentityTokenPayloadResponse>(&response) {
28        Ok(IdentityTokenResponse::Payload(r))
29    } else if let Ok(r) = serde_json::from_str::<IdentityTokenRefreshResponse>(&response) {
30        Ok(IdentityTokenResponse::Refreshed(r))
31    } else if let Ok(r) = serde_json::from_str::<IdentityTwoFactorResponse>(&response) {
32        Ok(IdentityTokenResponse::TwoFactorRequired(Box::new(r)))
33    } else if let Ok(r) = serde_json::from_str::<IdentityTokenFailResponse>(&response) {
34        Err(LoginError::IdentityFail(r))
35    } else {
36        Err(LoginError::Api(
37            ResponseContent {
38                status,
39                message: response,
40            }
41            .into(),
42        ))
43    }
44}
45
46#[cfg(test)]
47mod test {
48    use super::*;
49
50    #[test]
51    fn success() {
52        let expected = IdentityTokenSuccessResponse::default();
53        let success = serde_json::to_string(&expected).unwrap();
54        let expected = IdentityTokenResponse::Authenticated(expected);
55        let actual = parse_identity_response(StatusCode::OK, success).unwrap();
56        assert_eq!(expected, actual);
57    }
58
59    #[test]
60    fn two_factor() {
61        let expected = Box::<IdentityTwoFactorResponse>::default();
62        let two_factor = serde_json::to_string(&expected).unwrap();
63        let expected = IdentityTokenResponse::TwoFactorRequired(expected);
64        let actual = parse_identity_response(StatusCode::BAD_REQUEST, two_factor).unwrap();
65        assert_eq!(expected, actual);
66    }
67}