Files
overlord/Overlord-Server/src/server/agent-auth.ts
T

56 lines
1.6 KiB
TypeScript
Raw Normal View History

2026-03-05 00:04:26 -06:00
import { logger } from "../logger";
2026-03-21 17:03:42 -05:00
import { timingSafeEqual } from "crypto";
2026-06-08 22:33:34 -05:00
let warnedDisableAuthIgnored = false;
let loggedAuthDisabledByEnv = false;
let loggedAuthDisabledNoToken = false;
2026-03-21 17:03:42 -05:00
function safeCompare(a: string, b: string): boolean {
const bufA = Buffer.from(a);
const bufB = Buffer.from(b);
if (bufA.length !== bufB.length) return false;
return timingSafeEqual(bufA, bufB);
}
2026-03-05 00:04:26 -06:00
export function isAuthorizedAgentRequest(
req: Request,
url: URL,
agentToken?: string,
): boolean {
const disableAuth =
String(process.env.OVERLORD_DISABLE_AGENT_AUTH || "").toLowerCase() ===
"true";
if (disableAuth) {
const nodeEnv = String(process.env.NODE_ENV || "development").toLowerCase();
if (nodeEnv === "production") {
2026-06-08 22:33:34 -05:00
if (!warnedDisableAuthIgnored) {
warnedDisableAuthIgnored = true;
logger.warn("[auth] OVERLORD_DISABLE_AGENT_AUTH is ignored in production mode");
}
} else {
2026-06-08 22:33:34 -05:00
if (!loggedAuthDisabledByEnv) {
loggedAuthDisabledByEnv = true;
logger.info("[auth] Agent auth explicitly disabled by OVERLORD_DISABLE_AGENT_AUTH=true (non-production mode)");
}
return true;
}
2026-03-05 00:04:26 -06:00
}
const token = agentToken?.trim();
if (!token) {
2026-06-08 22:33:34 -05:00
if (!loggedAuthDisabledNoToken) {
loggedAuthDisabledNoToken = true;
logger.info("[auth] Agent auth disabled");
}
2026-03-05 00:04:26 -06:00
return true;
}
const headerToken = req.headers.get("x-agent-token");
const queryToken = url.searchParams.get("token");
2026-03-21 17:03:42 -05:00
const isAuthed =
(headerToken !== null && safeCompare(headerToken, token)) ||
(queryToken !== null && safeCompare(queryToken, token));
2026-03-05 00:04:26 -06:00
return isAuthed;
}