From ca96d0c49df16e492e5ddc6381d9cd410ec59c56 Mon Sep 17 00:00:00 2001 From: Bryan Weber Date: Thu, 23 Jul 2026 21:16:56 +0000 Subject: [PATCH 1/2] fix(auth): persist updated refresh_token and refresh_expires_at on token refresh (Fixes #41) --- lkr/auth_service.py | 13 ++++++++++--- tests/test_oauth_account.py | 8 ++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lkr/auth_service.py b/lkr/auth_service.py index d837f56..67cd0a2 100644 --- a/lkr/auth_service.py +++ b/lkr/auth_service.py @@ -375,11 +375,18 @@ def set_token( datetime.fromisoformat(expires_at) + timedelta(days=30) ).isoformat() if self.from_db and new_token: + if new_token.refresh_token: + self.refresh_token = new_token.refresh_token + self.access_token = new_token.access_token or self.access_token + self.token_type = new_token.token_type or self.token_type + self.refresh_expires_at = refresh_expires_at connection.execute( - "UPDATE auth SET access_token = ?, token_type = ?, expires_at = ? WHERE instance_name = ?", + "UPDATE auth SET access_token = ?, refresh_token = ?, refresh_expires_at = ?, token_type = ?, expires_at = ? WHERE instance_name = ?", ( - new_token.access_token, - new_token.token_type, + self.access_token, + self.refresh_token, + self.refresh_expires_at, + self.token_type, expires_at, self.instance_name, ), diff --git a/tests/test_oauth_account.py b/tests/test_oauth_account.py index 51409d5..1f3cd51 100644 --- a/tests/test_oauth_account.py +++ b/tests/test_oauth_account.py @@ -96,7 +96,10 @@ def test_set_token_refreshes_lookedup_account(temp_db): # Refresh the token new_token = AccessToken( - access_token="token-refreshed", token_type="Bearer", expires_in=3600 + access_token="token-refreshed", + refresh_token="refresh-target-new", + token_type="Bearer", + expires_in=3600, ) curr.set_token(auth_service.conn, new_token=new_token, commit=True) @@ -104,9 +107,10 @@ def test_set_token_refreshes_lookedup_account(temp_db): conn = sqlite3.connect(temp_db) conn.row_factory = sqlite3.Row row = conn.execute( - "SELECT access_token, current_instance FROM auth WHERE instance_name = 'target-inst'" + "SELECT access_token, refresh_token, current_instance FROM auth WHERE instance_name = 'target-inst'" ).fetchone() assert row["access_token"] == "token-refreshed" + assert row["refresh_token"] == "refresh-target-new" assert row["current_instance"] == 0 # Still not active! # Verify that active-inst was NOT touched From cc79bd3ba5e1901c4fb13c6ba987c05104ae280f Mon Sep 17 00:00:00 2001 From: Bryan Weber Date: Thu, 23 Jul 2026 21:18:50 +0000 Subject: [PATCH 2/2] fix(auth): only update refresh_expires_at when new refresh_token is present --- lkr/auth_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lkr/auth_service.py b/lkr/auth_service.py index 67cd0a2..0554df6 100644 --- a/lkr/auth_service.py +++ b/lkr/auth_service.py @@ -377,9 +377,9 @@ def set_token( if self.from_db and new_token: if new_token.refresh_token: self.refresh_token = new_token.refresh_token + self.refresh_expires_at = refresh_expires_at self.access_token = new_token.access_token or self.access_token self.token_type = new_token.token_type or self.token_type - self.refresh_expires_at = refresh_expires_at connection.execute( "UPDATE auth SET access_token = ?, refresh_token = ?, refresh_expires_at = ?, token_type = ?, expires_at = ? WHERE instance_name = ?", (