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