package lockout import ( "context" "errors" "gitea.perlbach24.de/scripte/nexarch/internal/auth" ) var ErrAccountLocked = errors.New("lockout: konto ist vorübergehend gesperrt") // GuardedLogin komponiert IAM-02s LoginService mit dem Lockout-Zustand, // OHNE LoginService selbst zu veraendern (kein Umbau der Vorbedingung): // vor jedem Login-Versuch wird die Sperre geprueft, nach jedem Versuch wird // Erfolg/Fehlschlag im geteilten Postgres-Zustand vermerkt. func GuardedLogin(ctx context.Context, store *Store, login *auth.LoginService, email, password string) (string, error) { locked, _, err := store.IsLocked(ctx, email) if err != nil { return "", err } if locked { return "", ErrAccountLocked } token, err := login.Login(ctx, email, password) if err != nil { if _, _, lockErr := store.RecordFailure(ctx, email); lockErr != nil { return "", lockErr } return "", err } if err := store.RecordSuccess(ctx, email); err != nil { return "", err } return token, nil }