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::{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 if let Some(ref local_var_user_agent) = local_var_configuration.user_agent {
75 local_var_req_builder = local_var_req_builder
76 .header(reqwest::header::USER_AGENT, local_var_user_agent.clone());
77 }
78
79 let local_var_req = local_var_req_builder.build()?;
80 let local_var_resp = local_var_client.execute(local_var_req).await?;
81
82 let local_var_status = local_var_resp.status();
83 let local_var_content = local_var_resp.text().await?;
84
85 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
86 Ok(())
87 } else {
88 let local_var_entity: Option<ExternalCallbackError> =
89 serde_json::from_str(&local_var_content).ok();
90 let local_var_error = ResponseContent {
91 status: local_var_status,
92 content: local_var_content,
93 entity: local_var_entity,
94 };
95 Err(Error::ResponseError(local_var_error))
96 }
97 }
98
99 async fn external_challenge<'a>(
100 &self,
101 domain_hint: Option<&'a str>,
102 return_url: Option<&'a str>,
103 user_identifier: Option<&'a str>,
104 sso_token: Option<&'a str>,
105 ) -> Result<(), Error<ExternalChallengeError>> {
106 let local_var_configuration = &self.configuration;
107
108 let local_var_client = &local_var_configuration.client;
109
110 let local_var_uri_str = format!(
111 "{}/sso/ExternalChallenge",
112 local_var_configuration.base_path
113 );
114 let mut local_var_req_builder =
115 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
116
117 if let Some(ref param_value) = domain_hint {
118 local_var_req_builder =
119 local_var_req_builder.query(&[("domainHint", ¶m_value.to_string())]);
120 }
121 if let Some(ref param_value) = return_url {
122 local_var_req_builder =
123 local_var_req_builder.query(&[("returnUrl", ¶m_value.to_string())]);
124 }
125 if let Some(ref param_value) = user_identifier {
126 local_var_req_builder =
127 local_var_req_builder.query(&[("userIdentifier", ¶m_value.to_string())]);
128 }
129 if let Some(ref param_value) = sso_token {
130 local_var_req_builder =
131 local_var_req_builder.query(&[("ssoToken", ¶m_value.to_string())]);
132 }
133 if let Some(ref local_var_user_agent) = local_var_configuration.user_agent {
134 local_var_req_builder = local_var_req_builder
135 .header(reqwest::header::USER_AGENT, local_var_user_agent.clone());
136 }
137
138 let local_var_req = local_var_req_builder.build()?;
139 let local_var_resp = local_var_client.execute(local_var_req).await?;
140
141 let local_var_status = local_var_resp.status();
142 let local_var_content = local_var_resp.text().await?;
143
144 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
145 Ok(())
146 } else {
147 let local_var_entity: Option<ExternalChallengeError> =
148 serde_json::from_str(&local_var_content).ok();
149 let local_var_error = ResponseContent {
150 status: local_var_status,
151 content: local_var_content,
152 entity: local_var_entity,
153 };
154 Err(Error::ResponseError(local_var_error))
155 }
156 }
157
158 async fn login<'a>(&self, return_url: Option<&'a str>) -> Result<(), Error<LoginError>> {
159 let local_var_configuration = &self.configuration;
160
161 let local_var_client = &local_var_configuration.client;
162
163 let local_var_uri_str = format!("{}/sso/Login", local_var_configuration.base_path);
164 let mut local_var_req_builder =
165 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
166
167 if let Some(ref param_value) = return_url {
168 local_var_req_builder =
169 local_var_req_builder.query(&[("returnUrl", ¶m_value.to_string())]);
170 }
171 if let Some(ref local_var_user_agent) = local_var_configuration.user_agent {
172 local_var_req_builder = local_var_req_builder
173 .header(reqwest::header::USER_AGENT, local_var_user_agent.clone());
174 }
175
176 let local_var_req = local_var_req_builder.build()?;
177 let local_var_resp = local_var_client.execute(local_var_req).await?;
178
179 let local_var_status = local_var_resp.status();
180 let local_var_content = local_var_resp.text().await?;
181
182 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
183 Ok(())
184 } else {
185 let local_var_entity: Option<LoginError> =
186 serde_json::from_str(&local_var_content).ok();
187 let local_var_error = ResponseContent {
188 status: local_var_status,
189 content: local_var_content,
190 entity: local_var_entity,
191 };
192 Err(Error::ResponseError(local_var_error))
193 }
194 }
195
196 async fn pre_validate<'a>(
197 &self,
198 domain_hint: Option<&'a str>,
199 ) -> Result<(), Error<PreValidateError>> {
200 let local_var_configuration = &self.configuration;
201
202 let local_var_client = &local_var_configuration.client;
203
204 let local_var_uri_str = format!("{}/sso/PreValidate", local_var_configuration.base_path);
205 let mut local_var_req_builder =
206 local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str());
207
208 if let Some(ref param_value) = domain_hint {
209 local_var_req_builder =
210 local_var_req_builder.query(&[("domainHint", ¶m_value.to_string())]);
211 }
212 if let Some(ref local_var_user_agent) = local_var_configuration.user_agent {
213 local_var_req_builder = local_var_req_builder
214 .header(reqwest::header::USER_AGENT, local_var_user_agent.clone());
215 }
216
217 let local_var_req = local_var_req_builder.build()?;
218 let local_var_resp = local_var_client.execute(local_var_req).await?;
219
220 let local_var_status = local_var_resp.status();
221 let local_var_content = local_var_resp.text().await?;
222
223 if !local_var_status.is_client_error() && !local_var_status.is_server_error() {
224 Ok(())
225 } else {
226 let local_var_entity: Option<PreValidateError> =
227 serde_json::from_str(&local_var_content).ok();
228 let local_var_error = ResponseContent {
229 status: local_var_status,
230 content: local_var_content,
231 entity: local_var_entity,
232 };
233 Err(Error::ResponseError(local_var_error))
234 }
235 }
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize)]
240#[serde(untagged)]
241pub enum ExternalCallbackError {
242 UnknownValue(serde_json::Value),
243}
244#[derive(Debug, Clone, Serialize, Deserialize)]
246#[serde(untagged)]
247pub enum ExternalChallengeError {
248 UnknownValue(serde_json::Value),
249}
250#[derive(Debug, Clone, Serialize, Deserialize)]
252#[serde(untagged)]
253pub enum LoginError {
254 UnknownValue(serde_json::Value),
255}
256#[derive(Debug, Clone, Serialize, Deserialize)]
258#[serde(untagged)]
259pub enum PreValidateError {
260 UnknownValue(serde_json::Value),
261}