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 --}} +
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"