bitwarden_core/auth/api/response/
identity_token_response.rs1use reqwest::StatusCode;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 auth::{
6 api::response::{
7 IdentityTokenFailResponse, IdentityTokenPayloadResponse, IdentityTokenRefreshResponse,
8 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}
22
23pub fn parse_identity_response(
24 status: StatusCode,
25 response: String,
26) -> Result<IdentityTokenResponse, LoginError> {
27 if let Ok(r) = serde_json::from_str::<IdentityTokenSuccessResponse>(&response) {
28 Ok(IdentityTokenResponse::Authenticated(r))
29 } else if let Ok(r) = serde_json::from_str::<IdentityTokenPayloadResponse>(&response) {
30 Ok(IdentityTokenResponse::Payload(r))
31 } else if let Ok(r) = serde_json::from_str::<IdentityTokenRefreshResponse>(&response) {
32 Ok(IdentityTokenResponse::Refreshed(r))
33 } else if let Ok(r) = serde_json::from_str::<IdentityTwoFactorResponse>(&response) {
34 Ok(IdentityTokenResponse::TwoFactorRequired(Box::new(r)))
35 } else if let Ok(r) = serde_json::from_str::<IdentityTokenFailResponse>(&response) {
36 Err(LoginError::IdentityFail(r))
37 } else {
38 Err(ApiError::ResponseContent {
39 status,
40 message: response,
41 }
42 .into())
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}