diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-04-12 03:44:48 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-04-12 03:44:48 -0400 |
commit | 201d2d40cac8760fb69b9282ba2a4f9f7ec82d47 (patch) | |
tree | 0c1cfd3986e28e7be2b73cdcba11e9ebbbb7c2fa /src/bin/rbw-agent | |
parent | bcae263e4e888274f399a75ec5b171ee25edf894 (diff) | |
download | rbw-201d2d40cac8760fb69b9282ba2a4f9f7ec82d47.tar.gz rbw-201d2d40cac8760fb69b9282ba2a4f9f7ec82d47.zip |
implement refresh token handling
Diffstat (limited to 'src/bin/rbw-agent')
-rw-r--r-- | src/bin/rbw-agent/actions.rs | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/bin/rbw-agent/actions.rs b/src/bin/rbw-agent/actions.rs index 81e2597..4662164 100644 --- a/src/bin/rbw-agent/actions.rs +++ b/src/bin/rbw-agent/actions.rs @@ -133,13 +133,32 @@ pub async fn sync(sock: &mut crate::sock::Sock) -> anyhow::Result<()> { .context("failed to load local database")?; let access_token = if let Some(access_token) = &db.access_token { - access_token + access_token.clone() } else { return Err(anyhow::anyhow!("failed to find access token in db")); }; - let (protected_key, ciphers) = rbw::actions::sync(&access_token) - .await - .context("failed to sync database from server")?; + let res = rbw::actions::sync(&access_token).await; + let res = 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) + .await?; + db.access_token = Some(access_token.clone()); + rbw::actions::sync(&access_token).await + } else { + return Err(anyhow::anyhow!( + "failed to find refresh token in db" + )); + } + } else { + res + } + } else { + res + }; + let (protected_key, ciphers) = + res.context("failed to sync database from server")?; db.protected_key = Some(protected_key); db.ciphers = ciphers; db.save_async(&email) |