From 631c807571a52691594ca8015ae81bce71c27355 Mon Sep 17 00:00:00 2001 From: Ash Svitan Date: Thu, 30 Apr 2026 19:47:08 +0200 Subject: [PATCH] :construction: Adds searching algorithm Signed-off-by: Ash Svitan --- src/main.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- src/pass.rs | 13 +++---------- src/rbw.rs | 16 +++++++++++----- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index a552390..2a633ed 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,14 +41,58 @@ fn main() -> Result<(), Error> { } }; - let pass_items = pass::get_items(&vault)?.items; + let mut 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)?; + let mut rbw_items = rbw::get_login_items(rbw_items_partial)?; println!("{:?}", rbw_items[0]); println!("{}", rbw_items.len()); + for rbw_item in rbw_items.clone().iter() { + let mut pass_item: Option<&pass::Item> = None; + + 'inner: for pass_item_iter in pass_items.iter() { + if rbw_item.name == pass_item_iter.content.title { + println!("found match! {}", rbw_item.name); + pass_item = Some(pass_item_iter); + break 'inner; + } + } + + if let None = pass_item { + println!("no match found for {}!", rbw_item.name); + continue; + } + let pass_item = pass_item.unwrap(); + + let rbw_password = rbw_item.password.clone(); + let pass_password = pass_item + .clone() + .content + .content + .login + .clone() + .unwrap() + .password; + if rbw_password == pass_password { + let rbw_index = rbw_items.iter().position(|x| x.id == rbw_item.id).unwrap(); + rbw_items.remove(rbw_index); + + let pass_index = pass_items.iter().position(|x| x.id == pass_item.id).unwrap(); + pass_items.remove(pass_index); + continue; + } else { + println!( + "password doesn't match! '{}' / '{}'", + rbw_password, pass_password + ); + } + } + + println!("remaining {} rbw items", rbw_items.len()); + println!("remaining {} pass items", pass_items.len()); + return Ok(()); } diff --git a/src/pass.rs b/src/pass.rs index c02c454..e9cbaa7 100644 --- a/src/pass.rs +++ b/src/pass.rs @@ -12,8 +12,6 @@ pub struct Vaults { #[derive(Deserialize, Debug)] pub struct Vault { pub name: String, - pub vault_id: String, - pub share_id: String, } #[derive(Deserialize, Debug)] @@ -24,28 +22,23 @@ pub struct Items { #[derive(Deserialize, Debug)] pub struct Item { pub id: String, - pub share_id: String, - pub vault_id: String, pub content: ItemContent, - pub state: String, - pub create_time: String, - pub modify_time: String, } #[derive(Deserialize, Debug)] pub struct ItemContent { pub title: String, pub note: String, - pub item_uuid: String, pub content: ItemContentContent, } #[derive(Deserialize, Debug)] pub struct ItemContentContent { - pub Login: Option, + #[serde(rename = "Login")] + pub login: Option, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Clone)] pub struct ItemLogin { pub email: String, pub username: String, diff --git a/src/rbw.rs b/src/rbw.rs index 9074b8e..0f4125c 100644 --- a/src/rbw.rs +++ b/src/rbw.rs @@ -14,7 +14,7 @@ pub struct Item { pub type_: String, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Clone)] pub struct LoginItem { pub id: String, pub name: String, @@ -57,11 +57,14 @@ pub fn get_items() -> Result, Error> { } pub fn get_login_items(items: Vec) -> Result, Error> { - let items = items.iter().filter(|item| item.type_ == "Login").collect::>(); + 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)); + let password = sh::sh(format!("{} get '{}'", EXECUTABLE, item.id)); if let None = item.user { println!("WARNING: user not found for {}", item.name); } @@ -70,9 +73,12 @@ pub fn get_login_items(items: Vec) -> Result, Error> { id: item.id.clone(), name: item.name.clone(), user: item.user.clone(), - password: password, + password: match password.strip_suffix("\n") { + Some(s) => s.to_string(), + None => password, + }, uris: item.uris.clone(), - type_: item.type_.clone() + type_: item.type_.clone(), }); }