aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-07-25 04:33:51 -0400
committerJesse Luehrs <doy@tozt.net>2020-07-25 04:33:51 -0400
commit6b38682d711fb74feddcc06c4da18f8e771858df (patch)
tree52c36bba21247f0abb7062f87e3e0745dd496b4f /src
parent56e9b720bade5dcdc6505952c1bf81bdeca26bcd (diff)
downloadrbw-6b38682d711fb74feddcc06c4da18f8e771858df.tar.gz
rbw-6b38682d711fb74feddcc06c4da18f8e771858df.zip
implement rbw unlocked
Diffstat (limited to 'src')
-rw-r--r--src/bin/rbw-agent/actions.rs14
-rw-r--r--src/bin/rbw-agent/agent.rs9
-rw-r--r--src/bin/rbw/actions.rs4
-rw-r--r--src/bin/rbw/commands.rs7
-rw-r--r--src/bin/rbw/main.rs5
-rw-r--r--src/protocol.rs1
6 files changed, 40 insertions, 0 deletions
diff --git a/src/bin/rbw-agent/actions.rs b/src/bin/rbw-agent/actions.rs
index a01f510..1a5a3c5 100644
--- a/src/bin/rbw-agent/actions.rs
+++ b/src/bin/rbw-agent/actions.rs
@@ -357,6 +357,20 @@ pub async fn lock(
Ok(())
}
+pub async fn check_lock(
+ sock: &mut crate::sock::Sock,
+ state: std::sync::Arc<tokio::sync::RwLock<crate::agent::State>>,
+ _tty: Option<&str>,
+) -> anyhow::Result<()> {
+ if state.read().await.needs_unlock() {
+ return Err(anyhow::anyhow!("agent is locked"));
+ }
+
+ respond_ack(sock).await?;
+
+ Ok(())
+}
+
pub async fn sync(
sock: &mut crate::sock::Sock,
ack: bool,
diff --git a/src/bin/rbw-agent/agent.rs b/src/bin/rbw-agent/agent.rs
index 2d9b08e..23f684b 100644
--- a/src/bin/rbw-agent/agent.rs
+++ b/src/bin/rbw-agent/agent.rs
@@ -143,6 +143,15 @@ async fn handle_request(
.await?;
true
}
+ rbw::protocol::Action::CheckLock => {
+ crate::actions::check_lock(
+ sock,
+ state.clone(),
+ req.tty.as_deref(),
+ )
+ .await?;
+ false
+ }
rbw::protocol::Action::Lock => {
crate::actions::lock(sock, state.clone()).await?;
false
diff --git a/src/bin/rbw/actions.rs b/src/bin/rbw/actions.rs
index 9e64bbf..2c7d699 100644
--- a/src/bin/rbw/actions.rs
+++ b/src/bin/rbw/actions.rs
@@ -10,6 +10,10 @@ pub fn unlock() -> anyhow::Result<()> {
simple_action(rbw::protocol::Action::Unlock)
}
+pub fn unlocked() -> anyhow::Result<()> {
+ simple_action(rbw::protocol::Action::CheckLock)
+}
+
pub fn sync() -> anyhow::Result<()> {
simple_action(rbw::protocol::Action::Sync)
}
diff --git a/src/bin/rbw/commands.rs b/src/bin/rbw/commands.rs
index e5858b6..f514153 100644
--- a/src/bin/rbw/commands.rs
+++ b/src/bin/rbw/commands.rs
@@ -466,6 +466,13 @@ pub fn unlock() -> anyhow::Result<()> {
Ok(())
}
+pub fn unlocked() -> anyhow::Result<()> {
+ ensure_agent()?;
+ crate::actions::unlocked()?;
+
+ Ok(())
+}
+
pub fn sync() -> anyhow::Result<()> {
ensure_agent()?;
crate::actions::login()?;
diff --git a/src/bin/rbw/main.rs b/src/bin/rbw/main.rs
index f1903e7..2bb4360 100644
--- a/src/bin/rbw/main.rs
+++ b/src/bin/rbw/main.rs
@@ -22,6 +22,9 @@ enum Opt {
#[structopt(about = "Unlock the local Bitwarden database")]
Unlock,
+ #[structopt(about = "Check if the local Bitwarden database is unlocked")]
+ Unlocked,
+
#[structopt(about = "Update the local copy of the Bitwarden database")]
Sync,
@@ -207,6 +210,7 @@ impl Opt {
}
Self::Login => "login".to_string(),
Self::Unlock => "unlock".to_string(),
+ Self::Unlocked => "unlocked".to_string(),
Self::Sync => "sync".to_string(),
Self::List { .. } => "list".to_string(),
Self::Get { .. } => "get".to_string(),
@@ -275,6 +279,7 @@ fn main(opt: Opt) {
},
Opt::Login => commands::login(),
Opt::Unlock => commands::unlock(),
+ Opt::Unlocked => commands::unlocked(),
Opt::Sync => commands::sync(),
Opt::List { fields } => commands::list(&fields),
Opt::Get {
diff --git a/src/protocol.rs b/src/protocol.rs
index 68506b2..203e6b9 100644
--- a/src/protocol.rs
+++ b/src/protocol.rs
@@ -21,6 +21,7 @@ pub struct Request {
pub enum Action {
Login,
Unlock,
+ CheckLock,
Lock,
Sync,
Decrypt {