aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/rbw/commands.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-18 01:51:31 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-18 01:58:08 -0400
commit45343bb64d9230da0705d259c7f411d8af8d990f (patch)
tree34244a1357c6375098c42fcc70ab3d94cc445015 /src/bin/rbw/commands.rs
parent6c039cd319f15a8b5fbf771729589764be83a29d (diff)
downloadrbw-45343bb64d9230da0705d259c7f411d8af8d990f.tar.gz
rbw-45343bb64d9230da0705d259c7f411d8af8d990f.zip
implement saving generated passwords
Diffstat (limited to 'src/bin/rbw/commands.rs')
-rw-r--r--src/bin/rbw/commands.rs43
1 files changed, 40 insertions, 3 deletions
diff --git a/src/bin/rbw/commands.rs b/src/bin/rbw/commands.rs
index 3e11c88..a42e796 100644
--- a/src/bin/rbw/commands.rs
+++ b/src/bin/rbw/commands.rs
@@ -194,17 +194,54 @@ pub fn add(name: &str, username: Option<&str>) -> anyhow::Result<()> {
pub fn generate(
name: Option<&str>,
- user: Option<&str>,
+ username: Option<&str>,
len: usize,
ty: rbw::pwgen::Type,
) -> anyhow::Result<()> {
let password = rbw::pwgen::pwgen(ty, len);
println!("{}", password);
- if name.is_some() && user.is_some() {
+ if let Some(name) = name {
unlock()?;
- todo!();
+ let email = config_email()?;
+ let mut db = rbw::db::Db::load(&email)?;
+ // unwrap is safe here because the call to unlock above is guaranteed
+ // to populate it or error
+ let access_token = db.access_token.unwrap();
+
+ let name = crate::actions::encrypt(name)?;
+ let username = username
+ .map(|username| crate::actions::encrypt(username))
+ .transpose()?;
+ let password = crate::actions::encrypt(&password)?;
+
+ let cipher = rbw::api::Cipher {
+ name,
+ login: rbw::api::Login {
+ username,
+ password: Some(password),
+ },
+ };
+
+ let res = rbw::actions::add(&access_token, &cipher);
+ if let Err(e) = &res {
+ if let rbw::error::Error::RequestUnauthorized = e {
+ if let Some(refresh_token) = &db.refresh_token {
+ let access_token =
+ rbw::actions::exchange_refresh_token(refresh_token)?;
+ db.access_token = Some(access_token.clone());
+ db.save(&email).context("failed to save database")?;
+ rbw::actions::add(&access_token, &cipher)?;
+ } else {
+ return Err(anyhow::anyhow!(
+ "failed to find refresh token in db"
+ ));
+ }
+ }
+ }
+
+ crate::actions::sync()?;
}
Ok(())