From 46e127ccd2782051da87e5be4dcea1edb94b677b Mon Sep 17 00:00:00 2001 From: Zomatree Date: Wed, 2 Jul 2025 01:16:16 +0100 Subject: [PATCH] chore: send rest of the errors to the catchers --- .../core/database/src/models/users/rocket.rs | 1 + crates/core/database/src/util/idempotency.rs | 2 ++ crates/core/result/src/axum.rs | 1 + crates/core/result/src/lib.rs | 3 ++- crates/core/result/src/rocket.rs | 1 + .../routes/webhooks/webhook_execute_github.rs | 2 ++ crates/delta/src/util/catchers.rs | 18 +++++++++++++++++- crates/delta/src/util/ratelimiter.rs | 2 +- 8 files changed, 27 insertions(+), 3 deletions(-) diff --git a/crates/core/database/src/models/users/rocket.rs b/crates/core/database/src/models/users/rocket.rs index 57b634b1..58556854 100644 --- a/crates/core/database/src/models/users/rocket.rs +++ b/crates/core/database/src/models/users/rocket.rs @@ -38,6 +38,7 @@ impl<'r> FromRequest<'r> for User { if let Some(user) = user { Outcome::Success(user.clone()) } else { + request.local_cache(|| Some(create_error!(DuplicateNonce))); Outcome::Error((Status::Unauthorized, authifier::Error::InvalidSession)) } } diff --git a/crates/core/database/src/util/idempotency.rs b/crates/core/database/src/util/idempotency.rs index 769dc1dd..ddb2f80a 100644 --- a/crates/core/database/src/util/idempotency.rs +++ b/crates/core/database/src/util/idempotency.rs @@ -113,6 +113,8 @@ impl<'r> FromRequest<'r> for IdempotencyKey { let idempotency = IdempotencyKey { key }; let mut cache = TOKEN_CACHE.lock().await; if cache.get(&idempotency.key).is_some() { + request.local_cache(|| Some(create_error!(DuplicateNonce))); + return Outcome::Error((Status::Conflict, create_error!(DuplicateNonce))); } diff --git a/crates/core/result/src/axum.rs b/crates/core/result/src/axum.rs index 0aade127..02106e92 100644 --- a/crates/core/result/src/axum.rs +++ b/crates/core/result/src/axum.rs @@ -69,6 +69,7 @@ impl Error { ErrorType::InvalidProperty => StatusCode::BAD_REQUEST, ErrorType::InvalidSession => StatusCode::UNAUTHORIZED, ErrorType::NotAuthenticated => StatusCode::UNAUTHORIZED, + ErrorType::Conflict => StatusCode::CONFLICT, ErrorType::DuplicateNonce => StatusCode::CONFLICT, ErrorType::VosoUnavailable => StatusCode::BAD_REQUEST, ErrorType::NotFound => StatusCode::NOT_FOUND, diff --git a/crates/core/result/src/lib.rs b/crates/core/result/src/lib.rs index 729da276..44193af9 100644 --- a/crates/core/result/src/lib.rs +++ b/crates/core/result/src/lib.rs @@ -152,6 +152,7 @@ pub enum ErrorType { InvalidSession, InvalidFlagValue, NotAuthenticated, + Conflict, DuplicateNonce, NotFound, NoEffect, @@ -180,7 +181,7 @@ pub enum ErrorType { // ? Feature flag disabled in the config FeatureDisabled { feature: String, - }, + } } #[macro_export] diff --git a/crates/core/result/src/rocket.rs b/crates/core/result/src/rocket.rs index bc127c9a..90a82a50 100644 --- a/crates/core/result/src/rocket.rs +++ b/crates/core/result/src/rocket.rs @@ -76,6 +76,7 @@ impl Error { ErrorType::InvalidProperty => Status::BadRequest, ErrorType::InvalidSession => Status::Unauthorized, ErrorType::NotAuthenticated => Status::Unauthorized, + ErrorType::Conflict => Status::Conflict, ErrorType::DuplicateNonce => Status::Conflict, ErrorType::VosoUnavailable => Status::BadRequest, ErrorType::NotFound => Status::NotFound, diff --git a/crates/delta/src/routes/webhooks/webhook_execute_github.rs b/crates/delta/src/routes/webhooks/webhook_execute_github.rs index 8d98efce..8fc753ee 100644 --- a/crates/delta/src/routes/webhooks/webhook_execute_github.rs +++ b/crates/delta/src/routes/webhooks/webhook_execute_github.rs @@ -636,6 +636,8 @@ impl<'r> FromRequest<'r> for EventHeader<'r> { async fn from_request(request: &'r Request<'_>) -> rocket::request::Outcome { let headers = request.headers(); let Some(event) = headers.get_one("X-GitHub-Event") else { + request.local_cache(|| Some(create_error!(InvalidOperation))); + return rocket::request::Outcome::Error(( Status::BadRequest, create_error!(InvalidOperation), diff --git a/crates/delta/src/util/catchers.rs b/crates/delta/src/util/catchers.rs index 6738dcc7..29efb493 100644 --- a/crates/delta/src/util/catchers.rs +++ b/crates/delta/src/util/catchers.rs @@ -14,6 +14,22 @@ pub fn unprocessable_entity(req: &Request) -> Result<()> { } } +#[catch(401)] +pub fn unauthorized(req: &Request) -> Result<()> { + match req.local_cache(|| None::) { + Some(e) => Err(e.clone()), + None => Err(create_error!(NotAuthenticated)) + } +} + +#[catch(409)] +pub fn conflict(req: &Request) -> Result<()> { + match req.local_cache(|| None::) { + Some(e) => Err(e.clone()), + None => Err(create_error!(Conflict)) + } +} + pub fn all_catchers() -> Vec { - catchers![not_found, unprocessable_entity] + catchers![not_found, unprocessable_entity, unauthorized, conflict] } \ No newline at end of file diff --git a/crates/delta/src/util/ratelimiter.rs b/crates/delta/src/util/ratelimiter.rs index 25d45840..7a195240 100644 --- a/crates/delta/src/util/ratelimiter.rs +++ b/crates/delta/src/util/ratelimiter.rs @@ -3,12 +3,12 @@ use std::hash::Hasher; use std::ops::Add; use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use crate::util::json::Json; use authifier::models::Session; use rocket::fairing::{Fairing, Info, Kind}; use rocket::http::uri::Origin; use rocket::http::{Method, Status}; use rocket::request::{FromRequest, Outcome}; -use crate::util::json::Json; use rocket::{Data, Request, Response}; use revolt_rocket_okapi::gen::OpenApiGenerator;