feat: OAuth token storage via OS keychain (#78) #83
No reviewers
Labels
No labels
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#83
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-78-token-store"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes #78
Refs #66
Summary
token_storemodule centralises OAuth token persistence.tokens.jsonis copied into the keychain and then zero-overwritten + fsync'd before unlink.store_modeflag persisted to refuse silent downgrades after a prior keychain success (forces re-auth instead of leaking plaintext).get_token_store_modecommand for the upcoming settings banner (#81).auth_commands.rsrefactored: all tokens.json paths go throughtoken_store.check_subscription_statususestoken_store::load().is_some()so the migration runs even when the 24h throttle early-returns.Test plan
cargo checkcleancargo test17/17 pass (3 new tests for token_store)npm run buildcleansecret-tool lookup service com.simpl.resultat user oauth-tokens, verify notokens.jsonin app data dirtokens.jsonon disk, start the app, verify migration + wipeDBUS_SESSION_BUS_ADDRESS=/dev/nullstart, verify fallback path activatesReview — APPROVE ✓
Inspection de la PR #83 contre la checklist sprint.
Security
com.simpl.resultat(canonique tauri.conf.json)remove_filedanszero_and_delete(CWE-212)store_modepersistant refuse le downgrade silencieux après un succès keychain (CWE-757)zeroizeappliqué au buffer localCorrectness
TOKENS_FILEpassent partoken_storecheck_subscription_statusutilisetoken_store::load(&app)?.is_some()— déclenche la migration même quand le throttle 24h early-returnrefresh_auth_tokenappelletoken_store::deletesur échec au lieu defs::remove_filehandle_auth_callbackordre correct : save tokens → fetch userinfo → save accountNoEntryde keyring sont traduites enOk(None)/Ok(())pour une API idempotenteQuality
Observations mineures (non-bloquantes)
zero_and_deleteutilisetruncate(false)qui est la valeur par défaut d'OpenOptions — suppression possible, cosmétique.write_store_modeéchoue après unkeychain_saveréussi danssave(), on retourne Err mais les tokens sont déjà dans le keychain. Edge case très rare (disk full en plein entre deux fs ops). Pas bloquant.keyring = "3.6"— version pinnée mineure comme demandé par la revue spec.cargo audità ajouter dans #79.Backend choice note
La revue spec envisageait
libsecret-1-devcomme dep de build Linux. Finalement j'utilisesync-secret-service+crypto-rustqui sont pure Rust côté parseur de Secret Service, mais passent pardbus-secret-service→dbuscrate →libdbus-1-devau build time (au lieu de libsecret-1-dev). Net : impact CI/packaging identique, un seul apt package à ajouter dans #79, etlibdbus-1-3est quasi universellement présent sur Linux desktop au runtime donc pas besoin de l'ajouter aux.deb.depends.Verdict : APPROVE — prêt à merger. Les points mineurs peuvent être traités en follow-up ou laissés tels quels.