this repo has no description
1use super::super::{AuthFlowState, AuthorizationRequestParameters, ClientAuth, OAuthError, RequestData};
2use super::helpers::{from_json, to_json};
3use sqlx::PgPool;
4
5pub async fn get_authorization_request_with_state(
6 pool: &PgPool,
7 request_id: &str,
8) -> Result<Option<(RequestData, AuthFlowState)>, OAuthError> {
9 match get_authorization_request(pool, request_id).await? {
10 Some(data) => {
11 let state = AuthFlowState::from_request_data(&data);
12 Ok(Some((data, state)))
13 }
14 None => Ok(None),
15 }
16}
17
18pub async fn create_authorization_request(
19 pool: &PgPool,
20 request_id: &str,
21 data: &RequestData,
22) -> Result<(), OAuthError> {
23 let client_auth_json = match &data.client_auth {
24 Some(ca) => Some(to_json(ca)?),
25 None => None,
26 };
27 let parameters_json = to_json(&data.parameters)?;
28 sqlx::query!(
29 r#"
30 INSERT INTO oauth_authorization_request
31 (id, did, device_id, client_id, client_auth, parameters, expires_at, code)
32 VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
33 "#,
34 request_id,
35 data.did,
36 data.device_id,
37 data.client_id,
38 client_auth_json,
39 parameters_json,
40 data.expires_at,
41 data.code,
42 )
43 .execute(pool)
44 .await?;
45 Ok(())
46}
47
48pub async fn get_authorization_request(
49 pool: &PgPool,
50 request_id: &str,
51) -> Result<Option<RequestData>, OAuthError> {
52 let row = sqlx::query!(
53 r#"
54 SELECT did, device_id, client_id, client_auth, parameters, expires_at, code, controller_did
55 FROM oauth_authorization_request
56 WHERE id = $1
57 "#,
58 request_id
59 )
60 .fetch_optional(pool)
61 .await?;
62 match row {
63 Some(r) => {
64 let client_auth: Option<ClientAuth> = match r.client_auth {
65 Some(v) => Some(from_json(v)?),
66 None => None,
67 };
68 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
69 Ok(Some(RequestData {
70 client_id: r.client_id,
71 client_auth,
72 parameters,
73 expires_at: r.expires_at,
74 did: r.did,
75 device_id: r.device_id,
76 code: r.code,
77 controller_did: r.controller_did,
78 }))
79 }
80 None => Ok(None),
81 }
82}
83
84pub async fn set_authorization_did(
85 pool: &PgPool,
86 request_id: &str,
87 did: &str,
88 device_id: Option<&str>,
89) -> Result<(), OAuthError> {
90 sqlx::query!(
91 r#"
92 UPDATE oauth_authorization_request
93 SET did = $2, device_id = $3
94 WHERE id = $1
95 "#,
96 request_id,
97 did,
98 device_id
99 )
100 .execute(pool)
101 .await?;
102 Ok(())
103}
104
105pub async fn update_authorization_request(
106 pool: &PgPool,
107 request_id: &str,
108 did: &str,
109 device_id: Option<&str>,
110 code: &str,
111) -> Result<(), OAuthError> {
112 sqlx::query!(
113 r#"
114 UPDATE oauth_authorization_request
115 SET did = $2, device_id = $3, code = $4
116 WHERE id = $1
117 "#,
118 request_id,
119 did,
120 device_id,
121 code
122 )
123 .execute(pool)
124 .await?;
125 Ok(())
126}
127
128pub async fn consume_authorization_request_by_code(
129 pool: &PgPool,
130 code: &str,
131) -> Result<Option<RequestData>, OAuthError> {
132 let row = sqlx::query!(
133 r#"
134 DELETE FROM oauth_authorization_request
135 WHERE code = $1
136 RETURNING did, device_id, client_id, client_auth, parameters, expires_at, code, controller_did
137 "#,
138 code
139 )
140 .fetch_optional(pool)
141 .await?;
142 match row {
143 Some(r) => {
144 let client_auth: Option<ClientAuth> = match r.client_auth {
145 Some(v) => Some(from_json(v)?),
146 None => None,
147 };
148 let parameters: AuthorizationRequestParameters = from_json(r.parameters)?;
149 Ok(Some(RequestData {
150 client_id: r.client_id,
151 client_auth,
152 parameters,
153 expires_at: r.expires_at,
154 did: r.did,
155 device_id: r.device_id,
156 code: r.code,
157 controller_did: r.controller_did,
158 }))
159 }
160 None => Ok(None),
161 }
162}
163
164pub async fn delete_authorization_request(
165 pool: &PgPool,
166 request_id: &str,
167) -> Result<(), OAuthError> {
168 sqlx::query!(
169 r#"
170 DELETE FROM oauth_authorization_request WHERE id = $1
171 "#,
172 request_id
173 )
174 .execute(pool)
175 .await?;
176 Ok(())
177}
178
179pub async fn delete_expired_authorization_requests(pool: &PgPool) -> Result<u64, OAuthError> {
180 let result = sqlx::query!(
181 r#"
182 DELETE FROM oauth_authorization_request
183 WHERE expires_at < NOW()
184 "#
185 )
186 .execute(pool)
187 .await?;
188 Ok(result.rows_affected())
189}
190
191pub async fn mark_request_authenticated(
192 pool: &PgPool,
193 request_id: &str,
194 did: &str,
195 device_id: Option<&str>,
196) -> Result<(), OAuthError> {
197 sqlx::query!(
198 r#"
199 UPDATE oauth_authorization_request
200 SET did = $2, device_id = $3
201 WHERE id = $1
202 "#,
203 request_id,
204 did,
205 device_id
206 )
207 .execute(pool)
208 .await?;
209 Ok(())
210}
211
212pub async fn update_request_scope(
213 pool: &PgPool,
214 request_id: &str,
215 scope: &str,
216) -> Result<(), OAuthError> {
217 sqlx::query!(
218 r#"
219 UPDATE oauth_authorization_request
220 SET parameters = jsonb_set(parameters, '{scope}', to_jsonb($2::text))
221 WHERE id = $1
222 "#,
223 request_id,
224 scope
225 )
226 .execute(pool)
227 .await?;
228 Ok(())
229}
230
231pub async fn set_controller_did(
232 pool: &PgPool,
233 request_id: &str,
234 controller_did: &str,
235) -> Result<(), OAuthError> {
236 sqlx::query!(
237 r#"
238 UPDATE oauth_authorization_request
239 SET controller_did = $2
240 WHERE id = $1
241 "#,
242 request_id,
243 controller_did
244 )
245 .execute(pool)
246 .await?;
247 Ok(())
248}
249
250pub async fn set_request_did(pool: &PgPool, request_id: &str, did: &str) -> Result<(), OAuthError> {
251 sqlx::query!(
252 r#"
253 UPDATE oauth_authorization_request
254 SET did = $2
255 WHERE id = $1
256 "#,
257 request_id,
258 did
259 )
260 .execute(pool)
261 .await?;
262 Ok(())
263}