package web_test import ( "net/http" "net/url" "regexp" "testing" ) var resetLinkPattern = regexp.MustCompile(`/passwort-zuruecksetzen/([a-f0-9]+)`) func TestPasswortVergessenSendetLinkUndSetztNeuesPasswort(t *testing.T) { fs := newFakeStore() s, fm := newServerWithMailer(t, fs) regResp := postForm(t, s, nil, "/register", mergeValues(url.Values{ "account_name": {"Reset-Firma"}, "email": {"reset@example.com"}, "password": {"altes-passwort"}, }, firmenPflichtfelder())) if regResp.Code != http.StatusSeeOther { t.Fatalf("register status = %d, want 303", regResp.Code) } vergessenResp := postForm(t, s, nil, "/passwort-vergessen", url.Values{"email": {"reset@example.com"}}) if vergessenResp.Code != http.StatusOK { t.Fatalf("passwort-vergessen status = %d, want 200", vergessenResp.Code) } if len(fm.Sent) != 1 { t.Fatalf("got %d gesendete Mails, want 1", len(fm.Sent)) } match := resetLinkPattern.FindStringSubmatch(fm.Sent[0].Body) if match == nil { t.Fatalf("kein Reset-Link in Mail-Body gefunden: %q", fm.Sent[0].Body) } token := match[1] getResp := getWithCookie(t, s, nil, "/passwort-zuruecksetzen/"+token) if getResp.Code != http.StatusOK { t.Fatalf("get reset form status = %d, want 200", getResp.Code) } resetResp := postForm(t, s, nil, "/passwort-zuruecksetzen/"+token, url.Values{"password": {"neues-passwort-123"}}) if resetResp.Code != http.StatusSeeOther { t.Fatalf("reset status = %d, want 303, body: %s", resetResp.Code, resetResp.Body.String()) } // Derselbe Link darf kein zweites Mal funktionieren. reuseResp := postForm(t, s, nil, "/passwort-zuruecksetzen/"+token, url.Values{"password": {"noch-ein-passwort"}}) if reuseResp.Code != http.StatusNotFound { t.Fatalf("reuse status = %d, want 404 (Token bereits verwendet)", reuseResp.Code) } // Altes Passwort funktioniert nicht mehr. oldLoginResp := postForm(t, s, nil, "/login", url.Values{"email": {"reset@example.com"}, "password": {"altes-passwort"}}) if oldLoginResp.Code != http.StatusOK { t.Fatalf("login mit altem Passwort status = %d, want 200 (abgelehnt)", oldLoginResp.Code) } // Neues Passwort funktioniert. newLoginResp := postForm(t, s, nil, "/login", url.Values{"email": {"reset@example.com"}, "password": {"neues-passwort-123"}}) if newLoginResp.Code != http.StatusSeeOther { t.Fatalf("login mit neuem Passwort status = %d, want 303", newLoginResp.Code) } } func TestPasswortVergessenFuerUnbekannteEmailVerraetNichts(t *testing.T) { fs := newFakeStore() s, fm := newServerWithMailer(t, fs) resp := postForm(t, s, nil, "/passwort-vergessen", url.Values{"email": {"gibt-es-nicht@example.com"}}) if resp.Code != http.StatusOK { t.Fatalf("status = %d, want 200", resp.Code) } if len(fm.Sent) != 0 { t.Fatalf("got %d gesendete Mails für unbekannte E-Mail, want 0", len(fm.Sent)) } if !containsHinweis(resp.Body.String()) { t.Fatalf("erwartete generische Erfolgsmeldung, body: %s", resp.Body.String()) } } func containsHinweis(body string) bool { return regexp.MustCompile(`Falls diese E-Mail-Adresse`).MatchString(body) } func TestPasswortZuruecksetzenMitUngueltigemTokenGibt404(t *testing.T) { fs := newFakeStore() s := newServer(t, fs) resp := getWithCookie(t, s, nil, "/passwort-zuruecksetzen/nicht-existierendes-token") if resp.Code != http.StatusNotFound { t.Fatalf("status = %d, want 404", resp.Code) } }