permdock 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +327 -1
- package/dist/a2a/index.d.ts +169 -0
- package/dist/a2a/index.js +232 -0
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +95 -0
- package/dist/ai-sdk/index.js +154 -0
- package/dist/approval-required-TzNB9oQA.js +6 -0
- package/dist/approvals/index.d.ts +3 -0
- package/dist/approvals/index.js +5 -0
- package/dist/approvals-DbYAuNkG.js +224 -0
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/arazzo-BAgw9ap6.js +70 -0
- package/dist/arazzo-cmvX2jDe.js +54 -0
- package/dist/authzen/index.d.ts +39 -0
- package/dist/authzen/index.js +302 -0
- package/dist/better-auth/index.d.ts +109 -0
- package/dist/better-auth/index.js +344 -0
- package/dist/better-supabase/index.d.ts +206 -0
- package/dist/better-supabase/index.js +620 -0
- package/dist/bind-CVy3Espv.d.ts +25 -0
- package/dist/bind-VnYn2HKq.js +97 -0
- package/dist/boundary-BM8a_P6E.js +13 -0
- package/dist/boundary-BmHxVH1J.d.ts +15 -0
- package/dist/budget-JqcRqyhK.d.ts +11 -0
- package/dist/budget-NbEtbJC_.js +11 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/capability-4qPdO9gk.js +173 -0
- package/dist/capability-Dq43tT1u.d.ts +99 -0
- package/dist/catalog/index.d.ts +12 -0
- package/dist/catalog/index.js +2 -0
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/catalog-doc-Dsc9y7sd.js +309 -0
- package/dist/catalog-h2tlKFkq.js +48 -0
- package/dist/catalog-path-CnI0XTFK.js +12 -0
- package/dist/catalog-z8q6bi_r.js +55 -0
- package/dist/claude-agent/index.d.ts +72 -0
- package/dist/claude-agent/index.js +77 -0
- package/dist/clerk/index.d.ts +65 -0
- package/dist/clerk/index.js +301 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +20 -0
- package/dist/cli/index.d.ts +46 -0
- package/dist/cli/index.js +5 -0
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +90 -0
- package/dist/cloud/index.js +404 -0
- package/dist/cloud-BGhHS-lY.js +50 -0
- package/dist/cloud-Bo3e9Ak3.js +118 -0
- package/dist/collect-DDDv_ESs.js +502 -0
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/commands-DWOrSQic.js +97 -0
- package/dist/compact-y6vfu2_f.js +19 -0
- package/dist/compare-pfyVnBjE.js +12 -0
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/compile-Ba4blROR.js +613 -0
- package/dist/compile-CNnl6uIt.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Bn00Z3ks.js +36 -0
- package/dist/config-report-Dw_JcUqT.js +44 -0
- package/dist/connection-CU8MQxRi.js +194 -0
- package/dist/context-Ttp0ekMT.js +82 -0
- package/dist/convex/index.d.ts +45 -0
- package/dist/convex/index.js +65 -0
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.js +253 -0
- package/dist/credential-8P81ff4u.js +306 -0
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/describe-B_gVZEVi.js +94 -0
- package/dist/describe-PdoqESvg.d.ts +36 -0
- package/dist/diff-B8Tunc3o.js +451 -0
- package/dist/diff-CzqLxZ77.js +48 -0
- package/dist/digest-B3kc_PgQ.d.ts +19 -0
- package/dist/digest-BI-6aa6d.js +27 -0
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/doctor-rOr-4ZfS.js +53 -0
- package/dist/drizzle/index.d.ts +73 -0
- package/dist/drizzle/index.js +160 -0
- package/dist/duration-xK2jGFVc.js +25 -0
- package/dist/elysia/index.d.ts +49 -0
- package/dist/elysia/index.js +59 -0
- package/dist/errors-CWfoNg9N.js +47 -0
- package/dist/errors-Cz5zn0mW.js +123 -0
- package/dist/errors-DAqevpNk.d.ts +125 -0
- package/dist/errors-DRnGZHzF.js +30 -0
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/evaluations-tz6D9A2G.js +461 -0
- package/dist/eve/index.d.ts +86 -0
- package/dist/eve/index.js +176 -0
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +23 -0
- package/dist/express/index.js +78 -0
- package/dist/fastify/index.d.ts +33 -0
- package/dist/fastify/index.js +92 -0
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/files-DWUN9PzI.js +125 -0
- package/dist/fixtures-ht28Cplr.js +67 -0
- package/dist/freeze-CrU8nQeX.js +60 -0
- package/dist/from-snapshot-C3sHpZNS.js +569 -0
- package/dist/generate-CH7ThJ14.js +173 -0
- package/dist/grantee-Cv5Sogfv.js +602 -0
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/headers-BZSDieNT.js +6 -0
- package/dist/headers-Cf-zWvsO.d.ts +6 -0
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +48 -0
- package/dist/hono/index.js +99 -0
- package/dist/hosted-DJQw46hn.js +266 -0
- package/dist/http-BIhmLfCc.js +95 -0
- package/dist/http-DPuDaChb.d.ts +13 -0
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/index-A0YNL8jZ.d.ts +177 -0
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/index-D3vbkoSI.d.ts +483 -0
- package/dist/index-D6_cSa1z.d.ts +201 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +26 -0
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/json-schema-BsAflUGW.js +106 -0
- package/dist/jwt/index.d.ts +91 -0
- package/dist/jwt/index.js +590 -0
- package/dist/kernel-GSQnMz3O.js +208 -0
- package/dist/kysely/index.d.ts +78 -0
- package/dist/kysely/index.js +129 -0
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/load-DhWEB9P1.js +75 -0
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/load-jose-BL6LH4bL.js +11 -0
- package/dist/lru-8q4WZjBV.js +28 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/map-AcxK9o_D.js +147 -0
- package/dist/map-claims-Z4QZOiFF.js +369 -0
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/markers-B0hYLvMD.js +60 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +159 -0
- package/dist/mcp/index.js +603 -0
- package/dist/nest/index.d.ts +75 -0
- package/dist/nest/index.js +261 -0
- package/dist/next/client.d.ts +23 -0
- package/dist/next/client.js +33 -0
- package/dist/next/index.d.ts +93 -0
- package/dist/next/index.js +180 -0
- package/dist/next/plugin.d.ts +14 -0
- package/dist/next/plugin.js +33 -0
- package/dist/node/index.d.ts +24 -0
- package/dist/node/index.js +34 -0
- package/dist/openai/index.d.ts +62 -0
- package/dist/openai/index.js +92 -0
- package/dist/openapi/index.d.ts +176 -0
- package/dist/openapi/index.js +3 -0
- package/dist/openapi-Bbg4wGVL.js +164 -0
- package/dist/openapi-BqRBvAng.js +538 -0
- package/dist/openapi-CqqEbHsL.js +250 -0
- package/dist/openapi-import-cmwetbzw.js +5959 -0
- package/dist/openapi-schema--ARjyfQr.js +6902 -0
- package/dist/orpc/index.d.ts +51 -0
- package/dist/orpc/index.js +145 -0
- package/dist/otel/index.d.ts +13 -0
- package/dist/otel/index.js +202 -0
- package/dist/package-root-zGkxO3oN.js +30 -0
- package/dist/parse-BuyjxhZV.js +53 -0
- package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/pdp/index.d.ts +22 -0
- package/dist/pdp/index.js +682 -0
- package/dist/peer-BOr_kJE1.js +31 -0
- package/dist/permdock-CzqXjCpU.js +3471 -0
- package/dist/permissions-CDgvKG5L.d.ts +52 -0
- package/dist/permissions-CpZrivYv.js +142 -0
- package/dist/permissions-DVoF6dMt.js +662 -0
- package/dist/permissions-DttnqqxC.d.ts +214 -0
- package/dist/pins-8ILTftC9.js +12 -0
- package/dist/policy-CFZAr_Al.d.ts +2252 -0
- package/dist/policy-D8UFyERw.d.ts +20 -0
- package/dist/policy-xyWg7QdR.js +1122 -0
- package/dist/powersync-A8x_Yyvh.js +2 -0
- package/dist/powersync-C7kLglqX.js +540 -0
- package/dist/powersync-yW1UUFzp.js +62 -0
- package/dist/prisma/index.d.ts +136 -0
- package/dist/prisma/index.js +455 -0
- package/dist/problem-B43ztKIm.js +191 -0
- package/dist/problem-details-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/prompt-CXYhLfsS.js +32 -0
- package/dist/protected-CNsMzrVd.d.ts +27 -0
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/provider-Cjr62YMV.d.ts +6 -0
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.js +43 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +7 -0
- package/dist/react/provider-client.d.ts +2 -0
- package/dist/react/provider-client.js +3 -0
- package/dist/react-native/index.d.ts +198 -0
- package/dist/react-native/index.js +696 -0
- package/dist/refs-KYb4ntaz.js +91 -0
- package/dist/relations-cjOL01hZ.js +505 -0
- package/dist/replay-BsOyTrdV.js +28 -0
- package/dist/replay-sqBGMnNs.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/revocations-Cy06JNx2.d.ts +21 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/rls-CEvs64Kj.js +238 -0
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/rls-graph-pc9fuXYm.js +435 -0
- package/dist/rls-import-D8F7j35Q.js +943 -0
- package/dist/rls-migrate-7wikfrVI.js +367 -0
- package/dist/rls-ownership-B5Lkq62W.js +843 -0
- package/dist/rls-shared-aOQ4hGTO.js +493 -0
- package/dist/rls-verify-D8B7dOTh.js +745 -0
- package/dist/row-check-Dt35czLy.d.ts +40 -0
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/run-YXCJDNYk.js +174 -0
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/saas-Bj_FFkjN.js +1203 -0
- package/dist/schema-D3MnDMxa.js +300 -0
- package/dist/scim/index.d.ts +2 -0
- package/dist/scim/index.js +2 -0
- package/dist/scim-BFGBBAqR.js +1445 -0
- package/dist/scopes-CVdPrWN-.js +239 -0
- package/dist/server/index.d.ts +134 -0
- package/dist/server/index.js +11 -0
- package/dist/server-DlZ28Oz5.js +268 -0
- package/dist/sha256-BO0swRXL.js +150 -0
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/sink-Bd9PSyfq.js +141 -0
- package/dist/sink-Gs6TTVa-.d.ts +104 -0
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/skills-JaymNCdK.js +56 -0
- package/dist/snapshot-Enxd0n-s.js +975 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +93 -0
- package/dist/solid/index.js +188 -0
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/sql-xdg5f4Fi.js +27 -0
- package/dist/src-CSbUiozF.js +568 -0
- package/dist/ssf/index.d.ts +4 -0
- package/dist/ssf/index.js +596 -0
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/store-D_pjn91-.d.ts +36 -0
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/stores-4_sqiOA1.js +87 -0
- package/dist/stores-DVR5NHLE.d.ts +52 -0
- package/dist/stream-DDpvynSB.js +66 -0
- package/dist/stream-DlvG2hs-.d.ts +12 -0
- package/dist/style-CTm1AXDT.js +22 -0
- package/dist/subject-C6dLxqHU.js +24 -0
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +183 -0
- package/dist/supabase/index.js +5 -0
- package/dist/supabase/middleware.d.ts +82 -0
- package/dist/supabase/middleware.js +102 -0
- package/dist/supabase-CwafwxxF.js +83 -0
- package/dist/supabase-DTBaC20O.js +774 -0
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/supabase-hook-BuxLQLpU.js +1814 -0
- package/dist/supabase-hook-D5qVd_D8.js +2 -0
- package/dist/supautils-DYZnzRWV.js +91 -0
- package/dist/svelte/PermissionBoundary.svelte +37 -0
- package/dist/svelte/Protected.svelte +40 -0
- package/dist/svelte/index.d.ts +13 -0
- package/dist/svelte/index.js +107 -0
- package/dist/svelte/runtime.d.ts +7 -0
- package/dist/svelte/runtime.js +4 -0
- package/dist/svelte/source.d.ts +13 -0
- package/dist/svelte/source.js +11 -0
- package/dist/terminal/index.d.ts +163 -0
- package/dist/terminal/index.js +833 -0
- package/dist/testing/index.d.ts +745 -0
- package/dist/testing/index.js +3672 -0
- package/dist/testing/saas/index.d.ts +194 -0
- package/dist/testing/saas/index.js +3 -0
- package/dist/testing/saas/permissions.d.ts +2 -0
- package/dist/testing/saas/permissions.js +2 -0
- package/dist/text-diff-BdkkYSbi.js +15 -0
- package/dist/thenable-okc2xDsj.js +10 -0
- package/dist/timeout-D51niuQP.js +8 -0
- package/dist/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +61 -0
- package/dist/trpc/index.js +122 -0
- package/dist/types-9AWO9EGt.d.ts +197 -0
- package/dist/types-BPxgszlT.d.ts +550 -0
- package/dist/types-BVyImy5I.d.ts +120 -0
- package/dist/types-Bvc4oWT6.d.ts +9 -0
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/types-Dnemwd77.d.ts +183 -0
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/types-vKyAMtcX.d.ts +157 -0
- package/dist/types-vNSDF7Dq.d.ts +66 -0
- package/dist/types-yF5LmQVD.d.ts +306 -0
- package/dist/unplugin/index.d.ts +7 -0
- package/dist/unplugin/index.js +31 -0
- package/dist/usage-D07N9QJ3.js +42 -0
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/usage-DG1oeCca.js +693 -0
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -0
- package/dist/validity-uOp8UpYn.js +245 -0
- package/dist/verifier-BxBo6I44.js +466 -0
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/vocabulary-DA8a8zif.d.ts +56 -0
- package/dist/vue/index.d.ts +79 -0
- package/dist/vue/index.js +196 -0
- package/dist/watch-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.js +128 -0
- package/dist/webmcp/index.d.ts +75 -0
- package/dist/webmcp/index.js +307 -0
- package/package.json +450 -5
- package/rulesets/permdock.yaml +29 -0
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +535 -0
- package/schemas/openapi/oas-3.1.json +1298 -0
- package/schemas/openapi/oas-3.2.json +1516 -0
- package/schemas/openapi/overlay-1.1.json +79 -0
- package/schemas/supabase-claims-v1.json +144 -0
- package/schemas/supabase-manifest-v1.json +361 -0
- package/skills/permdock/SKILL.md +66 -0
- package/skills/permdock-agents/SKILL.md +77 -0
- package/skills/permdock-agents/references/runtimes.md +213 -0
- package/skills/permdock-approvals/SKILL.md +80 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
- package/skills/permdock-audit/SKILL.md +67 -0
- package/skills/permdock-credentials/SKILL.md +55 -0
- package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
- package/skills/permdock-data/SKILL.md +57 -0
- package/skills/permdock-data/references/queries-and-rls.md +62 -0
- package/skills/permdock-data/references/relationships.md +67 -0
- package/skills/permdock-tenancy/SKILL.md +80 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
- package/skills/permdock-wire/SKILL.md +116 -0
- package/skills/permdock-wire/references/adapters.md +492 -0
- package/skills/permdock-wire/references/policy-options.md +45 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { t as compact } from "../compact-y6vfu2_f.js";
|
|
2
|
+
import { E as ownGet, _ as listPermissions, c as getResource } from "../permissions-DVoF6dMt.js";
|
|
3
|
+
import { t as PROBLEM_BASE } from "../validation-error-CnjZ4t92.js";
|
|
4
|
+
import { t as createPermDock$1 } from "../permdock-CzqXjCpU.js";
|
|
5
|
+
import { n as resourceRef } from "../resource-ref-CaS9yVPi.js";
|
|
6
|
+
import { n as hasCredentials } from "../http-SO7qGttf.js";
|
|
7
|
+
import { i as methodNotAllowed, l as unauthenticatedProblem, s as problemResponse, t as batchTooLarge, u as validationProblem } from "../problem-B43ztKIm.js";
|
|
8
|
+
import { t as applyApprovalResume } from "../evaluations-tz6D9A2G.js";
|
|
9
|
+
import { t as instanceOptions } from "../instance-options-Dhhcnm3y.js";
|
|
10
|
+
import { n as permissionLookup } from "../evaluation-items-CfCCejQd.js";
|
|
11
|
+
import { a as endsWithPath, c as mergeItem, d as pathnameOf, f as permissionOf, g as userFromEntity, h as tenantOf, i as delegationOf, l as pageOf, m as resourceIdOf, n as UNKNOWN, o as evaluationRow, p as resourceData, r as actorOf, s as isRecord, t as UNAVAILABLE, u as paged } from "../map-AcxK9o_D.js";
|
|
12
|
+
//#region src/authzen/create.ts
|
|
13
|
+
function notFound(detail) {
|
|
14
|
+
return problemResponse({
|
|
15
|
+
type: `${PROBLEM_BASE}/not-found`,
|
|
16
|
+
title: "Not found",
|
|
17
|
+
status: 404,
|
|
18
|
+
detail
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function readJson(request) {
|
|
22
|
+
try {
|
|
23
|
+
return await request.json();
|
|
24
|
+
} catch {
|
|
25
|
+
return validationProblem("AuthZEN body was not valid JSON");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const SEMANTICS = [
|
|
29
|
+
"execute_all",
|
|
30
|
+
"deny_on_first_deny",
|
|
31
|
+
"permit_on_first_permit"
|
|
32
|
+
];
|
|
33
|
+
function semanticOf(body) {
|
|
34
|
+
const options = body["options"];
|
|
35
|
+
const value = isRecord(options) ? options["evaluations_semantic"] : void 0;
|
|
36
|
+
if (value === void 0) return "execute_all";
|
|
37
|
+
return SEMANTICS.find((semantic) => semantic === value);
|
|
38
|
+
}
|
|
39
|
+
const WELL_KNOWN = "/.well-known/authzen-configuration";
|
|
40
|
+
function withRequestId(request, response) {
|
|
41
|
+
const id = request.headers.get("x-request-id");
|
|
42
|
+
if (id !== null && id !== "") response.headers.set("X-Request-ID", id);
|
|
43
|
+
return response;
|
|
44
|
+
}
|
|
45
|
+
const createPermDock = (policy, options) => {
|
|
46
|
+
const maxEvaluations = options.maxEvaluations ?? 256;
|
|
47
|
+
const lookup = permissionLookup(policy.permissions);
|
|
48
|
+
const trusts = (pep) => {
|
|
49
|
+
const allow = options.trustedPep;
|
|
50
|
+
if (typeof allow !== "function" || pep === null) return false;
|
|
51
|
+
try {
|
|
52
|
+
return allow(pep) === true;
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const allowAnonymous = options.anonymous === true;
|
|
58
|
+
async function authenticate(request) {
|
|
59
|
+
let pep;
|
|
60
|
+
try {
|
|
61
|
+
pep = await options.subject(request);
|
|
62
|
+
} catch {
|
|
63
|
+
pep = null;
|
|
64
|
+
}
|
|
65
|
+
if ((pep === null || pep === void 0) && !allowAnonymous) return unauthenticatedProblem(hasCredentials(request));
|
|
66
|
+
return { pep: pep ?? null };
|
|
67
|
+
}
|
|
68
|
+
function instantiate(pep, item) {
|
|
69
|
+
const trusted = trusts(pep);
|
|
70
|
+
const user = (trusted ? userFromEntity(item.subject) : null) ?? pep;
|
|
71
|
+
return createPermDock$1(policy, user, compact({
|
|
72
|
+
actor: trusted ? actorOf(item) : void 0,
|
|
73
|
+
delegation: trusted ? delegationOf(item) : void 0,
|
|
74
|
+
tenant: tenantOf(item),
|
|
75
|
+
...instanceOptions(options)
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
async function resourceOf(item) {
|
|
79
|
+
const properties = item.resource?.properties;
|
|
80
|
+
if (properties !== null && typeof properties === "object") return {
|
|
81
|
+
data: properties,
|
|
82
|
+
trusted: false
|
|
83
|
+
};
|
|
84
|
+
const type = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
85
|
+
const id = resourceIdOf(item);
|
|
86
|
+
const load = type !== void 0 && options.resources !== void 0 ? options.resources[type]?.load : void 0;
|
|
87
|
+
if (id !== void 0 && load !== void 0) try {
|
|
88
|
+
return {
|
|
89
|
+
data: await load(id),
|
|
90
|
+
trusted: true
|
|
91
|
+
};
|
|
92
|
+
} catch {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
data: resourceData(item),
|
|
97
|
+
trusted: false
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function decideItem(request, pep, item) {
|
|
101
|
+
const permission = permissionOf(lookup, item);
|
|
102
|
+
if (permission === void 0) return UNKNOWN;
|
|
103
|
+
const resolved = await resourceOf(item);
|
|
104
|
+
if (resolved === void 0) return UNAVAILABLE;
|
|
105
|
+
const { data, trusted } = resolved;
|
|
106
|
+
const permdock = await instantiate(pep, item);
|
|
107
|
+
const decide = permdock.decide;
|
|
108
|
+
const decision = decide(permission, data, trusted ? {
|
|
109
|
+
source: "endpoint",
|
|
110
|
+
adapter: "authzen",
|
|
111
|
+
trusted: true
|
|
112
|
+
} : {
|
|
113
|
+
source: "endpoint",
|
|
114
|
+
adapter: "authzen",
|
|
115
|
+
trusted: false,
|
|
116
|
+
boundary: "decision-endpoint"
|
|
117
|
+
});
|
|
118
|
+
return applyApprovalResume(decision, permission, permdock, options.store, request, resourceRef(permission, data, item.resource?.id), "authzen");
|
|
119
|
+
}
|
|
120
|
+
async function evaluation(request, pep) {
|
|
121
|
+
const body = await readJson(request);
|
|
122
|
+
if (body instanceof Response) return body;
|
|
123
|
+
if (!isRecord(body)) return validationProblem("evaluation body must be an object");
|
|
124
|
+
return Response.json(evaluationRow(await decideItem(request, pep, body)));
|
|
125
|
+
}
|
|
126
|
+
async function evaluations(request, pep) {
|
|
127
|
+
const body = await readJson(request);
|
|
128
|
+
if (body instanceof Response) return body;
|
|
129
|
+
if (!isRecord(body)) return validationProblem("evaluations body must be an object");
|
|
130
|
+
const items = body["evaluations"] ?? [];
|
|
131
|
+
if (!Array.isArray(items)) return validationProblem("evaluations must be an array");
|
|
132
|
+
if (items.length === 0) return Response.json(evaluationRow(await decideItem(request, pep, body)));
|
|
133
|
+
if (items.length > maxEvaluations) return batchTooLarge(maxEvaluations);
|
|
134
|
+
const semantic = semanticOf(body);
|
|
135
|
+
if (semantic === void 0) return validationProblem(`options.evaluations_semantic must be one of ${SEMANTICS.join(", ")}`);
|
|
136
|
+
const shared = compact({
|
|
137
|
+
subject: isRecord(body["subject"]) ? body["subject"] : void 0,
|
|
138
|
+
action: isRecord(body["action"]) ? body["action"] : void 0,
|
|
139
|
+
resource: isRecord(body["resource"]) ? body["resource"] : void 0,
|
|
140
|
+
context: body["context"]
|
|
141
|
+
});
|
|
142
|
+
const rowOf = (item) => decideItem(request, pep, mergeItem(shared, item)).then(evaluationRow);
|
|
143
|
+
if (semantic === "execute_all") return Response.json({ evaluations: await Promise.all(items.map(rowOf)) });
|
|
144
|
+
const stopOn = semantic === "permit_on_first_permit";
|
|
145
|
+
const rows = [];
|
|
146
|
+
for (const item of items) {
|
|
147
|
+
const row = await rowOf(item);
|
|
148
|
+
rows.push(row);
|
|
149
|
+
if (row.decision === stopOn) break;
|
|
150
|
+
}
|
|
151
|
+
return Response.json({ evaluations: rows });
|
|
152
|
+
}
|
|
153
|
+
async function searchAction(request, pep) {
|
|
154
|
+
const body = await readJson(request);
|
|
155
|
+
if (body instanceof Response) return body;
|
|
156
|
+
if (!isRecord(body)) return validationProblem("search/action body must be an object");
|
|
157
|
+
const item = body;
|
|
158
|
+
const type = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
159
|
+
const leaves = listPermissions(policy.permissions).filter((leaf) => type === void 0 || leaf.resource === type);
|
|
160
|
+
const decisions = await Promise.all(leaves.map(async (leaf) => ({
|
|
161
|
+
leaf,
|
|
162
|
+
decision: await decideItem(request, pep, compact({
|
|
163
|
+
subject: item.subject,
|
|
164
|
+
context: item.context,
|
|
165
|
+
resource: item.resource,
|
|
166
|
+
action: { name: leaf.key }
|
|
167
|
+
}))
|
|
168
|
+
})));
|
|
169
|
+
const names = [];
|
|
170
|
+
for (const { leaf, decision } of decisions) if (decision.outcome === "granted" && !names.includes(leaf.action)) names.push(leaf.action);
|
|
171
|
+
const { offset, size } = pageOf(body);
|
|
172
|
+
return Response.json(paged(names.map((name) => ({ name })), offset, size));
|
|
173
|
+
}
|
|
174
|
+
async function listRows(type, where) {
|
|
175
|
+
const list = options.resources?.[type]?.list;
|
|
176
|
+
if (list === void 0) return [];
|
|
177
|
+
try {
|
|
178
|
+
return await list({ where });
|
|
179
|
+
} catch {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function searchResource(request, pep) {
|
|
184
|
+
const body = await readJson(request);
|
|
185
|
+
if (body instanceof Response) return body;
|
|
186
|
+
if (!isRecord(body)) return validationProblem("search/resource body must be an object");
|
|
187
|
+
const item = body;
|
|
188
|
+
const type = typeof item.resource?.type === "string" ? item.resource.type : void 0;
|
|
189
|
+
const permission = permissionOf(lookup, item);
|
|
190
|
+
if (type === void 0 || permission === void 0) return Response.json(paged([], 0, 1));
|
|
191
|
+
const rows = await listRows(type, isRecord(item.resource?.properties) ? item.resource.properties : void 0);
|
|
192
|
+
const permdock = await instantiate(pep, item);
|
|
193
|
+
let permitted = [];
|
|
194
|
+
if (permission.kind === "instance") permitted = permdock.filter(permission, rows);
|
|
195
|
+
else if (permission.kind === "collection" && permdock.can(permission)) permitted = rows;
|
|
196
|
+
const idField = getResource(policy.permissions, type)?.id ?? "id";
|
|
197
|
+
const entities = permitted.flatMap((row) => {
|
|
198
|
+
const id = isRecord(row) ? ownGet(row, idField) : void 0;
|
|
199
|
+
return typeof id === "string" || typeof id === "number" ? [{
|
|
200
|
+
type,
|
|
201
|
+
id: String(id)
|
|
202
|
+
}] : [];
|
|
203
|
+
});
|
|
204
|
+
const { offset, size } = pageOf(body);
|
|
205
|
+
return Response.json(paged(entities, offset, size));
|
|
206
|
+
}
|
|
207
|
+
async function searchSubject(request, pep) {
|
|
208
|
+
if (options.subjects?.list === void 0) return notFound("search/subject is not configured");
|
|
209
|
+
const body = await readJson(request);
|
|
210
|
+
if (body instanceof Response) return body;
|
|
211
|
+
if (!isRecord(body)) return validationProblem("search/subject body must be an object");
|
|
212
|
+
let records;
|
|
213
|
+
try {
|
|
214
|
+
records = await options.subjects.list();
|
|
215
|
+
} catch {
|
|
216
|
+
return Response.json(paged([], 0, 1));
|
|
217
|
+
}
|
|
218
|
+
const item = body;
|
|
219
|
+
const wanted = item.subject?.type;
|
|
220
|
+
if (typeof wanted === "string" && wanted !== "user") return Response.json(paged([], 0, 1));
|
|
221
|
+
const matches = (await Promise.all(records.map(async (record) => {
|
|
222
|
+
const properties = {};
|
|
223
|
+
for (const [key, value] of Object.entries(record)) if (key !== "id") properties[key] = value;
|
|
224
|
+
return {
|
|
225
|
+
id: record.id,
|
|
226
|
+
decision: await decideItem(request, pep, compact({
|
|
227
|
+
action: item.action,
|
|
228
|
+
resource: item.resource,
|
|
229
|
+
context: item.context,
|
|
230
|
+
subject: {
|
|
231
|
+
type: "user",
|
|
232
|
+
id: record.id,
|
|
233
|
+
properties
|
|
234
|
+
}
|
|
235
|
+
}))
|
|
236
|
+
};
|
|
237
|
+
}))).flatMap(({ id, decision }) => decision.outcome === "granted" ? [{
|
|
238
|
+
type: "user",
|
|
239
|
+
id
|
|
240
|
+
}] : []);
|
|
241
|
+
const { offset, size } = pageOf(body);
|
|
242
|
+
return Response.json(paged(matches, offset, size));
|
|
243
|
+
}
|
|
244
|
+
function discovery(request, pathname) {
|
|
245
|
+
const pdp = `${new URL(request.url).origin}${pathname.slice(pathname.indexOf(WELL_KNOWN) + 34).replace(/\/+$/u, "")}`;
|
|
246
|
+
const document = {
|
|
247
|
+
policy_decision_point: pdp,
|
|
248
|
+
access_evaluation_endpoint: `${pdp}/access/v1/evaluation`,
|
|
249
|
+
access_evaluations_endpoint: `${pdp}/access/v1/evaluations`,
|
|
250
|
+
search_action_endpoint: `${pdp}/access/v1/search/action`,
|
|
251
|
+
search_resource_endpoint: `${pdp}/access/v1/search/resource`
|
|
252
|
+
};
|
|
253
|
+
if (options.subjects?.list !== void 0) document["search_subject_endpoint"] = `${pdp}/access/v1/search/subject`;
|
|
254
|
+
return Response.json(document);
|
|
255
|
+
}
|
|
256
|
+
async function route(request) {
|
|
257
|
+
const pathname = pathnameOf(request);
|
|
258
|
+
if (endsWithPath(pathname, WELL_KNOWN) || pathname.includes(`${WELL_KNOWN}/`)) {
|
|
259
|
+
if (request.method !== "GET") return methodNotAllowed("GET");
|
|
260
|
+
return discovery(request, pathname);
|
|
261
|
+
}
|
|
262
|
+
const identity = await authenticate(request);
|
|
263
|
+
if (identity instanceof Response) return identity;
|
|
264
|
+
const routes = [
|
|
265
|
+
[
|
|
266
|
+
"POST",
|
|
267
|
+
"/access/v1/evaluation",
|
|
268
|
+
evaluation
|
|
269
|
+
],
|
|
270
|
+
[
|
|
271
|
+
"POST",
|
|
272
|
+
"/access/v1/evaluations",
|
|
273
|
+
evaluations
|
|
274
|
+
],
|
|
275
|
+
[
|
|
276
|
+
"POST",
|
|
277
|
+
"/access/v1/search/action",
|
|
278
|
+
searchAction
|
|
279
|
+
],
|
|
280
|
+
[
|
|
281
|
+
"POST",
|
|
282
|
+
"/access/v1/search/resource",
|
|
283
|
+
searchResource
|
|
284
|
+
],
|
|
285
|
+
[
|
|
286
|
+
"POST",
|
|
287
|
+
"/access/v1/search/subject",
|
|
288
|
+
searchSubject
|
|
289
|
+
]
|
|
290
|
+
];
|
|
291
|
+
for (const [method, suffix, serve] of routes) if (endsWithPath(pathname, suffix)) {
|
|
292
|
+
if (request.method !== method) return methodNotAllowed(method);
|
|
293
|
+
return serve(request, identity.pep);
|
|
294
|
+
}
|
|
295
|
+
return notFound("unknown AuthZEN path");
|
|
296
|
+
}
|
|
297
|
+
return { async permdockHandler(request) {
|
|
298
|
+
return withRequestId(request, await route(request));
|
|
299
|
+
} };
|
|
300
|
+
};
|
|
301
|
+
//#endregion
|
|
302
|
+
export { createPermDock };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Nr as Principal, Pr as Subject, at as DecisionSink, k as RoleBinding, xt as RoleSource } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { m as PermissionTree } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
|
+
//#region src/better-auth/types.d.ts
|
|
5
|
+
type BetterAuthPrincipal = Principal & {
|
|
6
|
+
readonly email?: string;
|
|
7
|
+
readonly claims?: Readonly<Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
type BetterAuthStatements = Readonly<Record<string, readonly string[]>>;
|
|
10
|
+
type BetterAuthAccessRole = {
|
|
11
|
+
readonly statements?: BetterAuthStatements;
|
|
12
|
+
readonly permissions?: BetterAuthStatements;
|
|
13
|
+
};
|
|
14
|
+
type BetterAuthAccessControl = {
|
|
15
|
+
readonly ac?: unknown;
|
|
16
|
+
readonly roles: Readonly<Record<string, BetterAuthAccessRole>>;
|
|
17
|
+
};
|
|
18
|
+
type BetterAuthAssignableRole = {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly statements: BetterAuthStatements;
|
|
21
|
+
};
|
|
22
|
+
type BetterAuthMemberQuery = {
|
|
23
|
+
readonly model: string;
|
|
24
|
+
where: {
|
|
25
|
+
readonly field: string;
|
|
26
|
+
readonly value: string;
|
|
27
|
+
}[];
|
|
28
|
+
readonly limit?: number;
|
|
29
|
+
};
|
|
30
|
+
type BetterAuthLike = {
|
|
31
|
+
readonly $context?: Promise<{
|
|
32
|
+
readonly adapter?: {
|
|
33
|
+
readonly findMany?: (query: BetterAuthMemberQuery) => Promise<unknown>;
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
readonly api?: {
|
|
37
|
+
readonly listOrganizations?: (args?: {
|
|
38
|
+
readonly headers?: unknown;
|
|
39
|
+
}) => Promise<unknown>;
|
|
40
|
+
readonly listMembers?: (args?: {
|
|
41
|
+
readonly query?: {
|
|
42
|
+
readonly organizationId?: string;
|
|
43
|
+
readonly filterField?: string;
|
|
44
|
+
readonly filterOperator?: "eq";
|
|
45
|
+
readonly filterValue?: string;
|
|
46
|
+
};
|
|
47
|
+
readonly headers?: unknown;
|
|
48
|
+
}) => Promise<unknown>;
|
|
49
|
+
readonly getActiveMember?: (args?: {
|
|
50
|
+
readonly headers?: unknown;
|
|
51
|
+
}) => Promise<unknown>;
|
|
52
|
+
readonly listUserTeams?: (args?: {
|
|
53
|
+
readonly headers?: unknown;
|
|
54
|
+
}) => Promise<unknown>;
|
|
55
|
+
readonly listOrganizationRoles?: (args?: {
|
|
56
|
+
readonly query?: {
|
|
57
|
+
readonly organizationId?: string;
|
|
58
|
+
};
|
|
59
|
+
readonly headers?: unknown;
|
|
60
|
+
}) => Promise<unknown>;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
type BetterAuthSubjectOptions = {
|
|
64
|
+
readonly memberships?: "all" | "active";
|
|
65
|
+
/**
|
|
66
|
+
* Parses the user's additional fields into `principal.claims`. Without it no
|
|
67
|
+
* field reaches claims, because a user may edit their own additional fields.
|
|
68
|
+
*/
|
|
69
|
+
readonly schema?: StandardSchemaV1;
|
|
70
|
+
readonly headers?: unknown;
|
|
71
|
+
readonly declared?: readonly string[];
|
|
72
|
+
};
|
|
73
|
+
type BetterAuthRoleSourceOptions = {
|
|
74
|
+
readonly assignable?: readonly BetterAuthAssignableRole[];
|
|
75
|
+
readonly headers?: unknown;
|
|
76
|
+
};
|
|
77
|
+
type BetterAuthUnmatchedStatement = {
|
|
78
|
+
readonly role: string;
|
|
79
|
+
readonly resource: string;
|
|
80
|
+
readonly action: string;
|
|
81
|
+
};
|
|
82
|
+
type BetterAuthRoleChangeEvent = {
|
|
83
|
+
readonly userId?: string;
|
|
84
|
+
readonly organizationId?: string;
|
|
85
|
+
readonly role?: string;
|
|
86
|
+
readonly previousRole?: string;
|
|
87
|
+
readonly teamId?: string;
|
|
88
|
+
readonly by?: {
|
|
89
|
+
readonly id: string;
|
|
90
|
+
readonly kind: string;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
//#endregion
|
|
94
|
+
//#region src/better-auth/roles.d.ts
|
|
95
|
+
type SeededRoles = RoleBinding<"tenant">[] & {
|
|
96
|
+
readonly unmatched: readonly BetterAuthUnmatchedStatement[];
|
|
97
|
+
};
|
|
98
|
+
export declare function rolesFromAccessControl(access: BetterAuthAccessControl, permissions: PermissionTree, options?: {
|
|
99
|
+
readonly on?: "tenant" | "global";
|
|
100
|
+
}): SeededRoles;
|
|
101
|
+
export declare function betterAuthRoleSource(auth: BetterAuthLike, options?: BetterAuthRoleSourceOptions): RoleSource;
|
|
102
|
+
export declare function onRoleChange(refresh: (event: BetterAuthRoleChangeEvent) => void | Promise<void>, options?: {
|
|
103
|
+
readonly sink?: DecisionSink;
|
|
104
|
+
}): (event: BetterAuthRoleChangeEvent) => Promise<void>;
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/better-auth/subject.d.ts
|
|
107
|
+
export declare function subjectFromBetterAuth(auth: BetterAuthLike, session: unknown, options?: BetterAuthSubjectOptions): Promise<Subject<BetterAuthPrincipal>>;
|
|
108
|
+
//#endregion
|
|
109
|
+
export type { BetterAuthAccessControl, BetterAuthAccessRole, BetterAuthAssignableRole, BetterAuthLike, BetterAuthMemberQuery, BetterAuthPrincipal, BetterAuthRoleChangeEvent, BetterAuthRoleSourceOptions, BetterAuthStatements, BetterAuthSubjectOptions, BetterAuthUnmatchedStatement, SeededRoles };
|