From 8dc8448de0b9acaf9c3c27556d3c6c4342d8d493 Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Tue, 21 May 2024 10:43:08 +0700 Subject: fix(daemon): do not try to sync if logged out (#2037) * fix(daemon): do not try to sync if logged out I've also added Settings::logged_in, as there are a few places where we switch on login state. * make session_token a function --- crates/atuin-client/src/record/sync.rs | 10 ++++-- crates/atuin-client/src/settings.rs | 36 ++++++++++------------ crates/atuin-client/src/sync.rs | 2 +- crates/atuin-daemon/src/server/sync.rs | 5 +++ .../src/command/client/account/change_password.rs | 2 +- crates/atuin/src/command/client/account/delete.rs | 2 +- crates/atuin/src/command/client/account/login.rs | 4 +-- crates/atuin/src/command/client/account/logout.rs | 4 +-- crates/atuin/src/command/client/store/push.rs | 2 +- crates/atuin/src/command/client/sync/status.rs | 2 +- 10 files changed, 36 insertions(+), 33 deletions(-) diff --git a/crates/atuin-client/src/record/sync.rs b/crates/atuin-client/src/record/sync.rs index 234c6442..c3794b59 100644 --- a/crates/atuin-client/src/record/sync.rs +++ b/crates/atuin-client/src/record/sync.rs @@ -55,7 +55,10 @@ pub async fn diff( ) -> Result<(Vec, RecordStatus), SyncError> { let client = Client::new( &settings.sync_address, - &settings.session_token, + settings + .session_token() + .map_err(|e| SyncError::RemoteRequestError { msg: e.to_string() })? + .as_str(), settings.network_connect_timeout, settings.network_timeout, ) @@ -270,7 +273,10 @@ pub async fn sync_remote( ) -> Result<(i64, Vec), SyncError> { let client = Client::new( &settings.sync_address, - &settings.session_token, + settings + .session_token() + .map_err(|e| SyncError::RemoteRequestError { msg: e.to_string() })? + .as_str(), settings.network_connect_timeout, settings.network_timeout, ) diff --git a/crates/atuin-client/src/settings.rs b/crates/atuin-client/src/settings.rs index 98a40496..a97d05eb 100644 --- a/crates/atuin-client/src/settings.rs +++ b/crates/atuin-client/src/settings.rs @@ -1,10 +1,5 @@ use std::{ - collections::HashMap, - convert::TryFrom, - fmt, - io::prelude::*, - path::{Path, PathBuf}, - str::FromStr, + collections::HashMap, convert::TryFrom, fmt, io::prelude::*, path::PathBuf, str::FromStr, }; use atuin_common::record::HostId; @@ -458,11 +453,6 @@ pub struct Settings { #[serde(default)] pub daemon: Daemon, - - // This is automatically loaded when settings is created. Do not set in - // config! Keep secrets and settings apart. - #[serde(skip)] - pub session_token: String, } impl Settings { @@ -568,6 +558,21 @@ impl Settings { } } + pub fn logged_in(&self) -> bool { + let session_path = self.session_path.as_str(); + + PathBuf::from(session_path).exists() + } + + pub fn session_token(&self) -> Result { + if !self.logged_in() { + return Err(eyre!("Tried to load session; not logged in")); + } + + let session_path = self.session_path.as_str(); + Ok(fs_err::read_to_string(session_path)?) + } + #[cfg(feature = "check-update")] fn needs_update_check(&self) -> Result { let last_check = Settings::last_version_check()?; @@ -688,7 +693,6 @@ impl Settings { )? .set_default("scroll_context_lines", 1)? .set_default("shell_up_key_binding", false)? - .set_default("session_token", "")? .set_default("workspaces", false)? .set_default("ctrl_n_shortcuts", false)? .set_default("secrets_filter", true)? @@ -778,14 +782,6 @@ impl Settings { let session_path = shellexpand::full(&session_path)?; settings.session_path = session_path.to_string(); - // Finally, set the auth token - if Path::new(session_path.to_string().as_str()).exists() { - let token = fs_err::read_to_string(session_path.to_string())?; - settings.session_token = token.trim().to_string(); - } else { - settings.session_token = String::from("not logged in"); - } - Ok(settings) } diff --git a/crates/atuin-client/src/sync.rs b/crates/atuin-client/src/sync.rs index 0a5021cb..c2377baa 100644 --- a/crates/atuin-client/src/sync.rs +++ b/crates/atuin-client/src/sync.rs @@ -191,7 +191,7 @@ async fn sync_upload( pub async fn sync(settings: &Settings, force: bool, db: &impl Database) -> Result<()> { let client = api_client::Client::new( &settings.sync_address, - &settings.session_token, + settings.session_token()?.as_str(), settings.network_connect_timeout, settings.network_timeout, )?; diff --git a/crates/atuin-daemon/src/server/sync.rs b/crates/atuin-daemon/src/server/sync.rs index 22c8d307..0724a250 100644 --- a/crates/atuin-daemon/src/server/sync.rs +++ b/crates/atuin-daemon/src/server/sync.rs @@ -38,6 +38,11 @@ pub async fn worker( ticker.tick().await; tracing::info!("sync worker tick"); + if !settings.logged_in() { + tracing::debug!("not logged in, skipping sync tick"); + continue; + } + let res = sync::sync(&settings, &store).await; if let Err(e) = res { diff --git a/crates/atuin/src/command/client/account/change_password.rs b/crates/atuin/src/command/client/account/change_password.rs index 3b5ad6f5..97ebfa9c 100644 --- a/crates/atuin/src/command/client/account/change_password.rs +++ b/crates/atuin/src/command/client/account/change_password.rs @@ -26,7 +26,7 @@ pub async fn run( ) -> Result<()> { let client = api_client::Client::new( &settings.sync_address, - &settings.session_token, + settings.session_token()?.as_str(), settings.network_connect_timeout, settings.network_timeout, )?; diff --git a/crates/atuin/src/command/client/account/delete.rs b/crates/atuin/src/command/client/account/delete.rs index 3591c6f3..e109bd28 100644 --- a/crates/atuin/src/command/client/account/delete.rs +++ b/crates/atuin/src/command/client/account/delete.rs @@ -12,7 +12,7 @@ pub async fn run(settings: &Settings) -> Result<()> { let client = api_client::Client::new( &settings.sync_address, - &settings.session_token, + settings.session_token()?.as_str(), settings.network_connect_timeout, settings.network_timeout, )?; diff --git a/crates/atuin/src/command/client/account/login.rs b/crates/atuin/src/command/client/account/login.rs index 9cd53399..6b72cc63 100644 --- a/crates/atuin/src/command/client/account/login.rs +++ b/crates/atuin/src/command/client/account/login.rs @@ -35,9 +35,7 @@ fn get_input() -> Result { impl Cmd { pub async fn run(&self, settings: &Settings, store: &SqliteStore) -> Result<()> { - let session_path = settings.session_path.as_str(); - - if PathBuf::from(session_path).exists() { + if settings.logged_in() { println!( "You are already logged in! Please run 'atuin logout' if you wish to login again" ); diff --git a/crates/atuin/src/command/client/account/logout.rs b/crates/atuin/src/command/client/account/logout.rs index 90b49d6d..42d969a7 100644 --- a/crates/atuin/src/command/client/account/logout.rs +++ b/crates/atuin/src/command/client/account/logout.rs @@ -1,5 +1,3 @@ -use std::path::PathBuf; - use eyre::{Context, Result}; use fs_err::remove_file; @@ -8,7 +6,7 @@ use atuin_client::settings::Settings; pub fn run(settings: &Settings) -> Result<()> { let session_path = settings.session_path.as_str(); - if PathBuf::from(session_path).exists() { + if settings.logged_in() { remove_file(session_path).context("Failed to remove session file")?; println!("You have logged out!"); } else { diff --git a/crates/atuin/src/command/client/store/push.rs b/crates/atuin/src/command/client/store/push.rs index 17a72f2a..e1d80ef7 100644 --- a/crates/atuin/src/command/client/store/push.rs +++ b/crates/atuin/src/command/client/store/push.rs @@ -37,7 +37,7 @@ impl Push { let client = Client::new( &settings.sync_address, - &settings.session_token, + settings.session_token()?.as_str(), settings.network_connect_timeout, settings.network_timeout * 10, // we may be deleting a lot of data... so up the // timeout diff --git a/crates/atuin/src/command/client/sync/status.rs b/crates/atuin/src/command/client/sync/status.rs index 29a1e113..77dfd529 100644 --- a/crates/atuin/src/command/client/sync/status.rs +++ b/crates/atuin/src/command/client/sync/status.rs @@ -16,7 +16,7 @@ pub async fn run(settings: &Settings, db: &impl Database) -> Result<()> { let client = api_client::Client::new( &settings.sync_address, - &settings.session_token, + settings.session_token()?.as_str(), settings.network_connect_timeout, settings.network_timeout, )?; -- cgit v1.3.1