From ea5f9d1c13d1151b96642936132586539c07a3a5 Mon Sep 17 00:00:00 2001 From: red binder Date: Sat, 4 Jul 2026 19:26:28 +0200 Subject: [PATCH] simple ban system for admins (to be replaced later) --- src/json_api/admin/bans.rs | 39 ++++++++++++++++++++++++++++ src/json_api/admin/mod.rs | 1 + src/json_api/mod.rs | 3 ++- src/json_api/oauth/generate_token.rs | 5 +--- src/main.rs | 1 + 5 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 src/json_api/admin/bans.rs create mode 100644 src/json_api/admin/mod.rs diff --git a/src/json_api/admin/bans.rs b/src/json_api/admin/bans.rs new file mode 100644 index 0000000..94ebef5 --- /dev/null +++ b/src/json_api/admin/bans.rs @@ -0,0 +1,39 @@ +use rocket::serde::json::Json; +use rocket::{post, FromForm, State}; +use rocket::form::Form; +use rocket::futures::TryFutureExt; +use rocket::http::Status; +use crate::account::account::Auth; +use crate::json_api::oauth::generate_token::TokenRequest; +use crate::nnid::people::{build_oauth_profile, GetOwnOAuthProfileData}; +use crate::Pool; + +#[derive(FromForm)] +pub struct AdminRequest<'r> { + pub username: &'r str, +} + +#[post("/api/v2/admin/ban", data = "")] +pub async fn ban_user(pool: &State, auth: Auth, request: Form>) -> Result<(), Status> { + if auth.account_level < 2 { + return Err(Status::Forbidden); + }; + + log::info!("banning user {:?} from moderator {:?}", request.username, auth.username); + + let row = sqlx::query!( + "UPDATE users SET account_level = $1 WHERE username = $2", + -1, + request.username + ) + .execute(pool.inner()) + .await + .map_err(|e| { + log::error!("failed to execute query: {:?}", e); + return Err::<(), rocket::http::Status>(Status::InternalServerError); + }); + + log::info!("banned user {:?}", request.username); + + Ok(()) +} \ No newline at end of file diff --git a/src/json_api/admin/mod.rs b/src/json_api/admin/mod.rs new file mode 100644 index 0000000..edd510f --- /dev/null +++ b/src/json_api/admin/mod.rs @@ -0,0 +1 @@ +pub mod bans; \ No newline at end of file diff --git a/src/json_api/mod.rs b/src/json_api/mod.rs index 47d4216..7061194 100644 --- a/src/json_api/mod.rs +++ b/src/json_api/mod.rs @@ -1,2 +1,3 @@ pub mod oauth; -pub mod users; \ No newline at end of file +pub mod users; +pub mod admin; \ No newline at end of file diff --git a/src/json_api/oauth/generate_token.rs b/src/json_api/oauth/generate_token.rs index df43982..72843d7 100644 --- a/src/json_api/oauth/generate_token.rs +++ b/src/json_api/oauth/generate_token.rs @@ -41,10 +41,7 @@ pub fn verify_nintendo_password(pid: i32, text_password: &str, db_bcrypt_hash: & sha.update(&[0x02, 0x65, 0x43, 0x46]); sha.update(text_password.as_bytes()); let hashed_password_hex = hex::encode(sha.finalize()); - match bcrypt::verify(hashed_password_hex, db_bcrypt_hash) { - Ok(valid) => valid, - Err(_) => false, - } + bcrypt::verify(hashed_password_hex, db_bcrypt_hash).unwrap_or_else(|_| false) } // dummy error responses diff --git a/src/main.rs b/src/main.rs index c7ba707..35a48df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -118,6 +118,7 @@ async fn launch() -> _ { json_api::users::delete::delete_account, json_api::oauth::authorize::authorize_page, json_api::oauth::authorize::authorize_submit, + json_api::admin::bans::ban_user, nnid::people::thing, // graphql::graphiql, // graphql::playground,