diff --git a/src/bw.rs b/src/bw.rs index 7c55f64..7b1a41c 100644 --- a/src/bw.rs +++ b/src/bw.rs @@ -1,6 +1,6 @@ use crate::sh; use serde::Deserialize; -use std::io::{Error, ErrorKind}; +use std::io::{Error, ErrorKind, Write, stdin, stdout}; const EXECUTABLE: &str = "bw"; @@ -42,7 +42,7 @@ pub struct ItemField { pub struct Login { pub uris: Vec, pub username: String, - pub password: String, + pub password: Option, pub totp: Option, #[serde(rename = "passwordRevisionDate")] pub password_revision_date: Option, @@ -83,7 +83,7 @@ pub struct Fido2Credential { pub creation_date: String, } -pub fn check_bw() -> Result { +pub fn check_bw() -> Result<(), Error> { let which = sh::sh(format!("which {}", EXECUTABLE)); if which.is_empty() { return Err(Error::new( @@ -92,19 +92,11 @@ pub fn check_bw() -> Result { )); } - let session = sh::sh(format!("{} unlock", EXECUTABLE)); - if session.is_empty() { - return Err(Error::new( - ErrorKind::Other, - format!("{} couldn't unlock", EXECUTABLE), - )); - } - - Ok(session) + Ok(()) } -pub fn get_items(session: String) -> Result, Error> { - let items_raw = sh::sh(format!("BW_SESSION={} {} list --raw", session, EXECUTABLE)); +pub fn get_items() -> Result, Error> { + let items_raw = sh::sh(format!("{} list items --raw", EXECUTABLE)); match serde_json::from_str(items_raw.as_str()) { Ok(val) => Ok(val), Err(e) => Err(Error::new( diff --git a/src/main.rs b/src/main.rs index 8159081..2148888 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,7 +27,7 @@ fn ask_consent(question: String, line1: String, line2: String) -> Result Result<(), Error> { pass::check_pass()?; - let bw_session = bw::check_bw()?; + bw::check_bw()?; let vaults = pass::get_vaults()?.vaults; if vaults.len() <= 0 { @@ -62,7 +62,7 @@ fn sync() -> Result<(), Error> { let pass_items = pass::get_items(&vault)?; let mut pass_logins = pass::get_logins(pass_items); - let mut bw_items = bw::get_items(bw_session)?; + let mut bw_items = bw::get_items()?; println!(); println!( @@ -87,6 +87,12 @@ fn sync() -> Result<(), Error> { let pass_login = pass_login.unwrap(); let bw_password = bw_item.login.password.clone(); + // TODO: fix this + if let None = bw_password { + continue; + } + let bw_password = bw_password.unwrap(); + let pass_password = pass_login.password.clone(); let bw_user = bw_item.login.username.clone(); @@ -114,10 +120,7 @@ fn sync() -> Result<(), Error> { } } - let bw_index = bw_items - .iter() - .position(|x| x.id == bw_item.id) - .unwrap(); + let bw_index = bw_items.iter().position(|x| x.id == bw_item.id).unwrap(); bw_items.remove(bw_index); let pass_index = pass_logins @@ -138,10 +141,15 @@ fn sync() -> Result<(), Error> { let consent = ask_consent( format!("Attempting to create {}:", bw_item.name), format!("{}", bw_item.login.username), - format!("{}", bw_item.login.password), + format!("{:?}", bw_item.login.password), )?; if consent { - pass::create(&vault, bw_item.name, bw_item.login.username, bw_item.login.password); + pass::create( + &vault, + bw_item.name, + bw_item.login.username, + bw_item.login.password.unwrap_or("".to_string()), + ); } }