diff --git a/package.json b/package.json
index ff34fff..a87e799 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
"express": "^5.1.0",
"express-handlebars": "^8.0.3",
"express-list-endpoints": "^7.1.1",
+ "express-openid-connect": "^2.19.4",
"express-rate-limit": "^8.0.1",
"glob": "^11.0.3",
"gray-matter": "^4.0.3",
@@ -47,8 +48,10 @@
"hbs": "^4.2.0",
"helmet": "^8.1.0",
"hpp": "^0.2.3",
+ "jose": "^6.2.2",
"js-beautify": "^1.15.4",
"js-yaml": "^4.1.0",
+ "ldapts": "^8.1.7",
"marked": "^16.1.1",
"morgan": "^1.10.1",
"node-disk-info": "^1.3.0",
diff --git a/public/js/credentialManager.js b/public/js/credentialManager.js
index a068221..04ab38a 100644
--- a/public/js/credentialManager.js
+++ b/public/js/credentialManager.js
@@ -7,10 +7,14 @@
this.container = document.getElementById("manager-container");
this.token = this.container?.dataset.token || null;
+ this.isAuthenticated = this.container?.dataset.authenticated === "true";
+ this.username = this.container?.dataset.username || null;
+ this.groups = this.container?.dataset.groups || [];
+
// Capture redirect target from URL or default to root
const urlParams = new URLSearchParams(window.location.search);
this.hasRedirect = urlParams.has("rd");
- this.redirectUri = urlParams.get("rd") || "/";
+ this.redirectUri = urlParams.get("rd") || "/guest-access";
this.action = urlParams.get("action");
}
@@ -34,6 +38,7 @@
const returnLoginBtn = document.getElementById("return-to-login-btn");
const authForm = document.getElementById("auth-form");
const logoutBtn = document.getElementById("logout-btn");
+ const reLoginBtn = document.getElementById("re-login-btn");
if (showTokenBtn) {
showTokenBtn.addEventListener("click", () =>
@@ -82,6 +87,11 @@
if (logoutBtn) {
logoutBtn.addEventListener("click", () => this.handleLogout());
}
+ if (reLoginBtn) {
+ reLoginBtn.addEventListener("click", () => {
+ this._switchState("logout-success-section", "login-section");
+ });
+ }
}
_switchState(fromId, toId) {
@@ -197,30 +207,36 @@
btn.disabled = true;
btn.innerText = "AUTHENTICATING...";
- errorEl?.classList.add("hidden");
try {
+ // STEP 1: Satisfy Authelia's Identity Check via AJAX
+ // This puts the 'authelia_session' cookie in your browser.
const response = await fetch(
"https://auth.jasonpoage.com/api/firstfactor",
{
method: "POST",
- mode: "cors",
headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- username: username,
- password: password,
- keepMeLoggedIn: keepMeLoggedIn,
- }),
- credentials: "include", // Required for session cookie storage
+ body: JSON.stringify({ username, password, keepMeLoggedIn }),
+ credentials: "include", // CRITICAL: This allows the browser to save the cookie
},
);
- if (response.ok) {
- window.location.href = this.redirectUri;
- } else {
+ if (!response.ok) {
const data = await response.json();
throw new Error(data.message || "Invalid credentials.");
}
+
+ // STEP 2: Trigger the OIDC Handshake
+ // Now that Authelia has your session cookie, this redirect will
+ // "blip" through Authelia and back to your app instantly.
+ const loginUrl = "/auth/login";
+ const target = this.hasRedirect
+ ? `?returnTo=${encodeURIComponent(this.redirectUri)}`
+ : "";
+ const loginUri = `${loginUrl}${target}`;
+
+ console.log(loginUri);
+ window.location.href = loginUri;
} catch (err) {
if (errorEl) {
errorEl.innerText = err.message;
@@ -235,27 +251,23 @@
*/
async checkSession() {
try {
- // Authelia's internal identity endpoint
- const response = await fetch(
- "https://auth.jasonpoage.com/api/user/info",
- {
- method: "GET",
- credentials: "include",
- },
- );
+ // Query the Express App, not the Authelia Portal
+ const response = await fetch("/api/auth/status");
if (response.ok) {
- const user = await response.json();
+ const session = await response.json();
- if (this.hasRedirect && this.redirectUri !== "/") {
- // Rule: Logged in + Redirect set -> GO
- window.location.href = this.redirectUri;
- } else {
- this._displayLogoutState(user.data.display_name);
+ if (session.isAuthenticated) {
+ if (this.hasRedirect && this.redirectUri !== "/") {
+ window.location.href = this.redirectUri;
+ } else {
+ // Use the verified session username and groups
+ this._displayLogoutState(this.username);
+ }
}
}
} catch (err) {
- console.log("No active session detected.", err.stack);
+ console.log("No active application session detected.");
}
}
@@ -273,20 +285,31 @@
async handleLogout() {
const btn = document.getElementById("logout-btn");
- btn.disabled = true;
- btn.innerText = "SIGNING OUT...";
+ if (btn) {
+ btn.disabled = true;
+ btn.innerText = "SIGNING OUT...";
+ }
try {
- await fetch("https://auth.jasonpoage.com/api/logout", {
+ // 1. Terminate the Express App session
+ const appLogout = await fetch("/api/auth/logout", {
method: "POST",
- credentials: "include",
+ headers: { "Content-Type": "application/json" },
});
- // Refresh to reset the UI to the clean login state
- window.location.reload();
+
+ if (appLogout.ok) {
+ this.isAuthenticated = false;
+ this.container.dataset.authenticated = "false";
+ this._switchState("logout-section", "logout-success-section");
+ } else {
+ throw new Error("Logout failed");
+ }
} catch (err) {
- btn.disabled = false;
- btn.innerText = "SIGN OUT";
- console.error("Logout failed:", err);
+ console.error("Logout process failed:", err);
+ if (btn) {
+ btn.disabled = false;
+ btn.innerText = "SIGN OUT";
+ }
}
}
}
diff --git a/src/config/loader.js b/src/config/loader.js
index 11ffc69..7b7d107 100644
--- a/src/config/loader.js
+++ b/src/config/loader.js
@@ -48,6 +48,13 @@
120000,
timeout_ms: c?.auth?.timeout_ms || process.env.AUTH_TIMEOUT_MS || 5000,
},
+ session: {
+ cookie: {
+ secure: true, // Required since you are using HTTPS via Nginx
+ sameSite: "Lax", // Allows the cookie to be sent on the top-level redirect back
+ domain: ".jasonpoage.com", // Ensures the cookie is visible across subdomains
+ },
+ },
mail: {
secure: c?.mail?.secure || process.env.MAIL_SECURE || false,
auth: c?.mail?.auth || process.env.MAIL_AUTH || null,
diff --git a/src/controllers/accessController.js b/src/controllers/accessController.js
index 241e03a..d16833f 100644
--- a/src/controllers/accessController.js
+++ b/src/controllers/accessController.js
@@ -1,3 +1,6 @@
+const { session } = require("../config/loader.js");
+const { baseUrl } = require("../utils/baseUrl.js");
+
/**
* Handles the GET request from a recruiter clicking the unique link.
*/
@@ -20,3 +23,48 @@
// Base context handles user/session data
});
};
+
+exports.userInfoApiController = async (req, res) => {
+ const userInfo = await req.oidc.fetchUserInfo();
+
+ res.status(200).json(userInfo);
+};
+exports.logoutSuccessApiController = (req, res) => {
+ res.status(200).json({
+ success: true,
+ message: "Local application session cleared",
+ });
+};
+exports.logoutApiController = (req, res) => {
+ try {
+ res.oidc.logout({
+ returnTo: "/api/auth/logout/success",
+ });
+ } catch (e) {
+ res.send(e.message);
+ }
+};
+exports.logoutController = (req, res) => {
+ try {
+ res.oidc.logout({
+ returnTo: "/auth/logout/success",
+ });
+ } catch (e) {
+ res.send(e.message);
+ }
+};
+
+exports.loginController = (req, res) => {
+ const rd = req.query.rd;
+ const destination = rd
+ ? `/guest-access?rd=${encodeURIComponent(rd)}`
+ : "/guest-access";
+
+ try {
+ res.oidc.login({
+ returnTo: "/guest-access",
+ });
+ } catch (e) {
+ res.status(500).send(e.message);
+ }
+};
diff --git a/src/middleware/authCheck.js b/src/middleware/authCheck.js
index 780ec8a..68e9d63 100644
--- a/src/middleware/authCheck.js
+++ b/src/middleware/authCheck.js
@@ -1,104 +1,18 @@
// middleware/authCheck.js
-const fetch = require("node-fetch");
-const { auth } = require("../config/loader");
-const { verify: verify_url, cache_ttl, timeout_ms } = auth;
-const { LOG_MESSAGES } = require("../constants/authConstants");
-
-// Simple in-memory cache
-const authCache = new Map();
-
-function getCacheKey(cookie, authHeader) {
- return `${cookie}:${authHeader}`;
-}
-
-function isCacheValid(entry) {
- return entry && Date.now() - entry.timestamp < cache_ttl;
-}
-
-setInterval(() => {
- const now = Date.now();
- for (const [key, entry] of authCache.entries()) {
- if (now - entry.timestamp >= cache_ttl) {
- authCache.delete(key);
- }
- }
-}, cache_ttl);
-// const SAFE_IPS = ["192.168.1.200", "192.168.1.50"];
-const SAFE_IPS = [];
module.exports = async (req, res, next) => {
- // Determine the client IP address.
- // req.ip is often provided by Express and correctly handles X-Forwarded-For if Express is configured for it.
- // If not, you might need to manually check req.headers['x-forwarded-for']
- const clientIp = req.ip; // Or req.headers['x-forwarded-for']?.split(',')[0] || req.connection.remoteAddress;
- // --- Bypass Logic ---
- // Check if the client IP is in the list of safe IPs
- if (SAFE_IPS.includes(clientIp)) {
- // -- fixme; harden for production by disabling this
- res.locals.session = {
- isAuthenticated: true,
- user: "local-admin",
- groups: ["admin", "guests"], // Assign groups needed for menu visibility
- };
- if (req.log) {
- req.log.security(`Bypassing authentication for safe IP: ${clientIp}`);
- } else {
- console.security(`Bypassing authentication for safe IP: ${clientIp}`);
- }
- return next(); // Proceed to the next middleware/route handler
- }
- // --- End Bypass Logic ---
-
- const cookie = req.headers["cookie"] || "";
- const authHeader = req.headers["authorization"] || "";
- const cacheKey = getCacheKey(cookie, authHeader);
-
- const cached = authCache.get(cacheKey);
- if (isCacheValid(cached)) {
- res.locals.session = cached.session;
- return next();
- }
-
+ // Initialize default state
res.locals.session = { isAuthenticated: false, user: null, groups: [] };
- try {
- const controller = new AbortController();
- const timeout = setTimeout(() => controller.abort(), auth.timeout_ms);
+ if (req.oidc.isAuthenticated()) {
+ // Pull data directly from the encrypted session cookie
+ // No network calls, no Map lookups, no staleness
+ const user = await req.oidc.fetchUserInfo();
- const resVerify = await fetch(verify_url, {
- headers: { cookie, authorization: authHeader },
- credentials: "include",
- signal: controller.signal,
- });
-
- clearTimeout(timeout);
-
- if (resVerify.status === 200) {
- // Extract Authelia identity headers from the verification response
- const user = resVerify.headers.get("remote-user");
- const groupsHeader = resVerify.headers.get("remote-groups") || "";
- const groups = groupsHeader
- ? groupsHeader.split(",").map((g) => g.trim())
- : [];
-
- res.locals.session = {
- isAuthenticated: true,
- user: user,
- groups: groups,
- };
- }
-
- authCache.set(cacheKey, {
- session: res.locals.session,
- timestamp: Date.now(),
- });
- } catch (e) {
- req.isAuthenticated = false;
- if (req.log) {
- req.log.warn(LOG_MESSAGES.AUTH_SERVER_UNAVAILABLE, e.stack);
- } else {
- console.warn(LOG_MESSAGES.AUTH_SERVER_UNAVAILABLE, e.stack);
- }
+ res.locals.session = {
+ isAuthenticated: true,
+ ...user,
+ };
}
next();
diff --git a/src/middleware/authConfig.js b/src/middleware/authConfig.js
new file mode 100644
index 0000000..b883144
--- /dev/null
+++ b/src/middleware/authConfig.js
@@ -0,0 +1,68 @@
+// src/setupMiddleware.js
+const { TRUST_PROXY } = require("../constants/middlewareConstants");
+
+const { meta, session } = require("../config/loader");
+const { auth, requiresAuth } = require("express-openid-connect");
+const { baseUrl } = require("../utils/baseUrl.js");
+
+const authConfig = {
+ // idpLogout: true,
+ afterCallback: async (req, res, session, decodedToken) => {
+ req.log.warn(
+ "User Authenticated:" +
+ JSON.stringify(decodedToken) +
+ JSON.stringify(session),
+ );
+ // try {
+ const jose = require("jose");
+ const claims = jose.decodeJwt(session.id_token);
+ // const userInfo = await req.oidc.fetchUserInfo();
+ req.log.warn("claims: " + JSON.stringify(claims));
+ return {
+ ...session,
+ sub: claims.sub,
+ // userProfile: {
+ // username: userInfo.preferred_username || userInfo.name,
+ // groups: userInfo.groups || [],
+ // },
+ };
+ // } catch (err) {
+ // req.log.error(
+ // "Failed to fetch UserInfo during callback:" + JSON.stringify(err),
+ // );
+ // return session; // Fallback to basic session if fetch fails
+ // }
+ },
+ // afterCallback: async (req, res, session, decodedToken) => {
+ // // 1. Manually fetch the fresh user info (including groups) once
+ // // const userInfo = await req.oidc.fetchUserInfo();
+
+ // // 2. Attach it to the session object
+ // // This gets encrypted into the 'appSession' cookie
+ // return {
+ // ...session,
+ // // userinfo: userInfo,
+ // // groups: userInfo.groups || [],
+ // };
+ // },
+ session,
+ secret: "insecure_secret",
+ clientID: "express-blog",
+ clientSecret: "insecure_secret",
+ baseURL: baseUrl,
+ issuerBaseURL: "https://auth.jasonpoage.com",
+ authRequired: false,
+ authorizationParams: {
+ response_type: "code",
+ response_mode: "query",
+ scope: "openid profile email groups",
+ // audience: "express-blog",
+ },
+ routes: {
+ callback: "/auth/callback",
+ login: "/auth/_login",
+ logout: "/auth/logout",
+ },
+};
+
+module.exports = auth(authConfig);
diff --git a/src/middleware/debug.js b/src/middleware/debug.js
new file mode 100644
index 0000000..987b286
--- /dev/null
+++ b/src/middleware/debug.js
@@ -0,0 +1,67 @@
+// src/setupMiddleware.js
+
+const router = require("express").Router();
+const { TRUST_PROXY } = require("../constants/middlewareConstants");
+const { meta, session } = require("../config/loader");
+const { requiresAuth } = require("express-openid-connect");
+const { baseUrl } = require("../utils/baseUrl.js");
+
+const cookieParser = require("cookie-parser");
+router.use(cookieParser());
+
+const debug = async (req, res) => {
+ try {
+ const tokenSet = req.oidc.tokenSet;
+ const username = req.oidc?.user?.name ?? undefined;
+
+ let userinfo;
+ try {
+ userinfo = await req.oidc.fetchUserInfo();
+ } catch (e) {
+ userinfo = e.message;
+ }
+
+ const diagnostics = {
+ session,
+ "req.cookies": req.cookies,
+ "req.signedCookies": req.signedCookies,
+ "req.oidc.fetchUserInfo()": userinfo,
+ "req.locals.session": res.locals.session || "unset",
+ "req.oidc.user": req.oidc.user || "unset",
+
+ metadata: {
+ "trust-proxy": TRUST_PROXY,
+ baseUrl,
+ user: username,
+ // 1. Connection Security (Critical for Access Tokens)
+ protocol: req.protocol,
+ isSecure: req.secure, // If this is false, the SDK drops the access_token
+ // 2. Auth State
+ isAuthenticated: req.oidc.isAuthenticated(),
+
+ // 3. Token Inventory (What the library actually holds)
+ tokensInStore: tokenSet ? Object.keys(tokenSet) : "NONE",
+
+ // 4. Scopes (What was actually granted by Authelia)
+ grantedScopes: tokenSet?.scope,
+ "req.openidTokens": req.openidTokens ?? "not set",
+ },
+ };
+
+ // Log to console for persistent record
+ console.warn("--- DIAGNOSTIC DATA ---");
+ res.send("
" + JSON.stringify(diagnostics, null, 2) + "
");
+
+ // res.json(diagnostics);
+ } catch (e) {
+ res.json(e.stack);
+ }
+};
+
+router.get("/debug", debug);
+
+const { claimIncludes } = require("express-openid-connect");
+
+router.get("/debug/claim", claimIncludes("groups", "guests"), debug);
+
+module.exports = router;
diff --git a/src/middleware/errorHandler.js b/src/middleware/errorHandler.js
index bee91cc..8c18a9e 100644
--- a/src/middleware/errorHandler.js
+++ b/src/middleware/errorHandler.js
@@ -11,6 +11,7 @@
ERROR_REDIRECT_PATH,
} = require("../constants/errorConstants");
const { winstonLogger } = require("../utils/logging");
+const { meta } = require("../config/loader");
module.exports = async (err, req, res, next) => {
const statusCode = err.statusCode ?? DEFAULT_STATUS_CODE;
@@ -75,15 +76,20 @@
metadata: err.metadata,
});
- const errorPageContext = await req.getBaseContext(
- req?.isAuthenticated,
- context,
- );
- res.status(errorContext.statusCode);
try {
+ const errorPageContext = await req.getBaseContext(
+ req?.isAuthenticated,
+ context,
+ );
+ res.status(errorContext.statusCode);
res.renderGenericMessage(errorPageContext);
} catch (e) {
winstonLogger.error(e, { context });
- res.send("Critical error.");
+ if (meta.node_env == "production") {
+ res.send("Critical error.");
+ } else {
+ const response = "" + JSON.stringify(context, null, 2) + "
";
+ res.send(response);
+ }
}
};
diff --git a/src/middleware/index.js b/src/middleware/index.js
index 4de2b80..8922f4c 100644
--- a/src/middleware/index.js
+++ b/src/middleware/index.js
@@ -23,8 +23,12 @@
const analytics = require("../controllers/analyticsControllers");
const httpLogger = require("../utils/structuredLogger");
const cacheUtils = require("./cacheUtils");
+const authConfig = require("./authConfig");
+const debugMiddleware = require("./debug");
const trace = require("./trace");
-const { meta } = require("../config/loader");
+const { meta, session } = require("../config/loader");
+const { auth, requiresAuth } = require("express-openid-connect");
+const { baseUrl } = require("../utils/baseUrl.js");
function setupApp(config) {
const app = express();
@@ -34,12 +38,14 @@
app.use(adaptiveBodyParser);
app.use(hbs);
-
// Setup logging
app.use(httpLogger, loggingMiddleware);
+ app.use(authConfig);
app.use(authCheck);
+ app.use(debugMiddleware);
+
// Setup handlebars
app.use(BaseContext);
// app.use(attachBaseContextGetter, buildBaseContext);
diff --git a/src/middleware/safeIpCheck.js b/src/middleware/safeIpCheck.js
new file mode 100644
index 0000000..8bc813e
--- /dev/null
+++ b/src/middleware/safeIpCheck.js
@@ -0,0 +1,32 @@
+// middleware/safeipCheck.js
+const use_ip_bypass = false;
+
+// const SAFE_IPS = ["192.168.1.200", "192.168.1.50"];
+const SAFE_IPS = [];
+
+module.exports = bypassSafeIp(req, res, next) => {
+ // Determine the client IP address.
+ // req.ip is often provided by Express and correctly handles X-Forwarded-For if Express is configured for it.
+ // If not, you might need to manually check req.headers['x-forwarded-for']
+ const clientIp = req.ip; // Or req.headers['x-forwarded-for']?.split(',')[0] || req.connection.remoteAddress;
+ // --- Bypass Logic ---
+ // Check if the client IP is in the list of safe IPs
+ if (use_ip_bypass && SAFE_IPS.includes(clientIp)) {
+ // -- fixme; harden for production by disabling this block
+ res.locals.session = {
+ isAuthenticated: true,
+ user: "local-admin",
+ groups: ["admin", "guests", "people"], // Assign groups needed for menu visibility
+ };
+ if (req.log) {
+ req.log.security(`Bypassing authentication for safe IP: ${clientIp}`);
+ } else {
+ console.security(`Bypassing authentication for safe IP: ${clientIp}`);
+ }
+ res.locals.isSafeIp = true;
+ } else {
+ res.locals.isSafeIp = false;
+ }
+ return next(); // Proceed to the next middleware/route handler
+}
+
diff --git a/src/middleware/setPolicy.js b/src/middleware/setPolicy.js
new file mode 100644
index 0000000..952e04e
--- /dev/null
+++ b/src/middleware/setPolicy.js
@@ -0,0 +1,54 @@
+const { evaluateRules } = require("../utils/evaluateRules.js");
+const { handleRedirect } = require("./redirect.js");
+
+/**
+ * Route-level policy enforcement middleware.
+ * @param {Object} config - { policy: "allow"|"deny"|"deny-children", rules: Array }
+ */
+function setPolicy(config) {
+ return (req, res, next) => {
+ const session = res.locals.session || {
+ isAuthenticated: false,
+ groups: [],
+ user: null,
+ };
+ // return res.json(session);
+ const policy = config.policy || "allow";
+ const rules = config.rules || [];
+ const redirectTarget = config.redirectOnFail || "/";
+
+ // 1. "allow" and "deny-children" permit access to the route itself
+ if (policy === "allow" || policy === "deny-children") {
+ return next();
+ }
+
+ // 2. "deny" requires authentication AND passing the rule set
+ if (policy === "deny") {
+ if (session.isAuthenticated && evaluateRules(rules, session)) {
+ return next();
+ }
+
+ // Log the rejection for audit trails
+ if (req.log) {
+ req.log.warn(
+ { user: session.user, policy, rules },
+ "Access Denied by Policy",
+ );
+ }
+
+ // CASE: User is not logged in - Redirect to OIDC Login
+ if (!session.isAuthenticated) {
+ req.log.warn("REDIRECT " + JSON.stringify(session));
+ return handleRedirect(req, res, "/guest-access", 302);
+ }
+
+ // CASE: User is logged in but lacks permissions - Redirect to target (or 403 page)
+ return handleRedirect(req, res, redirectTarget, 302);
+ }
+
+ // Default safety: Fail closed
+ res.status(403).send("Security Policy Violation");
+ };
+}
+
+module.exports = setPolicy;
diff --git a/src/routes/guestAccessRouter.js b/src/routes/guestAccessRouter.js
index e189886..7a84cae 100644
--- a/src/routes/guestAccessRouter.js
+++ b/src/routes/guestAccessRouter.js
@@ -2,21 +2,53 @@
const router = express.Router();
const logEvent = require("../middleware/analytics.js");
-const securedMiddleware = require("./secured");
+const { auth, requiresAuth } = require("express-openid-connect");
+const setPolicy = require("../middleware/setPolicy.js");
const {
handleAccessConsumption,
renderPortal,
+ loginController,
+ logoutApiController,
+ logoutSuccessApiController,
+ logoutController,
+ userInfoApiController,
} = require("../controllers/accessController");
+// -- Generate acccess token
router.get(
"/access/manager",
logEvent("admin"),
- securedMiddleware,
+ setPolicy({
+ policy: "deny",
+ rules: [["user:jason"], ["group:professors"]],
+ }),
renderPortal,
);
+// -- Logout
+router.post("/api/auth/logout", logoutApiController);
+// router.get("/auth/login", loginController);
+router.use("/auth/login", loginController);
+router.get("/api/auth/logout", logoutApiController);
+router.get("/api/auth/logout/success", logoutSuccessApiController);
+router.get("/guest-access/logout", logoutController);
+
+// -- User info
+router.get("/api/auth/userinfo", userInfoApiController);
+router.get("/api/auth/status", (req, res) => {
+ // res.locals.session is populated by your authCheck middleware
+ res.json(res.locals.session);
+});
+
+// -- Login
+router.get(
+ "/guest-access",
+ logEvent("admin"),
+ // requiresAuth(),
+ handleAccessConsumption,
+);
+// -- Login using access token
router.get("/guest-access/:token", logEvent("admin"), handleAccessConsumption);
-router.get("/guest-access", logEvent("admin"), handleAccessConsumption);
module.exports = router;
diff --git a/src/utils/baseContext.js b/src/utils/baseContext.js
index a4c80ea..212cb8c 100644
--- a/src/utils/baseContext.js
+++ b/src/utils/baseContext.js
@@ -27,8 +27,18 @@
}
async init() {
- console.log(this.res.locals);
- const session = this.res.locals.session;
+ this.req.log.info(
+ "baseContext res.locals" + JSON.stringify(this.res.locals),
+ );
+ const session = this.res.locals.session || {
+ isAuthenticated: false,
+ user: null,
+ groups: [],
+ };
+ this.req.log.warn(
+ "baseContext res.locals.session" +
+ JSON.stringify(this.res.locals.session),
+ );
session.token = generateToken();
this.baseContext = await this.getBaseContext(session, {});
this.next();
@@ -75,6 +85,10 @@
const siteOwner = meta.site_owner;
const context = {
+ session: {
+ ...session,
+ groups: session,
+ },
title: getSiteTitle(siteOwner),
siteOwner,
originCountry: meta.country,
diff --git a/src/utils/evaluateRules.js b/src/utils/evaluateRules.js
new file mode 100644
index 0000000..5dd8068
--- /dev/null
+++ b/src/utils/evaluateRules.js
@@ -0,0 +1,29 @@
+// src/utils/evaluateRules.js
+/**
+ * Evaluates access rules against the current identity context.
+ * * Rules:
+ * - Outer array: Logical OR (Success if any requirement block passes)
+ * - Inner array: Logical AND (Success if all rules in the block pass)
+ * * @param {Array>} rules - Nested rule set
+ * @param {Object} auth - { isAuthenticated, user, groups }
+ */
+function evaluateRules(rules, session) {
+ if (!rules || !rules.length) return true;
+
+ const { user, groups = [] } = session;
+
+ return rules.some((requirement) =>
+ requirement.every((rule) => {
+ const [type, value] = rule.split(":");
+ switch (type) {
+ case "group":
+ return groups.includes(value);
+ case "user":
+ return user === value;
+ default:
+ return false;
+ }
+ }),
+ );
+}
+module.exports = { evaluateRules };
diff --git a/src/utils/getGroups.js b/src/utils/getGroups.js
new file mode 100644
index 0000000..6c5ff8c
--- /dev/null
+++ b/src/utils/getGroups.js
@@ -0,0 +1,35 @@
+const { winstonLogger } = require("./logging");
+const { Client } = require("ldapts");
+
+module.exports.getGroups = async function getGroups(username) {
+ return [];
+ try {
+ const url = "ldap://10.8.0.1";
+ const bindDN = "cn=admin,dc=jasonpoage,dc=com";
+ const password = "9b4h655SrcIOLmK4u5Zldw";
+ const userDN = `uid=${username},ou=People,dc=jasonpoage,dc=com`;
+
+ const client = new Client({ url });
+
+ try {
+ await client.bind(bindDN, password);
+
+ const { searchEntries } = await client.search("dc=jasonpoage,dc=com", {
+ scope: "sub",
+ // Find groups where this user's full DN is listed in the 'member' attribute
+ filter: `(&(objectClass=groupOfNames)(member=${userDN}))`,
+ attributes: ["cn"],
+ });
+
+ // Extract the 'cn' from each group found
+ return searchEntries.map((entry) => entry.cn);
+ } catch (err) {
+ winstonLogger.warn("LDAP Search Error:" + err.message);
+ throw err;
+ } finally {
+ await client.unbind();
+ }
+ } catch (e) {
+ return e.stack;
+ }
+};
diff --git a/src/utils/processMenuLinks.js b/src/utils/processMenuLinks.js
index fecc1df..63482b3 100644
--- a/src/utils/processMenuLinks.js
+++ b/src/utils/processMenuLinks.js
@@ -1,65 +1,122 @@
// src/utils/processMenuLinks.js
+const { winstonLogger } = require("./logging/index.js");
+const { evaluateRules } = require("../utils/evaluateRules.js");
/**
- * Evaluates access rules against the current identity context.
- * * Rules:
- * - Outer array: Logical OR (Success if any requirement block passes)
- * - Inner array: Logical AND (Success if all rules in the block pass)
- * * @param {Array>} rules - Nested rule set
- * @param {Object} auth - { isAuthenticated, user, groups }
+ * Applies attribute promotion from a child to a parent.
*/
-function evaluateRules(rules, session) {
- if (!rules || !rules.length) return true;
+function promoteAttributes(parent, child) {
+ const promote = child.promote;
+ let keys = [];
- const { user, groups = [] } = session;
+ if (promote === "true" || promote === true) {
+ keys = Object.keys(child).filter((k) => k !== "submenu" && k !== "promote");
+ } else if (typeof promote === "string") {
+ keys = [promote];
+ } else if (Array.isArray(promote)) {
+ keys = promote;
+ }
- return rules.some((requirement) =>
- requirement.every((rule) => {
- const [type, value] = rule.split(":");
- switch (type) {
- case "group":
- return groups.includes(value);
- case "user":
- return user === value;
- default:
- return false;
- }
- }),
- );
+ keys.forEach((key) => {
+ parent[key] = child[key];
+ });
}
-function processMenuLinks(links, session, currentPath) {
+
+/**
+ * Processes menu links with policy inheritance and parent-override logic.
+ * @param {Array} links - The menu items to filter.
+ * @param {Object} session - The { isAuthenticated, user, groups } object.
+ * @param {string} currentPath - The active URL path.
+ * @param {string} inheritedPolicy - The policy passed down from the parent (default "allow").
+ */
+function processMenuLinks(
+ links,
+ session,
+ currentPath,
+ inheritedPolicy = "allow",
+) {
+ if (!links) return [];
+
return links
- .filter((link) => {
- const policy = link.policy || "allow";
-
- if (policy == "allow" || policy === "deny-children") {
- return true;
- }
-
- // 1. Check basic security requirement
- if (policy == "deny" && !session.isAuthenticated) return false;
-
- // 2. Check specific rules if they exist
- return evaluateRules(link.rules, session);
- })
.map((link) => {
const item = { ...link };
- if (item.appendCurrentPath && typeof item.href === "string") {
- if (currentPath !== "/" && !item.href.endsWith(currentPath)) {
- item.href = item.href + currentPath;
- }
- } else if (item.html) {
- item.href = `/docs/hexa/${item.html}`; // fixme
- } else if (item.frame) {
- item.href = `/docs/hexa/${item.frame}`; // fixme
- } else if (item.mermaid) {
- item.href = `/docs/hexa/${item.mermaid}`; // fixme
- }
+ const activePolicy = item.policy || inheritedPolicy;
+ // winstonLogger.info(
+ // JSON.stringify({ Label: item.label, Policy: activePolicy, session }),
+ // );
+
if (item.submenu) {
- item.submenu = processMenuLinks(item.submenu, session, currentPath);
- if (!item.submenu.length) delete item.submenu;
+ const nextPolicy =
+ activePolicy === "deny-children" ? "deny" : activePolicy;
+ const processedSub = processMenuLinks(
+ item.submenu,
+ session,
+ currentPath,
+ nextPolicy,
+ );
+
+ const primaryChild = item.submenu[0];
+ const isPrimaryVisible = processedSub.some(
+ (s) => s.label === primaryChild.label,
+ );
+
+ // Promotion Logic: Trigger if only the primary child remains or the menu is empty
+ if (
+ (processedSub.length === 0 ||
+ (processedSub.length === 1 && isPrimaryVisible)) &&
+ primaryChild?.promote
+ ) {
+ const childPolicy = primaryChild.policy || "allow"; // Requirement: Default to allow
+
+ const isChildAccessible =
+ childPolicy === "allow" ||
+ (childPolicy === "deny" &&
+ session.isAuthenticated &&
+ evaluateRules(primaryChild.rules, session));
+
+ if (isChildAccessible) {
+ promoteAttributes(item, primaryChild);
+
+ // Policy inheritance: Apply child policy only if the child has its own children
+ if (primaryChild.submenu && primaryChild.submenu.length > 0) {
+ item.policy = childPolicy;
+ item.submenu = processMenuLinks(
+ primaryChild.submenu,
+ session,
+ currentPath,
+ item.policy,
+ );
+ } else {
+ item.policy = childPolicy;
+ delete item.submenu;
+ }
+ }
+ } else {
+ // Standard Dropdown: Filter out any item with the 'promote' key from the list
+ item.submenu = processedSub.filter((s) => !s.promote);
+ if (item.submenu.length === 0) delete item.submenu;
+ }
}
+
+ // Path/Resource Normalization
+ if (item.appendCurrentPath && typeof item.href === "string") {
+ if (currentPath !== "/" && !item.href.endsWith(currentPath))
+ item.href += currentPath;
+ } else if (item.html || item.frame || item.mermaid) {
+ item.href = `/docs/hexa/${item.html || item.frame || item.mermaid}`;
+ }
+
return item;
+ })
+ .filter((item) => {
+ // Final Security Gate (Parent Wins)
+ const policy = item.policy || inheritedPolicy;
+ if (policy === "allow" || policy === "deny-children") return true;
+ if (policy === "deny") {
+ console.log(session);
+ return session.isAuthenticated && evaluateRules(item.rules, session);
+ }
+ return false;
});
}
module.exports = processMenuLinks;
diff --git a/src/views/pages/credentials.handlebars b/src/views/pages/credentials.handlebars
index e148219..3cfeee1 100644
--- a/src/views/pages/credentials.handlebars
+++ b/src/views/pages/credentials.handlebars
@@ -6,7 +6,13 @@
{{/section}}
-
+
{{!-- State 1: Standard Login (Default) --}}
@@ -83,4 +89,14 @@
+ {{!-- State 5: Logout Success --}}
+
+
Logout Successful
+
Your local session has been terminated and security headers cleared.
+
+
+
diff --git a/yarn.lock b/yarn.lock
index 17c8df5..5166865 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -148,6 +148,22 @@
languageName: node
linkType: hard
+"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0":
+ version: 9.3.0
+ resolution: "@hapi/hoek@npm:9.3.0"
+ checksum: 10c0/a096063805051fb8bba4c947e293c664b05a32b47e13bc654c0dd43813a1cec993bdd8f29ceb838020299e1d0f89f68dc0d62a603c13c9cc8541963f0beca055
+ languageName: node
+ linkType: hard
+
+"@hapi/topo@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@hapi/topo@npm:5.1.0"
+ dependencies:
+ "@hapi/hoek": "npm:^9.0.0"
+ checksum: 10c0/b16b06d9357947149e032bdf10151eb71aea8057c79c4046bf32393cb89d0d0f7ca501c40c0f7534a5ceca078de0700d2257ac855c15e59fe4e00bba2f25c86f
+ languageName: node
+ linkType: hard
+
"@img/sharp-darwin-arm64@npm:0.34.3":
version: 0.34.3
resolution: "@img/sharp-darwin-arm64@npm:0.34.3"
@@ -468,6 +484,13 @@
languageName: node
linkType: hard
+"@panva/asn1.js@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "@panva/asn1.js@npm:1.0.0"
+ checksum: 10c0/5d6e7ec460b65b017043e2702e25f323936baad2aa248dbd9bf54c9508e351d236bffac96fa033c6e36cb0482a9dd73c3605948a36a59bd6bec49353ba8d7b62
+ languageName: node
+ linkType: hard
+
"@pkgjs/parseargs@npm:^0.11.0":
version: 0.11.0
resolution: "@pkgjs/parseargs@npm:0.11.0"
@@ -550,6 +573,29 @@
languageName: node
linkType: hard
+"@sideway/address@npm:^4.1.5":
+ version: 4.1.5
+ resolution: "@sideway/address@npm:4.1.5"
+ dependencies:
+ "@hapi/hoek": "npm:^9.0.0"
+ checksum: 10c0/638eb6f7e7dba209053dd6c8da74d7cc995e2b791b97644d0303a7dd3119263bcb7225a4f6804d4db2bc4f96e5a9d262975a014f58eae4d1753c27cbc96ef959
+ languageName: node
+ linkType: hard
+
+"@sideway/formula@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "@sideway/formula@npm:3.0.1"
+ checksum: 10c0/3fe81fa9662efc076bf41612b060eb9b02e846ea4bea5bd114f1662b7f1541e9dedcf98aff0d24400bcb92f113964a50e0290b86e284edbdf6346fa9b7e2bf2c
+ languageName: node
+ linkType: hard
+
+"@sideway/pinpoint@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "@sideway/pinpoint@npm:2.0.0"
+ checksum: 10c0/d2ca75dacaf69b8fc0bb8916a204e01def3105ee44d8be16c355e5f58189eb94039e15ce831f3d544f229889ccfa35562a0ce2516179f3a7ee1bbe0b71e55b36
+ languageName: node
+ linkType: hard
+
"@simple-dom/interface@npm:^1.4.0":
version: 1.4.0
resolution: "@simple-dom/interface@npm:1.4.0"
@@ -557,6 +603,13 @@
languageName: node
linkType: hard
+"@sindresorhus/is@npm:^4.0.0":
+ version: 4.6.0
+ resolution: "@sindresorhus/is@npm:4.6.0"
+ checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e
+ languageName: node
+ linkType: hard
+
"@sinonjs/commons@npm:^3.0.1":
version: 3.0.1
resolution: "@sinonjs/commons@npm:3.0.1"
@@ -585,6 +638,15 @@
languageName: node
linkType: hard
+"@szmarczak/http-timer@npm:^4.0.5":
+ version: 4.0.6
+ resolution: "@szmarczak/http-timer@npm:4.0.6"
+ dependencies:
+ defer-to-connect: "npm:^2.0.0"
+ checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f
+ languageName: node
+ linkType: hard
+
"@tootallnate/once@npm:1":
version: 1.1.2
resolution: "@tootallnate/once@npm:1.1.2"
@@ -599,6 +661,25 @@
languageName: node
linkType: hard
+"@types/cacheable-request@npm:^6.0.1":
+ version: 6.0.3
+ resolution: "@types/cacheable-request@npm:6.0.3"
+ dependencies:
+ "@types/http-cache-semantics": "npm:*"
+ "@types/keyv": "npm:^3.1.4"
+ "@types/node": "npm:*"
+ "@types/responselike": "npm:^1.0.0"
+ checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03
+ languageName: node
+ linkType: hard
+
+"@types/http-cache-semantics@npm:*":
+ version: 4.2.0
+ resolution: "@types/http-cache-semantics@npm:4.2.0"
+ checksum: 10c0/82dd33cbe7d4843f1e884a251c6a12d385b62274353b9db167462e7fbffdbb3a83606f9952203017c5b8cabbd7b9eef0cf240a3a9dedd20f69875c9701939415
+ languageName: node
+ linkType: hard
+
"@types/istanbul-lib-coverage@npm:^2.0.1":
version: 2.0.6
resolution: "@types/istanbul-lib-coverage@npm:2.0.6"
@@ -606,6 +687,15 @@
languageName: node
linkType: hard
+"@types/keyv@npm:^3.1.4":
+ version: 3.1.4
+ resolution: "@types/keyv@npm:3.1.4"
+ dependencies:
+ "@types/node": "npm:*"
+ checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c
+ languageName: node
+ linkType: hard
+
"@types/node@npm:*":
version: 24.1.0
resolution: "@types/node@npm:24.1.0"
@@ -615,6 +705,15 @@
languageName: node
linkType: hard
+"@types/responselike@npm:^1.0.0":
+ version: 1.0.3
+ resolution: "@types/responselike@npm:1.0.3"
+ dependencies:
+ "@types/node": "npm:*"
+ checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129
+ languageName: node
+ linkType: hard
+
"@types/triple-beam@npm:^1.3.2":
version: 1.3.5
resolution: "@types/triple-beam@npm:1.3.5"
@@ -687,7 +786,7 @@
languageName: node
linkType: hard
-"aggregate-error@npm:^3.0.0":
+"aggregate-error@npm:^3.0.0, aggregate-error@npm:^3.1.0":
version: 3.1.0
resolution: "aggregate-error@npm:3.1.0"
dependencies:
@@ -812,6 +911,47 @@
languageName: node
linkType: hard
+"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "array-buffer-byte-length@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ is-array-buffer: "npm:^3.0.5"
+ checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d
+ languageName: node
+ linkType: hard
+
+"array.prototype.reduce@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "array.prototype.reduce@npm:1.0.8"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.9"
+ es-array-method-boxes-properly: "npm:^1.0.0"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ is-string: "npm:^1.1.1"
+ checksum: 10c0/0a4635f468e9161f51c4a87f80057b8b3c27b0ccc3e40ad7ea77cd1e147f1119f46977b0452f3fa325f543126200f2caf8c1390bd5303edf90d9c1dcd7d5a8a0
+ languageName: node
+ linkType: hard
+
+"arraybuffer.prototype.slice@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "arraybuffer.prototype.slice@npm:1.0.4"
+ dependencies:
+ array-buffer-byte-length: "npm:^1.0.1"
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.5"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.6"
+ is-array-buffer: "npm:^3.0.4"
+ checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06
+ languageName: node
+ linkType: hard
+
"arrify@npm:^1.0.1":
version: 1.0.1
resolution: "arrify@npm:1.0.1"
@@ -844,6 +984,20 @@
languageName: node
linkType: hard
+"async-function@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "async-function@npm:1.0.0"
+ checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73
+ languageName: node
+ linkType: hard
+
+"async-generator-function@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "async-generator-function@npm:1.0.0"
+ checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186
+ languageName: node
+ linkType: hard
+
"async@npm:^2.6.3, async@npm:~2.6.1":
version: 2.6.4
resolution: "async@npm:2.6.4"
@@ -867,6 +1021,15 @@
languageName: node
linkType: hard
+"available-typed-arrays@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "available-typed-arrays@npm:1.0.7"
+ dependencies:
+ possible-typed-array-names: "npm:^1.0.0"
+ checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2
+ languageName: node
+ linkType: hard
+
"aws-sign2@npm:~0.7.0":
version: 0.7.0
resolution: "aws-sign2@npm:0.7.0"
@@ -965,6 +1128,13 @@
languageName: node
linkType: hard
+"base64url@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "base64url@npm:3.0.1"
+ checksum: 10c0/5ca9d6064e9440a2a45749558dddd2549ca439a305793d4f14a900b7256b5f4438ef1b7a494e1addc66ced5d20f5c010716d353ed267e4b769e6c78074991241
+ languageName: node
+ linkType: hard
+
"basic-auth@npm:~2.0.1":
version: 2.0.1
resolution: "basic-auth@npm:2.0.1"
@@ -1259,7 +1429,29 @@
languageName: node
linkType: hard
-"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
+"cacheable-lookup@npm:^5.0.3":
+ version: 5.0.4
+ resolution: "cacheable-lookup@npm:5.0.4"
+ checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c
+ languageName: node
+ linkType: hard
+
+"cacheable-request@npm:^7.0.2":
+ version: 7.0.4
+ resolution: "cacheable-request@npm:7.0.4"
+ dependencies:
+ clone-response: "npm:^1.0.2"
+ get-stream: "npm:^5.1.0"
+ http-cache-semantics: "npm:^4.0.0"
+ keyv: "npm:^4.0.0"
+ lowercase-keys: "npm:^2.0.0"
+ normalize-url: "npm:^6.0.1"
+ responselike: "npm:^2.0.0"
+ checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41
+ languageName: node
+ linkType: hard
+
+"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
version: 1.0.2
resolution: "call-bind-apply-helpers@npm:1.0.2"
dependencies:
@@ -1269,7 +1461,19 @@
languageName: node
linkType: hard
-"call-bound@npm:^1.0.2":
+"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "call-bind@npm:1.0.8"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.0"
+ es-define-property: "npm:^1.0.0"
+ get-intrinsic: "npm:^1.2.4"
+ set-function-length: "npm:^1.2.2"
+ checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4
+ languageName: node
+ linkType: hard
+
+"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4":
version: 1.0.4
resolution: "call-bound@npm:1.0.4"
dependencies:
@@ -1449,6 +1653,22 @@
languageName: node
linkType: hard
+"clone-response@npm:^1.0.2":
+ version: 1.0.3
+ resolution: "clone-response@npm:1.0.3"
+ dependencies:
+ mimic-response: "npm:^1.0.0"
+ checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087
+ languageName: node
+ linkType: hard
+
+"clone@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "clone@npm:2.1.2"
+ checksum: 10c0/ed0601cd0b1606bc7d82ee7175b97e68d1dd9b91fd1250a3617b38d34a095f8ee0431d40a1a611122dcccb4f93295b4fdb94942aa763392b5fe44effa50c2d5e
+ languageName: node
+ linkType: hard
+
"color-convert@npm:^1.9.3":
version: 1.9.3
resolution: "color-convert@npm:1.9.3"
@@ -1662,7 +1882,7 @@
languageName: node
linkType: hard
-"cookie@npm:0.7.2, cookie@npm:^0.7.1":
+"cookie@npm:0.7.2, cookie@npm:^0.7.1, cookie@npm:^0.7.2":
version: 0.7.2
resolution: "cookie@npm:0.7.2"
checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2
@@ -1771,6 +1991,39 @@
languageName: node
linkType: hard
+"data-view-buffer@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "data-view-buffer@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ is-data-view: "npm:^1.0.2"
+ checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c
+ languageName: node
+ linkType: hard
+
+"data-view-byte-length@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "data-view-byte-length@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ is-data-view: "npm:^1.0.2"
+ checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55
+ languageName: node
+ linkType: hard
+
+"data-view-byte-offset@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "data-view-byte-offset@npm:1.0.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ is-data-view: "npm:^1.0.1"
+ checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4
+ languageName: node
+ linkType: hard
+
"dayjs@npm:~1.11.13":
version: 1.11.13
resolution: "dayjs@npm:1.11.13"
@@ -1850,6 +2103,35 @@
languageName: node
linkType: hard
+"defer-to-connect@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "defer-to-connect@npm:2.0.1"
+ checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782
+ languageName: node
+ linkType: hard
+
+"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
+ version: 1.1.4
+ resolution: "define-data-property@npm:1.1.4"
+ dependencies:
+ es-define-property: "npm:^1.0.0"
+ es-errors: "npm:^1.3.0"
+ gopd: "npm:^1.0.1"
+ checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37
+ languageName: node
+ linkType: hard
+
+"define-properties@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "define-properties@npm:1.2.1"
+ dependencies:
+ define-data-property: "npm:^1.0.1"
+ has-property-descriptors: "npm:^1.0.0"
+ object-keys: "npm:^1.1.1"
+ checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3
+ languageName: node
+ linkType: hard
+
"degenerator@npm:^5.0.0":
version: 5.0.1
resolution: "degenerator@npm:5.0.1"
@@ -1924,7 +2206,7 @@
languageName: node
linkType: hard
-"dunder-proto@npm:^1.0.1":
+"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1":
version: 1.0.1
resolution: "dunder-proto@npm:1.0.1"
dependencies:
@@ -2051,7 +2333,76 @@
languageName: node
linkType: hard
-"es-define-property@npm:^1.0.1":
+"es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0":
+ version: 1.24.1
+ resolution: "es-abstract@npm:1.24.1"
+ dependencies:
+ array-buffer-byte-length: "npm:^1.0.2"
+ arraybuffer.prototype.slice: "npm:^1.0.4"
+ available-typed-arrays: "npm:^1.0.7"
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ data-view-buffer: "npm:^1.0.2"
+ data-view-byte-length: "npm:^1.0.2"
+ data-view-byte-offset: "npm:^1.0.1"
+ es-define-property: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ es-set-tostringtag: "npm:^2.1.0"
+ es-to-primitive: "npm:^1.3.0"
+ function.prototype.name: "npm:^1.1.8"
+ get-intrinsic: "npm:^1.3.0"
+ get-proto: "npm:^1.0.1"
+ get-symbol-description: "npm:^1.1.0"
+ globalthis: "npm:^1.0.4"
+ gopd: "npm:^1.2.0"
+ has-property-descriptors: "npm:^1.0.2"
+ has-proto: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ hasown: "npm:^2.0.2"
+ internal-slot: "npm:^1.1.0"
+ is-array-buffer: "npm:^3.0.5"
+ is-callable: "npm:^1.2.7"
+ is-data-view: "npm:^1.0.2"
+ is-negative-zero: "npm:^2.0.3"
+ is-regex: "npm:^1.2.1"
+ is-set: "npm:^2.0.3"
+ is-shared-array-buffer: "npm:^1.0.4"
+ is-string: "npm:^1.1.1"
+ is-typed-array: "npm:^1.1.15"
+ is-weakref: "npm:^1.1.1"
+ math-intrinsics: "npm:^1.1.0"
+ object-inspect: "npm:^1.13.4"
+ object-keys: "npm:^1.1.1"
+ object.assign: "npm:^4.1.7"
+ own-keys: "npm:^1.0.1"
+ regexp.prototype.flags: "npm:^1.5.4"
+ safe-array-concat: "npm:^1.1.3"
+ safe-push-apply: "npm:^1.0.0"
+ safe-regex-test: "npm:^1.1.0"
+ set-proto: "npm:^1.0.0"
+ stop-iteration-iterator: "npm:^1.1.0"
+ string.prototype.trim: "npm:^1.2.10"
+ string.prototype.trimend: "npm:^1.0.9"
+ string.prototype.trimstart: "npm:^1.0.8"
+ typed-array-buffer: "npm:^1.0.3"
+ typed-array-byte-length: "npm:^1.0.3"
+ typed-array-byte-offset: "npm:^1.0.4"
+ typed-array-length: "npm:^1.0.7"
+ unbox-primitive: "npm:^1.1.0"
+ which-typed-array: "npm:^1.1.19"
+ checksum: 10c0/fca062ef8b5daacf743732167d319a212d45cb655b0bb540821d38d715416ae15b04b84fc86da9e2c89135aa7b337337b6c867f84dcde698d75d55688d5d765c
+ languageName: node
+ linkType: hard
+
+"es-array-method-boxes-properly@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "es-array-method-boxes-properly@npm:1.0.0"
+ checksum: 10c0/4b7617d3fbd460d6f051f684ceca6cf7e88e6724671d9480388d3ecdd72119ddaa46ca31f2c69c5426a82e4b3091c1e81867c71dcdc453565cd90005ff2c382d
+ languageName: node
+ linkType: hard
+
+"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1":
version: 1.0.1
resolution: "es-define-property@npm:1.0.1"
checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c
@@ -2074,6 +2425,29 @@
languageName: node
linkType: hard
+"es-set-tostringtag@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "es-set-tostringtag@npm:2.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.6"
+ has-tostringtag: "npm:^1.0.2"
+ hasown: "npm:^2.0.2"
+ checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af
+ languageName: node
+ linkType: hard
+
+"es-to-primitive@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "es-to-primitive@npm:1.3.0"
+ dependencies:
+ is-callable: "npm:^1.2.7"
+ is-date-object: "npm:^1.0.5"
+ is-symbol: "npm:^1.0.4"
+ checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b
+ languageName: node
+ linkType: hard
+
"es6-promise@npm:^3.0.2":
version: 3.3.1
resolution: "es6-promise@npm:3.3.1"
@@ -2204,6 +2578,7 @@
express: "npm:^5.1.0"
express-handlebars: "npm:^8.0.3"
express-list-endpoints: "npm:^7.1.1"
+ express-openid-connect: "npm:^2.19.4"
express-rate-limit: "npm:^8.0.1"
fast-check: "npm:^4.2.0"
glob: "npm:^11.0.3"
@@ -2212,8 +2587,10 @@
hbs: "npm:^4.2.0"
helmet: "npm:^8.1.0"
hpp: "npm:^0.2.3"
+ jose: "npm:^6.2.2"
js-beautify: "npm:^1.15.4"
js-yaml: "npm:^4.1.0"
+ ldapts: "npm:^8.1.7"
marked: "npm:^16.1.1"
mocha: "npm:^11.7.1"
mock-fs: "npm:^5.5.0"
@@ -2261,6 +2638,28 @@
languageName: node
linkType: hard
+"express-openid-connect@npm:^2.19.4":
+ version: 2.19.4
+ resolution: "express-openid-connect@npm:2.19.4"
+ dependencies:
+ base64url: "npm:^3.0.1"
+ clone: "npm:^2.1.2"
+ cookie: "npm:^0.7.2"
+ debug: "npm:^4.4.1"
+ futoin-hkdf: "npm:^1.5.3"
+ http-errors: "npm:^1.8.1"
+ joi: "npm:^17.13.3"
+ jose: "npm:^2.0.7"
+ on-headers: "npm:^1.1.0"
+ openid-client: "npm:^4.9.1"
+ url-join: "npm:^4.0.1"
+ util-promisify: "npm:3.0.0"
+ peerDependencies:
+ express: ">= 4.17.0"
+ checksum: 10c0/63faf22a7142ee7b526eebb89fa8abf7ca22da06fccb29eac8cc1b143aba8570b4d91463d07683fb9e6c8ac8073f95eee8c1f9a2e05dc319e38924becf580d2d
+ languageName: node
+ linkType: hard
+
"express-rate-limit@npm:^8.0.1":
version: 8.0.1
resolution: "express-rate-limit@npm:8.0.1"
@@ -2530,6 +2929,15 @@
languageName: node
linkType: hard
+"for-each@npm:^0.3.3, for-each@npm:^0.3.5":
+ version: 0.3.5
+ resolution: "for-each@npm:0.3.5"
+ dependencies:
+ is-callable: "npm:^1.2.7"
+ checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee
+ languageName: node
+ linkType: hard
+
"foreachasync@npm:^3.0.0":
version: 3.0.0
resolution: "foreachasync@npm:3.0.0"
@@ -2653,6 +3061,34 @@
languageName: node
linkType: hard
+"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8":
+ version: 1.1.8
+ resolution: "function.prototype.name@npm:1.1.8"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ define-properties: "npm:^1.2.1"
+ functions-have-names: "npm:^1.2.3"
+ hasown: "npm:^2.0.2"
+ is-callable: "npm:^1.2.7"
+ checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253
+ languageName: node
+ linkType: hard
+
+"functions-have-names@npm:^1.2.3":
+ version: 1.2.3
+ resolution: "functions-have-names@npm:1.2.3"
+ checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca
+ languageName: node
+ linkType: hard
+
+"futoin-hkdf@npm:^1.5.3":
+ version: 1.5.3
+ resolution: "futoin-hkdf@npm:1.5.3"
+ checksum: 10c0/fe87b50d2ac125ca2074e92588ca1df5016e9657267363cb77d8287080639dc31f90e7740f4737aa054c3e687b2ab3456f9b5c55950b94cd2c2010bc441aa5ae
+ languageName: node
+ linkType: hard
+
"gauge@npm:^4.0.3":
version: 4.0.4
resolution: "gauge@npm:4.0.4"
@@ -2669,6 +3105,13 @@
languageName: node
linkType: hard
+"generator-function@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "generator-function@npm:2.0.1"
+ checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8
+ languageName: node
+ linkType: hard
+
"get-caller-file@npm:^2.0.5":
version: 2.0.5
resolution: "get-caller-file@npm:2.0.5"
@@ -2676,6 +3119,27 @@
languageName: node
linkType: hard
+"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7":
+ version: 1.3.1
+ resolution: "get-intrinsic@npm:1.3.1"
+ dependencies:
+ async-function: "npm:^1.0.0"
+ async-generator-function: "npm:^1.0.0"
+ call-bind-apply-helpers: "npm:^1.0.2"
+ es-define-property: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ function-bind: "npm:^1.1.2"
+ generator-function: "npm:^2.0.0"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ hasown: "npm:^2.0.2"
+ math-intrinsics: "npm:^1.1.0"
+ checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d
+ languageName: node
+ linkType: hard
+
"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0":
version: 1.3.0
resolution: "get-intrinsic@npm:1.3.0"
@@ -2723,6 +3187,17 @@
languageName: node
linkType: hard
+"get-symbol-description@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "get-symbol-description@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.6"
+ checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b
+ languageName: node
+ linkType: hard
+
"get-uri@npm:^6.0.1":
version: 6.0.5
resolution: "get-uri@npm:6.0.5"
@@ -2840,13 +3315,42 @@
languageName: node
linkType: hard
-"gopd@npm:^1.2.0":
+"globalthis@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "globalthis@npm:1.0.4"
+ dependencies:
+ define-properties: "npm:^1.2.1"
+ gopd: "npm:^1.0.1"
+ checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846
+ languageName: node
+ linkType: hard
+
+"gopd@npm:^1.0.1, gopd@npm:^1.2.0":
version: 1.2.0
resolution: "gopd@npm:1.2.0"
checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead
languageName: node
linkType: hard
+"got@npm:^11.8.0":
+ version: 11.8.6
+ resolution: "got@npm:11.8.6"
+ dependencies:
+ "@sindresorhus/is": "npm:^4.0.0"
+ "@szmarczak/http-timer": "npm:^4.0.5"
+ "@types/cacheable-request": "npm:^6.0.1"
+ "@types/responselike": "npm:^1.0.0"
+ cacheable-lookup: "npm:^5.0.3"
+ cacheable-request: "npm:^7.0.2"
+ decompress-response: "npm:^6.0.0"
+ http2-wrapper: "npm:^1.0.0-beta.5.2"
+ lowercase-keys: "npm:^2.0.0"
+ p-cancelable: "npm:^2.0.0"
+ responselike: "npm:^2.0.0"
+ checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1
+ languageName: node
+ linkType: hard
+
"graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6":
version: 4.2.11
resolution: "graceful-fs@npm:4.2.11"
@@ -2919,6 +3423,13 @@
languageName: node
linkType: hard
+"has-bigints@npm:^1.0.2":
+ version: 1.1.0
+ resolution: "has-bigints@npm:1.1.0"
+ checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788
+ languageName: node
+ linkType: hard
+
"has-flag@npm:^3.0.0":
version: 3.0.0
resolution: "has-flag@npm:3.0.0"
@@ -2933,13 +3444,40 @@
languageName: node
linkType: hard
-"has-symbols@npm:^1.1.0":
+"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "has-property-descriptors@npm:1.0.2"
+ dependencies:
+ es-define-property: "npm:^1.0.0"
+ checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236
+ languageName: node
+ linkType: hard
+
+"has-proto@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "has-proto@npm:1.2.0"
+ dependencies:
+ dunder-proto: "npm:^1.0.0"
+ checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95
+ languageName: node
+ linkType: hard
+
+"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0":
version: 1.1.0
resolution: "has-symbols@npm:1.1.0"
checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e
languageName: node
linkType: hard
+"has-tostringtag@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "has-tostringtag@npm:1.0.2"
+ dependencies:
+ has-symbols: "npm:^1.0.3"
+ checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c
+ languageName: node
+ linkType: hard
+
"has-unicode@npm:^2.0.1":
version: 2.0.1
resolution: "has-unicode@npm:2.0.1"
@@ -2999,7 +3537,7 @@
languageName: node
linkType: hard
-"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1":
+"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1":
version: 4.2.0
resolution: "http-cache-semantics@npm:4.2.0"
checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37
@@ -3019,6 +3557,19 @@
languageName: node
linkType: hard
+"http-errors@npm:^1.8.1":
+ version: 1.8.1
+ resolution: "http-errors@npm:1.8.1"
+ dependencies:
+ depd: "npm:~1.1.2"
+ inherits: "npm:2.0.4"
+ setprototypeof: "npm:1.2.0"
+ statuses: "npm:>= 1.5.0 < 2"
+ toidentifier: "npm:1.0.1"
+ checksum: 10c0/f01aeecd76260a6fe7f08e192fcbe9b2f39ed20fc717b852669a69930167053b01790998275c6297d44f435cf0e30edd50c05223d1bec9bc484e6cf35b2d6f43
+ languageName: node
+ linkType: hard
+
"http-errors@npm:~1.7.3":
version: 1.7.3
resolution: "http-errors@npm:1.7.3"
@@ -3064,6 +3615,16 @@
languageName: node
linkType: hard
+"http2-wrapper@npm:^1.0.0-beta.5.2":
+ version: 1.0.3
+ resolution: "http2-wrapper@npm:1.0.3"
+ dependencies:
+ quick-lru: "npm:^5.1.1"
+ resolve-alpn: "npm:^1.0.0"
+ checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1
+ languageName: node
+ linkType: hard
+
"https-proxy-agent@npm:^5.0.0":
version: 5.0.1
resolution: "https-proxy-agent@npm:5.0.1"
@@ -3205,6 +3766,17 @@
languageName: node
linkType: hard
+"internal-slot@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "internal-slot@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ hasown: "npm:^2.0.2"
+ side-channel: "npm:^1.1.0"
+ checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7
+ languageName: node
+ linkType: hard
+
"ip-address@npm:10.0.1":
version: 10.0.1
resolution: "ip-address@npm:10.0.1"
@@ -3236,6 +3808,17 @@
languageName: node
linkType: hard
+"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5":
+ version: 3.0.5
+ resolution: "is-array-buffer@npm:3.0.5"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ get-intrinsic: "npm:^1.2.6"
+ checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d
+ languageName: node
+ linkType: hard
+
"is-arrayish@npm:^0.2.1":
version: 0.2.1
resolution: "is-arrayish@npm:0.2.1"
@@ -3250,6 +3833,28 @@
languageName: node
linkType: hard
+"is-async-function@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "is-async-function@npm:2.1.1"
+ dependencies:
+ async-function: "npm:^1.0.0"
+ call-bound: "npm:^1.0.3"
+ get-proto: "npm:^1.0.1"
+ has-tostringtag: "npm:^1.0.2"
+ safe-regex-test: "npm:^1.1.0"
+ checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298
+ languageName: node
+ linkType: hard
+
+"is-bigint@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "is-bigint@npm:1.1.0"
+ dependencies:
+ has-bigints: "npm:^1.0.2"
+ checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4
+ languageName: node
+ linkType: hard
+
"is-binary-path@npm:~2.1.0":
version: 2.1.0
resolution: "is-binary-path@npm:2.1.0"
@@ -3259,6 +3864,23 @@
languageName: node
linkType: hard
+"is-boolean-object@npm:^1.2.1":
+ version: 1.2.2
+ resolution: "is-boolean-object@npm:1.2.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e
+ languageName: node
+ linkType: hard
+
+"is-callable@npm:^1.2.7":
+ version: 1.2.7
+ resolution: "is-callable@npm:1.2.7"
+ checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f
+ languageName: node
+ linkType: hard
+
"is-core-module@npm:^2.16.0":
version: 2.16.1
resolution: "is-core-module@npm:2.16.1"
@@ -3268,6 +3890,27 @@
languageName: node
linkType: hard
+"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "is-data-view@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.2.6"
+ is-typed-array: "npm:^1.1.13"
+ checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153
+ languageName: node
+ linkType: hard
+
+"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "is-date-object@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f
+ languageName: node
+ linkType: hard
+
"is-extendable@npm:^0.1.0":
version: 0.1.1
resolution: "is-extendable@npm:0.1.1"
@@ -3282,6 +3925,15 @@
languageName: node
linkType: hard
+"is-finalizationregistry@npm:^1.1.0":
+ version: 1.1.1
+ resolution: "is-finalizationregistry@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97
+ languageName: node
+ linkType: hard
+
"is-fullwidth-code-point@npm:^3.0.0":
version: 3.0.0
resolution: "is-fullwidth-code-point@npm:3.0.0"
@@ -3296,6 +3948,19 @@
languageName: node
linkType: hard
+"is-generator-function@npm:^1.0.10":
+ version: 1.1.2
+ resolution: "is-generator-function@npm:1.1.2"
+ dependencies:
+ call-bound: "npm:^1.0.4"
+ generator-function: "npm:^2.0.0"
+ get-proto: "npm:^1.0.1"
+ has-tostringtag: "npm:^1.0.2"
+ safe-regex-test: "npm:^1.1.0"
+ checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372
+ languageName: node
+ linkType: hard
+
"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1":
version: 4.0.3
resolution: "is-glob@npm:4.0.3"
@@ -3312,6 +3977,30 @@
languageName: node
linkType: hard
+"is-map@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "is-map@npm:2.0.3"
+ checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc
+ languageName: node
+ linkType: hard
+
+"is-negative-zero@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "is-negative-zero@npm:2.0.3"
+ checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e
+ languageName: node
+ linkType: hard
+
+"is-number-object@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-number-object@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53
+ languageName: node
+ linkType: hard
+
"is-number@npm:^7.0.0":
version: 7.0.0
resolution: "is-number@npm:7.0.0"
@@ -3340,6 +4029,34 @@
languageName: node
linkType: hard
+"is-regex@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "is-regex@npm:1.2.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ gopd: "npm:^1.2.0"
+ has-tostringtag: "npm:^1.0.2"
+ hasown: "npm:^2.0.2"
+ checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04
+ languageName: node
+ linkType: hard
+
+"is-set@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "is-set@npm:2.0.3"
+ checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7
+ languageName: node
+ linkType: hard
+
+"is-shared-array-buffer@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "is-shared-array-buffer@npm:1.0.4"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db
+ languageName: node
+ linkType: hard
+
"is-stream@npm:^2.0.0":
version: 2.0.1
resolution: "is-stream@npm:2.0.1"
@@ -3347,6 +4064,36 @@
languageName: node
linkType: hard
+"is-string@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-string@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d
+ languageName: node
+ linkType: hard
+
+"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-symbol@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ has-symbols: "npm:^1.1.0"
+ safe-regex-test: "npm:^1.1.0"
+ checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e
+ languageName: node
+ linkType: hard
+
+"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15":
+ version: 1.1.15
+ resolution: "is-typed-array@npm:1.1.15"
+ dependencies:
+ which-typed-array: "npm:^1.1.16"
+ checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4
+ languageName: node
+ linkType: hard
+
"is-typedarray@npm:~1.0.0":
version: 1.0.0
resolution: "is-typedarray@npm:1.0.0"
@@ -3361,6 +4108,39 @@
languageName: node
linkType: hard
+"is-weakmap@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "is-weakmap@npm:2.0.2"
+ checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299
+ languageName: node
+ linkType: hard
+
+"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-weakref@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b
+ languageName: node
+ linkType: hard
+
+"is-weakset@npm:^2.0.3":
+ version: 2.0.4
+ resolution: "is-weakset@npm:2.0.4"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ get-intrinsic: "npm:^1.2.6"
+ checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647
+ languageName: node
+ linkType: hard
+
+"isarray@npm:^2.0.5":
+ version: 2.0.5
+ resolution: "isarray@npm:2.0.5"
+ checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd
+ languageName: node
+ linkType: hard
+
"isexe@npm:^2.0.0":
version: 2.0.0
resolution: "isexe@npm:2.0.0"
@@ -3456,6 +4236,35 @@
languageName: node
linkType: hard
+"joi@npm:^17.13.3":
+ version: 17.13.3
+ resolution: "joi@npm:17.13.3"
+ dependencies:
+ "@hapi/hoek": "npm:^9.3.0"
+ "@hapi/topo": "npm:^5.1.0"
+ "@sideway/address": "npm:^4.1.5"
+ "@sideway/formula": "npm:^3.0.1"
+ "@sideway/pinpoint": "npm:^2.0.0"
+ checksum: 10c0/9262aef1da3f1bec5b03caf50c46368899fe03b8ff26cbe3d53af4584dd1049079fc97230bbf1500b6149db7cc765b9ee45f0deb24bb6fc3fa06229d7148c17f
+ languageName: node
+ linkType: hard
+
+"jose@npm:^2.0.5, jose@npm:^2.0.7":
+ version: 2.0.7
+ resolution: "jose@npm:2.0.7"
+ dependencies:
+ "@panva/asn1.js": "npm:^1.0.0"
+ checksum: 10c0/228406f4635debd05922fa565a85c42c086426c1af03c4db2ce247d84f240d3f5985efa9540e6c90c89bab56476b1d1a0be2199740d1f497a37b075bbe2307e8
+ languageName: node
+ linkType: hard
+
+"jose@npm:^6.2.2":
+ version: 6.2.2
+ resolution: "jose@npm:6.2.2"
+ checksum: 10c0/201f4776d77eccd339de99fb3ba940fdf03db15e64be7a99b511e53c232e3f3818e3f21b95223d62f99315a2ab76b4251cedd94e067de56893e45273a8d2151b
+ languageName: node
+ linkType: hard
+
"jpeg-js@npm:^0.1.1":
version: 0.1.2
resolution: "jpeg-js@npm:0.1.2"
@@ -3550,6 +4359,13 @@
languageName: node
linkType: hard
+"json-buffer@npm:3.0.1":
+ version: 3.0.1
+ resolution: "json-buffer@npm:3.0.1"
+ checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7
+ languageName: node
+ linkType: hard
+
"json-parse-even-better-errors@npm:^2.3.0":
version: 2.3.1
resolution: "json-parse-even-better-errors@npm:2.3.1"
@@ -3590,6 +4406,15 @@
languageName: node
linkType: hard
+"keyv@npm:^4.0.0":
+ version: 4.5.4
+ resolution: "keyv@npm:4.5.4"
+ dependencies:
+ json-buffer: "npm:3.0.1"
+ checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e
+ languageName: node
+ linkType: hard
+
"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2":
version: 6.0.3
resolution: "kind-of@npm:6.0.3"
@@ -3604,6 +4429,15 @@
languageName: node
linkType: hard
+"ldapts@npm:^8.1.7":
+ version: 8.1.7
+ resolution: "ldapts@npm:8.1.7"
+ dependencies:
+ strict-event-emitter-types: "npm:2.0.0"
+ checksum: 10c0/df9926617deb9e82799bd294b45def5652e288f31f1a04c6bdfacf2b5ad85b8133db07809396f24dc3cb93393aa9be52aa6cbab86ab739d96e0c7d6dc0c1485b
+ languageName: node
+ linkType: hard
+
"lines-and-columns@npm:^1.1.6":
version: 1.2.4
resolution: "lines-and-columns@npm:1.2.4"
@@ -3667,6 +4501,13 @@
languageName: node
linkType: hard
+"lowercase-keys@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "lowercase-keys@npm:2.0.0"
+ checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082
+ languageName: node
+ linkType: hard
+
"lru-cache@npm:^10.2.0":
version: 10.4.3
resolution: "lru-cache@npm:10.4.3"
@@ -3713,6 +4554,13 @@
languageName: node
linkType: hard
+"make-error@npm:^1.3.6":
+ version: 1.3.6
+ resolution: "make-error@npm:1.3.6"
+ checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f
+ languageName: node
+ linkType: hard
+
"make-fetch-happen@npm:^15.0.0":
version: 15.0.4
resolution: "make-fetch-happen@npm:15.0.4"
@@ -3857,6 +4705,13 @@
languageName: node
linkType: hard
+"mimic-response@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "mimic-response@npm:1.0.1"
+ checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa
+ languageName: node
+ linkType: hard
+
"mimic-response@npm:^3.1.0":
version: 3.1.0
resolution: "mimic-response@npm:3.1.0"
@@ -4401,6 +5256,13 @@
languageName: node
linkType: hard
+"normalize-url@npm:^6.0.1":
+ version: 6.1.0
+ resolution: "normalize-url@npm:6.1.0"
+ checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23
+ languageName: node
+ linkType: hard
+
"npmlog@npm:^6.0.0":
version: 6.0.2
resolution: "npmlog@npm:6.0.2"
@@ -4427,6 +5289,13 @@
languageName: node
linkType: hard
+"object-hash@npm:^2.0.1":
+ version: 2.2.0
+ resolution: "object-hash@npm:2.2.0"
+ checksum: 10c0/1527de843926c5442ed61f8bdddfc7dc181b6497f725b0e89fcf50a55d9c803088763ed447cac85a5aa65345f1e99c2469ba679a54349ef3c4c0aeaa396a3eb9
+ languageName: node
+ linkType: hard
+
"object-hash@npm:^3.0.0":
version: 3.0.0
resolution: "object-hash@npm:3.0.0"
@@ -4434,13 +5303,56 @@
languageName: node
linkType: hard
-"object-inspect@npm:^1.13.3":
+"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4":
version: 1.13.4
resolution: "object-inspect@npm:1.13.4"
checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692
languageName: node
linkType: hard
+"object-keys@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "object-keys@npm:1.1.1"
+ checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d
+ languageName: node
+ linkType: hard
+
+"object.assign@npm:^4.1.7":
+ version: 4.1.7
+ resolution: "object.assign@npm:4.1.7"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ has-symbols: "npm:^1.1.0"
+ object-keys: "npm:^1.1.1"
+ checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc
+ languageName: node
+ linkType: hard
+
+"object.getownpropertydescriptors@npm:^2.0.3":
+ version: 2.1.9
+ resolution: "object.getownpropertydescriptors@npm:2.1.9"
+ dependencies:
+ array.prototype.reduce: "npm:^1.0.8"
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.24.0"
+ es-object-atoms: "npm:^1.1.1"
+ gopd: "npm:^1.2.0"
+ safe-array-concat: "npm:^1.1.3"
+ checksum: 10c0/8ccc9a4f28afb39cf7ab4d8acaf2ee817e47d59863d54a29b0e140648d841d2af3fc1564501a9b400862095258e3b28ee2c0506e1f5c04705ff781a8770f5eca
+ languageName: node
+ linkType: hard
+
+"oidc-token-hash@npm:^5.0.1":
+ version: 5.2.0
+ resolution: "oidc-token-hash@npm:5.2.0"
+ checksum: 10c0/4fa9a6f0a27c0b304aa2e4a37e433e871fb2e71418b62ada7305022ed7c70a4b325a81a4ee9661bf0c456cda0acdbeb564e68659bd6fe6a192b20bdec11688ea
+ languageName: node
+ linkType: hard
+
"on-finished@npm:^2.4.1":
version: 2.4.1
resolution: "on-finished@npm:2.4.1"
@@ -4459,7 +5371,7 @@
languageName: node
linkType: hard
-"on-headers@npm:~1.1.0":
+"on-headers@npm:^1.1.0, on-headers@npm:~1.1.0":
version: 1.1.0
resolution: "on-headers@npm:1.1.0"
checksum: 10c0/2c3b6b0d68ec9adbd561dc2d61c9b14da8ac03d8a2f0fd9e97bdf0600c887d5d97f664ff3be6876cf40cda6e3c587d73a4745e10b426ac50c7664fc5a0dfc0a1
@@ -4484,6 +5396,39 @@
languageName: node
linkType: hard
+"openid-client@npm:^4.9.1":
+ version: 4.9.1
+ resolution: "openid-client@npm:4.9.1"
+ dependencies:
+ aggregate-error: "npm:^3.1.0"
+ got: "npm:^11.8.0"
+ jose: "npm:^2.0.5"
+ lru-cache: "npm:^6.0.0"
+ make-error: "npm:^1.3.6"
+ object-hash: "npm:^2.0.1"
+ oidc-token-hash: "npm:^5.0.1"
+ checksum: 10c0/88af2e7c17e62eaddd3f27e96567ef9c08dbd3266a6ff9c4e058128191d2d4ec07c49eaa523d9159953835fc90c59470270f6050872afb70c5c9576c387833e7
+ languageName: node
+ linkType: hard
+
+"own-keys@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "own-keys@npm:1.0.1"
+ dependencies:
+ get-intrinsic: "npm:^1.2.6"
+ object-keys: "npm:^1.1.1"
+ safe-push-apply: "npm:^1.0.0"
+ checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a
+ languageName: node
+ linkType: hard
+
+"p-cancelable@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "p-cancelable@npm:2.1.1"
+ checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01
+ languageName: node
+ linkType: hard
+
"p-limit@npm:^3.0.2":
version: 3.1.0
resolution: "p-limit@npm:3.1.0"
@@ -4903,6 +5848,13 @@
languageName: node
linkType: hard
+"possible-typed-array-names@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "possible-typed-array-names@npm:1.1.0"
+ checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196
+ languageName: node
+ linkType: hard
+
"postcss-import@npm:^16.1.1":
version: 16.1.1
resolution: "postcss-import@npm:16.1.1"
@@ -5156,6 +6108,13 @@
languageName: node
linkType: hard
+"quick-lru@npm:^5.1.1":
+ version: 5.1.1
+ resolution: "quick-lru@npm:5.1.1"
+ checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da
+ languageName: node
+ linkType: hard
+
"random-bytes@npm:~1.0.0":
version: 1.0.0
resolution: "random-bytes@npm:1.0.0"
@@ -5257,6 +6216,36 @@
languageName: node
linkType: hard
+"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9":
+ version: 1.0.10
+ resolution: "reflect.getprototypeof@npm:1.0.10"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.9"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.0.0"
+ get-intrinsic: "npm:^1.2.7"
+ get-proto: "npm:^1.0.1"
+ which-builtin-type: "npm:^1.2.1"
+ checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac
+ languageName: node
+ linkType: hard
+
+"regexp.prototype.flags@npm:^1.5.4":
+ version: 1.5.4
+ resolution: "regexp.prototype.flags@npm:1.5.4"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-errors: "npm:^1.3.0"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ set-function-name: "npm:^2.0.2"
+ checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77
+ languageName: node
+ linkType: hard
+
"request@npm:^2.65.0":
version: 2.88.2
resolution: "request@npm:2.88.2"
@@ -5317,6 +6306,13 @@
languageName: node
linkType: hard
+"resolve-alpn@npm:^1.0.0":
+ version: 1.2.1
+ resolution: "resolve-alpn@npm:1.2.1"
+ checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4
+ languageName: node
+ linkType: hard
+
"resolve-from@npm:^4.0.0":
version: 4.0.0
resolution: "resolve-from@npm:4.0.0"
@@ -5350,6 +6346,15 @@
languageName: node
linkType: hard
+"responselike@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "responselike@npm:2.0.1"
+ dependencies:
+ lowercase-keys: "npm:^2.0.0"
+ checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5
+ languageName: node
+ linkType: hard
+
"retry@npm:^0.12.0":
version: 0.12.0
resolution: "retry@npm:0.12.0"
@@ -5412,6 +6417,19 @@
languageName: node
linkType: hard
+"safe-array-concat@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "safe-array-concat@npm:1.1.3"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.2.6"
+ has-symbols: "npm:^1.1.0"
+ isarray: "npm:^2.0.5"
+ checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d
+ languageName: node
+ linkType: hard
+
"safe-buffer@npm:5.1.2":
version: 5.1.2
resolution: "safe-buffer@npm:5.1.2"
@@ -5426,6 +6444,27 @@
languageName: node
linkType: hard
+"safe-push-apply@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "safe-push-apply@npm:1.0.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ isarray: "npm:^2.0.5"
+ checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750
+ languageName: node
+ linkType: hard
+
+"safe-regex-test@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "safe-regex-test@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ is-regex: "npm:^1.2.1"
+ checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665
+ languageName: node
+ linkType: hard
+
"safe-stable-stringify@npm:^2.3.1":
version: 2.5.0
resolution: "safe-stable-stringify@npm:2.5.0"
@@ -5537,6 +6576,43 @@
languageName: node
linkType: hard
+"set-function-length@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "set-function-length@npm:1.2.2"
+ dependencies:
+ define-data-property: "npm:^1.1.4"
+ es-errors: "npm:^1.3.0"
+ function-bind: "npm:^1.1.2"
+ get-intrinsic: "npm:^1.2.4"
+ gopd: "npm:^1.0.1"
+ has-property-descriptors: "npm:^1.0.2"
+ checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c
+ languageName: node
+ linkType: hard
+
+"set-function-name@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "set-function-name@npm:2.0.2"
+ dependencies:
+ define-data-property: "npm:^1.1.4"
+ es-errors: "npm:^1.3.0"
+ functions-have-names: "npm:^1.2.3"
+ has-property-descriptors: "npm:^1.0.2"
+ checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316
+ languageName: node
+ linkType: hard
+
+"set-proto@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "set-proto@npm:1.0.0"
+ dependencies:
+ dunder-proto: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a
+ languageName: node
+ linkType: hard
+
"setprototypeof@npm:1.1.1":
version: 1.1.1
resolution: "setprototypeof@npm:1.1.1"
@@ -5958,6 +7034,16 @@
languageName: node
linkType: hard
+"stop-iteration-iterator@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "stop-iteration-iterator@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ internal-slot: "npm:^1.1.0"
+ checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09
+ languageName: node
+ linkType: hard
+
"stream-to-buffer@npm:^0.1.0":
version: 0.1.0
resolution: "stream-to-buffer@npm:0.1.0"
@@ -5988,6 +7074,13 @@
languageName: node
linkType: hard
+"strict-event-emitter-types@npm:2.0.0":
+ version: 2.0.0
+ resolution: "strict-event-emitter-types@npm:2.0.0"
+ checksum: 10c0/7a2985b81908c2a7d1de10afe3be1de3423b8ce6188dc32aeb3dbaf66d4ac3f11029d6931c67d972a3bb976bbd04d27ee090eeed1cbd089c5ba3e899a04ed1b7
+ languageName: node
+ linkType: hard
+
"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
version: 4.2.3
resolution: "string-width@npm:4.2.3"
@@ -6010,6 +7103,44 @@
languageName: node
linkType: hard
+"string.prototype.trim@npm:^1.2.10":
+ version: 1.2.10
+ resolution: "string.prototype.trim@npm:1.2.10"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.2"
+ define-data-property: "npm:^1.1.4"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.5"
+ es-object-atoms: "npm:^1.0.0"
+ has-property-descriptors: "npm:^1.0.2"
+ checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8
+ languageName: node
+ linkType: hard
+
+"string.prototype.trimend@npm:^1.0.9":
+ version: 1.0.9
+ resolution: "string.prototype.trimend@npm:1.0.9"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.2"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6
+ languageName: node
+ linkType: hard
+
+"string.prototype.trimstart@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "string.prototype.trimstart@npm:1.0.8"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366
+ languageName: node
+ linkType: hard
+
"string_decoder@npm:^1.1.1":
version: 1.3.0
resolution: "string_decoder@npm:1.3.0"
@@ -6375,6 +7506,59 @@
languageName: node
linkType: hard
+"typed-array-buffer@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "typed-array-buffer@npm:1.0.3"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ is-typed-array: "npm:^1.1.14"
+ checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079
+ languageName: node
+ linkType: hard
+
+"typed-array-byte-length@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "typed-array-byte-length@npm:1.0.3"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ for-each: "npm:^0.3.3"
+ gopd: "npm:^1.2.0"
+ has-proto: "npm:^1.2.0"
+ is-typed-array: "npm:^1.1.14"
+ checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e
+ languageName: node
+ linkType: hard
+
+"typed-array-byte-offset@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "typed-array-byte-offset@npm:1.0.4"
+ dependencies:
+ available-typed-arrays: "npm:^1.0.7"
+ call-bind: "npm:^1.0.8"
+ for-each: "npm:^0.3.3"
+ gopd: "npm:^1.2.0"
+ has-proto: "npm:^1.2.0"
+ is-typed-array: "npm:^1.1.15"
+ reflect.getprototypeof: "npm:^1.0.9"
+ checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53
+ languageName: node
+ linkType: hard
+
+"typed-array-length@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "typed-array-length@npm:1.0.7"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ for-each: "npm:^0.3.3"
+ gopd: "npm:^1.0.1"
+ is-typed-array: "npm:^1.1.13"
+ possible-typed-array-names: "npm:^1.0.0"
+ reflect.getprototypeof: "npm:^1.0.6"
+ checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295
+ languageName: node
+ linkType: hard
+
"typed-query-selector@npm:^2.12.0":
version: 2.12.0
resolution: "typed-query-selector@npm:2.12.0"
@@ -6400,6 +7584,18 @@
languageName: node
linkType: hard
+"unbox-primitive@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "unbox-primitive@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-bigints: "npm:^1.0.2"
+ has-symbols: "npm:^1.1.0"
+ which-boxed-primitive: "npm:^1.1.1"
+ checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982
+ languageName: node
+ linkType: hard
+
"undefsafe@npm:^2.0.5":
version: 2.0.5
resolution: "undefsafe@npm:2.0.5"
@@ -6466,6 +7662,13 @@
languageName: node
linkType: hard
+"url-join@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "url-join@npm:4.0.1"
+ checksum: 10c0/ac65e2c7c562d7b49b68edddcf55385d3e922bc1dd5d90419ea40b53b6de1607d1e45ceb71efb9d60da02c681d13c6cb3a1aa8b13fc0c989dfc219df97ee992d
+ languageName: node
+ linkType: hard
+
"url-regex@npm:^3.0.0":
version: 3.2.0
resolution: "url-regex@npm:3.2.0"
@@ -6482,6 +7685,15 @@
languageName: node
linkType: hard
+"util-promisify@npm:3.0.0":
+ version: 3.0.0
+ resolution: "util-promisify@npm:3.0.0"
+ dependencies:
+ object.getownpropertydescriptors: "npm:^2.0.3"
+ checksum: 10c0/9c2af995c58b0fc77eb28e87f2f6339dabbbab14f6b846da17ddadbcaba2ba56714fe03b74a20742b2b0a0491ad4da2ca292596eae91bccc5b3bf82c07ee2500
+ languageName: node
+ linkType: hard
+
"util@npm:^0.10.3":
version: 0.10.4
resolution: "util@npm:0.10.4"
@@ -6622,6 +7834,67 @@
languageName: node
linkType: hard
+"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "which-boxed-primitive@npm:1.1.1"
+ dependencies:
+ is-bigint: "npm:^1.1.0"
+ is-boolean-object: "npm:^1.2.1"
+ is-number-object: "npm:^1.1.1"
+ is-string: "npm:^1.1.1"
+ is-symbol: "npm:^1.1.1"
+ checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe
+ languageName: node
+ linkType: hard
+
+"which-builtin-type@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "which-builtin-type@npm:1.2.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ function.prototype.name: "npm:^1.1.6"
+ has-tostringtag: "npm:^1.0.2"
+ is-async-function: "npm:^2.0.0"
+ is-date-object: "npm:^1.1.0"
+ is-finalizationregistry: "npm:^1.1.0"
+ is-generator-function: "npm:^1.0.10"
+ is-regex: "npm:^1.2.1"
+ is-weakref: "npm:^1.0.2"
+ isarray: "npm:^2.0.5"
+ which-boxed-primitive: "npm:^1.1.0"
+ which-collection: "npm:^1.0.2"
+ which-typed-array: "npm:^1.1.16"
+ checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471
+ languageName: node
+ linkType: hard
+
+"which-collection@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "which-collection@npm:1.0.2"
+ dependencies:
+ is-map: "npm:^2.0.3"
+ is-set: "npm:^2.0.3"
+ is-weakmap: "npm:^2.0.2"
+ is-weakset: "npm:^2.0.3"
+ checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2
+ languageName: node
+ linkType: hard
+
+"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19":
+ version: 1.1.20
+ resolution: "which-typed-array@npm:1.1.20"
+ dependencies:
+ available-typed-arrays: "npm:^1.0.7"
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ for-each: "npm:^0.3.5"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/16fcdada95c8afb821cd1117f0ab50b4d8551677ac08187f21d4e444530913c9ffd2dac634f0c1183345f96344b69280f40f9a8bc52164ef409e555567c2604b
+ languageName: node
+ linkType: hard
+
"which@npm:^2.0.1, which@npm:^2.0.2":
version: 2.0.2
resolution: "which@npm:2.0.2"