spaxel/dashboard
jedarden 3da0c32ba3 feat: dashboard PIN change flow
- Backend: Add POST /api/auth/change-pin endpoint
  - Requires valid session; body: {old_pin, new_pin}
  - Verifies old PIN against bcrypt hash; returns 403 on mismatch
  - Hashes new PIN with bcrypt cost=12
  - Existing sessions remain valid after PIN change
  - Returns {ok:true} on success

- Dashboard: Security section in settings panel
  - Add "Security" section with Change PIN button
  - Modal form: old PIN → new PIN → confirm new PIN → Submit
  - Inline error display for incorrect current PIN (403)
  - Success toast notification on PIN change
  - Validation: 4-8 digits, numeric only, PINs must match, new ≠ old

- Tests: Add comprehensive tests for change PIN endpoint
  - Success case: old PIN verified, new PIN works
  - Wrong old PIN: returns 403, original PIN still works
  - Unauthenticated: returns 401
  - Invalid new PIN: validation for length, digits, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 08:05:35 -04:00
..
css feat: dashboard PIN change flow 2026-04-09 08:05:35 -04:00
js feat: dashboard PIN change flow 2026-04-09 08:05:35 -04:00
index.html feat: add Identify button to fleet status page 2026-04-09 07:17:13 -04:00
jest.config.js feat(dashboard): interactive onboarding wizard for ESP32-S3 node provisioning 2026-03-28 02:36:58 -04:00
package-lock.json feat(dashboard): interactive onboarding wizard for ESP32-S3 node provisioning 2026-03-28 02:36:58 -04:00
package.json feat(dashboard): interactive onboarding wizard for ESP32-S3 node provisioning 2026-03-28 02:36:58 -04:00