@vantageos/cloud-identity 0.4.0 → 0.5.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/CHANGELOG.md +24 -0
- package/dist/scope-filter.d.ts +54 -3
- package/dist/scope-filter.d.ts.map +1 -1
- package/dist/scope-filter.js +58 -5
- package/dist/scope-filter.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,30 @@
|
|
|
3
3
|
All notable changes to `@vantageos/cloud-identity` are documented here.
|
|
4
4
|
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
5
5
|
|
|
6
|
+
## [0.5.0]
|
|
7
|
+
|
|
8
|
+
**Additive — grant-aware scope filter.** Closes the other pole of the
|
|
9
|
+
fail-closed defect class: 0.3.0/0.4.0 closed "a right granted by ABSENCE"
|
|
10
|
+
(missing `oauthCtx` silently passing everything); this closes "a right
|
|
11
|
+
REFUSED by absence" — a per-row grant (a named mission agent/pilot, a
|
|
12
|
+
mandate's `fulfilledBy`) that IS present on the row but that
|
|
13
|
+
`passesScopeFilter`/`scopeFilterList`/`scopeFilterGet` were structurally
|
|
14
|
+
blind to, because they only ever consulted `createdBy`/`namespace`.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- `passesScopeFilter`, `scopeFilterList`, `scopeFilterGet` (`src/scope-filter.ts`)
|
|
19
|
+
now accept an optional `grantFields: readonly string[]` parameter, defaulting
|
|
20
|
+
to `[]`. Each entry names a property on the row that the CALLER declares as
|
|
21
|
+
a per-row grant — the field's runtime value is treated as a single identity
|
|
22
|
+
(`string`, equality match) or multiple identities (`string[]`, any-element
|
|
23
|
+
match) against `oauthCtx.fromAllowList`. The package never hardcodes which
|
|
24
|
+
fields are grants for which table; that declaration is caller-supplied data.
|
|
25
|
+
- **Fail-closed regression preserved byte-for-byte:** omitting `grantFields`
|
|
26
|
+
(or passing `[]`) reproduces 0.4.0 behaviour exactly — this is a pure
|
|
27
|
+
widening, no existing caller's behaviour changes without an explicit
|
|
28
|
+
opt-in declaration at its own call site.
|
|
29
|
+
|
|
6
30
|
## [0.4.0]
|
|
7
31
|
|
|
8
32
|
**Additive.** Two new primitives so one identity layer covers both deployment
|
package/dist/scope-filter.d.ts
CHANGED
|
@@ -5,6 +5,31 @@
|
|
|
5
5
|
* implementation; the only change was replacing a framework-specific context
|
|
6
6
|
* type with the framework-agnostic `OAuthCtx` from `./types`.
|
|
7
7
|
*
|
|
8
|
+
* Contract (0.5.0 — additive, widening only, vs. 0.4.0):
|
|
9
|
+
* - Every exported predicate/filter now accepts an OPTIONAL `grantFields`
|
|
10
|
+
* parameter: `readonly string[]`, defaulting to `[]`. Each entry names a
|
|
11
|
+
* property on the row that the CALLER declares as a per-row grant (e.g.
|
|
12
|
+
* "agents", "pilot", "fulfilledBy"). The package never hardcodes which
|
|
13
|
+
* fields are grants for which table — that declaration is data supplied
|
|
14
|
+
* by the caller at the call site, not business knowledge baked into this
|
|
15
|
+
* shared module (no-hardcoded-business-knowledge).
|
|
16
|
+
* - A row passes for a non-master caller if createdBy/namespace already
|
|
17
|
+
* passed (0.4.0 behaviour, unchanged) OR if ANY declared grant field's
|
|
18
|
+
* value names an identity in `oauthCtx.fromAllowList` — the field may be
|
|
19
|
+
* a single string (e.g. "pilot") or a string[] (e.g. "agents"): a string
|
|
20
|
+
* value matches by equality, an array value matches if any element is in
|
|
21
|
+
* `fromAllowList`.
|
|
22
|
+
* - `grantFields` defaulting to `[]` means a caller that declares NO grants
|
|
23
|
+
* gets EXACTLY the 0.4.0 behaviour, byte-for-byte — this is a pure
|
|
24
|
+
* widening, no existing caller's behaviour changes without an explicit
|
|
25
|
+
* opt-in declaration at its own call site.
|
|
26
|
+
* - This closes the OTHER pole of the fail-closed defect: 0.3.0/0.4.0
|
|
27
|
+
* closed "a right granted by ABSENCE" (missing oauthCtx silently passing
|
|
28
|
+
* everything); this closes "a right REFUSED by absence" — a grant that
|
|
29
|
+
* IS present on the row (a named agent, pilot, or fulfiller) but that the
|
|
30
|
+
* filter was structurally blind to because it only ever consulted
|
|
31
|
+
* createdBy/namespace.
|
|
32
|
+
*
|
|
8
33
|
* Contract (0.3.0 — BREAKING vs. 0.2.0):
|
|
9
34
|
* - `oauthCtx` is now MANDATORY. A right is never granted by absence: the
|
|
10
35
|
* 0.2.0 behaviour of `oauthCtx === undefined` silently passing everything
|
|
@@ -50,6 +75,18 @@ export type ScopeFilterable = {
|
|
|
50
75
|
* `fromAllowList` contains the `"*"` sentinel.
|
|
51
76
|
*/
|
|
52
77
|
export declare function isMasterScope(ctx: OAuthCtx): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Names of row properties the CALLER declares as per-row grants. Each named
|
|
80
|
+
* property's runtime value must be a `string` (single identity) or
|
|
81
|
+
* `string[]` (multiple identities) to be consulted — any other runtime shape
|
|
82
|
+
* is silently skipped (not a match), never thrown, since these are duck-typed
|
|
83
|
+
* against arbitrary Convex documents.
|
|
84
|
+
*
|
|
85
|
+
* This is DATA supplied by the call site, never a list hardcoded inside this
|
|
86
|
+
* package: the package does not and must not know that "agents" means
|
|
87
|
+
* missions or "fulfilledBy" means mandates.
|
|
88
|
+
*/
|
|
89
|
+
export type GrantFieldDeclaration = readonly string[];
|
|
53
90
|
/**
|
|
54
91
|
* Core predicate. Returns true when the row is visible to the caller.
|
|
55
92
|
*
|
|
@@ -57,6 +94,9 @@ export declare function isMasterScope(ctx: OAuthCtx): boolean;
|
|
|
57
94
|
* - row.createdBy ∈ oauthCtx.fromAllowList → true
|
|
58
95
|
* - row.namespace === prefix OR startsWith prefix+'/'
|
|
59
96
|
* for any prefix ∈ oauthCtx.namespaceReadPrefixes → true
|
|
97
|
+
* - row[grantField] (for any declared grantField) names an identity in
|
|
98
|
+
* oauthCtx.fromAllowList, where the field is a string (equality) or a
|
|
99
|
+
* string[] (any-element membership) → true
|
|
60
100
|
* - otherwise → false
|
|
61
101
|
*
|
|
62
102
|
* `oauthCtx` is mandatory (see module-level contract note above): an omitted
|
|
@@ -64,21 +104,32 @@ export declare function isMasterScope(ctx: OAuthCtx): boolean;
|
|
|
64
104
|
* need the old legacy-bearer wildcard behaviour must pass `LEGACY_WILDCARD_CTX`
|
|
65
105
|
* explicitly.
|
|
66
106
|
*
|
|
107
|
+
* `grantFields` (0.5.0, optional, defaults to `[]`) lets a caller widen the
|
|
108
|
+
* predicate for its own table without this package hardcoding which fields
|
|
109
|
+
* are grants — see the module-level 0.5.0 contract note above. Omitting it
|
|
110
|
+
* (or passing `[]`) reproduces 0.4.0 behaviour exactly.
|
|
111
|
+
*
|
|
67
112
|
* Substring matches that don't fall on a '/' boundary are explicitly rejected
|
|
68
113
|
* (e.g. namespace="orchestrator/alphabet" does NOT match prefix
|
|
69
114
|
* "orchestrator/alpha"). This avoids the classic prefix-isolation bypass.
|
|
70
115
|
*/
|
|
71
|
-
export declare function passesScopeFilter(oauthCtx: OAuthCtx, row:
|
|
116
|
+
export declare function passesScopeFilter<T extends ScopeFilterable>(oauthCtx: OAuthCtx, row: T, grantFields?: GrantFieldDeclaration): boolean;
|
|
72
117
|
/**
|
|
73
118
|
* Filter a list of rows (post-query). Used by list_* tools.
|
|
119
|
+
*
|
|
120
|
+
* `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
|
|
121
|
+
* behaviour).
|
|
74
122
|
*/
|
|
75
|
-
export declare function scopeFilterList<T extends ScopeFilterable>(oauthCtx: OAuthCtx, rows: T[]): T[];
|
|
123
|
+
export declare function scopeFilterList<T extends ScopeFilterable>(oauthCtx: OAuthCtx, rows: T[], grantFields?: GrantFieldDeclaration): T[];
|
|
76
124
|
/**
|
|
77
125
|
* Assert a single row passes (get_* tools). Returns the row when allowed, null
|
|
78
126
|
* otherwise — callers translate null to a 404-equivalent "not found" MCP error
|
|
79
127
|
* to avoid leaking the difference between "absent" and "filtered out".
|
|
128
|
+
*
|
|
129
|
+
* `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
|
|
130
|
+
* behaviour).
|
|
80
131
|
*/
|
|
81
|
-
export declare function scopeFilterGet<T extends ScopeFilterable>(oauthCtx: OAuthCtx, row: T | null | undefined): T | null;
|
|
132
|
+
export declare function scopeFilterGet<T extends ScopeFilterable>(oauthCtx: OAuthCtx, row: T | null | undefined, grantFields?: GrantFieldDeclaration): T | null;
|
|
82
133
|
/**
|
|
83
134
|
* Helper for callers that want a single "is master / legacy" predicate.
|
|
84
135
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-filter.d.ts","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scope-filter.d.ts","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAKjC,CAAC;AAWF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAIpD;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,MAAM,EAAE,CAAC;AActD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzD,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,CAAC,EACN,WAAW,GAAE,qBAAuC,GACnD,OAAO,CAgBT;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,eAAe,EACvD,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,EAAE,EACT,WAAW,GAAE,qBAAuC,GACnD,CAAC,EAAE,CAGL;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,eAAe,EACtD,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzB,WAAW,GAAE,qBAAuC,GACnD,CAAC,GAAG,IAAI,CAIV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAGtD"}
|
package/dist/scope-filter.js
CHANGED
|
@@ -5,6 +5,31 @@
|
|
|
5
5
|
* implementation; the only change was replacing a framework-specific context
|
|
6
6
|
* type with the framework-agnostic `OAuthCtx` from `./types`.
|
|
7
7
|
*
|
|
8
|
+
* Contract (0.5.0 — additive, widening only, vs. 0.4.0):
|
|
9
|
+
* - Every exported predicate/filter now accepts an OPTIONAL `grantFields`
|
|
10
|
+
* parameter: `readonly string[]`, defaulting to `[]`. Each entry names a
|
|
11
|
+
* property on the row that the CALLER declares as a per-row grant (e.g.
|
|
12
|
+
* "agents", "pilot", "fulfilledBy"). The package never hardcodes which
|
|
13
|
+
* fields are grants for which table — that declaration is data supplied
|
|
14
|
+
* by the caller at the call site, not business knowledge baked into this
|
|
15
|
+
* shared module (no-hardcoded-business-knowledge).
|
|
16
|
+
* - A row passes for a non-master caller if createdBy/namespace already
|
|
17
|
+
* passed (0.4.0 behaviour, unchanged) OR if ANY declared grant field's
|
|
18
|
+
* value names an identity in `oauthCtx.fromAllowList` — the field may be
|
|
19
|
+
* a single string (e.g. "pilot") or a string[] (e.g. "agents"): a string
|
|
20
|
+
* value matches by equality, an array value matches if any element is in
|
|
21
|
+
* `fromAllowList`.
|
|
22
|
+
* - `grantFields` defaulting to `[]` means a caller that declares NO grants
|
|
23
|
+
* gets EXACTLY the 0.4.0 behaviour, byte-for-byte — this is a pure
|
|
24
|
+
* widening, no existing caller's behaviour changes without an explicit
|
|
25
|
+
* opt-in declaration at its own call site.
|
|
26
|
+
* - This closes the OTHER pole of the fail-closed defect: 0.3.0/0.4.0
|
|
27
|
+
* closed "a right granted by ABSENCE" (missing oauthCtx silently passing
|
|
28
|
+
* everything); this closes "a right REFUSED by absence" — a grant that
|
|
29
|
+
* IS present on the row (a named agent, pilot, or fulfiller) but that the
|
|
30
|
+
* filter was structurally blind to because it only ever consulted
|
|
31
|
+
* createdBy/namespace.
|
|
32
|
+
*
|
|
8
33
|
* Contract (0.3.0 — BREAKING vs. 0.2.0):
|
|
9
34
|
* - `oauthCtx` is now MANDATORY. A right is never granted by absence: the
|
|
10
35
|
* 0.2.0 behaviour of `oauthCtx === undefined` silently passing everything
|
|
@@ -57,6 +82,15 @@ export function isMasterScope(ctx) {
|
|
|
57
82
|
return true;
|
|
58
83
|
return ctx.fromAllowList.includes("*");
|
|
59
84
|
}
|
|
85
|
+
const NO_GRANT_FIELDS = [];
|
|
86
|
+
function grantFieldMatches(value, fromAllowList) {
|
|
87
|
+
if (typeof value === "string")
|
|
88
|
+
return fromAllowList.includes(value);
|
|
89
|
+
if (Array.isArray(value)) {
|
|
90
|
+
return value.some((entry) => typeof entry === "string" && fromAllowList.includes(entry));
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
60
94
|
/**
|
|
61
95
|
* Core predicate. Returns true when the row is visible to the caller.
|
|
62
96
|
*
|
|
@@ -64,6 +98,9 @@ export function isMasterScope(ctx) {
|
|
|
64
98
|
* - row.createdBy ∈ oauthCtx.fromAllowList → true
|
|
65
99
|
* - row.namespace === prefix OR startsWith prefix+'/'
|
|
66
100
|
* for any prefix ∈ oauthCtx.namespaceReadPrefixes → true
|
|
101
|
+
* - row[grantField] (for any declared grantField) names an identity in
|
|
102
|
+
* oauthCtx.fromAllowList, where the field is a string (equality) or a
|
|
103
|
+
* string[] (any-element membership) → true
|
|
67
104
|
* - otherwise → false
|
|
68
105
|
*
|
|
69
106
|
* `oauthCtx` is mandatory (see module-level contract note above): an omitted
|
|
@@ -71,11 +108,16 @@ export function isMasterScope(ctx) {
|
|
|
71
108
|
* need the old legacy-bearer wildcard behaviour must pass `LEGACY_WILDCARD_CTX`
|
|
72
109
|
* explicitly.
|
|
73
110
|
*
|
|
111
|
+
* `grantFields` (0.5.0, optional, defaults to `[]`) lets a caller widen the
|
|
112
|
+
* predicate for its own table without this package hardcoding which fields
|
|
113
|
+
* are grants — see the module-level 0.5.0 contract note above. Omitting it
|
|
114
|
+
* (or passing `[]`) reproduces 0.4.0 behaviour exactly.
|
|
115
|
+
*
|
|
74
116
|
* Substring matches that don't fall on a '/' boundary are explicitly rejected
|
|
75
117
|
* (e.g. namespace="orchestrator/alphabet" does NOT match prefix
|
|
76
118
|
* "orchestrator/alpha"). This avoids the classic prefix-isolation bypass.
|
|
77
119
|
*/
|
|
78
|
-
export function passesScopeFilter(oauthCtx, row) {
|
|
120
|
+
export function passesScopeFilter(oauthCtx, row, grantFields = NO_GRANT_FIELDS) {
|
|
79
121
|
assertOauthCtx(oauthCtx);
|
|
80
122
|
if (isMasterScope(oauthCtx))
|
|
81
123
|
return true;
|
|
@@ -90,25 +132,36 @@ export function passesScopeFilter(oauthCtx, row) {
|
|
|
90
132
|
return true;
|
|
91
133
|
}
|
|
92
134
|
}
|
|
135
|
+
for (const field of grantFields) {
|
|
136
|
+
const value = row[field];
|
|
137
|
+
if (grantFieldMatches(value, oauthCtx.fromAllowList))
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
93
140
|
return false;
|
|
94
141
|
}
|
|
95
142
|
/**
|
|
96
143
|
* Filter a list of rows (post-query). Used by list_* tools.
|
|
144
|
+
*
|
|
145
|
+
* `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
|
|
146
|
+
* behaviour).
|
|
97
147
|
*/
|
|
98
|
-
export function scopeFilterList(oauthCtx, rows) {
|
|
148
|
+
export function scopeFilterList(oauthCtx, rows, grantFields = NO_GRANT_FIELDS) {
|
|
99
149
|
assertOauthCtx(oauthCtx);
|
|
100
|
-
return rows.filter((r) => passesScopeFilter(oauthCtx, r));
|
|
150
|
+
return rows.filter((r) => passesScopeFilter(oauthCtx, r, grantFields));
|
|
101
151
|
}
|
|
102
152
|
/**
|
|
103
153
|
* Assert a single row passes (get_* tools). Returns the row when allowed, null
|
|
104
154
|
* otherwise — callers translate null to a 404-equivalent "not found" MCP error
|
|
105
155
|
* to avoid leaking the difference between "absent" and "filtered out".
|
|
156
|
+
*
|
|
157
|
+
* `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
|
|
158
|
+
* behaviour).
|
|
106
159
|
*/
|
|
107
|
-
export function scopeFilterGet(oauthCtx, row) {
|
|
160
|
+
export function scopeFilterGet(oauthCtx, row, grantFields = NO_GRANT_FIELDS) {
|
|
108
161
|
assertOauthCtx(oauthCtx);
|
|
109
162
|
if (row == null)
|
|
110
163
|
return null;
|
|
111
|
-
return passesScopeFilter(oauthCtx, row) ? row : null;
|
|
164
|
+
return passesScopeFilter(oauthCtx, row, grantFields) ? row : null;
|
|
112
165
|
}
|
|
113
166
|
/**
|
|
114
167
|
* Helper for callers that want a single "is master / legacy" predicate.
|
package/dist/scope-filter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-filter.js","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scope-filter.js","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED