First Release of Claw3D (#11)
Co-authored-by: iamlukethedev <iamlukethedev@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
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 };
|
||||
|
||||
Reference in New Issue
Block a user