From 6f10a47adc2fb42ffc965b954b9285123a82c094 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 19 Apr 2020 23:00:47 -0400 Subject: implement adding into a folder --- src/bin/rbw/commands.rs | 80 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) (limited to 'src/bin/rbw/commands.rs') diff --git a/src/bin/rbw/commands.rs b/src/bin/rbw/commands.rs index 317d62b..ee30950 100644 --- a/src/bin/rbw/commands.rs +++ b/src/bin/rbw/commands.rs @@ -170,6 +170,7 @@ pub fn add( name: &str, username: Option<&str>, uris: Vec<&str>, + folder: Option<&str>, ) -> anyhow::Result<()> { unlock()?; @@ -177,7 +178,7 @@ pub fn add( let mut db = rbw::db::Db::load(&email)?; // unwrap is safe here because the call to unlock above is guaranteed to // populate these or error - let access_token = db.access_token.as_ref().unwrap(); + let mut access_token = db.access_token.as_ref().unwrap().clone(); let refresh_token = db.refresh_token.as_ref().unwrap(); let name = crate::actions::encrypt(name)?; @@ -200,6 +201,42 @@ pub fn add( .map(|uri| crate::actions::encrypt(&uri)) .collect::>()?; + let mut folder_id = None; + if let Some(folder_name) = folder { + let (new_access_token, folders) = + rbw::actions::list_folders(&access_token, &refresh_token)?; + if let Some(new_access_token) = new_access_token { + access_token = new_access_token.clone(); + db.access_token = Some(new_access_token); + db.save(&email).context("failed to save database")?; + } + + let folders: Vec<(String, String)> = folders + .iter() + .cloned() + .map(|(id, name)| Ok((id, crate::actions::decrypt(&name)?))) + .collect::>()?; + + for (id, name) in folders { + if name == folder_name { + folder_id = Some(id); + } + } + if folder_id.is_none() { + let (new_access_token, id) = rbw::actions::create_folder( + &access_token, + &refresh_token, + &crate::actions::encrypt(folder_name)?, + )?; + if let Some(new_access_token) = new_access_token { + access_token = new_access_token.clone(); + db.access_token = Some(new_access_token); + db.save(&email).context("failed to save database")?; + } + folder_id = Some(id); + } + } + if let (Some(access_token), ()) = rbw::actions::add( &access_token, &refresh_token, @@ -208,6 +245,7 @@ pub fn add( password.as_deref(), notes.as_deref(), &uris, + folder_id.as_deref(), )? { db.access_token = Some(access_token); db.save(&email).context("failed to save database")?; @@ -222,6 +260,7 @@ pub fn generate( name: Option<&str>, username: Option<&str>, uris: Vec<&str>, + folder: Option<&str>, len: usize, ty: rbw::pwgen::Type, ) -> anyhow::Result<()> { @@ -235,7 +274,7 @@ pub fn generate( let mut db = rbw::db::Db::load(&email)?; // unwrap is safe here because the call to unlock above is guaranteed // to populate these or error - let access_token = db.access_token.as_ref().unwrap(); + let mut access_token = db.access_token.as_ref().unwrap().clone(); let refresh_token = db.refresh_token.as_ref().unwrap(); let name = crate::actions::encrypt(name)?; @@ -248,6 +287,42 @@ pub fn generate( .map(|uri| crate::actions::encrypt(&uri)) .collect::>()?; + let mut folder_id = None; + if let Some(folder_name) = folder { + let (new_access_token, folders) = + rbw::actions::list_folders(&access_token, &refresh_token)?; + if let Some(new_access_token) = new_access_token { + access_token = new_access_token.clone(); + db.access_token = Some(new_access_token); + db.save(&email).context("failed to save database")?; + } + + let folders: Vec<(String, String)> = folders + .iter() + .cloned() + .map(|(id, name)| Ok((id, crate::actions::decrypt(&name)?))) + .collect::>()?; + + for (id, name) in folders { + if name == folder_name { + folder_id = Some(id); + } + } + if folder_id.is_none() { + let (new_access_token, id) = rbw::actions::create_folder( + &access_token, + &refresh_token, + &crate::actions::encrypt(folder_name)?, + )?; + if let Some(new_access_token) = new_access_token { + access_token = new_access_token.clone(); + db.access_token = Some(new_access_token); + db.save(&email).context("failed to save database")?; + } + folder_id = Some(id); + } + } + if let (Some(access_token), ()) = rbw::actions::add( &access_token, &refresh_token, @@ -256,6 +331,7 @@ pub fn generate( Some(&password), None, &uris, + folder_id.as_deref(), )? { db.access_token = Some(access_token); db.save(&email).context("failed to save database")?; -- cgit v1.2.3-54-g00ecf