Files
claw3d/server/access-gate.js
T
Luke The Dev 4fa4f13558 First Release of Claw3D (#11)
Co-authored-by: iamlukethedev <iamlukethedev@users.noreply.github.com>
2026-03-19 23:14:04 -05:00

57 lines
1.5 KiB
JavaScript

const parseCookies = (header) => {
const raw = typeof header === "string" ? header : "";
if (!raw.trim()) return {};
const out = {};
for (const part of raw.split(";")) {
const idx = part.indexOf("=");
if (idx === -1) continue;
const key = part.slice(0, idx).trim();
const value = part.slice(idx + 1).trim();
if (!key) continue;
out[key] = value;
}
return out;
};
function createAccessGate(options) {
const token = String(options?.token ?? "").trim();
const cookieName = String(options?.cookieName ?? "studio_access").trim() || "studio_access";
const enabled = Boolean(token);
const isAuthorized = (req) => {
if (!enabled) return true;
const cookieHeader = req.headers?.cookie;
const cookies = parseCookies(cookieHeader);
return cookies[cookieName] === token;
};
const handleHttp = (req, res) => {
if (!enabled) return false;
if (String(req.url || "/").startsWith("/api/")) {
if (!isAuthorized(req)) {
res.statusCode = 401;
res.setHeader("Content-Type", "application/json");
res.end(
JSON.stringify({
error: "Studio access token required. Send the configured Studio access cookie and retry.",
})
);
return true;
}
}
return false;
};
const allowUpgrade = (req) => {
if (!enabled) return true;
return isAuthorized(req);
};
return { enabled, handleHttp, allowUpgrade };
}
module.exports = { createAccessGate };