@stratum-hq/control-plane 1.4.0 → 1.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/README.md +49 -12
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +27 -0
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -2
- package/dist/config.js.map +1 -1
- package/dist/db/connection.d.ts +10 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +41 -12
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +29 -6
- package/dist/db/migrate.js.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.js +1 -1
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/authorize.d.ts.map +1 -1
- package/dist/middleware/authorize.js +4 -3
- package/dist/middleware/authorize.js.map +1 -1
- package/dist/middleware/error-handler.d.ts +6 -0
- package/dist/middleware/error-handler.d.ts.map +1 -1
- package/dist/middleware/error-handler.js +27 -4
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/middleware/path-params.d.ts +31 -0
- package/dist/middleware/path-params.d.ts.map +1 -0
- package/dist/middleware/path-params.js +78 -0
- package/dist/middleware/path-params.js.map +1 -0
- package/dist/middleware/rate-limit-redis.js +1 -1
- package/dist/middleware/rate-limit-redis.js.map +1 -1
- package/dist/middleware/telemetry.js +3 -3
- package/dist/middleware/telemetry.js.map +1 -1
- package/dist/redis.js +1 -1
- package/dist/redis.js.map +1 -1
- package/dist/routes/abac.js +4 -4
- package/dist/routes/abac.js.map +1 -1
- package/dist/routes/api-keys.js +5 -5
- package/dist/routes/api-keys.js.map +1 -1
- package/dist/routes/audit-logs.js +2 -2
- package/dist/routes/audit-logs.js.map +1 -1
- package/dist/routes/config-diff.d.ts.map +1 -1
- package/dist/routes/config-diff.js +3 -2
- package/dist/routes/config-diff.js.map +1 -1
- package/dist/routes/config.d.ts +11 -1
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +107 -7
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/consent.js +3 -3
- package/dist/routes/consent.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +14 -9
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/maintenance.js +2 -2
- package/dist/routes/maintenance.js.map +1 -1
- package/dist/routes/permissions.js +4 -4
- package/dist/routes/permissions.js.map +1 -1
- package/dist/routes/regions.js +5 -5
- package/dist/routes/regions.js.map +1 -1
- package/dist/routes/roles.js +7 -7
- package/dist/routes/roles.js.map +1 -1
- package/dist/routes/tenants.d.ts.map +1 -1
- package/dist/routes/tenants.js +20 -17
- package/dist/routes/tenants.js.map +1 -1
- package/dist/routes/webhooks.js +12 -12
- package/dist/routes/webhooks.js.map +1 -1
- package/dist/services/isolation-service.d.ts.map +1 -1
- package/dist/services/isolation-service.js +9 -4
- package/dist/services/isolation-service.js.map +1 -1
- package/package.json +11 -6
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FastifyInstance, FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
/**
|
|
3
|
+
* Path parameters that hold the id of a database row. Every such id is a UUID.
|
|
4
|
+
* The other path parameters (a config `:key`, a consent `:purpose`) are free text.
|
|
5
|
+
*/
|
|
6
|
+
export declare const UUID_PATH_PARAMS: ReadonlySet<string>;
|
|
7
|
+
/** Returns the names of the path parameters in a route URL, such as `id` in `/tenants/:id`. */
|
|
8
|
+
export declare function pathParamNames(url: string): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Gives every route registered after this call a params schema that requires a
|
|
11
|
+
* UUID for each id parameter in its URL.
|
|
12
|
+
*
|
|
13
|
+
* The route keeps a failed check on the request (attachValidation) instead of
|
|
14
|
+
* answering at once. {@link rejectInvalidPathParams} answers it after the
|
|
15
|
+
* caller is authenticated, so a caller without credentials still gets 401.
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerUuidPathParams(app: FastifyInstance): void;
|
|
18
|
+
/**
|
|
19
|
+
* A global preHandler, registered after authentication: answers a request whose
|
|
20
|
+
* schema check failed with 400 VALIDATION_ERROR, one issue per bad path id.
|
|
21
|
+
*/
|
|
22
|
+
export declare function rejectInvalidPathParams(request: FastifyRequest, _reply: FastifyReply): Promise<void>;
|
|
23
|
+
/** Query-string parameters that hold a tenant id. Every such id is a UUID. */
|
|
24
|
+
export declare const UUID_QUERY_PARAMS: readonly string[];
|
|
25
|
+
/**
|
|
26
|
+
* A global preHandler, registered after authentication and before the tenant
|
|
27
|
+
* scope enforcer: answers a request whose query string carries a tenant id that
|
|
28
|
+
* is not a single UUID with 400 VALIDATION_ERROR, one issue per bad parameter.
|
|
29
|
+
*/
|
|
30
|
+
export declare function rejectInvalidQueryTenantIds(request: FastifyRequest, _reply: FastifyReply): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=path-params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-params.d.ts","sourceRoot":"","sources":["../../src/middleware/path-params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGxE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAkE,CAAC;AAIpH,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAmBjE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1G;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA0C,CAAC;AAI1F;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9G"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UUID_QUERY_PARAMS = exports.UUID_PATH_PARAMS = void 0;
|
|
4
|
+
exports.pathParamNames = pathParamNames;
|
|
5
|
+
exports.registerUuidPathParams = registerUuidPathParams;
|
|
6
|
+
exports.rejectInvalidPathParams = rejectInvalidPathParams;
|
|
7
|
+
exports.rejectInvalidQueryTenantIds = rejectInvalidQueryTenantIds;
|
|
8
|
+
const core_1 = require("@stratum-hq/core");
|
|
9
|
+
/**
|
|
10
|
+
* Path parameters that hold the id of a database row. Every such id is a UUID.
|
|
11
|
+
* The other path parameters (a config `:key`, a consent `:purpose`) are free text.
|
|
12
|
+
*/
|
|
13
|
+
exports.UUID_PATH_PARAMS = new Set(["id", "tenantId", "policyId", "keyId", "deliveryId"]);
|
|
14
|
+
const UUID_PATTERN = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
|
|
15
|
+
/** Returns the names of the path parameters in a route URL, such as `id` in `/tenants/:id`. */
|
|
16
|
+
function pathParamNames(url) {
|
|
17
|
+
return [...url.matchAll(/:([A-Za-z0-9_]+)/g)].map((match) => match[1]);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gives every route registered after this call a params schema that requires a
|
|
21
|
+
* UUID for each id parameter in its URL.
|
|
22
|
+
*
|
|
23
|
+
* The route keeps a failed check on the request (attachValidation) instead of
|
|
24
|
+
* answering at once. {@link rejectInvalidPathParams} answers it after the
|
|
25
|
+
* caller is authenticated, so a caller without credentials still gets 401.
|
|
26
|
+
*/
|
|
27
|
+
function registerUuidPathParams(app) {
|
|
28
|
+
app.addHook("onRoute", (routeOptions) => {
|
|
29
|
+
const names = pathParamNames(routeOptions.url ?? "").filter((name) => exports.UUID_PATH_PARAMS.has(name));
|
|
30
|
+
if (names.length === 0)
|
|
31
|
+
return;
|
|
32
|
+
const existing = (routeOptions.schema?.params ?? {});
|
|
33
|
+
routeOptions.schema = {
|
|
34
|
+
...routeOptions.schema,
|
|
35
|
+
params: {
|
|
36
|
+
type: "object",
|
|
37
|
+
...existing,
|
|
38
|
+
properties: {
|
|
39
|
+
...existing.properties,
|
|
40
|
+
...Object.fromEntries(names.map((name) => [name, { type: "string", format: "uuid", pattern: UUID_PATTERN }])),
|
|
41
|
+
},
|
|
42
|
+
required: [...new Set([...(existing.required ?? []), ...names])],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
routeOptions.attachValidation = true;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A global preHandler, registered after authentication: answers a request whose
|
|
50
|
+
* schema check failed with 400 VALIDATION_ERROR, one issue per bad path id.
|
|
51
|
+
*/
|
|
52
|
+
async function rejectInvalidPathParams(request, _reply) {
|
|
53
|
+
const failure = request.validationError;
|
|
54
|
+
if (!failure)
|
|
55
|
+
return;
|
|
56
|
+
if (failure.validationContext !== "params")
|
|
57
|
+
throw failure;
|
|
58
|
+
const names = new Set((failure.validation ?? []).map((item) => item.instancePath?.replace(/^\//, "") || item.params?.missingProperty || ""));
|
|
59
|
+
const issues = [...names].map((name) => ({ path: ["params", name], message: "Invalid uuid", code: "invalid_string" }));
|
|
60
|
+
throw new core_1.ValidationError("Invalid path parameter", { issues });
|
|
61
|
+
}
|
|
62
|
+
/** Query-string parameters that hold a tenant id. Every such id is a UUID. */
|
|
63
|
+
exports.UUID_QUERY_PARAMS = ["tenant_id", "tenant_a", "tenant_b"];
|
|
64
|
+
const UUID_REGEX = new RegExp(UUID_PATTERN);
|
|
65
|
+
/**
|
|
66
|
+
* A global preHandler, registered after authentication and before the tenant
|
|
67
|
+
* scope enforcer: answers a request whose query string carries a tenant id that
|
|
68
|
+
* is not a single UUID with 400 VALIDATION_ERROR, one issue per bad parameter.
|
|
69
|
+
*/
|
|
70
|
+
async function rejectInvalidQueryTenantIds(request, _reply) {
|
|
71
|
+
const query = (request.query ?? {});
|
|
72
|
+
const bad = exports.UUID_QUERY_PARAMS.filter((name) => query[name] !== undefined && !(typeof query[name] === "string" && UUID_REGEX.test(query[name])));
|
|
73
|
+
if (bad.length === 0)
|
|
74
|
+
return;
|
|
75
|
+
const issues = bad.map((name) => ({ path: ["query", name], message: "Invalid uuid", code: "invalid_string" }));
|
|
76
|
+
throw new core_1.ValidationError("Invalid query parameter", { issues });
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=path-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-params.js","sourceRoot":"","sources":["../../src/middleware/path-params.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,7 +93,7 @@ async function evalScript(redis, sha, key, ttlSec) {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
catch {
|
|
96
|
-
// NOSCRIPT or other error
|
|
96
|
+
// NOSCRIPT or other error: fall through to EVAL
|
|
97
97
|
}
|
|
98
98
|
return (await redis.eval(SLIDING_WINDOW_LUA, 1, key, String(ttlSec), String(now)));
|
|
99
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit-redis.js","sourceRoot":"","sources":["../../src/middleware/rate-limit-redis.ts"],"names":[],"mappings":";;AAwCA,wDAmEC;AAzGD,mEAA2F;AAS3F;;;;;;;;;;;;;GAaG;AACH,MAAM,kBAAkB,GAAG;;;;;;CAM1B,CAAC;AAEF;;;;;;GAMG;AACH,SAAgB,sBAAsB,CACpC,KAAY,EACZ,QAA8B;IAE9B,MAAM,QAAQ,GAAG,IAAA,uDAA+B,EAAC,QAAQ,CAAC,CAAC;IAE3D,0DAA0D;IAC1D,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,KAAK;SACF,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;SAClC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,SAAS,GAAG,GAAa,CAAC;IAC5B,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,sCAAsC;IACxC,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,UAAU,kBAAkB,CACtC,OAAuB,EACvB,KAAmB;QAEnB,mDAAmD;QACnD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAE5B,MAAM,KAAK,GAAG,IAAA,uCAAe,EAAC,OAAO,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC,WAAW,CAAC;QAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB;YAC/C,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAClD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,qBAAqB,KAAK,IAAI,WAAW,EAAE,CAAC;QAE7D,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;QAEjD,IAAI,YAAoB,CAAC;QAEzB,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,WAAW,CAC9B,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,EACpD,GAAG,CACJ,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,2CAA2C;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC;QAClD,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzD,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACvE,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YACnD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE;oBACL,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,qCAAqC,aAAa,WAAW;iBACvE;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,KAAK,UAAU,UAAU,CACvB,KAAY,EACZ,GAAkB,EAClB,GAAW,EACX,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,
|
|
1
|
+
{"version":3,"file":"rate-limit-redis.js","sourceRoot":"","sources":["../../src/middleware/rate-limit-redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.registerTelemetryHooks = registerTelemetryHooks;
|
|
10
|
-
// Lazy-loaded OTel API
|
|
10
|
+
// Lazy-loaded OTel API; stays `null` when the package is absent.
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
12
|
let otel = null;
|
|
13
13
|
try {
|
|
@@ -15,7 +15,7 @@ try {
|
|
|
15
15
|
otel = require("@opentelemetry/api");
|
|
16
16
|
}
|
|
17
17
|
catch {
|
|
18
|
-
// @opentelemetry/api is not installed
|
|
18
|
+
// @opentelemetry/api is not installed, so telemetry is a no-op.
|
|
19
19
|
}
|
|
20
20
|
const TRACER_NAME = "@stratum-hq/control-plane";
|
|
21
21
|
/**
|
|
@@ -93,7 +93,7 @@ function registerTelemetryHooks(app) {
|
|
|
93
93
|
message: error.message,
|
|
94
94
|
});
|
|
95
95
|
span.recordException(error);
|
|
96
|
-
// Don't end here
|
|
96
|
+
// Don't end here; onResponse will still fire and end the span.
|
|
97
97
|
});
|
|
98
98
|
}
|
|
99
99
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/middleware/telemetry.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAsBH,wDA+EC;AAjGD,
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/middleware/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/redis.js
CHANGED
|
@@ -33,7 +33,7 @@ function createRedisClient() {
|
|
|
33
33
|
console.warn("[stratum] Redis connection error (rate limiting will fall back to in-memory):", err.message);
|
|
34
34
|
});
|
|
35
35
|
client.on("connect", () => {
|
|
36
|
-
console.info("[stratum] Redis connected
|
|
36
|
+
console.info("[stratum] Redis connected; using Redis-backed rate limiting.");
|
|
37
37
|
});
|
|
38
38
|
// Attempt to connect; failures are non-fatal
|
|
39
39
|
client.connect().catch((err) => {
|
package/dist/redis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":";;;;;AAYA,8CA8BC;AAKD,wCAEC;AAKD,4CAgBC;AAtED,sDAA4B;AAC5B,2CAAqC;AAErC,IAAI,WAAW,GAAiB,IAAI,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,CAAC,kBAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,iBAAK,CAAC,kBAAM,CAAC,QAAQ,EAAE;QACxC,oBAAoB,EAAE,CAAC;QACvB,aAAa,CAAC,KAAa;YACzB,kEAAkE;YAClE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,kBAAkB,EAAE,KAAK;QACzB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,+EAA+E,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":";;;;;AAYA,8CA8BC;AAKD,wCAEC;AAKD,4CAgBC;AAtED,sDAA4B;AAC5B,2CAAqC;AAErC,IAAI,WAAW,GAAiB,IAAI,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,CAAC,kBAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,iBAAK,CAAC,kBAAM,CAAC,QAAQ,EAAE;QACxC,oBAAoB,EAAE,CAAC;QACvB,aAAa,CAAC,KAAa;YACzB,kEAAkE;YAClE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,kBAAkB,EAAE,KAAK;QACzB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,+EAA+E,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7B,OAAO,CAAC,IAAI,CAAC,uEAAuE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;IAEH,WAAW,GAAG,MAAM,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,WAAW,CAAC,IAAI,EAAE;YAClB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CACrD;SACF,CAAC,CAAC;QACH,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC"}
|
package/dist/routes/abac.js
CHANGED
|
@@ -10,24 +10,24 @@ function createAbacRoutes(stratum) {
|
|
|
10
10
|
// Tenant-scoped keys can only access ABAC policies for their own tenant subtree
|
|
11
11
|
(0, tenant_scope_js_1.declareTenantScope)(app, tenant_scope_js_1.fromParamTenantId);
|
|
12
12
|
(0, authorize_js_1.declareRequiredScope)(app, { read: "read", write: "write" });
|
|
13
|
-
// POST /api/v1/tenants/:tenantId/abac-policies
|
|
13
|
+
// POST /api/v1/tenants/:tenantId/abac-policies: Create ABAC policy
|
|
14
14
|
app.post("/", async (request, reply) => {
|
|
15
15
|
const input = core_1.CreateAbacPolicyInputSchema.parse(request.body);
|
|
16
16
|
const policy = await stratum.createAbacPolicy(request.params.tenantId, input, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
17
17
|
reply.status(201).send(policy);
|
|
18
18
|
});
|
|
19
|
-
// GET /api/v1/tenants/:tenantId/abac-policies
|
|
19
|
+
// GET /api/v1/tenants/:tenantId/abac-policies: List own ABAC policies
|
|
20
20
|
app.get("/", async (request, reply) => {
|
|
21
21
|
const policies = await stratum.getAbacPolicies(request.params.tenantId);
|
|
22
22
|
reply.status(200).send(policies);
|
|
23
23
|
});
|
|
24
|
-
// POST /api/v1/tenants/:tenantId/abac/evaluate
|
|
24
|
+
// POST /api/v1/tenants/:tenantId/abac/evaluate: Evaluate an ABAC request
|
|
25
25
|
app.post("/evaluate", async (request, reply) => {
|
|
26
26
|
const evalRequest = core_1.AbacEvaluationRequestSchema.parse(request.body);
|
|
27
27
|
const result = await stratum.evaluateAbac(request.params.tenantId, evalRequest);
|
|
28
28
|
reply.status(200).send(result);
|
|
29
29
|
});
|
|
30
|
-
// DELETE /api/v1/tenants/:tenantId/abac-policies/:policyId
|
|
30
|
+
// DELETE /api/v1/tenants/:tenantId/abac-policies/:policyId: Delete ABAC policy
|
|
31
31
|
app.delete("/:policyId", async (request, reply) => {
|
|
32
32
|
await stratum.deleteAbacPolicy(request.params.tenantId, request.params.policyId, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
33
33
|
reply.status(204).send();
|
package/dist/routes/abac.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abac.js","sourceRoot":"","sources":["../../src/routes/abac.ts"],"names":[],"mappings":";;AAOA,4CA8CC;AAnDD,2CAAoJ;AACpJ,mEAAsF;AACtF,6DAAkE;AAClE,mDAAoD;AAEpD,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,KAAK,UAAU,UAAU,CAAC,GAAoB;QACnD,gFAAgF;QAChF,IAAA,oCAAkB,EAAC,GAAG,EAAE,mCAAiB,CAAC,CAAC;QAC3C,IAAA,mCAAoB,EAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5D,
|
|
1
|
+
{"version":3,"file":"abac.js","sourceRoot":"","sources":["../../src/routes/abac.ts"],"names":[],"mappings":";;AAOA,4CA8CC;AAnDD,2CAAoJ;AACpJ,mEAAsF;AACtF,6DAAkE;AAClE,mDAAoD;AAEpD,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,KAAK,UAAU,UAAU,CAAC,GAAoB;QACnD,gFAAgF;QAChF,IAAA,oCAAkB,EAAC,GAAG,EAAE,mCAAiB,CAAC,CAAC;QAC3C,IAAA,mCAAoB,EAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5D,mEAAmE;QACnE,GAAG,CAAC,IAAI,CAAmC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,kCAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAA0B,CAAC;YACvF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,KAAK,EACL,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAC3B,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,sEAAsE;QACtE,GAAG,CAAC,GAAG,CAAmC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACtE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,yEAAyE;QACzE,GAAG,CAAC,IAAI,CAAmC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC/E,MAAM,WAAW,GAAG,kCAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAA0B,CAAC;YAC7F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,WAAW,CACZ,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,+EAA+E;QAC/E,GAAG,CAAC,MAAM,CACR,YAAY,EACZ,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,OAAO,CAAC,gBAAgB,CAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAC3B,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/routes/api-keys.js
CHANGED
|
@@ -22,7 +22,7 @@ function createApiKeyRoutes(stratum) {
|
|
|
22
22
|
// their handlers.
|
|
23
23
|
(0, tenant_scope_js_1.declareTenantScope)(app, tenant_scope_js_1.fromBodyTenantId);
|
|
24
24
|
(0, authorize_js_1.declareRequiredScope)(app, "admin");
|
|
25
|
-
// POST /api/v1/api-keys
|
|
25
|
+
// POST /api/v1/api-keys: Create a new API key (plaintext returned once)
|
|
26
26
|
app.post("/", async (request, reply) => {
|
|
27
27
|
const parsed = createApiKeySchema.safeParse(request.body);
|
|
28
28
|
if (!parsed.success) {
|
|
@@ -47,14 +47,14 @@ function createApiKeyRoutes(stratum) {
|
|
|
47
47
|
}, undefined, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
48
48
|
reply.status(201).send(result);
|
|
49
49
|
});
|
|
50
|
-
// GET /api/v1/api-keys
|
|
50
|
+
// GET /api/v1/api-keys: List API keys (optional ?tenant_id=)
|
|
51
51
|
app.get("/", async (request, reply) => {
|
|
52
52
|
// Scoped keys can only list keys for their own tenant
|
|
53
53
|
const tenantId = request.apiKey?.tenant_id ?? request.query.tenant_id;
|
|
54
54
|
const keys = await stratum.listApiKeys(tenantId);
|
|
55
55
|
reply.status(200).send(keys);
|
|
56
56
|
});
|
|
57
|
-
// GET /api/v1/api-keys/dormant
|
|
57
|
+
// GET /api/v1/api-keys/dormant: List dormant API keys (must be before /:id)
|
|
58
58
|
app.get("/dormant", async (request, reply) => {
|
|
59
59
|
const raw = request.query.days ? parseInt(request.query.days, 10) : 90;
|
|
60
60
|
const days = Number.isNaN(raw) || raw < 1 ? 90 : Math.min(raw, 365);
|
|
@@ -68,7 +68,7 @@ function createApiKeyRoutes(stratum) {
|
|
|
68
68
|
}
|
|
69
69
|
reply.status(200).send(keys);
|
|
70
70
|
});
|
|
71
|
-
// POST /api/v1/api-keys/:id/rotate
|
|
71
|
+
// POST /api/v1/api-keys/:id/rotate: Rotate an API key
|
|
72
72
|
app.post("/:id/rotate", async (request, reply) => {
|
|
73
73
|
// Verify caller has access to this key's tenant
|
|
74
74
|
if (request.apiKey?.tenant_id) {
|
|
@@ -83,7 +83,7 @@ function createApiKeyRoutes(stratum) {
|
|
|
83
83
|
const result = await stratum.rotateApiKey(request.params.id, parsed.name, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
84
84
|
reply.status(201).send(result);
|
|
85
85
|
});
|
|
86
|
-
// DELETE /api/v1/api-keys/:id
|
|
86
|
+
// DELETE /api/v1/api-keys/:id: Revoke an API key
|
|
87
87
|
app.delete("/:id", async (request, reply) => {
|
|
88
88
|
// Verify caller has access to this key's tenant
|
|
89
89
|
if (request.apiKey?.tenant_id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/routes/api-keys.ts"],"names":[],"mappings":";;AAkBA,gDA8FC;AA9GD,6BAAwB;AACxB,2CAAkD;AAClD,mEAAiG;AACjG,6DAAkE;AAClE,+EAAkE;AAClE,4CAAsC;AACtC,mDAAoD;AACpD,qEAA2E;AAE3E,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC5B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;IAC/D,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,QAAQ,EAAE;CAC3F,CAAC,CAAC;AAEH,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO,KAAK,UAAU,YAAY,CAAC,GAAoB;QACrD,4EAA4E;QAC5E,yEAAyE;QACzE,kBAAkB;QAClB,IAAA,oCAAkB,EAAC,GAAG,EAAE,kCAAgB,CAAC,CAAC;QAC1C,IAAA,mCAAoB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEnC,
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/routes/api-keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ function createAuditLogRoutes(stratum) {
|
|
|
18
18
|
// Scoped keys are constrained to their own tenant inside the handlers below.
|
|
19
19
|
(0, tenant_scope_js_1.declareTenantScope)(app, "global");
|
|
20
20
|
(0, authorize_js_1.declareRequiredScope)(app, "admin");
|
|
21
|
-
// GET /api/v1/audit-logs
|
|
21
|
+
// GET /api/v1/audit-logs: List audit logs with filters
|
|
22
22
|
app.get("/", async (request, reply) => {
|
|
23
23
|
const query = core_1.AuditLogQuerySchema.parse(request.query);
|
|
24
24
|
// Scoped keys can only see logs for their own tenant
|
|
@@ -28,7 +28,7 @@ function createAuditLogRoutes(stratum) {
|
|
|
28
28
|
const entries = await stratum.queryAuditLogs(query);
|
|
29
29
|
reply.status(200).send(entries);
|
|
30
30
|
});
|
|
31
|
-
// GET /api/v1/audit-logs/:id
|
|
31
|
+
// GET /api/v1/audit-logs/:id: Get single audit entry
|
|
32
32
|
app.get("/:id", async (request, reply) => {
|
|
33
33
|
const entry = await stratum.getAuditEntry(request.params.id);
|
|
34
34
|
if (!entry) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-logs.js","sourceRoot":"","sources":["../../src/routes/audit-logs.ts"],"names":[],"mappings":";;AAOA,8CAOC;AAED,oDAgCC;AA/CD,2CAAuD;AAGvD,mEAAmE;AACnE,6DAAkE;AAElE,SAAgB,iBAAiB,CAAC,OAAuB;IACvD,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,SAAS;QACzC,UAAU,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,SAAS,CAAsB;QAClE,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU,EAAE,OAAO,CAAC,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO,KAAK,UAAU,cAAc,CAAC,GAAoB;QACvD,6EAA6E;QAC7E,IAAA,oCAAkB,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClC,IAAA,mCAAoB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEnC,
|
|
1
|
+
{"version":3,"file":"audit-logs.js","sourceRoot":"","sources":["../../src/routes/audit-logs.ts"],"names":[],"mappings":";;AAOA,8CAOC;AAED,oDAgCC;AA/CD,2CAAuD;AAGvD,mEAAmE;AACnE,6DAAkE;AAElE,SAAgB,iBAAiB,CAAC,OAAuB;IACvD,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,SAAS;QACzC,UAAU,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,SAAS,CAAsB;QAClE,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU,EAAE,OAAO,CAAC,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO,KAAK,UAAU,cAAc,CAAC,GAAoB;QACvD,6EAA6E;QAC7E,IAAA,oCAAkB,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClC,IAAA,mCAAoB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEnC,uDAAuD;QACvD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,0BAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvD,qDAAqD;YACrD,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;gBAC9B,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YAC7C,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACpD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,GAAG,CAAC,GAAG,CAA6B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACnE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YACD,2CAA2C;YAC3C,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC9E,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-diff.d.ts","sourceRoot":"","sources":["../../src/routes/config-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-diff.d.ts","sourceRoot":"","sources":["../../src/routes/config-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAU1C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,IAMd,KAAK,eAAe,KAAG,OAAO,CAAC,IAAI,CAAC,CAqC5E"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createConfigDiffRoutes = createConfigDiffRoutes;
|
|
4
4
|
const tenant_scope_js_1 = require("../middleware/tenant-scope.js");
|
|
5
5
|
const authorize_js_1 = require("../middleware/authorize.js");
|
|
6
|
+
const config_js_1 = require("./config.js");
|
|
6
7
|
function createConfigDiffRoutes(stratum) {
|
|
7
8
|
// The diff compares two tenants read from the query string, so both operands
|
|
8
9
|
// must be authorized against the caller's subtree. The scope declaration below
|
|
@@ -12,7 +13,7 @@ function createConfigDiffRoutes(stratum) {
|
|
|
12
13
|
// A scoped key may diff only within its own subtree; a global key, anywhere.
|
|
13
14
|
(0, tenant_scope_js_1.declareTenantScope)(app, tenant_scope_js_1.fromQueryTenantA);
|
|
14
15
|
(0, authorize_js_1.declareRequiredScope)(app, { read: "read", write: "write" });
|
|
15
|
-
// GET /api/v1/config/diff?tenant_a=UUID&tenant_b=UUID
|
|
16
|
+
// GET /api/v1/config/diff?tenant_a=UUID&tenant_b=UUID: Compare resolved config between two tenants
|
|
16
17
|
app.get("/diff", { preHandler: secondOperandGuard }, async (request, reply) => {
|
|
17
18
|
const { tenant_a, tenant_b } = request.query;
|
|
18
19
|
if (!tenant_a || !tenant_b) {
|
|
@@ -33,7 +34,7 @@ function createConfigDiffRoutes(stratum) {
|
|
|
33
34
|
});
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
36
|
-
const diff = await stratum.diffConfig(tenant_a, tenant_b);
|
|
37
|
+
const diff = await stratum.diffConfig(tenant_a, tenant_b, (0, config_js_1.configReadOptions)(request));
|
|
37
38
|
reply.status(200).send(diff);
|
|
38
39
|
});
|
|
39
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-diff.js","sourceRoot":"","sources":["../../src/routes/config-diff.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config-diff.js","sourceRoot":"","sources":["../../src/routes/config-diff.ts"],"names":[],"mappings":";;AAWA,wDA2CC;AApDD,mEAKuC;AACvC,6DAAkE;AAClE,2CAAgD;AAEhD,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,6EAA6E;IAC7E,+EAA+E;IAC/E,0DAA0D;IAC1D,MAAM,kBAAkB,GAAG,IAAA,wCAAsB,EAAC,OAAO,EAAE,kCAAgB,CAAC,CAAC;IAE7E,OAAO,KAAK,UAAU,gBAAgB,CAAC,GAAoB;QACzD,6EAA6E;QAC7E,IAAA,oCAAkB,EAAC,GAAG,EAAE,kCAAgB,CAAC,CAAC;QAC1C,IAAA,mCAAoB,EAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5D,mGAAmG;QACnG,GAAG,CAAC,GAAG,CACL,OAAO,EACP,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAClC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;YAE7C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACrB,KAAK,EAAE;wBACL,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,0DAA0D;qBACpE;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACrB,KAAK,EAAE;wBACL,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,yCAAyC;qBACnD;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAA,6BAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;YACtF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/routes/config.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
import { FastifyInstance } from "fastify";
|
|
1
|
+
import { FastifyInstance, FastifyRequest } from "fastify";
|
|
2
|
+
import { type ResolveConfigOptions } from "@stratum-hq/core";
|
|
2
3
|
import { Stratum } from "@stratum-hq/lib";
|
|
4
|
+
/**
|
|
5
|
+
* Library read options for a config read made by `request`'s caller.
|
|
6
|
+
*
|
|
7
|
+
* A sensitive value inherited from an ancestor is revealed only to a caller
|
|
8
|
+
* whose key belongs to the tenant that set it. A global key is not that
|
|
9
|
+
* tenant, so it gets no viewer and those values stay masked. The API never
|
|
10
|
+
* asks the library to reveal every sensitive value.
|
|
11
|
+
*/
|
|
12
|
+
export declare function configReadOptions(request: FastifyRequest): ResolveConfigOptions;
|
|
3
13
|
export declare function createConfigRoutes(stratum: Stratum): (app: FastifyInstance) => Promise<void>;
|
|
4
14
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAKL,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAuD1C;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,oBAAoB,CAG/E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,IACd,KAAK,eAAe,KAAG,OAAO,CAAC,IAAI,CAAC,CAwFxE"}
|
package/dist/routes/config.js
CHANGED
|
@@ -1,32 +1,92 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configReadOptions = configReadOptions;
|
|
3
4
|
exports.createConfigRoutes = createConfigRoutes;
|
|
4
5
|
const core_1 = require("@stratum-hq/core");
|
|
5
6
|
const audit_logs_js_1 = require("./audit-logs.js");
|
|
6
7
|
const tenant_scope_js_1 = require("../middleware/tenant-scope.js");
|
|
7
8
|
const authorize_js_1 = require("../middleware/authorize.js");
|
|
9
|
+
const error_handler_js_1 = require("../middleware/error-handler.js");
|
|
10
|
+
/** The library's reason for an entry that an ancestor's lock refused. */
|
|
11
|
+
const LOCKED_REASON = /is locked by tenant/;
|
|
12
|
+
/**
|
|
13
|
+
* The result of a batch that nothing was written for: every entry failed,
|
|
14
|
+
* with its own reason when it has one.
|
|
15
|
+
*/
|
|
16
|
+
function rolledBackResult(keys, reasons) {
|
|
17
|
+
const failedKeys = [...reasons.keys()].map((i) => `'${keys[i]}'`).join(", ");
|
|
18
|
+
return {
|
|
19
|
+
results: keys.map((key, i) => ({
|
|
20
|
+
key,
|
|
21
|
+
status: "error",
|
|
22
|
+
error: reasons.get(i) ?? `Not applied: the batch was rolled back because ${failedKeys} failed`,
|
|
23
|
+
})),
|
|
24
|
+
succeeded: 0,
|
|
25
|
+
failed: keys.length,
|
|
26
|
+
rolled_back: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks every batch entry and returns the issues, with paths under `entries`.
|
|
31
|
+
* The library refuses the same entries, but checking here keeps them away from it.
|
|
32
|
+
*/
|
|
33
|
+
function batchEntryIssues(entries) {
|
|
34
|
+
const issues = [];
|
|
35
|
+
entries.forEach((raw, i) => {
|
|
36
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
37
|
+
issues.push({ path: ["entries", i], message: "Expected object", code: "invalid_type" });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const entry = raw;
|
|
41
|
+
if (typeof entry.key !== "string" || entry.key.length === 0) {
|
|
42
|
+
issues.push({ path: ["entries", i, "key"], message: "Config key must be a non-empty string", code: "invalid_type" });
|
|
43
|
+
}
|
|
44
|
+
if (entry.value === undefined) {
|
|
45
|
+
issues.push({ path: ["entries", i, "value"], message: "Required", code: "invalid_type" });
|
|
46
|
+
}
|
|
47
|
+
const parsed = core_1.SetConfigInputSchema.safeParse(entry);
|
|
48
|
+
if (!parsed.success) {
|
|
49
|
+
for (const issue of parsed.error.issues) {
|
|
50
|
+
issues.push({ path: ["entries", i, ...issue.path], message: issue.message, code: issue.code });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return issues;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Library read options for a config read made by `request`'s caller.
|
|
58
|
+
*
|
|
59
|
+
* A sensitive value inherited from an ancestor is revealed only to a caller
|
|
60
|
+
* whose key belongs to the tenant that set it. A global key is not that
|
|
61
|
+
* tenant, so it gets no viewer and those values stay masked. The API never
|
|
62
|
+
* asks the library to reveal every sensitive value.
|
|
63
|
+
*/
|
|
64
|
+
function configReadOptions(request) {
|
|
65
|
+
const viewerTenantId = request.apiKey?.tenant_id;
|
|
66
|
+
return viewerTenantId ? { viewerTenantId } : {};
|
|
67
|
+
}
|
|
8
68
|
function createConfigRoutes(stratum) {
|
|
9
69
|
return async function configRoutes(app) {
|
|
10
70
|
// Tenant-scoped keys can only access config for their own tenant subtree
|
|
11
71
|
(0, tenant_scope_js_1.declareTenantScope)(app, tenant_scope_js_1.fromParamId);
|
|
12
72
|
(0, authorize_js_1.declareRequiredScope)(app, { read: "read", write: "write" });
|
|
13
|
-
// GET /api/v1/tenants/:id/config
|
|
73
|
+
// GET /api/v1/tenants/:id/config: Get resolved config
|
|
14
74
|
app.get("/", async (request, reply) => {
|
|
15
|
-
const resolved = await stratum.resolveConfig(request.params.id);
|
|
75
|
+
const resolved = await stratum.resolveConfig(request.params.id, configReadOptions(request));
|
|
16
76
|
reply.status(200).send(resolved);
|
|
17
77
|
});
|
|
18
|
-
// PUT /api/v1/tenants/:id/config/:key
|
|
78
|
+
// PUT /api/v1/tenants/:id/config/:key: Set config value
|
|
19
79
|
app.put("/:key", async (request, reply) => {
|
|
20
80
|
const input = core_1.SetConfigInputSchema.parse(request.body);
|
|
21
81
|
const entry = await stratum.setConfig(request.params.id, request.params.key, input, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
22
82
|
reply.status(200).send(entry);
|
|
23
83
|
});
|
|
24
|
-
// DELETE /api/v1/tenants/:id/config/:key
|
|
84
|
+
// DELETE /api/v1/tenants/:id/config/:key: Delete config override
|
|
25
85
|
app.delete("/:key", async (request, reply) => {
|
|
26
86
|
await stratum.deleteConfig(request.params.id, request.params.key, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
27
87
|
reply.status(204).send();
|
|
28
88
|
});
|
|
29
|
-
// PUT /api/v1/tenants/:id/config/batch
|
|
89
|
+
// PUT /api/v1/tenants/:id/config/batch: Set multiple config keys atomically
|
|
30
90
|
app.put("/batch", async (request, reply) => {
|
|
31
91
|
const body = request.body;
|
|
32
92
|
if (!Array.isArray(body?.entries) || body.entries.length === 0) {
|
|
@@ -37,17 +97,57 @@ function createConfigRoutes(stratum) {
|
|
|
37
97
|
reply.status(400).send({ error: { code: "VALIDATION_ERROR", message: "Batch limited to 200 entries" } });
|
|
38
98
|
return;
|
|
39
99
|
}
|
|
100
|
+
const keys = body.entries.map((e) => {
|
|
101
|
+
const key = e?.key;
|
|
102
|
+
return typeof key === "string" ? key : "";
|
|
103
|
+
});
|
|
104
|
+
const issues = batchEntryIssues(body.entries);
|
|
105
|
+
if (issues.length > 0) {
|
|
106
|
+
const reasons = new Map();
|
|
107
|
+
for (const issue of issues) {
|
|
108
|
+
const i = issue.path[1];
|
|
109
|
+
if (!reasons.has(i))
|
|
110
|
+
reasons.set(i, issue.message);
|
|
111
|
+
}
|
|
112
|
+
reply.status(400).send((0, error_handler_js_1.validationErrorBody)("Validation failed", issues, { ...rolledBackResult(keys, reasons) }));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
40
115
|
const entries = body.entries.map((e) => {
|
|
41
116
|
const parsed = core_1.SetConfigInputSchema.parse(e);
|
|
42
117
|
const entry = e;
|
|
43
118
|
return { key: entry.key, value: parsed.value, locked: parsed.locked, sensitive: parsed.sensitive };
|
|
44
119
|
});
|
|
45
120
|
const batchResult = await stratum.batchSetConfig(request.params.id, entries, (0, audit_logs_js_1.buildAuditContext)(request));
|
|
121
|
+
if (batchResult.rolled_back) {
|
|
122
|
+
// Nothing was written. A lock gets the status of a single locked write.
|
|
123
|
+
const refused = batchResult.results
|
|
124
|
+
.map((result, i) => ({ result, i }))
|
|
125
|
+
.filter(({ result }) => result.error && !result.error.startsWith("Not applied:"));
|
|
126
|
+
const locked = refused.filter(({ result }) => LOCKED_REASON.test(result.error ?? ""));
|
|
127
|
+
if (locked.length > 0) {
|
|
128
|
+
const lockedKeys = locked.map(({ result }) => `'${result.key}'`).join(", ");
|
|
129
|
+
reply.status(403).send({
|
|
130
|
+
error: {
|
|
131
|
+
code: core_1.ErrorCode.CONFIG_LOCKED,
|
|
132
|
+
message: `The batch was rolled back and nothing was written: ${lockedKeys} locked by an ancestor`,
|
|
133
|
+
details: { ...batchResult },
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const refusedIssues = refused.map(({ result, i }) => ({
|
|
139
|
+
path: ["entries", i],
|
|
140
|
+
message: result.error,
|
|
141
|
+
code: "custom",
|
|
142
|
+
}));
|
|
143
|
+
reply.status(400).send((0, error_handler_js_1.validationErrorBody)("Validation failed", refusedIssues, { ...batchResult }));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
46
146
|
reply.status(200).send(batchResult);
|
|
47
147
|
});
|
|
48
|
-
// GET /api/v1/tenants/:id/config/inheritance
|
|
148
|
+
// GET /api/v1/tenants/:id/config/inheritance: Get full inheritance view
|
|
49
149
|
app.get("/inheritance", async (request, reply) => {
|
|
50
|
-
const inheritance = await stratum.getConfigWithInheritance(request.params.id);
|
|
150
|
+
const inheritance = await stratum.getConfigWithInheritance(request.params.id, configReadOptions(request));
|
|
51
151
|
reply.status(200).send(inheritance);
|
|
52
152
|
});
|
|
53
153
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"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"}
|