From 4287896a8a2186bb4b5751a52b4db59f031f132a Mon Sep 17 00:00:00 2001 From: keypair34 Date: Mon, 6 Apr 2026 22:47:27 +0200 Subject: [PATCH] Handle expired session on logout and clear token on 401 - Treat 401 Unauthorized during logout as success since the session is already expired on the server - Clear the local token and show a helpful message when any command fails with "Unauthorized access." - Add clear_smb_token helper to remove the token file for an environment --- crates/cli/src/account/logout/mod.rs | 10 ++++++++- crates/cli/src/lib.rs | 2 ++ crates/cli/src/main.rs | 28 +++++++++++++++++-------- crates/cli/src/token/clear_smb_token.rs | 11 ++++++++++ crates/cli/src/token/mod.rs | 1 + 5 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 crates/cli/src/token/clear_smb_token.rs diff --git a/crates/cli/src/account/logout/mod.rs b/crates/cli/src/account/logout/mod.rs index 601c904..01d8e42 100644 --- a/crates/cli/src/account/logout/mod.rs +++ b/crates/cli/src/account/logout/mod.rs @@ -70,6 +70,14 @@ async fn do_process_logout(env: Environment) -> Result<()> { let token = get_smb_token(env)?; match logout(env, client(), token).await { Ok(_) => Ok(()), - Err(e) => Err(anyhow!("{e}")), + Err(e) => { + // A 401 means the session is already expired on the server. + // Treat this as success — the session is gone either way. + if e.to_string().contains("Unauthorized") { + Ok(()) + } else { + Err(anyhow!("{e}")) + } + } } } diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 776982a..e0992ef 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -7,6 +7,8 @@ pub mod project; mod token; mod ui; +pub use token::clear_smb_token::clear_smb_token; + pub(crate) fn client() -> (&'static SmbClient, &'static str) { let secret = env!("CLI_CLIENT_SECRET"); (&SmbClient::Cli, secret) diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index b5abf42..06d87cc 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -4,6 +4,7 @@ use { console::style, smbcloud_cli::{ account::{login::process_login, logout::process_logout, me::process_me, process_account}, + clear_smb_token, cli::{Cli, CommandResult, Commands}, deploy::process_deploy::process_deploy, project::{crud_create::process_project_init, process::process_project}, @@ -72,25 +73,34 @@ fn setup_logging(env: Environment, level: Option) -> Result<()> { #[tokio::main] async fn main() { - match run().await { + let cli = Cli::parse(); + let environment = cli.environment; + match run(cli).await { Ok(result) => { result.stop_and_persist(); std::process::exit(0); } Err(e) => { - println!( - "\n{} {}", - style("✘".to_string()).for_stderr().red(), - style(e).red() - ); + if e.to_string().contains("Unauthorized access.") { + let _ = clear_smb_token(environment); + println!( + "\n{} {}", + style("✘".to_string()).for_stderr().red(), + style("Your session has expired. Please login again with `smb login`.").red() + ); + } else { + println!( + "\n{} {}", + style("✘".to_string()).for_stderr().red(), + style(e).red() + ); + } std::process::exit(1); } } } -async fn run() -> Result { - let cli = Cli::parse(); - +async fn run(cli: Cli) -> Result { // println!("Environment: {}", cli.environment); let log_level_error: Result = Err(anyhow!( diff --git a/crates/cli/src/token/clear_smb_token.rs b/crates/cli/src/token/clear_smb_token.rs new file mode 100644 index 0000000..3cb52ac --- /dev/null +++ b/crates/cli/src/token/clear_smb_token.rs @@ -0,0 +1,11 @@ +use { + crate::token::smb_token_file_path::smb_token_file_path, anyhow::Result, + smbcloud_network::environment::Environment, std::fs, +}; + +pub fn clear_smb_token(env: Environment) -> Result<()> { + if let Some(path) = smb_token_file_path(env) { + fs::remove_file(path)?; + } + Ok(()) +} diff --git a/crates/cli/src/token/mod.rs b/crates/cli/src/token/mod.rs index 16dd7ce..119c13b 100644 --- a/crates/cli/src/token/mod.rs +++ b/crates/cli/src/token/mod.rs @@ -1,3 +1,4 @@ +pub(crate) mod clear_smb_token; pub(crate) mod get_smb_token; pub(crate) mod is_logged_in; pub(crate) mod smb_token_file_path;