diff --git a/src/main.rs b/src/main.rs index 7e5e58b..a552390 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,9 +41,14 @@ fn main() -> Result<(), Error> { } }; - let items = pass::get_items(&vault)?.items; - println!("{:?}", items[0]); - println!("{}", items.len()); + let pass_items = pass::get_items(&vault)?.items; + println!("{:?}", pass_items[0]); + println!("{}", pass_items.len()); + + let rbw_items_partial = rbw::get_items()?; + let rbw_items = rbw::get_login_items(rbw_items_partial)?; + println!("{:?}", rbw_items[0]); + println!("{}", rbw_items.len()); return Ok(()); } diff --git a/src/rbw.rs b/src/rbw.rs index 3a1033d..9074b8e 100644 --- a/src/rbw.rs +++ b/src/rbw.rs @@ -8,8 +8,19 @@ const EXECUTABLE: &str = "rbw"; pub struct Item { pub id: String, pub name: String, - pub user: String, - pub uris: Vec, + pub user: Option, + pub uris: Option>, + #[serde(rename = "type")] + pub type_: String, +} + +#[derive(Deserialize, Debug)] +pub struct LoginItem { + pub id: String, + pub name: String, + pub user: Option, + pub password: String, + pub uris: Option>, #[serde(rename = "type")] pub type_: String, } @@ -33,3 +44,37 @@ pub fn check_rbw() -> Result<(), Error> { return Ok(()); } + +pub fn get_items() -> Result, Error> { + let items_raw = sh::sh(format!("{} list --raw", EXECUTABLE)); + return match serde_json::from_str(items_raw.as_str()) { + Ok(val) => Ok(val), + Err(e) => Err(Error::new( + ErrorKind::Other, + format!("Couldn't get items: {e}"), + )), + }; +} + +pub fn get_login_items(items: Vec) -> Result, Error> { + let items = items.iter().filter(|item| item.type_ == "Login").collect::>(); + let mut login_items = Vec::::new(); + + for item in items { + let password = sh::sh(format!("{} get '{}'", EXECUTABLE, item.name)); + if let None = item.user { + println!("WARNING: user not found for {}", item.name); + } + + login_items.push(LoginItem { + id: item.id.clone(), + name: item.name.clone(), + user: item.user.clone(), + password: password, + uris: item.uris.clone(), + type_: item.type_.clone() + }); + } + + return Ok(login_items); +}