package authtoken import ( "context" "fmt" "gitea.perlbach24.de/scripte/nexarch/internal/auth" "gitea.perlbach24.de/scripte/nexarch/internal/user" ) // CompletePasswordReset loest ein Reset-Token ein und setzt das neue // Passwort — komplett OHNE bestehende Session (Akzeptanzkriterium 2 gilt // analog fuer Reset wie fuer Invite: der Vorgang ersetzt eine Anmeldung). func CompletePasswordReset(ctx context.Context, tokens *Store, users *user.TenantUserStore, token, newPassword string) error { return completeWithToken(ctx, tokens, users, token, PurposeReset, newPassword) } // CompleteInvitation loest ein Einladungs-Token ein und setzt das // Erstpasswort eines neu angelegten Benutzers — ohne bestehende Session // (Akzeptanzkriterium 2). func CompleteInvitation(ctx context.Context, tokens *Store, users *user.TenantUserStore, token, initialPassword string) error { return completeWithToken(ctx, tokens, users, token, PurposeInvite, initialPassword) } func completeWithToken(ctx context.Context, tokens *Store, users *user.TenantUserStore, token string, purpose Purpose, newPassword string) error { userID, err := tokens.Consume(ctx, token, purpose) if err != nil { return err } hash, err := auth.HashPassword(newPassword) if err != nil { return fmt.Errorf("passwort hashen: %w", err) } if err := users.SetPasswordHash(ctx, userID, hash); err != nil { return fmt.Errorf("passwort setzen: %w", err) } return nil }