From efb661c32ae44edd9e6c0d92e2ec477c3d165c82 Mon Sep 17 00:00:00 2001 From: Ash Svitan Date: Thu, 30 Apr 2026 21:07:11 +0200 Subject: [PATCH] :sparkles: Adds updating fields Signed-off-by: Ash Svitan --- src/main.rs | 25 +++++++++++++++++-------- src/pass.rs | 27 +++++++++++++++++++-------- src/rbw.rs | 6 ------ 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index ca5b810..e658e12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,13 +44,15 @@ fn main() -> Result<(), Error> { let pass_items = pass::get_items(&vault)?; let mut pass_logins = pass::get_logins(pass_items); - println!("{:?}", pass_logins[0]); - println!("{}", pass_logins.len()); let rbw_items = rbw::get_items()?; let mut rbw_logins = rbw::get_logins(rbw_items)?; - println!("{:?}", rbw_logins[0]); - println!("{}", rbw_logins.len()); + + println!( + "Got {} pass logins and {} rbw logins...", + pass_logins.len(), + rbw_logins.len() + ); for rbw_login in rbw_logins.clone().iter() { let mut pass_login: Option<&pass::LoginItem> = None; @@ -79,16 +81,23 @@ fn main() -> Result<(), Error> { if rbw_user != pass_user || rbw_password != pass_password { // TODO: need to update - println!("Attempting to update:"); - println!("\t{} -> {}", pass_user, rbw_user); - println!("\t{} -> {}", pass_password, rbw_password); + println!("Attempting to update {}:", rbw_login.name); + println!("\t{} -> {}", pass_user, rbw_user.clone()); + println!("\t{} -> {}", pass_password, rbw_password.clone()); print!("Proceed? [y/N] "); io::stdout().flush()?; let mut input = String::new(); io::stdin().read_line(&mut input)?; if input.to_lowercase() == "y\n" { - println!("UPDATING!!!"); + let updated_pass_login = pass::LoginItem { + id: pass_login.id.clone(), + title: pass_login.title.clone(), + username: rbw_user.clone(), + email: rbw_user.clone(), + password: rbw_password, + }; + pass::update(&vault, updated_pass_login, pass_user_is_actually_email)?; } } diff --git a/src/pass.rs b/src/pass.rs index 671bd53..b7f0449 100644 --- a/src/pass.rs +++ b/src/pass.rs @@ -28,7 +28,6 @@ pub struct Item { #[derive(Deserialize, Debug, Clone)] pub struct ItemContent { pub title: String, - pub note: String, pub content: ItemContentContent, } @@ -44,8 +43,6 @@ pub struct ItemLogin { pub email: String, pub username: String, pub password: String, - pub urls: Vec, - pub totp_uri: String, } // our own custom structure, a counterpart to rbw::LoginItem @@ -56,8 +53,6 @@ pub struct LoginItem { pub username: String, pub email: String, pub password: String, - pub urls: Vec, - pub totp_uri: String, } pub fn check_pass() -> Result<(), Error> { @@ -92,7 +87,10 @@ pub fn get_vaults() -> Result { } pub fn get_items(vault: &String) -> Result { - let items_raw = sh::sh(format!("{} item list {} --output json", EXECUTABLE, vault)); + let items_raw = sh::sh(format!( + "{} item list '{}' --output json", + EXECUTABLE, vault + )); return match serde_json::from_str(items_raw.as_str()) { Ok(val) => Ok(val), Err(e) => Err(Error::new( @@ -121,9 +119,22 @@ pub fn get_logins(items: Items) -> Vec { username: login.username, email: login.email, password: login.password, - urls: login.urls, - totp_uri: login.totp_uri, } }) .collect() } + +pub fn update(vault: &String, item: LoginItem, user_is_actually_email: bool) -> Result<(), Error> { + let user_field_update = if user_is_actually_email { + format!("email={}", item.email) + } else { + format!("usename={}", item.username) + }; + let output = sh::sh(format!( + "{} item update --vault-name '{}' --item-id '{}' --field 'password={}' --field '{}'", + EXECUTABLE, vault, item.id, item.password, user_field_update + )); + println!("> {}", output); + + return Ok(()); +} diff --git a/src/rbw.rs b/src/rbw.rs index 304fc4d..74003d9 100644 --- a/src/rbw.rs +++ b/src/rbw.rs @@ -9,7 +9,6 @@ pub struct Item { pub id: String, pub name: String, pub user: Option, - pub uris: Option>, #[serde(rename = "type")] pub type_: String, } @@ -20,7 +19,6 @@ pub struct LoginItem { pub name: String, pub user: String, pub password: String, - pub uris: Vec, } pub fn check_rbw() -> Result<(), Error> { @@ -78,10 +76,6 @@ pub fn get_logins(items: Vec) -> Result, Error> { Some(s) => s.to_string(), None => password, }, - uris: match item.uris.clone() { - Some(val) => val, - None => Vec::new(), - }, }); }