diff --git a/backend/server/api/magic/register.post.ts b/backend/server/api/magic/register.post.ts index ae968e5..afb2e0a 100644 --- a/backend/server/api/magic/register.post.ts +++ b/backend/server/api/magic/register.post.ts @@ -101,10 +101,12 @@ export default defineEventHandler(async (event) => { } } - // 3. Generiere DNS-Token (64 char hex) - // WICHTIG: hex statt base64url — AdGuard's clientid muss DNS-Label-konform sein, - // verbietet `_` (das base64url als Ersatz für `/` generiert) → 400 "bad hostname label rune". - const dnsToken = randomBytes(32).toString("hex"); + // 3. Generiere DNS-Token (48 char hex) + // WICHTIG: hex (DNS-Label-konform, kein `_`) UND ≤63 Zeichen. AdGuard nutzt die + // clientid im DoH-Pfad `/dns-query/{id}` und lehnt >63 Zeichen ab + // ("hostname label is too long: got 64, max 63"). randomBytes(32).hex = 64 → 1 zu viel. + // 24 Bytes = 48 hex (192 bit Entropie), wie der historisch funktionierende Client. + const dnsToken = randomBytes(24).toString("hex"); // Hard-Lock: server-gehaltenes Removal-Passwort. Stabil über Re-Registrierungen // (sonst würde ein laufender Offboarding-Cooldown sein PW wechseln). diff --git a/backend/server/api/magic/status.get.ts b/backend/server/api/magic/status.get.ts index 695c1ab..e0c5195 100644 --- a/backend/server/api/magic/status.get.ts +++ b/backend/server/api/magic/status.get.ts @@ -16,7 +16,9 @@ export default defineEventHandler(async (event) => { const query = getQuery(event); const token = query.token as string | undefined; - if (!token || !/^[0-9a-f]{64}$/.test(token)) { + // Hex-Token, ≤63 Zeichen (AdGuard-clientid-Limit). Länge nicht hart fixieren, + // damit Token-Längen-Änderungen den Tamper-Poll nicht brechen. + if (!token || !/^[0-9a-f]{1,63}$/.test(token)) { throw createError({ statusCode: 400, message: "token query parameter required",