aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-10 03:39:44 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-10 03:39:44 -0400
commit59c7c079ca9452da0992159b2a85f2734f71ecdd (patch)
treedb0ebdd3a447eb96727abe7ec84f02a3e31c7720
parentecaae8c048c681a0fbc3986bb22ed81f173d83fb (diff)
downloadrbw-59c7c079ca9452da0992159b2a85f2734f71ecdd.tar.gz
rbw-59c7c079ca9452da0992159b2a85f2734f71ecdd.zip
implement locking
-rw-r--r--src/agent.rs1
-rw-r--r--src/bin/agent.rs12
-rw-r--r--src/bin/rbw.rs20
3 files changed, 32 insertions, 1 deletions
diff --git a/src/agent.rs b/src/agent.rs
index 1aec70c..8d7cd69 100644
--- a/src/agent.rs
+++ b/src/agent.rs
@@ -9,6 +9,7 @@ pub struct Request {
pub enum Action {
Login,
Unlock,
+ Lock,
Sync,
Decrypt { cipherstring: String },
// add
diff --git a/src/bin/agent.rs b/src/bin/agent.rs
index ddcc9fc..1c06912 100644
--- a/src/bin/agent.rs
+++ b/src/bin/agent.rs
@@ -79,6 +79,17 @@ async fn unlock(
send_response(sock, &rbw::agent::Response::Ack).await;
}
+async fn lock(
+ sock: &mut tokio::net::UnixStream,
+ state: std::sync::Arc<tokio::sync::RwLock<State>>,
+) {
+ let mut state = state.write().await;
+
+ state.priv_key = None;
+
+ send_response(sock, &rbw::agent::Response::Ack).await;
+}
+
async fn sync(sock: &mut tokio::net::UnixStream) {
let email = config_email().await;
let mut db = rbw::db::Db::load_async(&email)
@@ -127,6 +138,7 @@ async fn handle_sock(
rbw::agent::Action::Unlock => {
unlock(&mut sock, state.clone(), msg.tty.as_deref()).await
}
+ rbw::agent::Action::Lock => lock(&mut sock, state.clone()).await,
rbw::agent::Action::Sync => sync(&mut sock).await,
rbw::agent::Action::Decrypt { cipherstring } => {
decrypt(&mut sock, state.clone(), &cipherstring).await
diff --git a/src/bin/rbw.rs b/src/bin/rbw.rs
index bcdae01..02655a3 100644
--- a/src/bin/rbw.rs
+++ b/src/bin/rbw.rs
@@ -184,7 +184,25 @@ fn remove() {
}
fn lock() {
- todo!()
+ ensure_agent();
+
+ let mut sock = connect();
+ send(
+ &mut sock,
+ &rbw::agent::Request {
+ tty: std::env::var("TTY").ok(),
+ action: rbw::agent::Action::Lock,
+ },
+ );
+
+ let res = recv(&mut sock);
+ match res {
+ rbw::agent::Response::Ack => (),
+ rbw::agent::Response::Error { error } => {
+ panic!("failed to lock: {}", error)
+ }
+ _ => panic!("unexpected message: {:?}", res),
+ }
}
fn purge() {