@@ -2,17 +2,15 @@ use crate::app::AppState;
22use crate :: email:: Email ;
33use crate :: models:: { ApiToken , User } ;
44use crate :: schema:: api_tokens;
5- use crate :: tasks:: spawn_blocking;
65use crate :: util:: diesel:: prelude:: * ;
7- use crate :: util:: diesel:: Conn ;
86use crate :: util:: errors:: { bad_request, AppResult , BoxedAppError } ;
97use crate :: util:: token:: HashedToken ;
108use anyhow:: { anyhow, Context } ;
119use axum:: body:: Bytes ;
1210use axum:: Json ;
1311use base64:: { engine:: general_purpose, Engine } ;
1412use crates_io_github:: GitHubPublicKey ;
15- use diesel_async:: async_connection_wrapper :: AsyncConnectionWrapper ;
13+ use diesel_async:: AsyncPgConnection ;
1614use http:: HeaderMap ;
1715use p256:: ecdsa:: signature:: Verifier ;
1816use p256:: ecdsa:: VerifyingKey ;
@@ -129,12 +127,12 @@ struct GitHubSecretAlert {
129127}
130128
131129/// Revokes an API token and notifies the token owner
132- fn alert_revoke_token (
130+ async fn alert_revoke_token (
133131 state : & AppState ,
134132 alert : & GitHubSecretAlert ,
135- conn : & mut impl Conn ,
133+ conn : & mut AsyncPgConnection ,
136134) -> QueryResult < GitHubSecretAlertFeedbackLabel > {
137- use diesel :: RunQueryDsl ;
135+ use diesel_async :: RunQueryDsl ;
138136
139137 let hashed_token = HashedToken :: hash ( & alert. token ) ;
140138
@@ -143,6 +141,7 @@ fn alert_revoke_token(
143141 . select ( ApiToken :: as_select ( ) )
144142 . filter ( api_tokens:: token. eq ( hashed_token) )
145143 . get_result :: < ApiToken > ( conn)
144+ . await
146145 . optional ( ) ?;
147146
148147 let Some ( token) = token else {
@@ -160,14 +159,15 @@ fn alert_revoke_token(
160159
161160 diesel:: update ( & token)
162161 . set ( api_tokens:: revoked. eq ( true ) )
163- . execute ( conn) ?;
162+ . execute ( conn)
163+ . await ?;
164164
165165 warn ! (
166166 token_id = %token. id, user_id = %token. user_id,
167167 "Active API token received and revoked (true positive)" ,
168168 ) ;
169169
170- if let Err ( error) = send_notification_email ( & token, alert, state, conn) {
170+ if let Err ( error) = send_notification_email ( & token, alert, state, conn) . await {
171171 warn ! (
172172 token_id = %token. id, user_id = %token. user_id, ?error,
173173 "Failed to send email notification" ,
@@ -177,14 +177,17 @@ fn alert_revoke_token(
177177 Ok ( GitHubSecretAlertFeedbackLabel :: TruePositive )
178178}
179179
180- fn send_notification_email (
180+ async fn send_notification_email (
181181 token : & ApiToken ,
182182 alert : & GitHubSecretAlert ,
183183 state : & AppState ,
184- conn : & mut impl Conn ,
184+ conn : & mut AsyncPgConnection ,
185185) -> anyhow:: Result < ( ) > {
186- let user = User :: find ( conn, token. user_id ) . context ( "Failed to find user" ) ?;
187- let Some ( recipient) = user. email ( conn) ? else {
186+ let user = User :: async_find ( conn, token. user_id )
187+ . await
188+ . context ( "Failed to find user" ) ?;
189+
190+ let Some ( recipient) = user. async_email ( conn) . await ? else {
188191 return Err ( anyhow ! ( "No address found" ) ) ;
189192 } ;
190193
@@ -196,7 +199,7 @@ fn send_notification_email(
196199 url : & alert. url ,
197200 } ;
198201
199- state. emails . send ( & recipient, email) ?;
202+ state. emails . async_send ( & recipient, email) . await ?;
200203
201204 Ok ( ( ) )
202205}
@@ -268,25 +271,19 @@ pub async fn verify(
268271 let alerts: Vec < GitHubSecretAlert > = json:: from_slice ( & body)
269272 . map_err ( |e| bad_request ( format ! ( "invalid secret alert request: {e:?}" ) ) ) ?;
270273
271- let conn = state. db_write ( ) . await ?;
272- spawn_blocking ( move || {
273- let conn: & mut AsyncConnectionWrapper < _ > = & mut conn. into ( ) ;
274-
275- let feedback = alerts
276- . into_iter ( )
277- . map ( |alert| {
278- let label = alert_revoke_token ( & state, & alert, conn) ?;
279- Ok ( GitHubSecretAlertFeedback {
280- token_raw : alert. token ,
281- token_type : alert. r#type ,
282- label,
283- } )
284- } )
285- . collect :: < QueryResult < _ > > ( ) ?;
286-
287- Ok ( Json ( feedback) )
288- } )
289- . await
274+ let mut conn = state. db_write ( ) . await ?;
275+
276+ let mut feedback = Vec :: with_capacity ( alerts. len ( ) ) ;
277+ for alert in alerts {
278+ let label = alert_revoke_token ( & state, & alert, & mut conn) . await ?;
279+ feedback. push ( GitHubSecretAlertFeedback {
280+ token_raw : alert. token ,
281+ token_type : alert. r#type ,
282+ label,
283+ } ) ;
284+ }
285+
286+ Ok ( Json ( feedback) )
290287}
291288
292289#[ cfg( test) ]
0 commit comments