aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/rbw-agent
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-12 03:44:48 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-12 03:44:48 -0400
commit201d2d40cac8760fb69b9282ba2a4f9f7ec82d47 (patch)
tree0c1cfd3986e28e7be2b73cdcba11e9ebbbb7c2fa /src/bin/rbw-agent
parentbcae263e4e888274f399a75ec5b171ee25edf894 (diff)
downloadrbw-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.rs27
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)