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