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