bitwarden_api_identity/apis/
sso_api.rs1use std::sync::Arc;
12
13use async_trait::async_trait;
14#[cfg(feature = "mockall")]
15use mockall::automock;
16use reqwest;
17use serde::{Deserialize, Serialize, de::Error as _};
18
19use super::{Error, configuration};
20use crate::{
21 apis::{AuthRequired, ContentType, ResponseContent},
22 models,
23};
24
25#[cfg_attr(feature = "mockall", automock)]
26#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
27#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
28pub trait SsoApi: Send + Sync {
29 async fn external_callback(&self) -> Result<(), Error<ExternalCallbackError>>;
31
32 async fn external_challenge<'a>(
34 &self,
35 domain_hint: Option<&'a str>,
36 return_url: Option<&'a str>,
37 user_identifier: Option<&'a str>,
38 sso_token: Option<&'a str>,
39 ) -> Result<(), Error<ExternalChallengeError>>;
40
41 async fn login<'a>(&self, return_url: Option<&'a str>) -> Result<(), Error<LoginError>>;
43
44 async fn pre_validate<'a>(
46 &self,
47 domain_hint: Option<&'a str>,
48 ) -> Result<(), Error<PreValidateError>>;
49}
50
51pub struct SsoApiClient {
52 configuration: Arc<configuration::Configuration>,
53}
54
55impl SsoApiClient {
56 pub fn new(configuration: Arc<configuration::Configuration>) -> Self {
57 Self { configuration }
58 }
59}
60
61#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
62#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
63impl SsoApi for SsoApiClient {
64 async fn external_callback(&self) -> Result<(), Error<ExternalCallbackError>> {
65 let local_var_configuration = &self.configuration;
66
67 let local_var_client = &local_var_configuration.client;
68
69 let local_var_uri_str =
70 format!("{}/sso/ExternalCallback", local_var_configuration.base_path);
71 let mut local_var_req_builder =
72 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
73
74 let local_var_resp = local_var_req_builder.send().await?;
75
76 let local_var_status = local_var_resp.status();
77 let local_var_content = local_var_resp.text().await?;
78
79 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
80 Ok(())
81 } else {
82 let local_var_entity: Option<ExternalCallbackError> =
83 serde_json::from_str(&local_var_content).ok();
84 let local_var_error = ResponseContent {
85 status: local_var_status,
86 content: local_var_content,
87 entity: local_var_entity,
88 };
89 Err(Error::ResponseError(local_var_error))
90 }
91 }
92
93 async fn external_challenge<'a>(
94 &self,
95 domain_hint: Option<&'a str>,
96 return_url: Option<&'a str>,
97 user_identifier: Option<&'a str>,
98 sso_token: Option<&'a str>,
99 ) -> Result<(), Error<ExternalChallengeError>> {
100 let local_var_configuration = &self.configuration;
101
102 let local_var_client = &local_var_configuration.client;
103
104 let local_var_uri_str = format!(
105 "{}/sso/ExternalChallenge",
106 local_var_configuration.base_path
107 );
108 let mut local_var_req_builder =
109 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
110
111 if let Some(ref param_value) = domain_hint {
112 local_var_req_builder =
113 local_var_req_builder.query(&[("domainHint", ¶m_value.to_string())]);
114 }
115 if let Some(ref param_value) = return_url {
116 local_var_req_builder =
117 local_var_req_builder.query(&[("returnUrl", ¶m_value.to_string())]);
118 }
119 if let Some(ref param_value) = user_identifier {
120 local_var_req_builder =
121 local_var_req_builder.query(&[("userIdentifier", ¶m_value.to_string())]);
122 }
123 if let Some(ref param_value) = sso_token {
124 local_var_req_builder =
125 local_var_req_builder.query(&[("ssoToken", ¶m_value.to_string())]);
126 }
127
128 let local_var_resp = local_var_req_builder.send().await?;
129
130 let local_var_status = local_var_resp.status();
131 let local_var_content = local_var_resp.text().await?;
132
133 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
134 Ok(())
135 } else {
136 let local_var_entity: Option<ExternalChallengeError> =
137 serde_json::from_str(&local_var_content).ok();
138 let local_var_error = ResponseContent {
139 status: local_var_status,
140 content: local_var_content,
141 entity: local_var_entity,
142 };
143 Err(Error::ResponseError(local_var_error))
144 }
145 }
146
147 async fn login<'a>(&self, return_url: Option<&'a str>) -> Result<(), Error<LoginError>> {
148 let local_var_configuration = &self.configuration;
149
150 let local_var_client = &local_var_configuration.client;
151
152 let local_var_uri_str = format!("{}/sso/Login", local_var_configuration.base_path);
153 let mut local_var_req_builder =
154 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
155
156 if let Some(ref param_value) = return_url {
157 local_var_req_builder =
158 local_var_req_builder.query(&[("returnUrl", ¶m_value.to_string())]);
159 }
160
161 let local_var_resp = local_var_req_builder.send().await?;
162
163 let local_var_status = local_var_resp.status();
164 let local_var_content = local_var_resp.text().await?;
165
166 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
167 Ok(())
168 } else {
169 let local_var_entity: Option<LoginError> =
170 serde_json::from_str(&local_var_content).ok();
171 let local_var_error = ResponseContent {
172 status: local_var_status,
173 content: local_var_content,
174 entity: local_var_entity,
175 };
176 Err(Error::ResponseError(local_var_error))
177 }
178 }
179
180 async fn pre_validate<'a>(
181 &self,
182 domain_hint: Option<&'a str>,
183 ) -> Result<(), Error<PreValidateError>> {
184 let local_var_configuration = &self.configuration;
185
186 let local_var_client = &local_var_configuration.client;
187
188 let local_var_uri_str = format!("{}/sso/PreValidate", local_var_configuration.base_path);
189 let mut local_var_req_builder =
190 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
191
192 if let Some(ref param_value) = domain_hint {
193 local_var_req_builder =
194 local_var_req_builder.query(&[("domainHint", ¶m_value.to_string())]);
195 }
196
197 let local_var_resp = local_var_req_builder.send().await?;
198
199 let local_var_status = local_var_resp.status();
200 let local_var_content = local_var_resp.text().await?;
201
202 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
203 Ok(())
204 } else {
205 let local_var_entity: Option<PreValidateError> =
206 serde_json::from_str(&local_var_content).ok();
207 let local_var_error = ResponseContent {
208 status: local_var_status,
209 content: local_var_content,
210 entity: local_var_entity,
211 };
212 Err(Error::ResponseError(local_var_error))
213 }
214 }
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219#[serde(untagged)]
220pub enum ExternalCallbackError {
221 UnknownValue(serde_json::Value),
222}
223#[derive(Debug, Clone, Serialize, Deserialize)]
225#[serde(untagged)]
226pub enum ExternalChallengeError {
227 UnknownValue(serde_json::Value),
228}
229#[derive(Debug, Clone, Serialize, Deserialize)]
231#[serde(untagged)]
232pub enum LoginError {
233 UnknownValue(serde_json::Value),
234}
235#[derive(Debug, Clone, Serialize, Deserialize)]
237#[serde(untagged)]
238pub enum PreValidateError {
239 UnknownValue(serde_json::Value),
240}