bitwarden_core/auth/api/response/
identity_token_response.rs1use 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}