Implements shared auth token reuse.

This commit is contained in:
2026-08-23 23:10:00 -07:00
parent a4838bf8d9
commit 30cdc61ae0
2 changed files with 44 additions and 6 deletions

View File

@@ -70,7 +70,6 @@ This document defines the complete project roadmap and task tracking system for
| ID | Title | Status | Type | | ID | Title | Status | Type |
|---|---|---|---| |---|---|---|---|
| [NUT-016](#nut-016) | Implement Shared Auth Token Reuse | Triage | Integration |
| [NUT-017](#nut-017) | Implement Multi-Account Switching (GUI + CLI) | Triage | Integration | | [NUT-017](#nut-017) | Implement Multi-Account Switching (GUI + CLI) | Triage | Integration |
| [NUT-018](#nut-018) | Implement Packaging for macOS, Windows, Linux | Triage | Chore | | [NUT-018](#nut-018) | Implement Packaging for macOS, Windows, Linux | Triage | Chore |
| [NUT-019](#nut-019) | Implement Homebrew/Winget/Chocolatey Manifests | Triage | Chore | | [NUT-019](#nut-019) | Implement Homebrew/Winget/Chocolatey Manifests | Triage | Chore |
@@ -93,6 +92,7 @@ This document defines the complete project roadmap and task tracking system for
| [NUT-013](#nut-013) | Implement GUI File Queue + Drag-and-Drop | Fixed | Feature | | [NUT-013](#nut-013) | Implement GUI File Queue + Drag-and-Drop | Fixed | Feature |
| [NUT-014](#nut-014) | Implement GUI Credential Management UI | Fixed | Feature | | [NUT-014](#nut-014) | Implement GUI Credential Management UI | Fixed | Feature |
| [NUT-015](#nut-015) | Implement GUI Upload Progress Bars | Fixed | Feature | | [NUT-015](#nut-015) | Implement GUI Upload Progress Bars | Fixed | Feature |
| [NUT-016](#nut-016) | Implement Shared Auth Token Reuse | Fixed | Integration |
| [NUT-021](#nut-021) | Support Headless & SSH Remote Authentication Modes | Fixed | Feature | | [NUT-021](#nut-021) | Support Headless & SSH Remote Authentication Modes | Fixed | Feature |
--- ---
@@ -402,19 +402,19 @@ Add per-file and total progress bars to the GUI.
- NUT-013 - NUT-013
<a id="nut-016" class="task" data-status="triage" data-task-type="integration"></a> <a id="nut-016" class="task" data-status="done" data-task-type="integration"></a>
### Implement Shared Auth Token Reuse ### Implement Shared Auth Token Reuse
**ID:** NUT-016 **ID:** NUT-016
**Status:** Triage **Status:** Fixed
**Type:** Integration **Type:** Integration
**Description:** **Description:**
Ensure both CLI and GUI reuse the same credential store and cached tokens. Ensure both CLI and GUI reuse the same credential store and cached tokens.
**Requirements:** **Requirements:**
- [ ] Shared credential backend - [x] Shared credential backend
- [ ] Shared token cache - [x] Shared token cache
- [ ] Unified config format - [x] Unified config format
**Dependencies:** **Dependencies:**
- NUT-006 - NUT-006

View File

@@ -345,4 +345,42 @@ mod tests {
let deserialized: StoredAccount = serde_json::from_str(&json).unwrap(); let deserialized: StoredAccount = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, account); assert_eq!(deserialized, account);
} }
#[test]
fn test_unified_config_accounts_parsing() {
let json_data = r#"[
{
"id": "alice@cloud.example.com",
"label": "Work",
"username": "alice",
"server_url": "https://cloud.example.com",
"is_default": true,
"fallback_password": "app-password-token"
},
{
"id": "bob@personal.nextcloud.com",
"label": "Personal",
"username": "bob",
"server_url": "https://personal.nextcloud.com",
"is_default": false
}
]"#;
let accounts: Vec<StoredAccount> = serde_json::from_str(json_data).unwrap();
assert_eq!(accounts.len(), 2);
assert_eq!(accounts[0].id, "alice@cloud.example.com");
assert_eq!(accounts[0].label.as_deref(), Some("Work"));
assert!(accounts[0].is_default);
assert_eq!(accounts[0].fallback_password.as_deref(), Some("app-password-token"));
assert_eq!(accounts[1].id, "bob@personal.nextcloud.com");
assert_eq!(accounts[1].label.as_deref(), Some("Personal"));
assert!(!accounts[1].is_default);
assert_eq!(accounts[1].fallback_password, None);
}
#[test]
fn test_keyring_constants() {
assert_eq!(KEYRING_SERVICE_NAME, "me.majinnaibu.nut");
}
} }