73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
const { getPlatformStatus } = require("./platforms");
|
|
|
|
function createWebAuth(options = {}) {
|
|
const platformStatus = options.getPlatformStatus || getPlatformStatus;
|
|
|
|
function isConfigured() {
|
|
const platforms = platformStatus().filter((platform) => platform.supported && platform.enabled);
|
|
return platforms.length > 0 && platforms.some((platform) => platform.configured);
|
|
}
|
|
|
|
function isLocalhostLoginAvailable(req) {
|
|
if (!req) return false;
|
|
const host = normalizeHostName(req.hostname || req.get?.("host"));
|
|
return host === "localhost" || host === "::1" || host === "::ffff:127.0.0.1" || host === "127.0.0.1" || host.startsWith("127.");
|
|
}
|
|
|
|
function getLocalhostLoginPlatform(req) {
|
|
if (!isLocalhostLoginAvailable(req)) return null;
|
|
return {
|
|
id: "localhost",
|
|
label: "Localhost Login",
|
|
configured: true,
|
|
enabled: true,
|
|
supported: true,
|
|
supportsLogin: true,
|
|
loginPath: "/auth/localhost"
|
|
};
|
|
}
|
|
|
|
function getPrimaryLoginPlatform(req) {
|
|
const localhost = getLocalhostLoginPlatform(req);
|
|
if (localhost) return localhost;
|
|
const platforms = platformStatus().filter((platform) => platform.supported && platform.enabled && platform.supportsLogin);
|
|
if (!platforms.length) return null;
|
|
return platforms.find((platform) => platform.configured) || platforms[0];
|
|
}
|
|
|
|
function getLoginRedirectPath(req) {
|
|
return getPrimaryLoginPlatform(req)?.loginPath || "/setup";
|
|
}
|
|
|
|
function requireConfigured(req, res, next) {
|
|
if (!isConfigured() && !isLocalhostLoginAvailable(req) && !req.path.startsWith("/setup")) {
|
|
return res.redirect("/setup");
|
|
}
|
|
return next();
|
|
}
|
|
|
|
function requireAuth(req, res, next) {
|
|
if (!req.session?.user) return res.redirect(getLoginRedirectPath(req));
|
|
return next();
|
|
}
|
|
|
|
return Object.freeze({
|
|
isConfigured,
|
|
isLocalhostLoginAvailable,
|
|
getLocalhostLoginPlatform,
|
|
getPrimaryLoginPlatform,
|
|
getLoginRedirectPath,
|
|
requireConfigured,
|
|
requireAuth
|
|
});
|
|
}
|
|
|
|
function normalizeHostName(value) {
|
|
const raw = String(value || "").toLowerCase();
|
|
if (raw.startsWith("[")) return raw.slice(1, raw.indexOf("]"));
|
|
if (raw === "::1" || raw === "::ffff:127.0.0.1") return raw;
|
|
return raw.replace(/:\d+$/, "");
|
|
}
|
|
|
|
module.exports = { createWebAuth, normalizeHostName };
|