Skip to content

Commit bbd1ba6

Browse files
authored
Merge pull request #9964 from Turbo87/async-secrets
controllers/github/secret_scanning: Migrate to `diesel-async` queries
2 parents fd14d7a + 45e5225 commit bbd1ba6

File tree

1 file changed

+29
-32
lines changed

1 file changed

+29
-32
lines changed

src/controllers/github/secret_scanning.rs

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@ use crate::app::AppState;
22
use crate::email::Email;
33
use crate::models::{ApiToken, User};
44
use crate::schema::api_tokens;
5-
use crate::tasks::spawn_blocking;
65
use crate::util::diesel::prelude::*;
7-
use crate::util::diesel::Conn;
86
use crate::util::errors::{bad_request, AppResult, BoxedAppError};
97
use crate::util::token::HashedToken;
108
use anyhow::{anyhow, Context};
119
use axum::body::Bytes;
1210
use axum::Json;
1311
use base64::{engine::general_purpose, Engine};
1412
use crates_io_github::GitHubPublicKey;
15-
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
13+
use diesel_async::AsyncPgConnection;
1614
use http::HeaderMap;
1715
use p256::ecdsa::signature::Verifier;
1816
use 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

Comments
 (0)