Passwort-Reset: Review-Fixes

- Token vor bcrypt prüfen, damit beliebige Tokens keine CPU-Last erzeugen
- CLI meldet DB-Fehler nicht mehr als "Nutzer nicht gefunden"
- Reset in einem Browser mit fremder Session räumt diese mit ab
- Konto-Löschen entfernt auch offene Reset-Links

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
irrlicht
2026-10-02 00:44:32 +02:00
co-authored by Claude Opus 5.5
parent 81a74375b7
commit 764ad50b8e
3 changed files with 61 additions and 10 deletions
+24
View File
@@ -758,6 +758,30 @@ func TestPasswordReset(t *testing.T) {
t.Fatalf("neues Passwort: erwartet 200, bekam %d", got)
}
// Reset in einem Browser, in dem noch bob angemeldet ist: bobs Session
// wird mit abgeräumt statt verwaist gültig zu bleiben.
bob := registerAndLogin(t, srv, "bob")
var bobSession string
u, _ := url.Parse(srv.URL)
for _, ck := range bob.Jar.Cookies(u) {
if ck.Name == "session" {
bobSession = ck.Value
}
}
tok, _, _ := createResetToken("alice")
resp := postForm(t, bob, srv.URL+"/api/auth/reset", url.Values{
"token": {tok}, "pass1": {"drittesgeheim"}, "pass2": {"drittesgeheim"},
})
resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Fatalf("reset mit fremder Session: erwartet 200, bekam %d", resp.StatusCode)
}
var n int
db.QueryRow(`SELECT COUNT(*) FROM session WHERE value = $1`, bobSession).Scan(&n)
if n != 0 {
t.Fatalf("bobs Session nach Reset im selben Browser noch gültig")
}
// Ein neuer Link macht den vorigen ungültig; abgelaufene gelten nicht.
first, _, _ := createResetToken("alice")
second, _, _ := createResetToken("alice")