chahinebrini db6db547ff 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>
2026-06-07 23:33:56 +02:00

37 lines
1.1 KiB
TypeScript

import { findMagicDeviceByToken } from "../../db/devices";
/**
* GET /api/magic/status?token=<dnsToken>
*
* KEIN auth required — Token selbst ist das Secret (64-char hex).
*
* Polling-Endpoint für den Windows-Tamper-Service (rebreak-magic-win):
* Service prüft alle 5 Minuten ob das Binding noch aktiv ist.
* - active=true → DoH-Schutz muss aktiv sein (bei Manipulation re-applien)
* - active=false → Release-Cooldown abgelaufen, Token revoked → Teardown erlaubt
*
* Offline-Verhalten ist Client-Sache: kein Response → fail-closed (Schutz bleibt).
*/
export default defineEventHandler(async (event) => {
const query = getQuery(event);
const token = query.token as string | undefined;
// 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",
});
}
const device = await findMagicDeviceByToken(token);
return {
success: true,
data: {
active: device !== null,
},
};
});