fix(magic): DNS-Token auf 48 hex kürzen (AdGuard 63-char clientid-Limit)
randomBytes(32).hex = 64 Zeichen → AdGuard lehnt clientid ab
('hostname label is too long: got 64, max 63') → 'DNS-Provisioning
fehlgeschlagen' bei jeder Magic-Registrierung. Live gegen AdGuard
reproduziert: 64→HTTP400, 62→HTTP200.
- register: randomBytes(24).hex = 48 Zeichen (192 bit, ≤63)
- status: Token-Regex {64} → {1,63} (Länge nicht hart koppeln)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
4dfcfc4012
commit
db6db547ff
@ -101,10 +101,12 @@ export default defineEventHandler(async (event) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Generiere DNS-Token (64 char hex)
|
// 3. Generiere DNS-Token (48 char hex)
|
||||||
// WICHTIG: hex statt base64url — AdGuard's clientid muss DNS-Label-konform sein,
|
// WICHTIG: hex (DNS-Label-konform, kein `_`) UND ≤63 Zeichen. AdGuard nutzt die
|
||||||
// verbietet `_` (das base64url als Ersatz für `/` generiert) → 400 "bad hostname label rune".
|
// clientid im DoH-Pfad `/dns-query/{id}` und lehnt >63 Zeichen ab
|
||||||
const dnsToken = randomBytes(32).toString("hex");
|
// ("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
|
// Hard-Lock: server-gehaltenes Removal-Passwort. Stabil über Re-Registrierungen
|
||||||
// (sonst würde ein laufender Offboarding-Cooldown sein PW wechseln).
|
// (sonst würde ein laufender Offboarding-Cooldown sein PW wechseln).
|
||||||
|
|||||||
@ -16,7 +16,9 @@ export default defineEventHandler(async (event) => {
|
|||||||
const query = getQuery(event);
|
const query = getQuery(event);
|
||||||
const token = query.token as string | undefined;
|
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({
|
throw createError({
|
||||||
statusCode: 400,
|
statusCode: 400,
|
||||||
message: "token query parameter required",
|
message: "token query parameter required",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user