From 51ef6282907cb2ed61e9e16f054a70fae4f1af58 Mon Sep 17 00:00:00 2001 From: Fleeym <61891787+Fleeym@users.noreply.github.com> Date: Wed, 22 Jan 2025 20:33:16 +0200 Subject: [PATCH] feat: add emergency logout job for users --- src/cli/mod.rs | 17 ++++++++++++++--- src/jobs/logout_user.rs | 14 ++++++++++++++ src/jobs/mod.rs | 1 + 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/jobs/logout_user.rs diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 8e34d2d..6b83d85 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -4,24 +4,29 @@ use clap::{Parser, Subcommand}; #[derive(Debug, Parser)] #[command(version, about, long_about = None)] -pub struct Args { +struct Args { #[command(subcommand)] command: Option, } #[derive(Subcommand, Debug)] -pub enum Commands { +enum Commands { /// Run an internal job #[command(subcommand)] Job(JobCommand), } #[derive(Debug, Subcommand)] -pub enum JobCommand { +enum JobCommand { /// Cleans up mod_downloads from more than 30 days ago CleanupDownloads, /// Cleans up auth and refresh tokens that are expired CleanupTokens, + /// Emergency logout for a developer + LogoutDeveloper { + /// Username of the developer + username: String, + }, /// Runs migrations Migrate, } @@ -44,6 +49,12 @@ pub async fn maybe_cli(data: &AppData) -> anyhow::Result { Ok(true) } + JobCommand::LogoutDeveloper { username } => { + let mut conn = data.db().acquire().await?; + jobs::logout_user::logout_user(&username, &mut *conn).await?; + + Ok(true) + } JobCommand::CleanupTokens => { let mut conn = data.db().acquire().await?; jobs::token_cleanup::token_cleanup(&mut *conn).await?; diff --git a/src/jobs/logout_user.rs b/src/jobs/logout_user.rs new file mode 100644 index 0000000..aa249ae --- /dev/null +++ b/src/jobs/logout_user.rs @@ -0,0 +1,14 @@ +use crate::database::repository::{auth_tokens, developers, refresh_tokens}; +use crate::types::api::ApiError; +use sqlx::PgConnection; + +pub async fn logout_user(username: &str, conn: &mut PgConnection) -> Result<(), ApiError> { + let dev = developers::get_one_by_username(username, conn) + .await? + .ok_or(ApiError::NotFound("Developer not found".into()))?; + + auth_tokens::remove_developer_tokens(dev.id, conn).await?; + refresh_tokens::remove_developer_tokens(dev.id, conn).await?; + + Ok(()) +} diff --git a/src/jobs/mod.rs b/src/jobs/mod.rs index 431b116..f359b06 100644 --- a/src/jobs/mod.rs +++ b/src/jobs/mod.rs @@ -1,3 +1,4 @@ pub mod cleanup_downloads; +pub mod logout_user; pub mod migrate; pub mod token_cleanup;