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:
co-authored by
Claude Opus 5.5
parent
81a74375b7
commit
764ad50b8e
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user