diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-04-12 02:09:15 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-04-12 02:09:15 -0400 |
commit | bcae263e4e888274f399a75ec5b171ee25edf894 (patch) | |
tree | c5af1a9c50a17c21285a3073af8aa1ab9c109493 | |
parent | e45e35125e623a8fb683a28f55ad96d42d01a1d0 (diff) | |
download | rbw-bcae263e4e888274f399a75ec5b171ee25edf894.tar.gz rbw-bcae263e4e888274f399a75ec5b171ee25edf894.zip |
handle entries with no username or password
-rw-r--r-- | src/api.rs | 4 | ||||
-rw-r--r-- | src/bin/rbw/commands.rs | 41 |
2 files changed, 32 insertions, 13 deletions
@@ -65,9 +65,9 @@ pub struct Cipher { #[derive(serde::Serialize, serde::Deserialize, Debug)] pub struct Login { #[serde(rename = "Username")] - pub username: String, + pub username: Option<String>, #[serde(rename = "Password")] - pub password: String, + pub password: Option<String>, } #[derive(Debug)] diff --git a/src/bin/rbw/commands.rs b/src/bin/rbw/commands.rs index 83c6c81..5f1c2f1 100644 --- a/src/bin/rbw/commands.rs +++ b/src/bin/rbw/commands.rs @@ -75,29 +75,48 @@ pub fn get(name: &str, user: Option<&str>) -> anyhow::Result<()> { let email = config_email()?; let db = rbw::db::Db::load(&email) .context("failed to load password database")?; + let desc = format!( + "{}{}", + user.map(|s| format!("{}@", s)) + .unwrap_or_else(|| "".to_string()), + name + ); for cipher in db.ciphers { let cipher_name = crate::actions::decrypt(&cipher.name) .context("failed to decrypt entry name")?; if name == cipher_name { - let cipher_user = crate::actions::decrypt(&cipher.login.username) - .context("failed to decrypt entry username")?; if let Some(user) = user { - if user == cipher_user { - let pass = - crate::actions::decrypt(&cipher.login.password) - .context("failed to decrypt entry password")?; - println!("{}", pass); - return Ok(()); + if let Some(encrypted_user) = &cipher.login.username { + let cipher_user = crate::actions::decrypt(encrypted_user) + .context("failed to decrypt entry username")?; + if user == cipher_user { + if let Some(encrypted_pass) = &cipher.login.password { + let pass = + crate::actions::decrypt(encrypted_pass) + .context( + "failed to decrypt entry password", + )?; + println!("{}", pass); + } else { + eprintln!("no password found for entry {}", desc); + } + return Ok(()); + } } } else { - let pass = crate::actions::decrypt(&cipher.login.password) - .context("failed to decrypt entry password")?; - println!("{}", pass); + if let Some(encrypted_pass) = &cipher.login.password { + let pass = crate::actions::decrypt(encrypted_pass) + .context("failed to decrypt entry password")?; + println!("{}", pass); + } else { + eprintln!("no password found for entry {}", desc); + } return Ok(()); } } } + eprintln!("no entry found for {}", desc); Ok(()) } |