aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-11 18:21:55 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-11 18:21:55 -0400
commit504dd55666a13950657308a3a4be4e5f46e7abad (patch)
tree8eb5d8e183337c41420a26d77ea4531d3fa68504
parent0d2cb917ba9373e3a80581c73a3afb2b905be0b2 (diff)
downloadrbw-504dd55666a13950657308a3a4be4e5f46e7abad.tar.gz
rbw-504dd55666a13950657308a3a4be4e5f46e7abad.zip
only actually login or unlock if it's required
-rw-r--r--src/bin/rbw-agent.rs75
-rw-r--r--src/db.rs7
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();
diff --git a/src/db.rs b/src/db.rs
index 9d76d7a..7e94d73 100644
--- a/src/db.rs
+++ b/src/db.rs
@@ -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))
}