No description
Find a file
Erol Haagenrud fbd3f58a1c Ekte autentisering er bygget og verifisert. X-Debug-User-Id-stubben er helt fjernet, ingen fallback beholdt.
Ny flyt: magic-link (POST /auth/request-link → POST /auth/verify-link) + JWT-sesjon i HttpOnly/SameSite=Lax/dynamisk-Secure-cookie (30 dager), pluss /auth/logout og /auth/me. Ny migrasjon 004_auth.sql (unik e-post-indeks + magic_link_token-tabell).

Sikkerhetsdesignet fra Plan-agent-gjennomgangen holdt gjennom testing:

Token: secrets.token_urlsafe(32), kun SHA-256-hash lagres
Atomisk forbruk (UPDATE...RETURNING, ikke les-sjekk-skriv) — hindrer replay
Generisk respons uansett om e-posten finnes — hindrer enumerering
app_user opprettes først ved vellykket verifisering, ikke ved forespørsel — hindrer massopprettelse
Gamle uforbrukte lenker ugyldiggjøres når en ny utstedes
PyJWT (byttet fra python-jose pga. bredere sårbarhetsflate) med eksplisitt algorithms=["HS256"]
Ekte eksistens-sjekk mot app_user på hvert kall — en slettet bruker mister tilgang umiddelbart, ikke etter 30 dager
Alle 12 planlagte tester bestått, inkludert cooldown, token-ugyldiggjøring, utløp, tuklet JWT, slettet bruker, og at debug-headeren nå er helt uten effekt.

To ting funnet og fikset/dokumentert underveis:

ON CONFLICT (email) matchet ikke den nye partielle unike indeksen uten eksplisitt WHERE-klausul — fikset.
En reell, dypere RLS-bug (dokumentert i FEATURE_BACKLOG.md, ikke fikset her): organization-tabellens RLS-policy kaster en 500 i stedet for "se ingenting" når app.current_org leses tilbake som tomstreng (ikke NULL) på en gjenbrukt pool-tilkobling. Berører trolig alle 15 RLS-policyer i skjemaet — for stort og sensitivt (ADR-003-grunnmuren) til å hastefikse her, så jeg mitigerte det lokalt i /auth/me og satte det som punkt 1 i neste-steg-listen.
2026-07-16 15:16:53 +02:00
.claude Ekte autentisering er bygget og verifisert. X-Debug-User-Id-stubben er helt fjernet, ingen fallback beholdt. 2026-07-16 15:16:53 +02:00
__pycache__ Scoring-runden er ferdig og verifisert for ekte (samme scratch-container-mønster, denne gangen med hele /opt/teecup montert siden handicap_engine.py er et toppnivå-søskenmodul til app-pakken). Alle 10 planlagte tester besto, inkludert fourball better-ball-aggregering, poeng-caching ved tidlig avgjørelse, den sammenhengende-prefiks-regelen, og ADR-014-bryteren. Fant og fikset underveis at SessionCreate manglet scoring_mode helt — hole_result-modus kunne aldri vært brukt via API-et uten den fiksen. 2026-07-16 14:38:42 +02:00
app Ekte autentisering er bygget og verifisert. X-Debug-User-Id-stubben er helt fjernet, ingen fallback beholdt. 2026-07-16 15:16:53 +02:00
.gitignore Add .gitignore to keep .env (DB secrets) out of version control 2026-07-16 07:39:08 +02:00
001_initial_schema.sql Første commit for teecup 2026-07-16 07:18:01 +02:00
002_roles_and_grants.sql Fix migration 002: psql does not interpolate :'var' inside DO $$ blocks 2026-07-16 08:24:48 +02:00
003_scoring_and_blinddraw.sql Utgangspunktet 2026-07-16 07:26:04 +02:00
004_auth.sql Ekte autentisering er bygget og verifisert. X-Debug-User-Id-stubben er helt fjernet, ingen fallback beholdt. 2026-07-16 15:16:53 +02:00
ARCHITECTURE_DECISIONS.md ARCHITECTURE_DECISIONS.md — ny ADR-014 dokumenterer de fire uavhengige bryterne (bruk handicap / bruk course handicap / hcp-prosent / bruk matchplay-handicap), bekreftelsen av at prosentene matcher GameBook, og at motoren allerede støtter alle fire som atskilte kall. 2026-07-16 14:03:50 +02:00
CLAUDE.md Ekte autentisering er bygget og verifisert. X-Debug-User-Id-stubben er helt fjernet, ingen fallback beholdt. 2026-07-16 15:16:53 +02:00
FEATURE_BACKLOG.md Ekte autentisering er bygget og verifisert. X-Debug-User-Id-stubben er helt fjernet, ingen fallback beholdt. 2026-07-16 15:16:53 +02:00
handicap_engine.py Første commit for teecup 2026-07-16 07:18:01 +02:00
test_handicap_engine.py Første commit for teecup 2026-07-16 07:18:01 +02:00
test_isolation.sql Før vi flytter alt til agenten 2026-07-16 08:21:57 +02:00