@spinajs/authz-http-admin 0.0.0-stage → 3.0.1
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 +52 -2
- package/lib/cjs/config/authz-http-admin.d.ts +9 -0
- package/lib/cjs/config/authz-http-admin.d.ts.map +1 -0
- package/lib/cjs/config/authz-http-admin.js +16 -0
- package/lib/cjs/config/authz-http-admin.js.map +1 -0
- package/lib/cjs/controllers/AuthzAdminController.d.ts +249 -0
- package/lib/cjs/controllers/AuthzAdminController.d.ts.map +1 -0
- package/lib/cjs/controllers/AuthzAdminController.js +549 -0
- package/lib/cjs/controllers/AuthzAdminController.js.map +1 -0
- package/lib/cjs/index.d.ts +4 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +20 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +1 -0
- package/lib/cjs/routes/decode.d.ts +11 -0
- package/lib/cjs/routes/decode.d.ts.map +1 -0
- package/lib/cjs/routes/decode.js +53 -0
- package/lib/cjs/routes/decode.js.map +1 -0
- package/lib/cjs/routes/index.d.ts +4 -0
- package/lib/cjs/routes/index.d.ts.map +1 -0
- package/lib/cjs/routes/index.js +20 -0
- package/lib/cjs/routes/index.js.map +1 -0
- package/lib/cjs/routes/query.d.ts +16 -0
- package/lib/cjs/routes/query.d.ts.map +1 -0
- package/lib/cjs/routes/query.js +128 -0
- package/lib/cjs/routes/query.js.map +1 -0
- package/lib/cjs/routes/status.d.ts +6 -0
- package/lib/cjs/routes/status.d.ts.map +1 -0
- package/lib/cjs/routes/status.js +21 -0
- package/lib/cjs/routes/status.js.map +1 -0
- package/lib/cjs/schemas/bodies.d.ts +16 -0
- package/lib/cjs/schemas/bodies.d.ts.map +1 -0
- package/lib/cjs/schemas/bodies.js +39 -0
- package/lib/cjs/schemas/bodies.js.map +1 -0
- package/lib/cjs/schemas/commands.d.ts +9 -0
- package/lib/cjs/schemas/commands.d.ts.map +1 -0
- package/lib/cjs/schemas/commands.js +64 -0
- package/lib/cjs/schemas/commands.js.map +1 -0
- package/lib/cjs/schemas/document.d.ts +19 -0
- package/lib/cjs/schemas/document.d.ts.map +1 -0
- package/lib/cjs/schemas/document.js +76 -0
- package/lib/cjs/schemas/document.js.map +1 -0
- package/lib/cjs/schemas/index.d.ts +6 -0
- package/lib/cjs/schemas/index.d.ts.map +1 -0
- package/lib/cjs/schemas/index.js +21 -0
- package/lib/cjs/schemas/index.js.map +1 -0
- package/lib/cjs/schemas/primitives.d.ts +13 -0
- package/lib/cjs/schemas/primitives.d.ts.map +1 -0
- package/lib/cjs/schemas/primitives.js +29 -0
- package/lib/cjs/schemas/primitives.js.map +1 -0
- package/lib/cjs/schemas/provider.d.ts +13 -0
- package/lib/cjs/schemas/provider.d.ts.map +1 -0
- package/lib/cjs/schemas/provider.js +62 -0
- package/lib/cjs/schemas/provider.js.map +1 -0
- package/lib/mjs/config/authz-http-admin.d.ts +9 -0
- package/lib/mjs/config/authz-http-admin.d.ts.map +1 -0
- package/lib/mjs/config/authz-http-admin.js +14 -0
- package/lib/mjs/config/authz-http-admin.js.map +1 -0
- package/lib/mjs/controllers/AuthzAdminController.d.ts +249 -0
- package/lib/mjs/controllers/AuthzAdminController.d.ts.map +1 -0
- package/lib/mjs/controllers/AuthzAdminController.js +546 -0
- package/lib/mjs/controllers/AuthzAdminController.js.map +1 -0
- package/lib/mjs/index.d.ts +4 -0
- package/lib/mjs/index.d.ts.map +1 -0
- package/lib/mjs/index.js +4 -0
- package/lib/mjs/index.js.map +1 -0
- package/lib/mjs/package.json +1 -0
- package/lib/mjs/routes/decode.d.ts +11 -0
- package/lib/mjs/routes/decode.d.ts.map +1 -0
- package/lib/mjs/routes/decode.js +48 -0
- package/lib/mjs/routes/decode.js.map +1 -0
- package/lib/mjs/routes/index.d.ts +4 -0
- package/lib/mjs/routes/index.d.ts.map +1 -0
- package/lib/mjs/routes/index.js +4 -0
- package/lib/mjs/routes/index.js.map +1 -0
- package/lib/mjs/routes/query.d.ts +16 -0
- package/lib/mjs/routes/query.d.ts.map +1 -0
- package/lib/mjs/routes/query.js +120 -0
- package/lib/mjs/routes/query.js.map +1 -0
- package/lib/mjs/routes/status.d.ts +6 -0
- package/lib/mjs/routes/status.d.ts.map +1 -0
- package/lib/mjs/routes/status.js +17 -0
- package/lib/mjs/routes/status.js.map +1 -0
- package/lib/mjs/schemas/bodies.d.ts +16 -0
- package/lib/mjs/schemas/bodies.d.ts.map +1 -0
- package/lib/mjs/schemas/bodies.js +36 -0
- package/lib/mjs/schemas/bodies.js.map +1 -0
- package/lib/mjs/schemas/commands.d.ts +9 -0
- package/lib/mjs/schemas/commands.d.ts.map +1 -0
- package/lib/mjs/schemas/commands.js +61 -0
- package/lib/mjs/schemas/commands.js.map +1 -0
- package/lib/mjs/schemas/document.d.ts +19 -0
- package/lib/mjs/schemas/document.d.ts.map +1 -0
- package/lib/mjs/schemas/document.js +72 -0
- package/lib/mjs/schemas/document.js.map +1 -0
- package/lib/mjs/schemas/index.d.ts +6 -0
- package/lib/mjs/schemas/index.d.ts.map +1 -0
- package/lib/mjs/schemas/index.js +5 -0
- package/lib/mjs/schemas/index.js.map +1 -0
- package/lib/mjs/schemas/primitives.d.ts +13 -0
- package/lib/mjs/schemas/primitives.d.ts.map +1 -0
- package/lib/mjs/schemas/primitives.js +24 -0
- package/lib/mjs/schemas/primitives.js.map +1 -0
- package/lib/mjs/schemas/provider.d.ts +13 -0
- package/lib/mjs/schemas/provider.d.ts.map +1 -0
- package/lib/mjs/schemas/provider.js +26 -0
- package/lib/mjs/schemas/provider.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.mjs.tsbuildinfo +1 -0
- package/package.json +67 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/routes/decode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AssignmentSubject, AuthzAdminOptions, AuthzAdminQuery, ResourceRef } from '@spinajs/authz';
|
|
2
|
+
/** A parsed query string (express: string, string[] or a nested object per key). */
|
|
3
|
+
export type QueryInput = Readonly<Record<string, unknown>>;
|
|
4
|
+
/** `<type>` or `<type>:<id>`, split at the first `:` (ids may hold more); `$global` is GLOBAL. */
|
|
5
|
+
export declare function parseResourceRef(value: string, field: string): ResourceRef;
|
|
6
|
+
/** `<type>:<id>` (a principal) or `set:<role>@<type>:<id>` (a subject set). */
|
|
7
|
+
export declare function parseAssignmentSubject(value: string, field?: string): AssignmentSubject;
|
|
8
|
+
/** GET /authz/assignments: `scope`, `subject`, `role`, `includeExpired`, `limit`, `offset`. */
|
|
9
|
+
export declare function readAssignmentsQuery(q: QueryInput): AuthzAdminQuery;
|
|
10
|
+
/** GET /authz/holders: `scope` and `permission` (both required), `expandSets`, `limit`, `offset`. */
|
|
11
|
+
export declare function readHoldersQuery(q: QueryInput): AuthzAdminQuery;
|
|
12
|
+
/** GET /authz/links, /authz/rules and /authz/policies: `scope`, `limit`, `offset`. */
|
|
13
|
+
export declare function readPageQuery(kind: 'links' | 'rules' | 'policies', q: QueryInput): AuthzAdminQuery;
|
|
14
|
+
/** The AuthzAdminOptions of a single-command route: `reason`, `idempotencyKey`, `dryRun`. */
|
|
15
|
+
export declare function readWriteOptions(q: QueryInput): AuthzAdminOptions;
|
|
16
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/routes/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEzG,oFAAoF;AACpF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAe3D,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAS1E;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,iBAAiB,CAa1F;AA6BD,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,eAAe,CAYnE;AAED,qGAAqG;AACrG,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,eAAe,CAa/D;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,eAAe,CAElG;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,iBAAiB,CASjE"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { AuthzAdminFailure, GLOBAL } from '@spinajs/authz';
|
|
2
|
+
function invalid(field, message) {
|
|
3
|
+
throw new AuthzAdminFailure('invalid_query', message, field);
|
|
4
|
+
}
|
|
5
|
+
function text(q, field) {
|
|
6
|
+
const v = q[field];
|
|
7
|
+
if (v === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (typeof v !== 'string')
|
|
10
|
+
invalid(field, `${field} must be given once, as text`);
|
|
11
|
+
return v;
|
|
12
|
+
}
|
|
13
|
+
/** `<type>` or `<type>:<id>`, split at the first `:` (ids may hold more); `$global` is GLOBAL. */
|
|
14
|
+
export function parseResourceRef(value, field) {
|
|
15
|
+
if (value === GLOBAL.type)
|
|
16
|
+
return GLOBAL;
|
|
17
|
+
const at = value.indexOf(':');
|
|
18
|
+
const type = at < 0 ? value : value.slice(0, at);
|
|
19
|
+
if (type === '')
|
|
20
|
+
invalid(field, `${field} must be <type> or <type>:<id>, got ${JSON.stringify(value)}`);
|
|
21
|
+
if (at < 0)
|
|
22
|
+
return { type };
|
|
23
|
+
const id = value.slice(at + 1);
|
|
24
|
+
if (id === '')
|
|
25
|
+
invalid(field, `${field} must be <type> or <type>:<id>, got ${JSON.stringify(value)}`);
|
|
26
|
+
return { type, id };
|
|
27
|
+
}
|
|
28
|
+
/** `<type>:<id>` (a principal) or `set:<role>@<type>:<id>` (a subject set). */
|
|
29
|
+
export function parseAssignmentSubject(value, field = 'subject') {
|
|
30
|
+
const bad = () => invalid(field, `${field} must be <type>:<id> or set:<role>@<type>:<id>, got ${JSON.stringify(value)}`);
|
|
31
|
+
if (value.startsWith('set:')) {
|
|
32
|
+
const rest = value.slice('set:'.length);
|
|
33
|
+
const at = rest.indexOf('@');
|
|
34
|
+
if (at <= 0)
|
|
35
|
+
return bad();
|
|
36
|
+
const scope = rest.slice(at + 1);
|
|
37
|
+
if (scope === '' || scope.endsWith(':'))
|
|
38
|
+
return bad();
|
|
39
|
+
return { set: { role: rest.slice(0, at), scope: parseResourceRef(scope, field) } };
|
|
40
|
+
}
|
|
41
|
+
const at = value.indexOf(':');
|
|
42
|
+
if (at <= 0 || at === value.length - 1)
|
|
43
|
+
return bad();
|
|
44
|
+
return { type: value.slice(0, at), id: value.slice(at + 1) };
|
|
45
|
+
}
|
|
46
|
+
function flag(q, field) {
|
|
47
|
+
const v = text(q, field);
|
|
48
|
+
if (v === undefined)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (v !== 'true' && v !== 'false')
|
|
51
|
+
invalid(field, `${field} must be true or false`);
|
|
52
|
+
return v === 'true';
|
|
53
|
+
}
|
|
54
|
+
function count(q, field) {
|
|
55
|
+
const v = text(q, field);
|
|
56
|
+
if (v === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
if (!/^\d+$/.test(v))
|
|
59
|
+
invalid(field, `${field} must be a non-negative integer`);
|
|
60
|
+
return Number(v);
|
|
61
|
+
}
|
|
62
|
+
/** `limit` and `offset` as AuthzAdmin's page, only the ones given; AuthzAdmin defaults the rest. */
|
|
63
|
+
function page(q) {
|
|
64
|
+
const limit = count(q, 'limit');
|
|
65
|
+
const offset = count(q, 'offset');
|
|
66
|
+
if (limit === undefined && offset === undefined)
|
|
67
|
+
return {};
|
|
68
|
+
return { page: { ...(limit === undefined ? {} : { limit }), ...(offset === undefined ? {} : { offset }) } };
|
|
69
|
+
}
|
|
70
|
+
function scope(q) {
|
|
71
|
+
const v = text(q, 'scope');
|
|
72
|
+
return v === undefined ? {} : { scope: parseResourceRef(v, 'scope') };
|
|
73
|
+
}
|
|
74
|
+
/** GET /authz/assignments: `scope`, `subject`, `role`, `includeExpired`, `limit`, `offset`. */
|
|
75
|
+
export function readAssignmentsQuery(q) {
|
|
76
|
+
const subject = text(q, 'subject');
|
|
77
|
+
const role = text(q, 'role');
|
|
78
|
+
const includeExpired = flag(q, 'includeExpired');
|
|
79
|
+
return {
|
|
80
|
+
kind: 'assignments',
|
|
81
|
+
...scope(q),
|
|
82
|
+
...(subject === undefined ? {} : { subject: parseAssignmentSubject(subject) }),
|
|
83
|
+
...(role === undefined ? {} : { role }),
|
|
84
|
+
...(includeExpired === undefined ? {} : { includeExpired }),
|
|
85
|
+
...page(q),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** GET /authz/holders: `scope` and `permission` (both required), `expandSets`, `limit`, `offset`. */
|
|
89
|
+
export function readHoldersQuery(q) {
|
|
90
|
+
const scope = text(q, 'scope');
|
|
91
|
+
const permission = text(q, 'permission');
|
|
92
|
+
if (scope === undefined)
|
|
93
|
+
invalid('scope', 'scope is required');
|
|
94
|
+
if (permission === undefined || permission === '')
|
|
95
|
+
invalid('permission', 'permission is required');
|
|
96
|
+
const expandSets = flag(q, 'expandSets');
|
|
97
|
+
return {
|
|
98
|
+
kind: 'holders',
|
|
99
|
+
scope: parseResourceRef(scope, 'scope'),
|
|
100
|
+
permission,
|
|
101
|
+
...(expandSets === undefined ? {} : { expandSets }),
|
|
102
|
+
...page(q),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** GET /authz/links, /authz/rules and /authz/policies: `scope`, `limit`, `offset`. */
|
|
106
|
+
export function readPageQuery(kind, q) {
|
|
107
|
+
return { kind, ...scope(q), ...page(q) };
|
|
108
|
+
}
|
|
109
|
+
/** The AuthzAdminOptions of a single-command route: `reason`, `idempotencyKey`, `dryRun`. */
|
|
110
|
+
export function readWriteOptions(q) {
|
|
111
|
+
const reason = text(q, 'reason');
|
|
112
|
+
const idempotencyKey = text(q, 'idempotencyKey');
|
|
113
|
+
const dryRun = flag(q, 'dryRun');
|
|
114
|
+
return {
|
|
115
|
+
...(reason === undefined ? {} : { reason }),
|
|
116
|
+
...(idempotencyKey === undefined ? {} : { idempotencyKey }),
|
|
117
|
+
...(dryRun === undefined ? {} : { dryRun }),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/routes/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AuthzCommandResult } from '@spinajs/authz';
|
|
2
|
+
/** The HTTP status of an AuthzAdminError code: refusals 403, not_found 404, conflict 409, the rest (validation) 400. */
|
|
3
|
+
export declare function adminErrorStatus(code: string): number;
|
|
4
|
+
/** 200 when every command succeeded, else the status of the failed one (a batch reports its first failure). */
|
|
5
|
+
export declare function resultsStatus(results: readonly AuthzCommandResult[]): number;
|
|
6
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/routes/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,wHAAwH;AACxH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,+GAA+G;AAC/G,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,CAG5E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const REFUSED = new Set(['forbidden', 'escalation', 'last_holder', 'self_lockout', 'protected_role']);
|
|
2
|
+
/** The HTTP status of an AuthzAdminError code: refusals 403, not_found 404, conflict 409, the rest (validation) 400. */
|
|
3
|
+
export function adminErrorStatus(code) {
|
|
4
|
+
if (REFUSED.has(code))
|
|
5
|
+
return 403;
|
|
6
|
+
if (code === 'not_found')
|
|
7
|
+
return 404;
|
|
8
|
+
if (code === 'conflict')
|
|
9
|
+
return 409;
|
|
10
|
+
return 400;
|
|
11
|
+
}
|
|
12
|
+
/** 200 when every command succeeded, else the status of the failed one (a batch reports its first failure). */
|
|
13
|
+
export function resultsStatus(results) {
|
|
14
|
+
const failed = results.find((r) => !r.ok);
|
|
15
|
+
return failed && !failed.ok ? adminErrorStatus(failed.error.code) : 200;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/routes/status.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEtG,wHAAwH;AACxH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAClC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,GAAG,CAAC;IACrC,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,aAAa,CAAC,OAAsC;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { JsonSchema } from './primitives.js';
|
|
2
|
+
export declare const AuthzAdminBatch: JsonSchema;
|
|
3
|
+
export declare const AuthzAssignmentGrant: JsonSchema;
|
|
4
|
+
export declare const AuthzAssignmentPatch: JsonSchema;
|
|
5
|
+
export declare const AuthzLinkCreate: JsonSchema;
|
|
6
|
+
export declare const AuthzLinkPatch: JsonSchema;
|
|
7
|
+
export declare const AuthzRuleBody: JsonSchema;
|
|
8
|
+
export declare const AuthzPolicyBody: JsonSchema;
|
|
9
|
+
export declare const AuthzAttributesPatch: JsonSchema;
|
|
10
|
+
export declare const AuthzAttributesBody: JsonSchema;
|
|
11
|
+
export declare const AuthzAdminError: JsonSchema;
|
|
12
|
+
export declare const AuthzCommandResult: JsonSchema;
|
|
13
|
+
export declare const AuthzAdminResults: JsonSchema;
|
|
14
|
+
export declare const AuthzAdminPage: JsonSchema;
|
|
15
|
+
export declare const AuthzAdminAttributes: JsonSchema;
|
|
16
|
+
//# sourceMappingURL=bodies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bodies.d.ts","sourceRoot":"","sources":["../../../src/schemas/bodies.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAWlD,eAAO,MAAM,eAAe,EAAE,UAAiO,CAAC;AAEhQ,eAAO,MAAM,oBAAoB,EAAE,UAA2S,CAAC;AAE/U,eAAO,MAAM,oBAAoB,EAAE,UAIlC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,UAA4T,CAAC;AAE3V,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,UAA4H,CAAC;AACzJ,eAAO,MAAM,eAAe,EAAE,UAA2I,CAAC;AAC1K,eAAO,MAAM,oBAAoB,EAAE,UAAyH,CAAC;AAC7J,eAAO,MAAM,mBAAmB,EAAE,UAA+G,CAAC;AAIlJ,eAAO,MAAM,eAAe,EAAE,UAA+Z,CAAC;AAM9b,eAAO,MAAM,kBAAkB,EAAE,UAA4E,CAAC;AAE9G,eAAO,MAAM,iBAAiB,EAAE,UAAyR,CAAC;AAE1T,eAAO,MAAM,cAAc,EAAE,UAA0L,CAAC;AAExN,eAAO,MAAM,oBAAoB,EAAE,UAAuE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { commandSchemas, policyBody, ruleBody } from './commands.js';
|
|
2
|
+
import { anyObject, assignmentSubject, nullableDateTime, obj, resourceRef, tags, text } from './primitives.js';
|
|
3
|
+
const { id: _ruleId, ...ruleFields } = ruleBody.properties;
|
|
4
|
+
const { id: _policyId, ...policyFields } = policyBody.properties;
|
|
5
|
+
const writeOptions = {
|
|
6
|
+
reason: { ...text, description: 'goes to the audit trail' },
|
|
7
|
+
idempotencyKey: { ...text, description: 'a retried batch with the same key returns the first result' },
|
|
8
|
+
dryRun: { type: 'boolean', description: 'validate and guard, then roll back' },
|
|
9
|
+
};
|
|
10
|
+
export const AuthzAdminBatch = obj(['commands'], { commands: { type: 'array', items: { oneOf: commandSchemas } }, ...writeOptions }, 'POST /authz/commands: the commands run in one transaction, in order; the first failure rolls the batch back');
|
|
11
|
+
export const AuthzAssignmentGrant = obj(['subject', 'role', 'scope'], { subject: assignmentSubject, role: text, scope: resourceRef, tags, expiresAt: nullableDateTime, replaceLadder: { type: 'boolean' } }, 'POST /authz/assignments: the fields of assignment.grant (reason, idempotencyKey and dryRun go in the query string)');
|
|
12
|
+
export const AuthzAssignmentPatch = {
|
|
13
|
+
...obj([], { tags: { ...tags, description: 'replaces the tags' }, addTags: tags, removeTags: tags, expiresAt: nullableDateTime }, 'PATCH /authz/assignments/{id}: at least one key; the keys run as assignment.setTags, addTags, removeTags and setExpiry in one batch'),
|
|
14
|
+
additionalProperties: false,
|
|
15
|
+
anyOf: ['tags', 'addTags', 'removeTags', 'expiresAt'].map((k) => ({ required: [k] })),
|
|
16
|
+
};
|
|
17
|
+
export const AuthzLinkCreate = obj(['scope', 'role'], { scope: resourceRef, role: text, tags, expiresAt: nullableDateTime, attributes: anyObject }, 'POST /authz/links: the fields of link.create; the answer carries the token, shown once and sent with Cache-Control: no-store (reason, idempotencyKey and dryRun go in the query string)');
|
|
18
|
+
export const AuthzLinkPatch = {
|
|
19
|
+
...obj([], { id: { ...text, description: 'optional; must equal the path id' }, expiresAt: nullableDateTime, attributes: anyObject, role: text, tags: { ...tags, description: 'replaces the tags of the role the link grants' } }, 'PATCH /authz/links/{id}: at least one of expiresAt, attributes, role, tags; runs as one link.update'),
|
|
20
|
+
additionalProperties: false,
|
|
21
|
+
anyOf: ['expiresAt', 'attributes', 'role', 'tags'].map((k) => ({ required: [k] })),
|
|
22
|
+
};
|
|
23
|
+
export const AuthzRuleBody = obj(['kind', 'scope'], ruleFields, 'PUT /authz/rules/{id}: a rule; an `id` in the body must equal the path id');
|
|
24
|
+
export const AuthzPolicyBody = obj(['effect', 'permissions'], policyFields, 'PUT /authz/policies/{id}: a policy; an `id` in the body must equal the path id');
|
|
25
|
+
export const AuthzAttributesPatch = { ...anyObject, description: 'PATCH /authz/scopes/{type}/{id}/attributes: deep merge; null deletes a path' };
|
|
26
|
+
export const AuthzAttributesBody = { ...anyObject, description: 'PUT /authz/scopes/{type}/{id}/attributes: replaces all attributes' };
|
|
27
|
+
const errorShape = obj(['code', 'message'], { code: text, message: text, field: { ...text, description: 'the offending field, when one is known' } });
|
|
28
|
+
export const AuthzAdminError = obj(['error'], { error: errorShape }, 'The body of a refused request. Codes: invalid_request, invalid_query, invalid_batch, invalid_command, unknown_role, not_assignable, wrong_scope_type, unknown_ladder, unknown_permission, rule_not_compilable, invalid_attributes, set_cycle, set_too_deep (400); forbidden, escalation, last_holder, self_lockout, protected_role (403); not_found (404); conflict (409)');
|
|
29
|
+
const commandResult = {
|
|
30
|
+
oneOf: [obj(['ok', 'kind', 'affected'], { ok: { type: 'boolean', enum: [true] }, kind: text, id: text, token: { ...text, description: 'link.create only, shown once' }, affected: { type: 'integer' } }), obj(['ok', 'kind', 'error'], { ok: { type: 'boolean', enum: [false] }, kind: text, error: errorShape })],
|
|
31
|
+
};
|
|
32
|
+
export const AuthzCommandResult = { ...commandResult, description: 'The outcome of one command' };
|
|
33
|
+
export const AuthzAdminResults = obj(['results'], { results: { type: 'array', items: commandResult, description: 'one per command, in order; the first failure ends the list' } }, 'The answer of a write route: 200 when every command succeeded, else the status of the first failure, with the same body');
|
|
34
|
+
export const AuthzAdminPage = obj(['items', 'total'], { items: { type: 'array', items: anyObject }, total: { type: 'integer', description: 'rows matching before paging' } }, 'The answer of a list route');
|
|
35
|
+
export const AuthzAdminAttributes = { ...anyObject, description: 'The attributes of a scope' };
|
|
36
|
+
//# sourceMappingURL=bodies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bodies.js","sourceRoot":"","sources":["../../../src/schemas/bodies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JsonSchema } from './primitives.js';
|
|
2
|
+
/** A rule as `rule.put` takes it; the condition language is described by @spinajs/authz. */
|
|
3
|
+
export declare const ruleBody: JsonSchema;
|
|
4
|
+
/** A policy as `policy.put` takes it. */
|
|
5
|
+
export declare const policyBody: JsonSchema;
|
|
6
|
+
/** The command kinds of AuthzCommand (packages/authz/src/contracts/admin.ts), in declaration order. */
|
|
7
|
+
export declare const COMMAND_KINDS: readonly ['assignment.grant', 'assignment.revoke', 'assignment.revokeWhere', 'assignment.setTags', 'assignment.addTags', 'assignment.removeTags', 'assignment.setExpiry', 'set.addMember', 'set.removeMember', 'link.create', 'link.update', 'link.revoke', 'rule.put', 'rule.delete', 'policy.put', 'policy.delete', 'scope.setAttributes', 'scope.replaceAttributes', 'scope.forget'];
|
|
8
|
+
export declare const commandSchemas: readonly JsonSchema[];
|
|
9
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/schemas/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,4FAA4F;AAC5F,eAAO,MAAM,QAAQ,EAAE,UAsBtB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,UAAU,EAAE,UAiBxB,CAAC;AAEF,uGAAuG;AACvG,eAAO,MAAM,aAAa,YAAI,kBAAkB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,cAAc,CAAU,CAAC;AAErZ,eAAO,MAAM,cAAc,EAAE,SAAS,UAAU,EAoB/C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { anyObject, assignmentSubject, command, nullableDateTime, obj, principalRef, resourceRef, roleSet, tags, text } from './primitives.js';
|
|
2
|
+
const idOnly = { id: { ...text, description: 'the id of the row' } };
|
|
3
|
+
/** A rule as `rule.put` takes it; the condition language is described by @spinajs/authz. */
|
|
4
|
+
export const ruleBody = obj(['id', 'kind', 'scope'], {
|
|
5
|
+
id: text,
|
|
6
|
+
kind: { type: 'string', enum: ['restrict', 'cap', 'threshold'] },
|
|
7
|
+
scope: resourceRef,
|
|
8
|
+
resourceTypes: { type: 'array', items: text },
|
|
9
|
+
subjects: { ...anyObject, description: 'SubjectSelector: principalTypes, actorTypes, refs, rank, when' },
|
|
10
|
+
when: { ...anyObject, description: 'a Condition' },
|
|
11
|
+
expiresAt: nullableDateTime,
|
|
12
|
+
allow: { type: 'array', items: assignmentSubject },
|
|
13
|
+
ladder: text,
|
|
14
|
+
maxRole: { description: 'a role id, { ref } or null (drops the assignment)', nullable: true, oneOf: [text, anyObject] },
|
|
15
|
+
stripTags: { type: 'boolean' },
|
|
16
|
+
assignments: anyObject,
|
|
17
|
+
permissions: { type: 'array', items: text },
|
|
18
|
+
resource: { ...anyObject, description: 'a Condition on the resource' },
|
|
19
|
+
minRole: { description: 'a role id or { ref }', oneOf: [text, anyObject] },
|
|
20
|
+
at: text,
|
|
21
|
+
reason: { ...anyObject, description: 'DenyReason: code, payload, priority, sortKey' },
|
|
22
|
+
}, 'A RBAC rule in SQL form; the server sets `source`');
|
|
23
|
+
/** A policy as `policy.put` takes it. */
|
|
24
|
+
export const policyBody = obj(['id', 'effect', 'permissions'], {
|
|
25
|
+
id: text,
|
|
26
|
+
effect: { type: 'string', enum: ['permit', 'deny'] },
|
|
27
|
+
permissions: { type: 'array', items: text, description: 'permission globs' },
|
|
28
|
+
resourceTypes: { type: 'array', items: text },
|
|
29
|
+
principalTypes: { type: 'array', items: text },
|
|
30
|
+
actorTypes: { type: 'array', items: text },
|
|
31
|
+
scope: resourceRef,
|
|
32
|
+
when: { ...anyObject, description: 'a Condition' },
|
|
33
|
+
fields: { ...anyObject, description: 'a FieldSet' },
|
|
34
|
+
reason: text,
|
|
35
|
+
priority: { type: 'integer', description: 'default 500' },
|
|
36
|
+
expiresAt: nullableDateTime,
|
|
37
|
+
}, 'An ABAC policy; the server sets `source`');
|
|
38
|
+
/** The command kinds of AuthzCommand (packages/authz/src/contracts/admin.ts), in declaration order. */
|
|
39
|
+
export const COMMAND_KINDS = ['assignment.grant', 'assignment.revoke', 'assignment.revokeWhere', 'assignment.setTags', 'assignment.addTags', 'assignment.removeTags', 'assignment.setExpiry', 'set.addMember', 'set.removeMember', 'link.create', 'link.update', 'link.revoke', 'rule.put', 'rule.delete', 'policy.put', 'policy.delete', 'scope.setAttributes', 'scope.replaceAttributes', 'scope.forget'];
|
|
40
|
+
export const commandSchemas = [
|
|
41
|
+
command('assignment.grant', ['subject', 'role', 'scope'], { subject: assignmentSubject, role: text, scope: resourceRef, tags, expiresAt: nullableDateTime, replaceLadder: { type: 'boolean', description: "revoke the subject's other roles of the same ladder at this scope" } }, 'Grants a role to a subject at a scope'),
|
|
42
|
+
command('assignment.revoke', ['id'], idOnly, 'Revokes one assignment'),
|
|
43
|
+
command('assignment.revokeWhere', ['scope'], { scope: resourceRef, subject: assignmentSubject, role: text }, 'Revokes the assignments at a scope, narrowed by subject and role'),
|
|
44
|
+
command('assignment.setTags', ['id', 'tags'], { ...idOnly, tags }, 'Replaces the tags of an assignment'),
|
|
45
|
+
command('assignment.addTags', ['id', 'tags'], { ...idOnly, tags }, 'Adds tags to an assignment'),
|
|
46
|
+
command('assignment.removeTags', ['id', 'tags'], { ...idOnly, tags }, 'Removes tags from an assignment'),
|
|
47
|
+
command('assignment.setExpiry', ['id', 'expiresAt'], { ...idOnly, expiresAt: nullableDateTime }, 'Sets or clears the expiry of an assignment'),
|
|
48
|
+
command('set.addMember', ['set', 'member'], { set: roleSet, member: principalRef, expiresAt: nullableDateTime }, 'Adds a principal to a subject set (group.member at group:G)'),
|
|
49
|
+
command('set.removeMember', ['set', 'member'], { set: roleSet, member: principalRef }, 'Removes a principal from a subject set'),
|
|
50
|
+
command('link.create', ['scope', 'role'], { scope: resourceRef, role: text, tags, expiresAt: nullableDateTime, attributes: anyObject }, 'Creates a share link; the answer carries its token, shown once'),
|
|
51
|
+
command('link.update', ['id'], { ...idOnly, expiresAt: nullableDateTime, attributes: anyObject, role: text, tags }, 'Changes a share link'),
|
|
52
|
+
command('link.revoke', ['id'], idOnly, 'Revokes a share link'),
|
|
53
|
+
command('rule.put', ['rule'], { rule: ruleBody }, 'Inserts or replaces a RBAC rule by id'),
|
|
54
|
+
command('rule.delete', ['id'], idOnly, 'Deletes a RBAC rule'),
|
|
55
|
+
command('policy.put', ['policy'], { policy: policyBody }, 'Inserts or replaces an ABAC policy by id'),
|
|
56
|
+
command('policy.delete', ['id'], idOnly, 'Deletes an ABAC policy'),
|
|
57
|
+
command('scope.setAttributes', ['scope', 'patch'], { scope: resourceRef, patch: { ...anyObject, description: 'deep merge; null deletes a path' } }, 'Merges a patch into the attributes of a scope'),
|
|
58
|
+
command('scope.replaceAttributes', ['scope', 'attributes'], { scope: resourceRef, attributes: anyObject }, 'Replaces the attributes of a scope'),
|
|
59
|
+
command('scope.forget', ['scope'], { scope: resourceRef }, 'Removes everything held AT a scope node (assignments, links, rules, policies, attributes)'),
|
|
60
|
+
];
|
|
61
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/schemas/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface RouteDoc {
|
|
2
|
+
readonly method: 'get' | 'post' | 'put' | 'patch' | 'delete';
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly body?: string;
|
|
5
|
+
readonly query?: readonly string[];
|
|
6
|
+
readonly requiredQuery?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
/** What each route takes that the controller's signature cannot say: its body and its query string. */
|
|
9
|
+
export declare const AUTHZ_ADMIN_ROUTES: readonly RouteDoc[];
|
|
10
|
+
/**
|
|
11
|
+
* http-swagger describes a route's body and query string from decorated arguments, and the admin
|
|
12
|
+
* routes read both from `@Req()` so that no http-layer step can refuse what AuthzAdmin would answer.
|
|
13
|
+
* This adds what the builder cannot see to an OpenAPI document it built: the request bodies, the
|
|
14
|
+
* query parameters, the path parameter text and the body schemas as components. Operations are
|
|
15
|
+
* matched by method and path suffix, so a route prefix does not matter. Changes the document in place.
|
|
16
|
+
*/
|
|
17
|
+
export declare function describeAuthzAdminDocument<T extends object>(doc: T): T;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/schemas/document.ts"],"names":[],"mappings":"AAIA,UAAU,QAAQ;IAChB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAuBD,uGAAuG;AACvG,eAAO,MAAM,kBAAkB,EAAE,SAAS,QAAQ,EAoBjD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAmBtE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { AUTHZ_ADMIN_SCHEMAS } from './provider.js';
|
|
2
|
+
const WRITE_OPTIONS = ['reason', 'idempotencyKey', 'dryRun'];
|
|
3
|
+
const QUERY = {
|
|
4
|
+
scope: { schema: { type: 'string' }, description: '`<type>` or `<type>:<id>`, split at the first `:`; `$global` is the global scope' },
|
|
5
|
+
subject: { schema: { type: 'string' }, description: '`<type>:<id>` (a principal) or `set:<role>@<type>:<id>` (a subject set)' },
|
|
6
|
+
role: { schema: { type: 'string' }, description: 'only assignments of this role' },
|
|
7
|
+
permission: { schema: { type: 'string' }, description: 'the permission whose holders are listed (required)' },
|
|
8
|
+
expandSets: { schema: { type: 'boolean' }, description: '`true` also lists the members of each subject set, next to the set itself' },
|
|
9
|
+
includeExpired: { schema: { type: 'boolean' }, description: '`true` or `false`' },
|
|
10
|
+
limit: { schema: { type: 'integer', minimum: 0 }, description: 'page size; the server sets the default' },
|
|
11
|
+
offset: { schema: { type: 'integer', minimum: 0 }, description: 'rows to skip' },
|
|
12
|
+
reason: { schema: { type: 'string' }, description: 'goes to the audit trail' },
|
|
13
|
+
idempotencyKey: { schema: { type: 'string' }, description: 'a retried request with the same key returns the first result' },
|
|
14
|
+
dryRun: { schema: { type: 'boolean' }, description: '`true` validates and guards, then rolls back' },
|
|
15
|
+
};
|
|
16
|
+
const PATH_PARAMS = {
|
|
17
|
+
id: 'the id of the row (assignment, link, rule, policy) or of the scope node',
|
|
18
|
+
type: 'the resource type of the scope node',
|
|
19
|
+
};
|
|
20
|
+
/** What each route takes that the controller's signature cannot say: its body and its query string. */
|
|
21
|
+
export const AUTHZ_ADMIN_ROUTES = [
|
|
22
|
+
{ method: 'post', path: '/authz/commands', body: 'AuthzAdminBatch' },
|
|
23
|
+
{ method: 'get', path: '/authz/assignments', query: ['scope', 'subject', 'role', 'includeExpired', 'limit', 'offset'] },
|
|
24
|
+
{ method: 'get', path: '/authz/holders', query: ['scope', 'permission', 'expandSets', 'limit', 'offset'], requiredQuery: ['scope', 'permission'] },
|
|
25
|
+
{ method: 'post', path: '/authz/assignments', body: 'AuthzAssignmentGrant', query: WRITE_OPTIONS },
|
|
26
|
+
{ method: 'patch', path: '/authz/assignments/{id}', body: 'AuthzAssignmentPatch', query: WRITE_OPTIONS },
|
|
27
|
+
{ method: 'delete', path: '/authz/assignments/{id}', query: WRITE_OPTIONS },
|
|
28
|
+
{ method: 'get', path: '/authz/links', query: ['scope', 'limit', 'offset'] },
|
|
29
|
+
{ method: 'post', path: '/authz/links', body: 'AuthzLinkCreate', query: WRITE_OPTIONS },
|
|
30
|
+
{ method: 'patch', path: '/authz/links/{id}', body: 'AuthzLinkPatch', query: WRITE_OPTIONS },
|
|
31
|
+
{ method: 'delete', path: '/authz/links/{id}', query: WRITE_OPTIONS },
|
|
32
|
+
{ method: 'get', path: '/authz/rules', query: ['scope', 'limit', 'offset'] },
|
|
33
|
+
{ method: 'put', path: '/authz/rules/{id}', body: 'AuthzRuleBody', query: WRITE_OPTIONS },
|
|
34
|
+
{ method: 'delete', path: '/authz/rules/{id}', query: WRITE_OPTIONS },
|
|
35
|
+
{ method: 'get', path: '/authz/policies', query: ['scope', 'limit', 'offset'] },
|
|
36
|
+
{ method: 'put', path: '/authz/policies/{id}', body: 'AuthzPolicyBody', query: WRITE_OPTIONS },
|
|
37
|
+
{ method: 'delete', path: '/authz/policies/{id}', query: WRITE_OPTIONS },
|
|
38
|
+
{ method: 'get', path: '/authz/scopes/{type}/{id}/attributes' },
|
|
39
|
+
{ method: 'patch', path: '/authz/scopes/{type}/{id}/attributes', body: 'AuthzAttributesPatch', query: WRITE_OPTIONS },
|
|
40
|
+
{ method: 'put', path: '/authz/scopes/{type}/{id}/attributes', body: 'AuthzAttributesBody', query: WRITE_OPTIONS },
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* http-swagger describes a route's body and query string from decorated arguments, and the admin
|
|
44
|
+
* routes read both from `@Req()` so that no http-layer step can refuse what AuthzAdmin would answer.
|
|
45
|
+
* This adds what the builder cannot see to an OpenAPI document it built: the request bodies, the
|
|
46
|
+
* query parameters, the path parameter text and the body schemas as components. Operations are
|
|
47
|
+
* matched by method and path suffix, so a route prefix does not matter. Changes the document in place.
|
|
48
|
+
*/
|
|
49
|
+
export function describeAuthzAdminDocument(doc) {
|
|
50
|
+
const document = doc;
|
|
51
|
+
const components = ((document.components ??= {}).schemas ??= {});
|
|
52
|
+
for (const [name, schema] of Object.entries(AUTHZ_ADMIN_SCHEMAS))
|
|
53
|
+
components[name] ??= schema;
|
|
54
|
+
for (const route of AUTHZ_ADMIN_ROUTES) {
|
|
55
|
+
const path = Object.keys(document.paths ?? {}).find((p) => p === route.path || p.endsWith(route.path));
|
|
56
|
+
const operation = path ? document.paths[path][route.method] : undefined;
|
|
57
|
+
if (!operation)
|
|
58
|
+
continue;
|
|
59
|
+
if (route.body)
|
|
60
|
+
operation.requestBody = { required: true, content: { 'application/json': { schema: { $ref: `#/components/schemas/${route.body}` } } } };
|
|
61
|
+
const parameters = (operation.parameters ??= []);
|
|
62
|
+
for (const p of parameters)
|
|
63
|
+
if (p.in === 'path' && !p.description)
|
|
64
|
+
p.description = PATH_PARAMS[p.name];
|
|
65
|
+
for (const name of route.query ?? []) {
|
|
66
|
+
if (!parameters.some((p) => p.in === 'query' && p.name === name))
|
|
67
|
+
parameters.push({ name, in: 'query', required: route.requiredQuery?.includes(name) === true, ...QUERY[name] });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return doc;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../../src/schemas/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type JsonSchema = Record<string, unknown>;
|
|
2
|
+
export declare const text: JsonSchema;
|
|
3
|
+
export declare const nullableDateTime: JsonSchema;
|
|
4
|
+
export declare const tags: JsonSchema;
|
|
5
|
+
export declare const anyObject: JsonSchema;
|
|
6
|
+
export declare const resourceRef: JsonSchema;
|
|
7
|
+
export declare const principalRef: JsonSchema;
|
|
8
|
+
export declare const roleSet: JsonSchema;
|
|
9
|
+
export declare const subjectSet: JsonSchema;
|
|
10
|
+
export declare const assignmentSubject: JsonSchema;
|
|
11
|
+
export declare function obj(required: readonly string[], properties: Record<string, JsonSchema>, description?: string): JsonSchema;
|
|
12
|
+
export declare function command(kind: string, required: readonly string[], properties: Record<string, JsonSchema>, description: string): JsonSchema;
|
|
13
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/schemas/primitives.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,eAAO,MAAM,IAAI,EAAE,UAA+B,CAAC;AACnD,eAAO,MAAM,gBAAgB,EAAE,UAAmK,CAAC;AACnM,eAAO,MAAM,IAAI,EAAE,UAA2C,CAAC;AAC/D,eAAO,MAAM,SAAS,EAAE,UAA2D,CAAC;AAEpF,eAAO,MAAM,WAAW,EAAE,UAIzB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,UAI1B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,UAA4G,CAAC;AAEnI,eAAO,MAAM,UAAU,EAAE,UAAgF,CAAC;AAE1G,eAAO,MAAM,iBAAiB,EAAE,UAAmH,CAAC;AAEpJ,wBAAgB,GAAG,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAEzH;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAE1I"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const text = { type: 'string' };
|
|
2
|
+
export const nullableDateTime = { type: 'string', format: 'date-time', nullable: true, description: 'ISO 8601 date-time with Z or an offset, read as a Date; null clears the expiry' };
|
|
3
|
+
export const tags = { type: 'array', items: text };
|
|
4
|
+
export const anyObject = { type: 'object', additionalProperties: true };
|
|
5
|
+
export const resourceRef = {
|
|
6
|
+
type: 'object',
|
|
7
|
+
required: ['type'],
|
|
8
|
+
properties: { type: text, id: { ...text, description: 'absent for a type-level scope' } },
|
|
9
|
+
};
|
|
10
|
+
export const principalRef = {
|
|
11
|
+
type: 'object',
|
|
12
|
+
required: ['type', 'id'],
|
|
13
|
+
properties: { type: text, id: text },
|
|
14
|
+
};
|
|
15
|
+
export const roleSet = { type: 'object', required: ['role', 'scope'], properties: { role: text, scope: resourceRef } };
|
|
16
|
+
export const subjectSet = { type: 'object', required: ['set'], properties: { set: roleSet } };
|
|
17
|
+
export const assignmentSubject = { description: 'A principal, or the holders of a role at a scope', oneOf: [principalRef, subjectSet] };
|
|
18
|
+
export function obj(required, properties, description) {
|
|
19
|
+
return { type: 'object', ...(description ? { description } : {}), ...(required.length ? { required } : {}), properties };
|
|
20
|
+
}
|
|
21
|
+
export function command(kind, required, properties, description) {
|
|
22
|
+
return obj(['kind', ...required], { kind: { type: 'string', enum: [kind] }, ...properties }, description);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/schemas/primitives.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gFAAgF,EAAE,CAAC;AACnM,MAAM,CAAC,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,+BAA+B,EAAE,EAAE;CAC1F,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;IACxB,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE;CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;AAEnI,MAAM,CAAC,MAAM,UAAU,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC;AAE1G,MAAM,CAAC,MAAM,iBAAiB,GAAe,EAAE,WAAW,EAAE,kDAAkD,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;AAEpJ,MAAM,UAAU,GAAG,CAAC,QAA2B,EAAE,UAAsC,EAAE,WAAoB;IAC3G,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;AAC3H,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,QAA2B,EAAE,UAAsC,EAAE,WAAmB;IAC5H,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,WAAW,CAAC,CAAC;AAC5G,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SchemaProvider } from '@spinajs/validation';
|
|
2
|
+
import type { JsonSchema } from './primitives.js';
|
|
3
|
+
/** Every schema of the admin routes by name, as the swagger document names them. */
|
|
4
|
+
export declare const AUTHZ_ADMIN_SCHEMAS: Readonly<Record<string, JsonSchema>>;
|
|
5
|
+
/**
|
|
6
|
+
* Serves the schemas to http-swagger by the type names the controller's `@response` tags use.
|
|
7
|
+
* Nothing but the swagger builder asks a SchemaProvider: request validation reads `@Schema`
|
|
8
|
+
* metadata and route argument schemas, neither of which these routes carry.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AuthzAdminSchemaProvider extends SchemaProvider {
|
|
11
|
+
getSchema(typeName: string): Record<string, unknown> | undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/schemas/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAiB,CAAC;AAEvF;;;;GAIG;AACH,qBACa,wBAAyB,SAAQ,cAAc;IACnD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAEtE;CACF"}
|