[#1] Module token_store + refactor auth_commands.rs (coeur migration) #78
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#78
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Implementation du module
token_storequi remplace tous les accès direct au fichiertokens.jsondansauth_commands.rs, avec fallback gracieux et migration transparente.Spec :
spec-issue-66-oauth-keychain.mdParent : #66
Dépendances : aucune (première issue du milestone)
Tâches
Dépendances Rust
keyring = "3.x"danssrc-tauri/Cargo.toml(pin explicite)Module token_store
src-tauri/src/commands/token_store.rs(pas de nouveau top-levelauth/)src-tauri/src/commands/mod.rsservice = "com.simpl.resultat"(identifiant canonique de tauri.conf.json, PAScom.lacompagniemaximus.simpl-resultat)user = "oauth-tokens", valeur = JSON compact deStoredTokenssave(app, tokens) -> Result<(), String>— keyring d'abord, fallbackwrite_restricted()si KOload(app) -> Result<Option<StoredTokens>, String>— keyring d'abord, puis migration depuistokens.jsonsi présentdelete(app) -> Result<(), String>— efface keychain ET fichier résiduelMigration sécurisée
fs::remove_filedu fichier migré : overwrite avec zéros +fsync(), PUIS delete (CWE-212)Flag store_mode
store_modedansapp_data_dir/auth/pour distinguer keychain-réussi-une-fois vs jamais-marchéRefactor auth_commands.rs
handle_auth_callback(l.202) :token_store::save(&app, &tokens)refresh_auth_token(l.219-227) :token_store::load(&app)?refresh_auth_token(l.277) :token_store::save(&app, &new_tokens)refresh_auth_token(l.251) :token_store::delete(&app)sur échec refreshlogout(l.305) :token_store::delete(&app)check_subscription_status(l.320) : remplacerdir.join(TOKENS_FILE).exists()partoken_store::load(&app)?.is_some()— important : ça déclenche la migration même quand le throttle 24h early-returnTOKENS_FILEde auth_commands.rsTests
StoredTokens#[ignore]Backendd'injection — YAGNI, keyring v3 expose une struct concrèteCritères d'acceptation
cargo checketcargo testpassentTOKENS_FILE/tokens.jsonne reste dansauth_commands.rscom.simpl.resultat