Simpl-Resultat/src
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
..
__fixtures__ feat(onboarding): create_sample_import_folders command, sample CSV templates and detection test (#354) 2026-10-03 19:50:41 -04:00
__integration__ feat(onboarding): create_sample_import_folders command, sample CSV templates and detection test (#354) 2026-10-03 19:50:41 -04:00
components feat(license): remove the stored license key from the License card 2026-10-04 17:14:36 -04:00
contexts fix(license): check a revoked key as soon as it is entered 2026-10-04 16:26:10 -04:00
data feat(categories): add v1 IPC seed, i18n keys, and migration v8 (#115) 2026-04-19 16:41:55 -04:00
hooks fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
i18n fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
pages fix(onboarding): apply the three review follow-ups on the stack head 2026-10-04 08:47:30 -04:00
services fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
shared feat(onboarding): add transaction count, onboarding counters and checklist reducer (#351) 2026-10-03 19:22:18 -04:00
utils feat(onboarding): add transaction count, onboarding counters and checklist reducer (#351) 2026-10-03 19:22:18 -04:00
App.tsx feat(gating): gate routes and Sidebar for budget, advanced reports, balance 2026-07-20 22:12:51 -04:00
main.tsx feat(gating): license provider + entitlements matrix + useEntitlement (#297) 2026-07-19 21:05:10 -04:00
styles.css feat(categories): add categories standard guide page (#117) 2026-04-20 21:02:38 -04:00
vite-env.d.ts Initial project scaffold: Tauri v2 + React + TypeScript + TailwindCSS v4 2026-02-07 11:05:11 +00:00