openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
42 lines (41 loc) • 1.66 kB
JavaScript
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-1VuiLaaR.mjs";
import "./string-coerce-runtime-BbIJhy7G.mjs";
import "./security-runtime-DBKL3aSe.mjs";
import { t as safeEqualSecret } from "./secret-equal-DRsL8lKD.mjs";
//#region extensions/browser/src/browser/http-auth.ts
function firstHeader(value) {
return Array.isArray(value) ? value[0] ?? "" : value ?? "";
}
function parseBearerToken(authorization) {
if (!normalizeLowercaseStringOrEmpty(authorization).startsWith("bearer ")) return;
return authorization.slice(7).trim() || void 0;
}
function parseBasicPassword(authorization) {
if (!normalizeLowercaseStringOrEmpty(authorization).startsWith("basic ")) return;
const encoded = authorization.slice(6).trim();
if (!encoded) return;
try {
const decoded = Buffer.from(encoded, "base64").toString("utf8");
const sep = decoded.indexOf(":");
if (sep < 0) return;
return decoded.slice(sep + 1).trim() || void 0;
} catch {
return;
}
}
function isAuthorizedBrowserRequest(req, auth) {
const authorization = firstHeader(req.headers.authorization).trim();
if (auth.token) {
const bearer = parseBearerToken(authorization);
if (bearer && safeEqualSecret(bearer, auth.token)) return true;
}
if (auth.password) {
const passwordHeader = firstHeader(req.headers["x-openclaw-password"]).trim();
if (passwordHeader && safeEqualSecret(passwordHeader, auth.password)) return true;
const basicPassword = parseBasicPassword(authorization);
if (basicPassword && safeEqualSecret(basicPassword, auth.password)) return true;
}
return false;
}
//#endregion
export { isAuthorizedBrowserRequest as n, firstHeader as t };