Simpl-Resultat/docs/adr
le king fu ed35570121
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m49s
PR Check — Rust / rust (pull_request) Successful in 3m21s
fix(license): drop an activation token that no longer stands for this machine
A data directory written by v0.15.0 or earlier can hold a valid key next
to the activation token of another license, typically a refunded hence
revoked one. The License card read "Activated", market prices were
refused, and "Activate" was never offered: the folder could not recover
without a manual file removal.

- Prices: a 403 license_revoked drops the refused token, and only while
  the file still holds it, so an activation that lands while the refused
  request is in flight keeps its new token (CWE-367). The key's revoked
  state is never written from this route. The token is read through
  ACTIVATION_FILE by the directory-based read_stored_activation_token_in,
  in fetch_price_in, testable without AppHandle.
- Machine list: list_activated_machines returns { machines,
  token_dropped }. A complete list that names this machine under neither
  identifier drops a token that activates this machine, when the OS id is
  readable and the token is the one on disk when the list was asked for.
  An error, a revoked key or a rate limit drops nothing.
  machines_from_verify counts the rows it skips, which the list still
  tolerates. This also gives "Activate" back to a machine deactivated from
  another computer.
- Front: the activation status is read again after every list load; a
  fixed log line (ACTIVATION_TOKEN_LOG) is written on token_dropped and on
  a price refused as revoked; the revoked-license price message invites to
  activate the machine again.
- Docs: architecture, ADR 0017 (#365 amendment), ADR 0020 (rule 4), user
  guide and in-app tips, changelogs.

Resolves #367

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 17:58:25 -04:00
..
0001-tauri-v2.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0002-useReducer-vs-redux.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0003-sqlx-migrations.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0004-aes-256-gcm-encryption.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0005-multi-profile-db.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0006-oauth-tokens-keychain.md docs: ADR 0006 + changelog + architecture for OAuth keychain (#82) 2026-04-14 08:26:21 -04:00
0007-reports-hub-refactor.md docs: polish + changelog + ADR + legacy cleanup for reports refactor (#76) 2026-04-14 15:29:49 -04:00
0008-modified-dietz-pour-rendement.md docs(adr): add ADRs 0008-0010 (Modified Dietz, proxy price-fetching, FK RESTRICT) 2026-04-25 17:06:40 -04:00
0009-proxy-price-fetching-via-maximus-api.md docs(adr): add ADRs 0008-0010 (Modified Dietz, proxy price-fetching, FK RESTRICT) 2026-04-25 17:06:40 -04:00
0010-fk-restrict-balance-transfers.md docs(adr): add ADRs 0008-0010 (Modified Dietz, proxy price-fetching, FK RESTRICT) 2026-04-25 17:06:40 -04:00
0011-providers-best-effort-yahoo.md docs(prices): commit /v1/prices contract + ADR 0011 2026-04-27 08:06:03 -04:00
0012-balance-two-level-model.md docs(balance): ADR 0014 + reject 0012 + guide + changelog (#205) 2026-06-01 21:15:06 -04:00
0013-stocks-provider-evaluation.md docs(adr): 0013 — stocks provider evaluation, AV retained as bascule target (#196) 2026-05-09 12:40:08 +00:00
0014-balance-vehicule-attribut.md docs(balance): ADR 0014 + reject 0012 + guide + changelog (#205) 2026-06-01 21:15:06 -04:00
0015-balance-detail-par-titre.md docs(balance): ADR 0015 + guide + architecture + CHANGELOG for per-security detail (#218) 2026-06-06 14:17:03 -04:00
0016-persistance-etat-ui-par-profil.md docs(collapse): ADR 0016 per-profile UI state + guide, architecture, i18n 2026-07-18 14:43:24 -04:00
0017-feature-gating-par-tier.md fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
0018-suppression-advisories-non-atteignables.md fix(deps): resolve the quick-xml advisories, unyank deep-link and spin 2026-08-15 11:51:46 -04:00
0019-format-import-persiste.md docs: architecture, ADR 0019, user guide and changelog for the import format 2026-08-14 11:13:25 -04:00
0020-identifiant-machine-derive.md fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00