fix(PROJ-28): Invite-Token Pflicht bei Signup — TOCTOU + Enumeration-Leak schließen
- Signup ohne Invite-Token gibt 400 zurück (war: optional) - Use() statt Peek() vor User-Erstellung: verhindert TOCTOU bei parallelen Requests mit demselben Token und Enumeration via "Token noch gültig?" - invite_used Audit-Eintrag ergänzt - Doppeltes IsConfigured()-Check entfernt - Frontend: ohne ?invite= im URL wird Formular nicht gerendert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+19
-7
@@ -49,7 +49,10 @@ function SignupForm() {
|
||||
const [error, setError] = useState("");
|
||||
|
||||
useEffect(() => {
|
||||
if (!invite) return;
|
||||
if (!invite) {
|
||||
setInviteError("Registrierung nur mit gültigem Einladungslink möglich.");
|
||||
return;
|
||||
}
|
||||
checkInvite(invite).then((name) => {
|
||||
if (name === null) setInviteError("Ungültiger oder abgelaufener Einladungslink.");
|
||||
else setTenantName(name);
|
||||
@@ -95,8 +98,15 @@ function SignupForm() {
|
||||
)}
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
{inviteError && <p className="text-sm text-destructive mb-4">{inviteError}</p>}
|
||||
<form onSubmit={handleSubmit} className="space-y-4">
|
||||
{inviteError && (
|
||||
<div className="space-y-4">
|
||||
<p className="text-sm text-destructive">{inviteError}</p>
|
||||
<Button variant="outline" className="w-full" onClick={() => router.push("/")}>
|
||||
Zur Anmeldung
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
{!inviteError && <form onSubmit={handleSubmit} className="space-y-4">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="username">Benutzername</Label>
|
||||
<Input id="username" value={username} onChange={(e) => setUsername(e.target.value)} required autoComplete="username" />
|
||||
@@ -114,10 +124,12 @@ function SignupForm() {
|
||||
<Button type="submit" className="w-full" disabled={loading}>
|
||||
{loading ? "Registrierung..." : "Account erstellen"}
|
||||
</Button>
|
||||
</form>
|
||||
<p className="mt-4 text-center text-sm text-muted-foreground">
|
||||
<a href="/" className="underline hover:text-foreground">Zur Anmeldung</a>
|
||||
</p>
|
||||
</form>}
|
||||
{!inviteError && (
|
||||
<p className="mt-4 text-center text-sm text-muted-foreground">
|
||||
<a href="/" className="underline hover:text-foreground">Zur Anmeldung</a>
|
||||
</p>
|
||||
)}
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user