diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-04-11 18:21:55 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-04-11 18:21:55 -0400 |
commit | 504dd55666a13950657308a3a4be4e5f46e7abad (patch) | |
tree | 8eb5d8e183337c41420a26d77ea4531d3fa68504 | |
parent | 0d2cb917ba9373e3a80581c73a3afb2b905be0b2 (diff) | |
download | rbw-504dd55666a13950657308a3a4be4e5f46e7abad.tar.gz rbw-504dd55666a13950657308a3a4be4e5f46e7abad.zip |
only actually login or unlock if it's required
-rw-r--r-- | src/bin/rbw-agent.rs | 75 | ||||
-rw-r--r-- | src/db.rs | 7 |
2 files changed, 49 insertions, 33 deletions
diff --git a/src/bin/rbw-agent.rs b/src/bin/rbw-agent.rs index 9d4f7c5..00c4dd5 100644 --- a/src/bin/rbw-agent.rs +++ b/src/bin/rbw-agent.rs @@ -28,24 +28,25 @@ async fn login( tty: Option<&str>, ) { let mut state = state.write().await; - let email = config_email().await; - let password = - rbw::pinentry::getpin("prompt", "desc", tty).await.unwrap(); - - let (access_token, refresh_token, iterations, protected_key, keys) = - rbw::actions::login(&email, &password).await.unwrap(); - - state.priv_key = Some(keys); - let mut db = rbw::db::Db::load_async(&email) .await .unwrap_or_else(|_| rbw::db::Db::new()); - db.access_token = Some(access_token); - db.refresh_token = Some(refresh_token); - db.iterations = Some(iterations); - db.protected_key = Some(protected_key); - db.save_async(&email).await.unwrap(); + + if db.needs_login() { + let password = + rbw::pinentry::getpin("prompt", "desc", tty).await.unwrap(); + let (access_token, refresh_token, iterations, protected_key, keys) = + rbw::actions::login(&email, &password).await.unwrap(); + + state.priv_key = Some(keys); + + db.access_token = Some(access_token); + db.refresh_token = Some(refresh_token); + db.iterations = Some(iterations); + db.protected_key = Some(protected_key); + db.save_async(&email).await.unwrap(); + } send_response(sock, &rbw::agent::Response::Ack).await; } @@ -57,24 +58,26 @@ async fn unlock( ) { let mut state = state.write().await; - let email = config_email().await; - let password = - rbw::pinentry::getpin("prompt", "desc", tty).await.unwrap(); + if state.needs_unlock() { + let email = config_email().await; + let password = + rbw::pinentry::getpin("prompt", "desc", tty).await.unwrap(); - let db = rbw::db::Db::load_async(&email) + let db = rbw::db::Db::load_async(&email) + .await + .unwrap_or_else(|_| rbw::db::Db::new()); + + let keys = rbw::actions::unlock( + &email, + &password, + db.iterations.unwrap(), + db.protected_key.as_deref().unwrap(), + ) .await - .unwrap_or_else(|_| rbw::db::Db::new()); - - let keys = rbw::actions::unlock( - &email, - &password, - db.iterations.unwrap(), - db.protected_key.as_deref().unwrap(), - ) - .await - .unwrap(); + .unwrap(); - state.priv_key = Some(keys); + state.priv_key = Some(keys); + } send_response(sock, &rbw::agent::Response::Ack).await; } @@ -152,15 +155,21 @@ async fn config_email() -> String { config.email.unwrap() } +struct State { + priv_key: Option<rbw::locked::Keys>, +} + +impl State { + fn needs_unlock(&self) -> bool { + self.priv_key.is_none() + } +} + struct Agent { timeout: tokio::time::Delay, state: std::sync::Arc<tokio::sync::RwLock<State>>, } -struct State { - priv_key: Option<rbw::locked::Keys>, -} - impl Agent { fn new() -> Self { let config = rbw::config::Config::load().unwrap(); @@ -83,6 +83,13 @@ impl Db { Ok(()) } + pub fn needs_login(&self) -> bool { + self.access_token.is_none() + || self.refresh_token.is_none() + || self.iterations.is_none() + || self.protected_key.is_none() + } + fn filename(email: &str) -> std::path::PathBuf { crate::dirs::cache_dir().join(format!("{}.json", email)) } |