Mobile F1+F4 fix — tokeni van Zustand + demo-login prod gate (MC #900173)
Mobile F1+F4 fix — tokeni van Zustand + demo-login prod gate (MC #900173)
Izvor: Securion retroaktivni mobile audit (MC #900156, ~/system/evidence/900156/securion-mobile-audit-2026-08-23.md), verdikt PASS-UZ-POPRAVKE. Blokira sljedeću mobile distribuciju (#900152 Faza 3).
Nalaz F1 (KRITIČAN — blokira distribuciju)
apps/mobile/src/store/authStore.ts drži accessToken + refreshToken u Zustand AuthState; client.ts čita useAuthStore.getState().accessToken; 3 ekrana čitaju token hookom. PRD §13 + Impl-spec §1.3/Slice A izričito: "no code path stores tokens in AsyncStorage or Zustand", "tokens live in Keychain only". Store NIJE persist() — token ne ide na disk, ali je globalno čitljiv (DevTools/crash-reporting/memory-dump površina).
Fix: ukloniti oba tokena iz AuthState i svih set() poziva; module-level tokenService (uzor: apps/web/lib/api.ts _accessToken) ili sinhroni getter nad SecureStore; client.ts poziva getter.
Nalaz F4 (SREDNJI)
app/(auth)/login.tsx renderuje "Pogledaj demo" (startDemoSignIn → /auth/demo) bez env/build-profile provjere — isti kod u production EAS profilu.
Fix: env-gate (EXPO_PUBLIC_APP_ENV) demo dugmeta van production profila.
Acceptance
-
accessToken|refreshTokenuauthStore.tstipu = 0 pogodaka (grep) - Testovi za tokenService + 401→refresh→retry lanac (danas 0 testova za auth lanac)
- Negativni kanarinac: vraćanje tokena u store obara test (oba smjera)
- Demo dugme odsutno u production buildu (test ili build-profile dokaz)
- gate_mobile (PR #389) zelen na PR-u
- Nezavisna peer verifikacija (auth = risky path)