package totp import ( "context" "errors" "gitea.perlbach24.de/scripte/nexarch/internal/auth" "gitea.perlbach24.de/scripte/nexarch/internal/user" ) var ErrSecondFactorRequired = errors.New("totp: zweiter faktor erforderlich") // LoginWithTOTP komponiert IAM-02s LoginService mit der 2FA-Pruefung, ohne // LoginService selbst zu veraendern. Ist 2FA fuer den Benutzer aktiv, MUSS // totpCode gueltig sein (Akzeptanzkriterium 2) — ein leerer/falscher Code // wird zuverlaessig abgewiesen, auch bei korrektem Passwort. func LoginWithTOTP(ctx context.Context, users *user.TenantUserStore, totpStore *Store, login *auth.LoginService, email, password, totpCode string) (token string, err error) { creds, err := users.GetByEmailForAuth(ctx, email) if err != nil { return "", auth.ErrInvalidCredentials } enabled, err := totpStore.IsEnabled(ctx, creds.User.ID) if err != nil { return "", err } if enabled { if totpCode == "" { return "", ErrSecondFactorRequired } ok, err := totpStore.VerifyLoginCode(ctx, creds.User.ID, totpCode) if err != nil { return "", err } if !ok { return "", ErrSecondFactorRequired } } return login.Login(ctx, email, password) }