Skip to content

Security hardening + UX: PIN lockout, protected folders, keyboard play, mkdir/rename - #2

Merged
mkl159 merged 1 commit into
masterfrom
claude/code-review-verification-4h26dp
Jul 2, 2026
Merged

mkl159 merged 1 commit into
masterfrom
claude/code-review-verification-4h26dp

Conversation

@mkl159

@mkl159 mkl159 commented Jul 2, 2026

Copy link
Copy Markdown
Owner

Résumé

Lot de durcissement sécurité + améliorations d'ergonomie, avec tests fonctionnels réels (serveur lancé localement, chaque comportement vérifié au curl). Version 1.8.

🛡️ Sécurité / robustesse

  • Faille corrigée : /api/auth/setup permettait à n'importe qui sur le réseau d'écraser un PIN existant sans authentification → changer le PIN exige désormais une session valide.
  • Anti-brute-force : verrouillage de 30 s après 5 PINs erronés consécutifs (un PIN à 4 chiffres n'a que 10 000 combinaisons). Le message de verrouillage remonte jusqu'à l'écran de connexion.
  • Validation serveur du PIN : 4 à 8 chiffres uniquement.
  • Dossiers système protégés : SDCARD (racine), .tmp_update, Roms, Saves, Emu, RetroArch, miyoo, App, App/WebDeck, BIOS, Icons ne peuvent plus être supprimés ni renommés.
  • Bug getLocalIP : le préfixe "172." acceptait des IP publiques hors 172.16/12 → remplacé par net.IP.IsPrivate() (RFC 1918 exact).
  • Durcissement HTTP : http.Server avec ReadHeaderTimeout (anti-slowloris) ; les flux longue durée (MJPEG, WebSocket) ne sont pas affectés.

😊 Ergonomie

  • ⌨️ Jouer au clavier : flèches = croix, X=A, Z=B, S=X, A=Y, Q/E=L1/R1, W/R=L2/R2, Entrée=START, Maj=SELECT, M=MENU — désactivable, jamais actif pendant la saisie dans un champ, aide du mapping affichée sous la manette.
  • Gestionnaire de fichiers : boutons Nouveau dossier et Renommer (/api/mkdir, /api/rename), noms validés côté serveur (sanitizeName : pas de /, pas de traversée, pas de noms cachés).
  • Login : filtrage chiffres-uniquement à la saisie, indices autocomplete, vrai message serveur affiché lors du verrouillage.
  • Accessibilité : aria-label/title sur les boutons-icônes ; dernier tooltip français en dur déplacé dans l'i18n (FR/EN).

✅ Vérification

Tests fonctionnels live (serveur + fausse SD + curl) : PIN invalide refusé · écrasement sans session → 401 · changement avec session → OK · mkdir/rename OK · ../evil refusé · suppression de Roms bloquée · lockout après 5 échecs (même avec le bon PIN).

gofmt -l .      # vide
go vet ./...    # OK
go test ./...   # ok (+4 tests : validPin, isProtectedPath, sanitizeName, loginLimiter)
GOOS=linux GOARCH=arm GOARM=7 go build  # ARM 32-bit stripped
npm run build   # OK

Binaire ARM et bundle web du package régénérés.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XmGfBz6k1Z8YFPitFjuEGp


Generated by Claude Code

Security (all verified live with curl against a running server):
- fix: /api/auth/setup no longer lets an unauthenticated caller overwrite an
  existing PIN — changing the PIN now requires a valid session
- login rate limiting: 30s lockout after 5 consecutive wrong PINs (a 4-digit
  PIN is brute-forceable in minutes without this); lockout message surfaced
  in the login UI
- server-side PIN validation: 4-8 digits only
- protected system folders (SDCARD root, .tmp_update, Roms, Saves, RetroArch,
  miyoo, App/WebDeck, BIOS, Icons) can no longer be deleted or renamed
- getLocalIP: use net.IP.IsPrivate() — the old '172.' prefix wrongly matched
  public 172.x addresses outside 172.16/12
- http.Server with ReadHeaderTimeout (slowloris guard); streams unaffected

User-friendliness:
- play with the keyboard: arrows=D-pad, X=A, Z=B, S=X, A=Y, Q/E=L1/R1,
  W/R=L2/R2, Enter=START, Shift=SELECT, M=MENU; toggleable, never steals
  keys while typing in a field; mapping hint shown under the gamepad
- file manager: New folder and Rename buttons (names validated server-side)
- login: digit-only input filtering, proper autocomplete hints, real server
  error shown on lockout instead of a generic message
- aria-labels/titles on icon-only buttons; last hardcoded French tooltip
  moved to i18n

Tests: validPin, isProtectedPath, sanitizeName, loginLimiter (all green)
Version 1.8; ARM binary + www bundle rebuilt
@mkl159
mkl159 merged commit 381433b into master Jul 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants