@stigmer/server 3.15.2 → 3.15.3-dev.20260914121148
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/dist/boot/compose.d.ts.map +1 -1
- package/dist/boot/compose.js +103 -9
- package/dist/boot/compose.js.map +1 -1
- package/dist/domain/iampolicy/access-lists.d.ts +27 -0
- package/dist/domain/iampolicy/access-lists.d.ts.map +1 -0
- package/dist/domain/iampolicy/access-lists.js +124 -0
- package/dist/domain/iampolicy/access-lists.js.map +1 -0
- package/dist/domain/iampolicy/constants.d.ts +135 -0
- package/dist/domain/iampolicy/constants.d.ts.map +1 -0
- package/dist/domain/iampolicy/constants.js +203 -0
- package/dist/domain/iampolicy/constants.js.map +1 -0
- package/dist/domain/iampolicy/controller.d.ts +29 -0
- package/dist/domain/iampolicy/controller.d.ts.map +1 -0
- package/dist/domain/iampolicy/controller.js +451 -0
- package/dist/domain/iampolicy/controller.js.map +1 -0
- package/dist/domain/iampolicy/display-resolver.d.ts +6 -0
- package/dist/domain/iampolicy/display-resolver.d.ts.map +1 -0
- package/dist/domain/iampolicy/display-resolver.js +90 -0
- package/dist/domain/iampolicy/display-resolver.js.map +1 -0
- package/dist/domain/iampolicy/grant-path.d.ts +42 -0
- package/dist/domain/iampolicy/grant-path.d.ts.map +1 -0
- package/dist/domain/iampolicy/grant-path.js +183 -0
- package/dist/domain/iampolicy/grant-path.js.map +1 -0
- package/dist/domain/iampolicy/grant-scope.d.ts +4 -0
- package/dist/domain/iampolicy/grant-scope.d.ts.map +1 -0
- package/dist/domain/iampolicy/grant-scope.js +34 -0
- package/dist/domain/iampolicy/grant-scope.js.map +1 -0
- package/dist/domain/iampolicy/membership.d.ts +111 -0
- package/dist/domain/iampolicy/membership.d.ts.map +1 -0
- package/dist/domain/iampolicy/membership.js +152 -0
- package/dist/domain/iampolicy/membership.js.map +1 -0
- package/dist/domain/iampolicy/permissions.d.ts +19 -0
- package/dist/domain/iampolicy/permissions.d.ts.map +1 -0
- package/dist/domain/iampolicy/permissions.js +27 -0
- package/dist/domain/iampolicy/permissions.js.map +1 -0
- package/dist/domain/iampolicy/resource-store.d.ts +4 -0
- package/dist/domain/iampolicy/resource-store.d.ts.map +1 -0
- package/dist/domain/iampolicy/resource-store.js +135 -0
- package/dist/domain/iampolicy/resource-store.js.map +1 -0
- package/dist/domain/iampolicy/role-lifecycle.d.ts +9 -0
- package/dist/domain/iampolicy/role-lifecycle.d.ts.map +1 -0
- package/dist/domain/iampolicy/role-lifecycle.js +106 -0
- package/dist/domain/iampolicy/role-lifecycle.js.map +1 -0
- package/dist/domain/iampolicy/roles.d.ts +11 -0
- package/dist/domain/iampolicy/roles.d.ts.map +1 -0
- package/dist/domain/iampolicy/roles.js +78 -0
- package/dist/domain/iampolicy/roles.js.map +1 -0
- package/dist/domain/iampolicy/specs.d.ts +7 -0
- package/dist/domain/iampolicy/specs.d.ts.map +1 -0
- package/dist/domain/iampolicy/specs.js +45 -0
- package/dist/domain/iampolicy/specs.js.map +1 -0
- package/dist/domain/iampolicy/steps.d.ts +18 -0
- package/dist/domain/iampolicy/steps.d.ts.map +1 -0
- package/dist/domain/iampolicy/steps.js +117 -0
- package/dist/domain/iampolicy/steps.js.map +1 -0
- package/dist/domain/iampolicy/store-contract.d.ts +8 -0
- package/dist/domain/iampolicy/store-contract.d.ts.map +1 -0
- package/dist/domain/iampolicy/store-contract.js +258 -0
- package/dist/domain/iampolicy/store-contract.js.map +1 -0
- package/dist/domain/iampolicy/store.d.ts +78 -0
- package/dist/domain/iampolicy/store.d.ts.map +1 -0
- package/dist/domain/iampolicy/store.js +13 -0
- package/dist/domain/iampolicy/store.js.map +1 -0
- package/dist/domain/iampolicy/wire-refusals.d.ts +25 -0
- package/dist/domain/iampolicy/wire-refusals.d.ts.map +1 -0
- package/dist/domain/iampolicy/wire-refusals.js +76 -0
- package/dist/domain/iampolicy/wire-refusals.js.map +1 -0
- package/dist/domain/identityaccount/constants.d.ts +33 -0
- package/dist/domain/identityaccount/constants.d.ts.map +1 -1
- package/dist/domain/identityaccount/constants.js +2 -48
- package/dist/domain/identityaccount/constants.js.map +1 -1
- package/dist/domain/identityaccount/controller.d.ts +8 -1
- package/dist/domain/identityaccount/controller.d.ts.map +1 -1
- package/dist/domain/identityaccount/controller.js +54 -29
- package/dist/domain/identityaccount/controller.js.map +1 -1
- package/dist/domain/identityaccount/operator.d.ts.map +1 -1
- package/dist/domain/identityaccount/operator.js +2 -4
- package/dist/domain/identityaccount/operator.js.map +1 -1
- package/dist/domain/identityaccount/provisioning.d.ts +20 -1
- package/dist/domain/identityaccount/provisioning.d.ts.map +1 -1
- package/dist/domain/identityaccount/provisioning.js +17 -3
- package/dist/domain/identityaccount/provisioning.js.map +1 -1
- package/dist/domain/identityaccount/resolve.d.ts +23 -0
- package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
- package/dist/domain/identityaccount/resolve.js +17 -0
- package/dist/domain/identityaccount/resolve.js.map +1 -1
- package/dist/domain/identityaccount/store-contract.d.ts +4 -18
- package/dist/domain/identityaccount/store-contract.d.ts.map +1 -1
- package/dist/domain/identityaccount/store-contract.js +12 -47
- package/dist/domain/identityaccount/store-contract.js.map +1 -1
- package/dist/extensions/authorization-queries.d.ts +81 -0
- package/dist/extensions/authorization-queries.d.ts.map +1 -0
- package/dist/extensions/authorization-queries.js +2 -0
- package/dist/extensions/authorization-queries.js.map +1 -0
- package/dist/extensions/drivers.d.ts +49 -2
- package/dist/extensions/drivers.d.ts.map +1 -1
- package/dist/extensions/identity.d.ts +14 -0
- package/dist/extensions/identity.d.ts.map +1 -1
- package/dist/extensions/identity.js +18 -1
- package/dist/extensions/identity.js.map +1 -1
- package/dist/extensions/list-read-scope.d.ts +41 -4
- package/dist/extensions/list-read-scope.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.js +44 -7
- package/dist/extensions/list-read-scope.js.map +1 -1
- package/dist/extensions/policy-grant-scope.d.ts +50 -0
- package/dist/extensions/policy-grant-scope.d.ts.map +1 -0
- package/dist/extensions/policy-grant-scope.js +2 -0
- package/dist/extensions/policy-grant-scope.js.map +1 -0
- package/dist/extensions/registry.d.ts +23 -1
- package/dist/extensions/registry.d.ts.map +1 -1
- package/dist/extensions/registry.js +30 -0
- package/dist/extensions/registry.js.map +1 -1
- package/dist/extensions/resource-authorization.d.ts +63 -0
- package/dist/extensions/resource-authorization.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/apiresource-meta.d.ts +77 -1
- package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
- package/dist/pipeline/apiresource-meta.js +183 -1
- package/dist/pipeline/apiresource-meta.js.map +1 -1
- package/dist/pipeline/interceptors/auth.d.ts +12 -0
- package/dist/pipeline/interceptors/auth.d.ts.map +1 -1
- package/dist/pipeline/interceptors/auth.js +13 -1
- package/dist/pipeline/interceptors/auth.js.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.js +7 -26
- package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
- package/dist/pipeline/steps/authorize.d.ts +20 -5
- package/dist/pipeline/steps/authorize.d.ts.map +1 -1
- package/dist/pipeline/steps/authorize.js +37 -17
- package/dist/pipeline/steps/authorize.js.map +1 -1
- package/dist/pipeline/steps/defaults.d.ts +10 -0
- package/dist/pipeline/steps/defaults.d.ts.map +1 -1
- package/dist/pipeline/steps/defaults.js +39 -0
- package/dist/pipeline/steps/defaults.js.map +1 -1
- package/dist/pipeline/steps/shapes.d.ts +18 -0
- package/dist/pipeline/steps/shapes.d.ts.map +1 -1
- package/dist/pipeline/steps/shapes.js +29 -0
- package/dist/pipeline/steps/shapes.js.map +1 -1
- package/dist/store/port-contract.d.ts +61 -0
- package/dist/store/port-contract.d.ts.map +1 -0
- package/dist/store/port-contract.js +67 -0
- package/dist/store/port-contract.js.map +1 -0
- package/package.json +4 -4
- package/src/boot/compose.ts +107 -10
- package/src/domain/iampolicy/__tests__/access-lists.test.ts +238 -0
- package/src/domain/iampolicy/__tests__/constants.test.ts +388 -0
- package/src/domain/iampolicy/__tests__/controller.test.ts +960 -0
- package/src/domain/iampolicy/__tests__/display-resolver.test.ts +138 -0
- package/src/domain/iampolicy/__tests__/grant-path.test.ts +474 -0
- package/src/domain/iampolicy/__tests__/grant-scope.test.ts +61 -0
- package/src/domain/iampolicy/__tests__/iampolicy.test.ts +532 -0
- package/src/domain/iampolicy/__tests__/membership.test.ts +447 -0
- package/src/domain/iampolicy/__tests__/permissions.test.ts +41 -0
- package/src/domain/iampolicy/__tests__/resource-store.test.ts +165 -0
- package/src/domain/iampolicy/__tests__/role-lifecycle.test.ts +361 -0
- package/src/domain/iampolicy/__tests__/roles.test.ts +53 -0
- package/src/domain/iampolicy/__tests__/specs.test.ts +41 -0
- package/src/domain/iampolicy/__tests__/steps.test.ts +278 -0
- package/src/domain/iampolicy/__tests__/support.ts +195 -0
- package/src/domain/iampolicy/__tests__/wire-refusals.test.ts +117 -0
- package/src/domain/iampolicy/access-lists.ts +191 -0
- package/src/domain/iampolicy/constants.ts +243 -0
- package/src/domain/iampolicy/controller.ts +798 -0
- package/src/domain/iampolicy/display-resolver.ts +123 -0
- package/src/domain/iampolicy/grant-path.ts +270 -0
- package/src/domain/iampolicy/grant-scope.ts +36 -0
- package/src/domain/iampolicy/membership.ts +298 -0
- package/src/domain/iampolicy/permissions.ts +35 -0
- package/src/domain/iampolicy/resource-store.ts +186 -0
- package/src/domain/iampolicy/role-lifecycle.ts +132 -0
- package/src/domain/iampolicy/roles.ts +95 -0
- package/src/domain/iampolicy/specs.ts +53 -0
- package/src/domain/iampolicy/steps.ts +178 -0
- package/src/domain/iampolicy/store-contract.ts +450 -0
- package/src/domain/iampolicy/store.ts +103 -0
- package/src/domain/iampolicy/wire-refusals.ts +110 -0
- package/src/domain/identityaccount/__tests__/provisioning.test.ts +19 -7
- package/src/domain/identityaccount/__tests__/resolve.test.ts +113 -2
- package/src/domain/identityaccount/constants.ts +16 -31
- package/src/domain/identityaccount/controller.ts +65 -35
- package/src/domain/identityaccount/operator.ts +5 -5
- package/src/domain/identityaccount/provisioning.ts +43 -5
- package/src/domain/identityaccount/resolve.ts +43 -0
- package/src/domain/identityaccount/store-contract.ts +22 -70
- package/src/extensions/__tests__/composed-support.ts +87 -0
- package/src/extensions/__tests__/iam-policy-composed.test.ts +373 -0
- package/src/extensions/__tests__/iam-policy-points.test.ts +169 -0
- package/src/extensions/__tests__/identity-account-composed.test.ts +12 -78
- package/src/extensions/__tests__/identity.test.ts +62 -0
- package/src/extensions/__tests__/list-read-scope.test.ts +138 -0
- package/src/extensions/__tests__/tier-truthfulness.test.ts +8 -0
- package/src/extensions/authorization-queries.ts +97 -0
- package/src/extensions/drivers.ts +49 -2
- package/src/extensions/identity.ts +21 -0
- package/src/extensions/list-read-scope.ts +87 -9
- package/src/extensions/policy-grant-scope.ts +50 -0
- package/src/extensions/registry.ts +62 -1
- package/src/extensions/resource-authorization.ts +65 -0
- package/src/index.ts +20 -0
- package/src/pipeline/__tests__/grantable-roles-for.test.ts +87 -0
- package/src/pipeline/__tests__/inherited-authorization-parent.test.ts +51 -0
- package/src/pipeline/__tests__/kind-by-enum-name.test.ts +107 -0
- package/src/pipeline/__tests__/kind-served-by-edition.test.ts +107 -0
- package/src/pipeline/apiresource-meta.ts +218 -1
- package/src/pipeline/interceptors/auth.ts +14 -1
- package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +73 -3
- package/src/pipeline/steps/__tests__/authorize.test.ts +134 -9
- package/src/pipeline/steps/__tests__/derived-id.test.ts +49 -0
- package/src/pipeline/steps/authorization-tuples.ts +7 -28
- package/src/pipeline/steps/authorize.ts +46 -21
- package/src/pipeline/steps/defaults.ts +42 -0
- package/src/pipeline/steps/shapes.ts +31 -0
- package/src/store/__tests__/port-contract.test.ts +123 -0
- package/src/store/port-contract.ts +102 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IamPolicy domain constants (20260913.01, T01_0_plan.md §3a;
|
|
3
|
+
* T01_1_review.md Q-OR-6b, Q-OR-9; slice 2 ruling Q-S2-1): the derived
|
|
4
|
+
* policy id and the one spelling of a triple it hashes, the kinds the
|
|
5
|
+
* legacy-creator rule scans, and the byte-pinned wire copy.
|
|
6
|
+
*
|
|
7
|
+
* The derived id (Q-OR-9). A policy's id is a pure function of its triple:
|
|
8
|
+
* `iamp_` + `derivedId` (pipeline/steps/defaults.ts, the encoder shared
|
|
9
|
+
* with the identity account) over the triple's canonical text. The text
|
|
10
|
+
* IS the tuple notation the contract's own comment documents
|
|
11
|
+
* (`principal.kind:principal.id#principal.relation@resource.kind:resource.id#relation`,
|
|
12
|
+
* spec.proto), the principal's `#` present even when its qualifier is
|
|
13
|
+
* empty, so the natural key has one spelling and the primary key is the
|
|
14
|
+
* one home of "one row per triple" in open source: two concurrent grants
|
|
15
|
+
* converge by primary key with no secondary index and no scan. The golden
|
|
16
|
+
* vectors in __tests__/constants.test.ts are wire-adjacent contract: a
|
|
17
|
+
* change here re-addresses every policy open source ever wrote.
|
|
18
|
+
*
|
|
19
|
+
* The text's one weakness (Q-S2-1): `ApiResourceRef` fields carry no
|
|
20
|
+
* character pattern, so an id or relation holding one of the three
|
|
21
|
+
* delimiters could spell another triple's text (`a#b` with an empty
|
|
22
|
+
* qualifier and `a` with qualifier `b#` read alike). `malformedTripleField`
|
|
23
|
+
* names such a field; `policyIdFor` refuses to hash such a spec; the grant
|
|
24
|
+
* path turns the same check into INVALID_ARGUMENT before any read or write.
|
|
25
|
+
* No legitimate reference carries a delimiter: every kind is an enum member
|
|
26
|
+
* name, every id a `prefix_ulid`, a slug or the public wildcard `*`, every
|
|
27
|
+
* relation an FGA relation name — and OpenFGA itself rejects `:` and `#`
|
|
28
|
+
* in ids, so the cloud loses nothing it could ever have written.
|
|
29
|
+
*
|
|
30
|
+
* `BLUEPRINT_KINDS` (Q-OR-6b) is the legacy-creator rule's whole scan: the
|
|
31
|
+
* kinds an admin authors. Sessions, executions, keys and memories are
|
|
32
|
+
* personal and stay with their creator by DD-002 rule 2; they never appear
|
|
33
|
+
* here.
|
|
34
|
+
*
|
|
35
|
+
* The copy moved from the cloud's iam/policy/handlers.ts as-is: the CLI,
|
|
36
|
+
* console and SDK show these sentences verbatim, so they are contract. The
|
|
37
|
+
* new sentences are the two edition refusals (the federation shape), the
|
|
38
|
+
* unknown permission, the unknown principal kind (the resource sentence's
|
|
39
|
+
* shape) and the malformed triple.
|
|
40
|
+
*/
|
|
41
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
42
|
+
import { kindEnumName } from "../../pipeline/apiresource-meta.js";
|
|
43
|
+
import { derivedId } from "../../pipeline/steps/defaults.js";
|
|
44
|
+
/** The kind's id prefix (kind_meta `iam_policy.id_prefix`). */
|
|
45
|
+
export const POLICY_ID_PREFIX = "iamp";
|
|
46
|
+
/**
|
|
47
|
+
* The proto's `api_version` const (api.proto). The cloud's Java-era rows
|
|
48
|
+
* carry `iam.stigmer.com/v1` and are read as they are (Q-OR-9); every row
|
|
49
|
+
* this domain writes carries the contract's value.
|
|
50
|
+
*/
|
|
51
|
+
export const IAM_POLICY_API_VERSION = "iam.stigmer.ai/v1";
|
|
52
|
+
export const IAM_POLICY_KIND = "IamPolicy";
|
|
53
|
+
/** The three characters the canonical text is built from; none may appear inside a field. */
|
|
54
|
+
export const TRIPLE_DELIMITERS = [":", "#", "@"];
|
|
55
|
+
function completeTriple(spec) {
|
|
56
|
+
if (spec.principal === undefined || spec.resource === undefined) {
|
|
57
|
+
throw new Error("policy spec must carry principal and resource");
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
principal: spec.principal,
|
|
61
|
+
resource: spec.resource,
|
|
62
|
+
relation: spec.relation,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The proto's tuple notation, the one spelling of a triple:
|
|
67
|
+
* `principal.kind:principal.id#principal.relation@resource.kind:resource.id#relation`.
|
|
68
|
+
* The principal's `#` is always present (an empty qualifier reads `#@`),
|
|
69
|
+
* so the same triple never has two texts.
|
|
70
|
+
*/
|
|
71
|
+
export function canonicalTripleText(spec) {
|
|
72
|
+
const { principal, resource, relation } = completeTriple(spec);
|
|
73
|
+
return `${principal.kind}:${principal.id}#${principal.relation}@${resource.kind}:${resource.id}#${relation}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The first field, in the text's order, holding a delimiter — or
|
|
77
|
+
* `undefined` for a well-formed triple. Named in the proto's field paths so
|
|
78
|
+
* a refusal tells the caller exactly what to fix. Total over a spec
|
|
79
|
+
* missing a reference: that is `completeTriple`'s refusal, not this one.
|
|
80
|
+
*/
|
|
81
|
+
export function malformedTripleField(spec) {
|
|
82
|
+
const fields = [
|
|
83
|
+
["principal.kind", spec.principal?.kind ?? ""],
|
|
84
|
+
["principal.id", spec.principal?.id ?? ""],
|
|
85
|
+
["principal.relation", spec.principal?.relation ?? ""],
|
|
86
|
+
["resource.kind", spec.resource?.kind ?? ""],
|
|
87
|
+
["resource.id", spec.resource?.id ?? ""],
|
|
88
|
+
["relation", spec.relation],
|
|
89
|
+
];
|
|
90
|
+
for (const [path, value] of fields) {
|
|
91
|
+
if (TRIPLE_DELIMITERS.some((delimiter) => value.includes(delimiter))) {
|
|
92
|
+
return path;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The derived policy id of a triple. Pure; refuses a spec missing either
|
|
99
|
+
* reference (a triple is the whole key) and a spec whose text would be
|
|
100
|
+
* ambiguous (Q-S2-1) — both are the assert behind the grant path's gate,
|
|
101
|
+
* which is where a caller hears INVALID_ARGUMENT.
|
|
102
|
+
*/
|
|
103
|
+
export function policyIdFor(spec) {
|
|
104
|
+
const text = canonicalTripleText(spec);
|
|
105
|
+
const malformed = malformedTripleField(spec);
|
|
106
|
+
if (malformed !== undefined) {
|
|
107
|
+
throw new Error(malformedTripleMessage(malformed));
|
|
108
|
+
}
|
|
109
|
+
return derivedId(POLICY_ID_PREFIX, text);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The kinds an admin authors — the legacy-creator rule's scan (Q-OR-6b),
|
|
113
|
+
* in registry order. A caller who created one of these idp-shaped, before
|
|
114
|
+
* an account existed, becomes admin on first sign-in.
|
|
115
|
+
*/
|
|
116
|
+
export const BLUEPRINT_KINDS = [
|
|
117
|
+
ApiResourceKind.agent,
|
|
118
|
+
ApiResourceKind.workflow,
|
|
119
|
+
ApiResourceKind.skill,
|
|
120
|
+
ApiResourceKind.mcp_server,
|
|
121
|
+
ApiResourceKind.environment,
|
|
122
|
+
ApiResourceKind.schedule,
|
|
123
|
+
];
|
|
124
|
+
/**
|
|
125
|
+
* The principal kinds a PERSON may grant a role to — the user `create`
|
|
126
|
+
* lane's grantee vocabulary (2026-09-14, session 9 ruling Q-S9-2; the
|
|
127
|
+
* security read's finding 41). A role names a person, so the one grantee
|
|
128
|
+
* is the identity account. A row whose principal is a RESOURCE
|
|
129
|
+
* (`organization:A#organization@platform_client:X`, `#managed_org`) is a
|
|
130
|
+
* structural link, and structural links are `bootstrapPolicy`'s — the
|
|
131
|
+
* platform's own lane, which skips role validation by design.
|
|
132
|
+
*
|
|
133
|
+
* Why the rule is load-bearing: the read side treats every principal
|
|
134
|
+
* outside this vocabulary as a structural parent (`findScopeTuple`,
|
|
135
|
+
* resource-store.ts, which derives its exclusion FROM this constant so the
|
|
136
|
+
* two cannot drift), and the hierarchy walk follows it. Without the arm, a
|
|
137
|
+
* person with `can_grant_access` on organization B could write
|
|
138
|
+
* `organization:A#member@organization:B` and B's Members page, asked for
|
|
139
|
+
* inherited access, would list A's people. The cloud's `create` had the
|
|
140
|
+
* same gap; the store's exclusion also keeps the cloud's Java-era `team`,
|
|
141
|
+
* which is not an ApiResourceKind and so no wire spec can name.
|
|
142
|
+
*/
|
|
143
|
+
export const USER_GRANT_PRINCIPAL_KINDS = [
|
|
144
|
+
ApiResourceKind.identity_account,
|
|
145
|
+
];
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Byte-pinned copy (the cloud handlers' sentences, moved as-is).
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
/** get on a missing policy (NOT_FOUND). */
|
|
150
|
+
export function policyNotFoundMessage(id) {
|
|
151
|
+
return `IAM policy not found: ${id}`;
|
|
152
|
+
}
|
|
153
|
+
/** A grant on a kind whose kind_meta lists no grantable roles (INVALID_ARGUMENT, every edition). */
|
|
154
|
+
export function noGrantableRolesMessage(kind) {
|
|
155
|
+
return `No roles can be granted on resource kind '${kind}'. Role assignments for this resource kind are system-managed.`;
|
|
156
|
+
}
|
|
157
|
+
/** A role the kind does not list (INVALID_ARGUMENT); the grantable list in kind_meta order. */
|
|
158
|
+
export function roleNotGrantableMessage(role, kind, grantable) {
|
|
159
|
+
return `Role '${role}' cannot be granted on resource kind '${kind}'. Grantable roles: [${grantable.join(", ")}]`;
|
|
160
|
+
}
|
|
161
|
+
/** checkMyPermission for a caller with no identity (UNAUTHENTICATED). */
|
|
162
|
+
export const AUTHENTICATION_REQUIRED_MESSAGE = "Authentication required to check permissions";
|
|
163
|
+
/**
|
|
164
|
+
* A spec whose resource kind is not an ApiResourceKind member name
|
|
165
|
+
* (INVALID_ARGUMENT; the cloud's `kindFromSpecString` sentence). The grant
|
|
166
|
+
* path is where a permissive Authorizer's caller hears it; an enforcing
|
|
167
|
+
* Authorizer denies the unknown kind at position 1 first (slice 1, ruling 2).
|
|
168
|
+
*/
|
|
169
|
+
export function unknownResourceKindMessage(kind) {
|
|
170
|
+
return `Unknown resource kind: '${kind}'`;
|
|
171
|
+
}
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// New copy (this entry's refusals).
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
/**
|
|
176
|
+
* A grant on a kind outside the composed grant scope (UNIMPLEMENTED) — the
|
|
177
|
+
* federation and kind-registry degrade-by-probe posture: the sentence a
|
|
178
|
+
* person can act on, naming the editions that serve it.
|
|
179
|
+
*/
|
|
180
|
+
export const PER_RESOURCE_GRANTS_UNIMPLEMENTED_MESSAGE = "per-resource access grants are served by the Enterprise and Cloud editions";
|
|
181
|
+
/** The tuple-half queries on a composition without an AuthorizationQueryEngine (UNIMPLEMENTED). */
|
|
182
|
+
export const AUTHORIZATION_QUERIES_UNIMPLEMENTED_MESSAGE = "authorization queries are served by the Enterprise and Cloud editions";
|
|
183
|
+
/** checkMyPermission with a relation that is no IamPermission name (INVALID_ARGUMENT). */
|
|
184
|
+
export function unknownPermissionMessage(relation) {
|
|
185
|
+
return `unknown permission '${relation}'`;
|
|
186
|
+
}
|
|
187
|
+
/** A spec whose principal kind is not an ApiResourceKind member name (INVALID_ARGUMENT). */
|
|
188
|
+
export function unknownPrincipalKindMessage(kind) {
|
|
189
|
+
return `Unknown principal kind: '${kind}'`;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* A user grant whose principal is not a person (INVALID_ARGUMENT; Q-S9-2),
|
|
193
|
+
* in the role sentence's shape: the offending kind, then the vocabulary.
|
|
194
|
+
*/
|
|
195
|
+
export function principalNotGrantableMessage(kind) {
|
|
196
|
+
const grantable = USER_GRANT_PRINCIPAL_KINDS.map((k) => kindEnumName(k));
|
|
197
|
+
return `Principal kind '${kind}' cannot be granted a role. Grantable principal kinds: [${grantable.join(", ")}]`;
|
|
198
|
+
}
|
|
199
|
+
/** A triple field holding a canonical-text delimiter (INVALID_ARGUMENT; Q-S2-1). */
|
|
200
|
+
export function malformedTripleMessage(field) {
|
|
201
|
+
return `policy ${field} must not contain ':', '#' or '@'`;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/domain/iampolicy/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAMtH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAE3C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,iBAAiB,GAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AASxE,SAAS,cAAc,CAAC,IAAmB;IACzC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAmB;IACrD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC;AAC/G,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACtD,MAAM,MAAM,GAA0D;QACpE,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC;QACtD,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAC5C,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;KAC5B,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC7D,eAAe,CAAC,KAAK;IACrB,eAAe,CAAC,QAAQ;IACxB,eAAe,CAAC,KAAK;IACrB,eAAe,CAAC,UAAU;IAC1B,eAAe,CAAC,WAAW;IAC3B,eAAe,CAAC,QAAQ;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAmC;IACxE,eAAe,CAAC,gBAAgB;CACjC,CAAC;AAEF,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,2CAA2C;AAC3C,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,yBAAyB,EAAE,EAAE,CAAC;AACvC,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,6CAA6C,IAAI,gEAAgE,CAAC;AAC3H,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,IAAY,EACZ,SAAgC;IAEhC,OAAO,SAAS,IAAI,yCAAyC,IAAI,wBAAwB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACnH,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,8CAA8C,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,2BAA2B,IAAI,GAAG,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,yCAAyC,GACpD,4EAA4E,CAAC;AAE/E,mGAAmG;AACnG,MAAM,CAAC,MAAM,2CAA2C,GACtD,uEAAuE,CAAC;AAE1E,0FAA0F;AAC1F,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,OAAO,uBAAuB,QAAQ,GAAG,CAAC;AAC5C,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,OAAO,4BAA4B,IAAI,GAAG,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAY;IACvD,MAAM,SAAS,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,mBAAmB,IAAI,2DAA2D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACnH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,OAAO,UAAU,KAAK,mCAAmC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ConnectRouter } from "@connectrpc/connect";
|
|
2
|
+
import type { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
|
|
3
|
+
import type { Logger } from "../../boot/logger.js";
|
|
4
|
+
import type { AuthorizationQueryEngine } from "../../extensions/authorization-queries.js";
|
|
5
|
+
import type { Authorizer } from "../../extensions/authorizer.js";
|
|
6
|
+
import type { PolicyGrantScope } from "../../extensions/policy-grant-scope.js";
|
|
7
|
+
import type { AccountsByCaller } from "../identityaccount/resolve.js";
|
|
8
|
+
import type { AccountsByIds } from "./display-resolver.js";
|
|
9
|
+
import type { IamPolicyGrantPath } from "./grant-path.js";
|
|
10
|
+
import type { IamPolicyStore } from "./store.js";
|
|
11
|
+
/** The reads this controller makes of the identity-account port: the caller's account and display enrichment. */
|
|
12
|
+
export type IamPolicyAccounts = AccountsByCaller & AccountsByIds;
|
|
13
|
+
export interface IamPolicyControllerDeps {
|
|
14
|
+
readonly grantPath: IamPolicyGrantPath;
|
|
15
|
+
readonly policies: IamPolicyStore;
|
|
16
|
+
readonly accounts: IamPolicyAccounts;
|
|
17
|
+
/** The ONE composed Authorizer — position 1 of every chain and every direct handler's `authorizeDirect`. */
|
|
18
|
+
readonly authorizer: Authorizer;
|
|
19
|
+
/** The composed grant scope, or open source's organization-only default (compose.ts installs it at the `??` site). */
|
|
20
|
+
readonly grantScope: PolicyGrantScope;
|
|
21
|
+
/** The composed query engine — undefined = the tuple-half RPCs refuse UNIMPLEMENTED. */
|
|
22
|
+
readonly queries: AuthorizationQueryEngine | undefined;
|
|
23
|
+
/** The served edition — `checkMyPermission`'s first arm reads a kind's tier against it. */
|
|
24
|
+
readonly edition: ServerEdition;
|
|
25
|
+
readonly logger: Logger;
|
|
26
|
+
}
|
|
27
|
+
/** Registers both IamPolicy services on the router (routes stage). */
|
|
28
|
+
export declare function registerIamPolicyServices(router: ConnectRouter, deps: IamPolicyControllerDeps): void;
|
|
29
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/domain/iampolicy/controller.ts"],"names":[],"mappings":"AAgGA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,qBAAqB,CAAC;AAqCzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAE3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAmB/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAStE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAe1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,iHAAiH;AACjH,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAEjE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,4GAA4G;IAC5G,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,sHAAsH;IACtH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACvD,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,sEAAsE;AACtE,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,uBAAuB,GAC5B,IAAI,CA0CN"}
|