50 lines
1.4 KiB
TypeScript
50 lines
1.4 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);
|
|
|
|
if (!device) {
|
|
return {
|
|
success: true,
|
|
data: {
|
|
active: false,
|
|
sleep: false,
|
|
},
|
|
};
|
|
}
|
|
|
|
const inCooldown = device.magicCooldownUntil && device.magicCooldownUntil > new Date();
|
|
|
|
return {
|
|
success: true,
|
|
data: {
|
|
active: !device.magicRevokedAt && !!device.magicEnrolledAt,
|
|
sleep: !!inCooldown,
|
|
},
|
|
};
|
|
});
|