"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/authorization.ts var authorization_exports = {}; __export(authorization_exports, { createCheckAuthorization: () => createCheckAuthorization, resolveAuthState: () => resolveAuthState, splitByScope: () => splitByScope, validateReverificationConfig: () => validateReverificationConfig }); module.exports = __toCommonJS(authorization_exports); var TYPES_TO_OBJECTS = { strict_mfa: { afterMinutes: 10, level: "multi_factor" }, strict: { afterMinutes: 10, level: "second_factor" }, moderate: { afterMinutes: 60, level: "second_factor" }, lax: { afterMinutes: 1440, level: "second_factor" } }; var ALLOWED_LEVELS = /* @__PURE__ */ new Set(["first_factor", "second_factor", "multi_factor"]); var ALLOWED_TYPES = /* @__PURE__ */ new Set(["strict_mfa", "strict", "moderate", "lax"]); var isValidMaxAge = (maxAge) => typeof maxAge === "number" && maxAge > 0; var isValidLevel = (level) => ALLOWED_LEVELS.has(level); var isValidVerificationType = (type) => ALLOWED_TYPES.has(type); var prefixWithOrg = (value) => value.replace(/^(org:)*/, "org:"); var checkOrgAuthorization = (params, options) => { const { orgId, orgRole, orgPermissions } = options; if (!params.role && !params.permission) { return null; } if (!orgId || !orgRole || !orgPermissions) { return null; } if (params.permission) { return orgPermissions.includes(prefixWithOrg(params.permission)); } if (params.role) { return prefixWithOrg(orgRole) === prefixWithOrg(params.role); } return null; }; var checkForFeatureOrPlan = (claim, featureOrPlan) => { const { org: orgFeatures, user: userFeatures } = splitByScope(claim); const [scope, _id] = featureOrPlan.split(":"); const id = _id || scope; if (scope === "org") { return orgFeatures.includes(id); } else if (scope === "user") { return userFeatures.includes(id); } else { return [...orgFeatures, ...userFeatures].includes(id); } }; var checkBillingAuthorization = (params, options) => { const { features, plans } = options; if (params.feature && features) { return checkForFeatureOrPlan(features, params.feature); } if (params.plan && plans) { return checkForFeatureOrPlan(plans, params.plan); } return null; }; var splitByScope = (fea) => { const features = fea ? fea.split(",").map((f) => f.trim()) : []; return { org: features.filter((f) => f.split(":")[0].includes("o")).map((f) => f.split(":")[1]), user: features.filter((f) => f.split(":")[0].includes("u")).map((f) => f.split(":")[1]) }; }; var validateReverificationConfig = (config) => { if (!config) { return false; } const convertConfigToObject = (config2) => { if (typeof config2 === "string") { return TYPES_TO_OBJECTS[config2]; } return config2; }; const isValidStringValue = typeof config === "string" && isValidVerificationType(config); const isValidObjectValue = typeof config === "object" && isValidLevel(config.level) && isValidMaxAge(config.afterMinutes); if (isValidStringValue || isValidObjectValue) { return convertConfigToObject.bind(null, config); } return false; }; var checkReverificationAuthorization = (params, { factorVerificationAge }) => { if (!params.reverification || !factorVerificationAge) { return null; } const isValidReverification = validateReverificationConfig(params.reverification); if (!isValidReverification) { return null; } const { level, afterMinutes } = isValidReverification(); const [factor1Age, factor2Age] = factorVerificationAge; const isValidFactor1 = factor1Age !== -1 ? afterMinutes > factor1Age : null; const isValidFactor2 = factor2Age !== -1 ? afterMinutes > factor2Age : null; switch (level) { case "first_factor": return isValidFactor1; case "second_factor": return factor2Age !== -1 ? isValidFactor2 : isValidFactor1; case "multi_factor": return factor2Age === -1 ? isValidFactor1 : isValidFactor1 && isValidFactor2; } }; var createCheckAuthorization = (options) => { return (params) => { if (!options.userId) { return false; } const billingAuthorization = checkBillingAuthorization(params, options); const orgAuthorization = checkOrgAuthorization(params, options); const reverificationAuthorization = checkReverificationAuthorization(params, options); if ([billingAuthorization || orgAuthorization, reverificationAuthorization].some((a) => a === null)) { return [billingAuthorization || orgAuthorization, reverificationAuthorization].some((a) => a === true); } return [billingAuthorization || orgAuthorization, reverificationAuthorization].every((a) => a === true); }; }; var resolveAuthState = ({ authObject: { sessionId, sessionStatus, userId, actor, orgId, orgRole, orgSlug, signOut, getToken, has, sessionClaims }, options: { treatPendingAsSignedOut = true } }) => { if (sessionId === void 0 && userId === void 0) { return { isLoaded: false, isSignedIn: void 0, sessionId, sessionClaims: void 0, userId, actor: void 0, orgId: void 0, orgRole: void 0, orgSlug: void 0, has: void 0, signOut, getToken }; } if (sessionId === null && userId === null) { return { isLoaded: true, isSignedIn: false, sessionId, userId, sessionClaims: null, actor: null, orgId: null, orgRole: null, orgSlug: null, has: () => false, signOut, getToken }; } if (treatPendingAsSignedOut && sessionStatus === "pending") { return { isLoaded: true, isSignedIn: false, sessionId: null, userId: null, sessionClaims: null, actor: null, orgId: null, orgRole: null, orgSlug: null, has: () => false, signOut, getToken }; } if (!!sessionId && !!sessionClaims && !!userId && !!orgId && !!orgRole) { return { isLoaded: true, isSignedIn: true, sessionId, sessionClaims, userId, actor: actor || null, orgId, orgRole, orgSlug: orgSlug || null, has, signOut, getToken }; } if (!!sessionId && !!sessionClaims && !!userId && !orgId) { return { isLoaded: true, isSignedIn: true, sessionId, sessionClaims, userId, actor: actor || null, orgId: null, orgRole: null, orgSlug: null, has, signOut, getToken }; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createCheckAuthorization, resolveAuthState, splitByScope, validateReverificationConfig }); //# sourceMappingURL=authorization.js.map