@stratum-hq/lib 1.2.1 → 1.4.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/dist/crypto.d.ts +6 -2
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +23 -6
- package/dist/crypto.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate-schemas.d.ts.map +1 -1
- package/dist/migrate-schemas.js +19 -8
- package/dist/migrate-schemas.js.map +1 -1
- package/dist/migrations/022_roles_name_per_tenant.sql +10 -0
- package/dist/migrations/024_propagate_ancestry_ltree.sql +42 -0
- package/dist/migrations/025_redact_sensitive_config_audit.sql +19 -0
- package/dist/migrations/026_redact_webhook_secret_audit.sql +28 -0
- package/dist/migrations/027_tenant_status_pending.sql +8 -0
- package/dist/migrations/028_ancestry_path_prefix_index.sql +12 -0
- package/dist/pool-helpers.d.ts.map +1 -1
- package/dist/pool-helpers.js +20 -4
- package/dist/pool-helpers.js.map +1 -1
- package/dist/services/abac-service.d.ts +1 -1
- package/dist/services/abac-service.d.ts.map +1 -1
- package/dist/services/abac-service.js +64 -43
- package/dist/services/abac-service.js.map +1 -1
- package/dist/services/api-key-service.d.ts +6 -0
- package/dist/services/api-key-service.d.ts.map +1 -1
- package/dist/services/api-key-service.js +84 -33
- package/dist/services/api-key-service.js.map +1 -1
- package/dist/services/audit-service.d.ts.map +1 -1
- package/dist/services/audit-service.js +2 -1
- package/dist/services/audit-service.js.map +1 -1
- package/dist/services/config-service.d.ts.map +1 -1
- package/dist/services/config-service.js +14 -6
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/consent-service.d.ts +2 -2
- package/dist/services/consent-service.d.ts.map +1 -1
- package/dist/services/consent-service.js +4 -1
- package/dist/services/consent-service.js.map +1 -1
- package/dist/services/event-service.d.ts +12 -0
- package/dist/services/event-service.d.ts.map +1 -1
- package/dist/services/event-service.js +240 -79
- package/dist/services/event-service.js.map +1 -1
- package/dist/services/key-rotation-service.d.ts +18 -1
- package/dist/services/key-rotation-service.d.ts.map +1 -1
- package/dist/services/key-rotation-service.js +57 -9
- package/dist/services/key-rotation-service.js.map +1 -1
- package/dist/services/permission-service.d.ts.map +1 -1
- package/dist/services/permission-service.js +42 -18
- package/dist/services/permission-service.js.map +1 -1
- package/dist/services/region-service.d.ts.map +1 -1
- package/dist/services/region-service.js +8 -7
- package/dist/services/region-service.js.map +1 -1
- package/dist/services/retention-service.d.ts +7 -1
- package/dist/services/retention-service.d.ts.map +1 -1
- package/dist/services/retention-service.js +47 -7
- package/dist/services/retention-service.js.map +1 -1
- package/dist/services/role-service.d.ts +7 -0
- package/dist/services/role-service.d.ts.map +1 -1
- package/dist/services/role-service.js +25 -11
- package/dist/services/role-service.js.map +1 -1
- package/dist/services/tenant-service.d.ts +24 -3
- package/dist/services/tenant-service.d.ts.map +1 -1
- package/dist/services/tenant-service.js +132 -61
- package/dist/services/tenant-service.js.map +1 -1
- package/dist/services/webhook-service.d.ts +5 -0
- package/dist/services/webhook-service.d.ts.map +1 -1
- package/dist/services/webhook-service.js +14 -0
- package/dist/services/webhook-service.js.map +1 -1
- package/dist/stratum-tables.d.ts +12 -0
- package/dist/stratum-tables.d.ts.map +1 -0
- package/dist/stratum-tables.js +31 -0
- package/dist/stratum-tables.js.map +1 -0
- package/dist/stratum.d.ts +30 -12
- package/dist/stratum.d.ts.map +1 -1
- package/dist/stratum.js +138 -43
- package/dist/stratum.js.map +1 -1
- package/dist/validation.d.ts +25 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +23 -0
- package/dist/validation.js.map +1 -0
- package/package.json +5 -5
package/dist/crypto.d.ts
CHANGED
|
@@ -4,6 +4,10 @@ export declare function encrypt(plaintext: string): string;
|
|
|
4
4
|
* Falls back to STRATUM_ENCRYPTION_KEY_PREVIOUS if primary key decryption fails,
|
|
5
5
|
* enabling dual-key reads during rolling deployments. */
|
|
6
6
|
export declare function decrypt(encrypted: string): string;
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/** Encrypts a value with the key derived from `keyMaterial`.
|
|
8
|
+
* Key rotation uses it because it must not read or change process.env. */
|
|
9
|
+
export declare function encryptWithKeyMaterial(plaintext: string, keyMaterial: string): string;
|
|
10
|
+
/** Returns the plaintext, or null when the value does not decrypt with the key derived from `keyMaterial`.
|
|
11
|
+
* Key rotation uses the null result to try the next key instead of failing. */
|
|
12
|
+
export declare function decryptWithKeyMaterial(encrypted: string, keyMaterial: string): string | null;
|
|
9
13
|
//# sourceMappingURL=crypto.d.ts.map
|
package/dist/crypto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AA0EA,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;yDAEyD;AACzD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED;0EAC0E;AAC1E,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAErF;AAED;+EAC+E;AAC/E,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5F"}
|
package/dist/crypto.js
CHANGED
|
@@ -5,12 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.encrypt = encrypt;
|
|
7
7
|
exports.decrypt = decrypt;
|
|
8
|
-
exports.
|
|
8
|
+
exports.encryptWithKeyMaterial = encryptWithKeyMaterial;
|
|
9
|
+
exports.decryptWithKeyMaterial = decryptWithKeyMaterial;
|
|
9
10
|
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
10
11
|
const ALGORITHM = "aes-256-gcm";
|
|
11
12
|
const IV_LENGTH = 12;
|
|
12
13
|
const AUTH_TAG_LENGTH = 16;
|
|
13
14
|
const CURRENT_KEY_VERSION = "v1";
|
|
15
|
+
// Fixed, public salt used only outside production when STRATUM_HKDF_SALT is
|
|
16
|
+
// unset. It must stay stable: a per-process salt would make every value
|
|
17
|
+
// encrypted by an earlier process (or another replica) undecryptable. An HKDF
|
|
18
|
+
// salt is not secret; the key material is. Production still requires an
|
|
19
|
+
// explicit STRATUM_HKDF_SALT.
|
|
20
|
+
const NON_PRODUCTION_DEFAULT_SALT = "stratum-non-production-hkdf-salt-v1";
|
|
14
21
|
const HKDF_SALT = (() => {
|
|
15
22
|
if (process.env.STRATUM_HKDF_SALT) {
|
|
16
23
|
return Buffer.from(process.env.STRATUM_HKDF_SALT, "hex");
|
|
@@ -18,7 +25,7 @@ const HKDF_SALT = (() => {
|
|
|
18
25
|
if (process.env.NODE_ENV === "production") {
|
|
19
26
|
throw new Error("STRATUM_HKDF_SALT must be set in production");
|
|
20
27
|
}
|
|
21
|
-
return
|
|
28
|
+
return Buffer.from(NON_PRODUCTION_DEFAULT_SALT, "utf8");
|
|
22
29
|
})();
|
|
23
30
|
function hkdfDeriveKey(keyMaterial, info = "stratum-aes-key") {
|
|
24
31
|
return Buffer.from(node_crypto_1.default.hkdfSync("sha256", Buffer.from(keyMaterial, "utf8"), HKDF_SALT, info, 32));
|
|
@@ -89,9 +96,19 @@ function decrypt(encrypted) {
|
|
|
89
96
|
throw err;
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return encryptWithKey(plaintext, deriveKey(
|
|
99
|
+
/** Encrypts a value with the key derived from `keyMaterial`.
|
|
100
|
+
* Key rotation uses it because it must not read or change process.env. */
|
|
101
|
+
function encryptWithKeyMaterial(plaintext, keyMaterial) {
|
|
102
|
+
return encryptWithKey(plaintext, deriveKey(keyMaterial));
|
|
103
|
+
}
|
|
104
|
+
/** Returns the plaintext, or null when the value does not decrypt with the key derived from `keyMaterial`.
|
|
105
|
+
* Key rotation uses the null result to try the next key instead of failing. */
|
|
106
|
+
function decryptWithKeyMaterial(encrypted, keyMaterial) {
|
|
107
|
+
try {
|
|
108
|
+
return decryptWithKey(encrypted, deriveKey(keyMaterial));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
96
113
|
}
|
|
97
114
|
//# sourceMappingURL=crypto.js.map
|
package/dist/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
export { Stratum, type StratumOptions } from "./stratum.js";
|
|
2
2
|
export { migrate, type MigrateOptions } from "./migrate.js";
|
|
3
3
|
export { migrateAllSchemas, type MigrateSchemasOptions, type MigrateSchemasResult, } from "./migrate-schemas.js";
|
|
4
|
+
export { STRATUM_TABLES } from "./stratum-tables.js";
|
|
4
5
|
export { withClient, withTransaction } from "./pool-helpers.js";
|
|
5
6
|
export { runScopedJob, type ScopedJobFn, type RunScopedJobOptions, } from "./scoped-job.js";
|
|
6
7
|
export { verifyWebhookSignature, signWebhookPayload, DEFAULT_WEBHOOK_TOLERANCE_SECONDS, type VerifyWebhookOptions, } from "./webhook-signature.js";
|
|
7
8
|
export { traced, getTracer, isTracingEnabled } from "./telemetry.js";
|
|
8
|
-
export { ErrorCode, StratumError, TenantNotFoundError, TenantAlreadyExistsError, TenantHasChildrenError, TenantCycleDetectedError, TenantArchivedError, TenantSuspendedError, InvalidTenantStateError, TenantContextNotFoundError, IsolationViolationError, IsolationStrategyUnsupportedError, PermissionLockedError, PermissionNotFoundError, PermissionRevocationDeniedError, ConfigLockedError, ConfigNotFoundError, ValidationError, UnauthorizedError, ForbiddenError, WebhookNotFoundError, WebhookDeliveryError, WebhookUrlValidationError, AbacPolicyNotFoundError, InvalidAbacOperatorError, AbacPolicyLockedError, } from "@stratum-hq/core";
|
|
9
|
+
export { ErrorCode, StratumError, TenantNotFoundError, TenantAlreadyExistsError, TenantHasChildrenError, TenantCycleDetectedError, TenantArchivedError, TenantSuspendedError, TenantPendingError, TenantProvisioningError, InvalidTenantStateError, TenantContextNotFoundError, IsolationViolationError, IsolationStrategyUnsupportedError, PermissionLockedError, PermissionNotFoundError, PermissionRevocationDeniedError, ConfigLockedError, ConfigNotFoundError, ValidationError, UnauthorizedError, ForbiddenError, RegionInUseError, RegionNotActiveError, WebhookNotFoundError, WebhookDeliveryError, WebhookUrlValidationError, RegionNotFoundError, AbacPolicyNotFoundError, InvalidAbacOperatorError, AbacPolicyLockedError, } from "@stratum-hq/core";
|
|
9
10
|
export type { TenantNode, TenantContext, CreateTenantInput, UpdateTenantInput, MoveTenantInput, PaginationInput, PaginatedResult, ConfigEntry, SetConfigInput, BatchSetConfigEntry, ResolvedConfigEntry, ResolvedConfig, PermissionPolicy, CreatePermissionInput, UpdatePermissionInput, ResolvedPermission, } from "@stratum-hq/core";
|
|
10
11
|
export { RateLimiter, MemoryRateLimitStore } from "./services/rate-limit-service.js";
|
|
11
12
|
export type { RateLimit, RateLimitResult, RateLimitState, RateLimitStore, RateLimitResolver, RateLimiterOptions, } from "./services/rate-limit-service.js";
|
|
12
13
|
export type { ApiKeyRecord, CreatedApiKey, ValidatedApiKey, CreateApiKeyOptions } from "./services/api-key-service.js";
|
|
13
14
|
export type { BatchCreateResult } from "./services/tenant-service.js";
|
|
14
|
-
export type { KeyRotationResult } from "./services/key-rotation-service.js";
|
|
15
|
+
export type { KeyRotationResult, KeyRotationUnreadableRow } from "./services/key-rotation-service.js";
|
|
15
16
|
export type { DeliveryStats } from "./services/event-service.js";
|
|
16
17
|
export type { Role, CreateRoleInput, UpdateRoleInput } from "./services/role-service.js";
|
|
17
18
|
export type { AuditContext, AuditEntry, AuditLogQuery, RecordAuditEventInput } from "@stratum-hq/core";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,iCAAiC,EACjC,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKrE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,iCAAiC,EACjC,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACrF,YAAY,EACV,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvH,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,iCAAiC,EACjC,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKrE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,iCAAiC,EACjC,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACrF,YAAY,EACV,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvH,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AACtG,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGzF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGvG,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.noopLogger = exports.defaultLogger = exports.MemoryRateLimitStore = exports.RateLimiter = exports.AbacPolicyLockedError = exports.InvalidAbacOperatorError = exports.AbacPolicyNotFoundError = exports.WebhookUrlValidationError = exports.WebhookDeliveryError = exports.WebhookNotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.ValidationError = exports.ConfigNotFoundError = exports.ConfigLockedError = exports.PermissionRevocationDeniedError = exports.PermissionNotFoundError = exports.PermissionLockedError = exports.IsolationStrategyUnsupportedError = exports.IsolationViolationError = exports.TenantContextNotFoundError = exports.InvalidTenantStateError = exports.TenantSuspendedError = exports.TenantArchivedError = exports.TenantCycleDetectedError = exports.TenantHasChildrenError = exports.TenantAlreadyExistsError = exports.TenantNotFoundError = exports.StratumError = exports.ErrorCode = exports.isTracingEnabled = exports.getTracer = exports.traced = exports.DEFAULT_WEBHOOK_TOLERANCE_SECONDS = exports.signWebhookPayload = exports.verifyWebhookSignature = exports.runScopedJob = exports.withTransaction = exports.withClient = exports.migrateAllSchemas = exports.migrate = exports.Stratum = void 0;
|
|
3
|
+
exports.noopLogger = exports.defaultLogger = exports.MemoryRateLimitStore = exports.RateLimiter = exports.AbacPolicyLockedError = exports.InvalidAbacOperatorError = exports.AbacPolicyNotFoundError = exports.RegionNotFoundError = exports.WebhookUrlValidationError = exports.WebhookDeliveryError = exports.WebhookNotFoundError = exports.RegionNotActiveError = exports.RegionInUseError = exports.ForbiddenError = exports.UnauthorizedError = exports.ValidationError = exports.ConfigNotFoundError = exports.ConfigLockedError = exports.PermissionRevocationDeniedError = exports.PermissionNotFoundError = exports.PermissionLockedError = exports.IsolationStrategyUnsupportedError = exports.IsolationViolationError = exports.TenantContextNotFoundError = exports.InvalidTenantStateError = exports.TenantProvisioningError = exports.TenantPendingError = exports.TenantSuspendedError = exports.TenantArchivedError = exports.TenantCycleDetectedError = exports.TenantHasChildrenError = exports.TenantAlreadyExistsError = exports.TenantNotFoundError = exports.StratumError = exports.ErrorCode = exports.isTracingEnabled = exports.getTracer = exports.traced = exports.DEFAULT_WEBHOOK_TOLERANCE_SECONDS = exports.signWebhookPayload = exports.verifyWebhookSignature = exports.runScopedJob = exports.withTransaction = exports.withClient = exports.STRATUM_TABLES = exports.migrateAllSchemas = exports.migrate = exports.Stratum = void 0;
|
|
4
4
|
var stratum_js_1 = require("./stratum.js");
|
|
5
5
|
Object.defineProperty(exports, "Stratum", { enumerable: true, get: function () { return stratum_js_1.Stratum; } });
|
|
6
6
|
var migrate_js_1 = require("./migrate.js");
|
|
7
7
|
Object.defineProperty(exports, "migrate", { enumerable: true, get: function () { return migrate_js_1.migrate; } });
|
|
8
8
|
var migrate_schemas_js_1 = require("./migrate-schemas.js");
|
|
9
9
|
Object.defineProperty(exports, "migrateAllSchemas", { enumerable: true, get: function () { return migrate_schemas_js_1.migrateAllSchemas; } });
|
|
10
|
+
var stratum_tables_js_1 = require("./stratum-tables.js");
|
|
11
|
+
Object.defineProperty(exports, "STRATUM_TABLES", { enumerable: true, get: function () { return stratum_tables_js_1.STRATUM_TABLES; } });
|
|
10
12
|
var pool_helpers_js_1 = require("./pool-helpers.js");
|
|
11
13
|
Object.defineProperty(exports, "withClient", { enumerable: true, get: function () { return pool_helpers_js_1.withClient; } });
|
|
12
14
|
Object.defineProperty(exports, "withTransaction", { enumerable: true, get: function () { return pool_helpers_js_1.withTransaction; } });
|
|
@@ -32,6 +34,8 @@ Object.defineProperty(exports, "TenantHasChildrenError", { enumerable: true, get
|
|
|
32
34
|
Object.defineProperty(exports, "TenantCycleDetectedError", { enumerable: true, get: function () { return core_1.TenantCycleDetectedError; } });
|
|
33
35
|
Object.defineProperty(exports, "TenantArchivedError", { enumerable: true, get: function () { return core_1.TenantArchivedError; } });
|
|
34
36
|
Object.defineProperty(exports, "TenantSuspendedError", { enumerable: true, get: function () { return core_1.TenantSuspendedError; } });
|
|
37
|
+
Object.defineProperty(exports, "TenantPendingError", { enumerable: true, get: function () { return core_1.TenantPendingError; } });
|
|
38
|
+
Object.defineProperty(exports, "TenantProvisioningError", { enumerable: true, get: function () { return core_1.TenantProvisioningError; } });
|
|
35
39
|
Object.defineProperty(exports, "InvalidTenantStateError", { enumerable: true, get: function () { return core_1.InvalidTenantStateError; } });
|
|
36
40
|
Object.defineProperty(exports, "TenantContextNotFoundError", { enumerable: true, get: function () { return core_1.TenantContextNotFoundError; } });
|
|
37
41
|
Object.defineProperty(exports, "IsolationViolationError", { enumerable: true, get: function () { return core_1.IsolationViolationError; } });
|
|
@@ -44,9 +48,12 @@ Object.defineProperty(exports, "ConfigNotFoundError", { enumerable: true, get: f
|
|
|
44
48
|
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return core_1.ValidationError; } });
|
|
45
49
|
Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return core_1.UnauthorizedError; } });
|
|
46
50
|
Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return core_1.ForbiddenError; } });
|
|
51
|
+
Object.defineProperty(exports, "RegionInUseError", { enumerable: true, get: function () { return core_1.RegionInUseError; } });
|
|
52
|
+
Object.defineProperty(exports, "RegionNotActiveError", { enumerable: true, get: function () { return core_1.RegionNotActiveError; } });
|
|
47
53
|
Object.defineProperty(exports, "WebhookNotFoundError", { enumerable: true, get: function () { return core_1.WebhookNotFoundError; } });
|
|
48
54
|
Object.defineProperty(exports, "WebhookDeliveryError", { enumerable: true, get: function () { return core_1.WebhookDeliveryError; } });
|
|
49
55
|
Object.defineProperty(exports, "WebhookUrlValidationError", { enumerable: true, get: function () { return core_1.WebhookUrlValidationError; } });
|
|
56
|
+
Object.defineProperty(exports, "RegionNotFoundError", { enumerable: true, get: function () { return core_1.RegionNotFoundError; } });
|
|
50
57
|
Object.defineProperty(exports, "AbacPolicyNotFoundError", { enumerable: true, get: function () { return core_1.AbacPolicyNotFoundError; } });
|
|
51
58
|
Object.defineProperty(exports, "InvalidAbacOperatorError", { enumerable: true, get: function () { return core_1.InvalidAbacOperatorError; } });
|
|
52
59
|
Object.defineProperty(exports, "AbacPolicyLockedError", { enumerable: true, get: function () { return core_1.AbacPolicyLockedError; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2DAI8B;AAH5B,uHAAA,iBAAiB,OAAA;AAInB,qDAAgE;AAAvD,6GAAA,UAAU,OAAA;AAAE,kHAAA,eAAe,OAAA;AACpC,iDAIyB;AAHvB,6GAAA,YAAY,OAAA;AAId,+DAKgC;AAJ9B,8HAAA,sBAAsB,OAAA;AACtB,0HAAA,kBAAkB,OAAA;AAClB,yIAAA,iCAAiC,OAAA;AAGnC,+CAAqE;AAA5D,sGAAA,MAAM,OAAA;AAAE,yGAAA,SAAS,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAE5C,kFAAkF;AAClF,+EAA+E;AAC/E,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2CAA4D;AAAnD,qGAAA,OAAO,OAAA;AAChB,2DAI8B;AAH5B,uHAAA,iBAAiB,OAAA;AAInB,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;AACvB,qDAAgE;AAAvD,6GAAA,UAAU,OAAA;AAAE,kHAAA,eAAe,OAAA;AACpC,iDAIyB;AAHvB,6GAAA,YAAY,OAAA;AAId,+DAKgC;AAJ9B,8HAAA,sBAAsB,OAAA;AACtB,0HAAA,kBAAkB,OAAA;AAClB,yIAAA,iCAAiC,OAAA;AAGnC,+CAAqE;AAA5D,sGAAA,MAAM,OAAA;AAAE,yGAAA,SAAS,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAE5C,kFAAkF;AAClF,+EAA+E;AAC/E,8EAA8E;AAC9E,yCAgC0B;AA/BxB,iGAAA,SAAS,OAAA;AACT,oGAAA,YAAY,OAAA;AACZ,2GAAA,mBAAmB,OAAA;AACnB,gHAAA,wBAAwB,OAAA;AACxB,8GAAA,sBAAsB,OAAA;AACtB,gHAAA,wBAAwB,OAAA;AACxB,2GAAA,mBAAmB,OAAA;AACnB,4GAAA,oBAAoB,OAAA;AACpB,0GAAA,kBAAkB,OAAA;AAClB,+GAAA,uBAAuB,OAAA;AACvB,+GAAA,uBAAuB,OAAA;AACvB,kHAAA,0BAA0B,OAAA;AAC1B,+GAAA,uBAAuB,OAAA;AACvB,yHAAA,iCAAiC,OAAA;AACjC,6GAAA,qBAAqB,OAAA;AACrB,+GAAA,uBAAuB,OAAA;AACvB,uHAAA,+BAA+B,OAAA;AAC/B,yGAAA,iBAAiB,OAAA;AACjB,2GAAA,mBAAmB,OAAA;AACnB,uGAAA,eAAe,OAAA;AACf,yGAAA,iBAAiB,OAAA;AACjB,sGAAA,cAAc,OAAA;AACd,wGAAA,gBAAgB,OAAA;AAChB,4GAAA,oBAAoB,OAAA;AACpB,4GAAA,oBAAoB,OAAA;AACpB,4GAAA,oBAAoB,OAAA;AACpB,iHAAA,yBAAyB,OAAA;AACzB,2GAAA,mBAAmB,OAAA;AACnB,+GAAA,uBAAuB,OAAA;AACvB,gHAAA,wBAAwB,OAAA;AACxB,6GAAA,qBAAqB,OAAA;AAuBvB,0EAAqF;AAA5E,oHAAA,WAAW,OAAA;AAAE,6HAAA,oBAAoB,OAAA;AA2B1C,yCAAwD;AAA/C,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-schemas.d.ts","sourceRoot":"","sources":["../src/migrate-schemas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"migrate-schemas.d.ts","sourceRoot":"","sources":["../src/migrate-schemas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAAE,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA8D/B"}
|
package/dist/migrate-schemas.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.migrateAllSchemas = migrateAllSchemas;
|
|
7
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const pool_helpers_js_1 = require("./pool-helpers.js");
|
|
9
10
|
/**
|
|
10
11
|
* Discover all tenant schemas (tenants with SCHEMA_PER_TENANT isolation)
|
|
11
12
|
* and run the standard migration set against each one.
|
|
@@ -14,8 +15,9 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
14
15
|
*/
|
|
15
16
|
async function migrateAllSchemas(options) {
|
|
16
17
|
const { pool, concurrency = 5, onProgress, enforceRls } = options;
|
|
17
|
-
// Discover tenant schemas
|
|
18
|
-
|
|
18
|
+
// Discover tenant schemas. The tenants registry is under FORCE RLS, so
|
|
19
|
+
// discovery runs under the control-plane bypass like every other lib read.
|
|
20
|
+
const { rows } = await (0, pool_helpers_js_1.withClient)(pool, (client) => client.query(`SELECT slug FROM tenants WHERE isolation_strategy = 'SCHEMA_PER_TENANT' AND (deleted_at IS NULL) ORDER BY slug`));
|
|
19
21
|
const schemas = rows.map((r) => `tenant_${r.slug}`);
|
|
20
22
|
const result = { succeeded: [], failed: [] };
|
|
21
23
|
if (schemas.length === 0) {
|
|
@@ -61,24 +63,29 @@ async function migrateAllSchemas(options) {
|
|
|
61
63
|
async function migrateSchema(pool, schema, migrations, enforceRls) {
|
|
62
64
|
// Use a hash of the schema name for a unique advisory lock key per schema
|
|
63
65
|
const lockKey = hashSchemaLock(schema);
|
|
66
|
+
const quoted = quoteIdent(schema);
|
|
64
67
|
for (const migration of migrations) {
|
|
65
68
|
const client = await pool.connect();
|
|
66
69
|
try {
|
|
67
70
|
await client.query("BEGIN");
|
|
68
71
|
// Advisory lock scoped to this schema
|
|
69
72
|
await client.query(`SELECT pg_advisory_xact_lock($1)`, [lockKey]);
|
|
70
|
-
// Set search_path to the tenant schema
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
+
// Set search_path to the tenant schema. public stays on the path because
|
|
74
|
+
// the migration SQL uses extension types and functions installed there
|
|
75
|
+
// (ltree, uuid_generate_v4).
|
|
76
|
+
await client.query(`SET LOCAL search_path = ${quoted}, public`);
|
|
77
|
+
// Ensure _migrations exists in this schema. It is schema-qualified so the
|
|
78
|
+
// bookkeeping can never resolve to public._migrations; if the tenant
|
|
79
|
+
// schema does not exist this fails and the schema is reported as failed.
|
|
73
80
|
await client.query(`
|
|
74
|
-
CREATE TABLE IF NOT EXISTS _migrations (
|
|
81
|
+
CREATE TABLE IF NOT EXISTS ${quoted}._migrations (
|
|
75
82
|
id SERIAL PRIMARY KEY,
|
|
76
83
|
name TEXT NOT NULL UNIQUE,
|
|
77
84
|
applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
78
85
|
)
|
|
79
86
|
`);
|
|
80
87
|
// Check if already applied
|
|
81
|
-
const { rows } = await client.query(
|
|
88
|
+
const { rows } = await client.query(`SELECT 1 FROM ${quoted}._migrations WHERE name = $1`, [migration.name]);
|
|
82
89
|
if (rows.length > 0) {
|
|
83
90
|
await client.query("COMMIT");
|
|
84
91
|
continue;
|
|
@@ -87,7 +94,7 @@ async function migrateSchema(pool, schema, migrations, enforceRls) {
|
|
|
87
94
|
await client.query("SET LOCAL stratum.enforce_rls = 'on'");
|
|
88
95
|
}
|
|
89
96
|
await client.query(migration.sql);
|
|
90
|
-
await client.query(
|
|
97
|
+
await client.query(`INSERT INTO ${quoted}._migrations (name) VALUES ($1)`, [
|
|
91
98
|
migration.name,
|
|
92
99
|
]);
|
|
93
100
|
await client.query("COMMIT");
|
|
@@ -123,6 +130,10 @@ function quoteIdent(name) {
|
|
|
123
130
|
if (!/^[a-z_][a-z0-9_]*$/i.test(name)) {
|
|
124
131
|
throw new Error(`Invalid schema name: ${name}`);
|
|
125
132
|
}
|
|
133
|
+
// PostgreSQL truncates longer identifiers, which could name another schema.
|
|
134
|
+
if (Buffer.byteLength(name) > 63) {
|
|
135
|
+
throw new Error(`Schema name exceeds 63 bytes: ${name}`);
|
|
136
|
+
}
|
|
126
137
|
return `"${name}"`;
|
|
127
138
|
}
|
|
128
139
|
//# sourceMappingURL=migrate-schemas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-schemas.js","sourceRoot":"","sources":["../src/migrate-schemas.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"migrate-schemas.js","sourceRoot":"","sources":["../src/migrate-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- 022: Role names are unique within a tenant, not across all tenants.
|
|
2
|
+
-- Global roles (tenant_id IS NULL) keep a unique name among themselves.
|
|
3
|
+
|
|
4
|
+
ALTER TABLE roles DROP CONSTRAINT IF EXISTS roles_name_key;
|
|
5
|
+
|
|
6
|
+
CREATE UNIQUE INDEX IF NOT EXISTS roles_tenant_name_key
|
|
7
|
+
ON roles (tenant_id, name) WHERE tenant_id IS NOT NULL;
|
|
8
|
+
|
|
9
|
+
CREATE UNIQUE INDEX IF NOT EXISTS roles_global_name_key
|
|
10
|
+
ON roles (name) WHERE tenant_id IS NULL;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
-- Migration 024: Keep descendants' ancestry_ltree in step with their ancestors.
|
|
2
|
+
--
|
|
3
|
+
-- maintain_ancestry_ltree (001_init.sql) recomputes ancestry_ltree for the row
|
|
4
|
+
-- being inserted or updated only. When a tenant's slug (or parent) changes, its
|
|
5
|
+
-- descendants kept the old slug prefix. This AFTER trigger touches the direct
|
|
6
|
+
-- children whenever a row's ancestry_ltree actually changed; each child's
|
|
7
|
+
-- BEFORE trigger then recomputes its ltree from the updated parent, and its own
|
|
8
|
+
-- AFTER trigger continues down the subtree.
|
|
9
|
+
CREATE OR REPLACE FUNCTION propagate_ancestry_ltree()
|
|
10
|
+
RETURNS TRIGGER AS $$
|
|
11
|
+
BEGIN
|
|
12
|
+
UPDATE tenants SET slug = slug WHERE parent_id = NEW.id;
|
|
13
|
+
RETURN NULL;
|
|
14
|
+
END;
|
|
15
|
+
$$ language 'plpgsql';
|
|
16
|
+
|
|
17
|
+
DROP TRIGGER IF EXISTS propagate_tenant_ancestry_ltree ON tenants;
|
|
18
|
+
CREATE TRIGGER propagate_tenant_ancestry_ltree
|
|
19
|
+
AFTER UPDATE OF parent_id, slug ON tenants
|
|
20
|
+
FOR EACH ROW
|
|
21
|
+
WHEN (OLD.ancestry_ltree IS DISTINCT FROM NEW.ancestry_ltree)
|
|
22
|
+
EXECUTE FUNCTION propagate_ancestry_ltree();
|
|
23
|
+
|
|
24
|
+
-- Repair rows left stale by earlier renames: recompute every ltree from the
|
|
25
|
+
-- parent_id chain. Setting ancestry_ltree alone does not fire either trigger.
|
|
26
|
+
-- Runs under bypass so row-level security (019) does not hide rows.
|
|
27
|
+
SET LOCAL app.bypass_rls = 'on';
|
|
28
|
+
|
|
29
|
+
WITH RECURSIVE chain AS (
|
|
30
|
+
SELECT id, slug::ltree AS lt
|
|
31
|
+
FROM tenants
|
|
32
|
+
WHERE parent_id IS NULL
|
|
33
|
+
UNION ALL
|
|
34
|
+
SELECT c.id, chain.lt || c.slug::ltree
|
|
35
|
+
FROM tenants c
|
|
36
|
+
JOIN chain ON c.parent_id = chain.id
|
|
37
|
+
)
|
|
38
|
+
UPDATE tenants
|
|
39
|
+
SET ancestry_ltree = chain.lt
|
|
40
|
+
FROM chain
|
|
41
|
+
WHERE tenants.id = chain.id
|
|
42
|
+
AND tenants.ancestry_ltree IS DISTINCT FROM chain.lt;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
-- Migration 025: Redact sensitive config values from existing audit rows.
|
|
2
|
+
--
|
|
3
|
+
-- setConfig used to record the raw input, including the plaintext value of a
|
|
4
|
+
-- config key written with sensitive = true, as the audit after_state. New rows
|
|
5
|
+
-- are redacted at write time; this scrubs rows written before that change. The
|
|
6
|
+
-- rest of each audit row (actor, key, flags, timestamps) is kept.
|
|
7
|
+
--
|
|
8
|
+
-- Runs under bypass so row-level security (019) does not hide rows from the
|
|
9
|
+
-- migration role.
|
|
10
|
+
SET LOCAL app.bypass_rls = 'on';
|
|
11
|
+
|
|
12
|
+
UPDATE audit_logs
|
|
13
|
+
SET after_state = jsonb_set(after_state, '{value}', '"[REDACTED]"'::jsonb)
|
|
14
|
+
WHERE action = 'config.updated'
|
|
15
|
+
AND after_state IS NOT NULL
|
|
16
|
+
AND jsonb_typeof(after_state) = 'object'
|
|
17
|
+
AND after_state->>'sensitive' = 'true'
|
|
18
|
+
AND after_state ? 'value'
|
|
19
|
+
AND after_state->'value' IS DISTINCT FROM '"[REDACTED]"'::jsonb;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- Migration 026: Redact webhook secrets from existing audit rows.
|
|
2
|
+
--
|
|
3
|
+
-- updateWebhook used to record the raw input, including a rotated plaintext
|
|
4
|
+
-- webhook secret, as the audit after_state. New rows are redacted at write
|
|
5
|
+
-- time; this scrubs rows written before that change. The rest of each audit
|
|
6
|
+
-- row (actor, webhook id, other changed fields, timestamps) is kept.
|
|
7
|
+
--
|
|
8
|
+
-- Runs under bypass so row-level security (019) does not hide rows from the
|
|
9
|
+
-- migration role.
|
|
10
|
+
SET LOCAL app.bypass_rls = 'on';
|
|
11
|
+
|
|
12
|
+
UPDATE audit_logs
|
|
13
|
+
SET after_state = jsonb_set(after_state, '{secret}', '"[REDACTED]"'::jsonb)
|
|
14
|
+
WHERE resource_type = 'webhook'
|
|
15
|
+
AND action LIKE 'webhook.%'
|
|
16
|
+
AND after_state IS NOT NULL
|
|
17
|
+
AND jsonb_typeof(after_state) = 'object'
|
|
18
|
+
AND after_state ? 'secret'
|
|
19
|
+
AND after_state->'secret' IS DISTINCT FROM '"[REDACTED]"'::jsonb;
|
|
20
|
+
|
|
21
|
+
UPDATE audit_logs
|
|
22
|
+
SET before_state = jsonb_set(before_state, '{secret}', '"[REDACTED]"'::jsonb)
|
|
23
|
+
WHERE resource_type = 'webhook'
|
|
24
|
+
AND action LIKE 'webhook.%'
|
|
25
|
+
AND before_state IS NOT NULL
|
|
26
|
+
AND jsonb_typeof(before_state) = 'object'
|
|
27
|
+
AND before_state ? 'secret'
|
|
28
|
+
AND before_state->'secret' IS DISTINCT FROM '"[REDACTED]"'::jsonb;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- Tenant lifecycle: add the 'pending' state.
|
|
2
|
+
-- A SCHEMA_PER_TENANT or DB_PER_TENANT tenant is inserted as 'pending' and
|
|
3
|
+
-- becomes 'active' only once its schema or database has been provisioned.
|
|
4
|
+
-- Widen the status CHECK from 021_tenant_status_suspended.sql, keeping its name.
|
|
5
|
+
ALTER TABLE tenants DROP CONSTRAINT IF EXISTS tenants_status_check;
|
|
6
|
+
ALTER TABLE tenants
|
|
7
|
+
ADD CONSTRAINT tenants_status_check
|
|
8
|
+
CHECK (status IN ('pending', 'active', 'suspended', 'archived'));
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- Migration 028: Index ancestry_path for subtree queries.
|
|
2
|
+
--
|
|
3
|
+
-- getDescendants and the CASCADE revocations in permission-service and
|
|
4
|
+
-- abac-service select a subtree by the prefix of ancestry_path. text_pattern_ops
|
|
5
|
+
-- lets a btree index serve a prefix LIKE whatever the database collation is.
|
|
6
|
+
-- Without this index, every subtree query scans the whole tenants table.
|
|
7
|
+
--
|
|
8
|
+
-- This statement blocks writes to tenants until the index is built. On a large
|
|
9
|
+
-- table, an operator can build it first with CREATE INDEX CONCURRENTLY and the
|
|
10
|
+
-- same name and definition. IF NOT EXISTS then skips this statement.
|
|
11
|
+
CREATE INDEX IF NOT EXISTS idx_tenant_ancestry_path_prefix
|
|
12
|
+
ON tenants (ancestry_path text_pattern_ops);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool-helpers.d.ts","sourceRoot":"","sources":["../src/pool-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"pool-helpers.d.ts","sourceRoot":"","sources":["../src/pool-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAuCpB,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAeZ"}
|
package/dist/pool-helpers.js
CHANGED
|
@@ -23,8 +23,23 @@ async function enterBypass(client) {
|
|
|
23
23
|
// set_config('app.bypass_rls', 'on', true).
|
|
24
24
|
await client.query("SET LOCAL app.bypass_rls = 'on'");
|
|
25
25
|
}
|
|
26
|
+
// A failed ROLLBACK must not replace the caller's error. Callers map error
|
|
27
|
+
// codes such as 23505, so the original error must reach them unchanged. The
|
|
28
|
+
// ROLLBACK error goes to client.release instead: a truthy argument makes
|
|
29
|
+
// pg-pool destroy the connection, so no later caller gets a connection in an
|
|
30
|
+
// unknown transaction state.
|
|
31
|
+
async function rollback(client) {
|
|
32
|
+
try {
|
|
33
|
+
await client.query("ROLLBACK");
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
26
40
|
async function withClient(pool, fn) {
|
|
27
41
|
const client = await pool.connect();
|
|
42
|
+
let rollbackErr;
|
|
28
43
|
try {
|
|
29
44
|
await client.query("BEGIN");
|
|
30
45
|
await enterBypass(client);
|
|
@@ -33,15 +48,16 @@ async function withClient(pool, fn) {
|
|
|
33
48
|
return result;
|
|
34
49
|
}
|
|
35
50
|
catch (err) {
|
|
36
|
-
await client
|
|
51
|
+
rollbackErr = await rollback(client);
|
|
37
52
|
throw err;
|
|
38
53
|
}
|
|
39
54
|
finally {
|
|
40
|
-
client.release();
|
|
55
|
+
client.release(rollbackErr);
|
|
41
56
|
}
|
|
42
57
|
}
|
|
43
58
|
async function withTransaction(pool, fn) {
|
|
44
59
|
const client = await pool.connect();
|
|
60
|
+
let rollbackErr;
|
|
45
61
|
try {
|
|
46
62
|
await client.query("BEGIN");
|
|
47
63
|
await enterBypass(client);
|
|
@@ -50,11 +66,11 @@ async function withTransaction(pool, fn) {
|
|
|
50
66
|
return result;
|
|
51
67
|
}
|
|
52
68
|
catch (err) {
|
|
53
|
-
await client
|
|
69
|
+
rollbackErr = await rollback(client);
|
|
54
70
|
throw err;
|
|
55
71
|
}
|
|
56
72
|
finally {
|
|
57
|
-
client.release();
|
|
73
|
+
client.release(rollbackErr);
|
|
58
74
|
}
|
|
59
75
|
}
|
|
60
76
|
//# sourceMappingURL=pool-helpers.js.map
|
package/dist/pool-helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool-helpers.js","sourceRoot":"","sources":["../src/pool-helpers.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pool-helpers.js","sourceRoot":"","sources":["../src/pool-helpers.ts"],"names":[],"mappings":";;AAuCA,gCAkBC;AAED,0CAkBC;AA3ED,gFAAgF;AAChF,4EAA4E;AAC5E,8EAA8E;AAC9E,iFAAiF;AACjF,wBAAwB;AACxB,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,iEAAiE;AACjE,kDAAkD;AAClD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAEhF,KAAK,UAAU,WAAW,CAAC,MAAqB;IAC9C,2EAA2E;IAC3E,gDAAgD;IAChD,4CAA4C;IAC5C,MAAM,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACxD,CAAC;AAED,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,6BAA6B;AAC7B,KAAK,UAAU,QAAQ,CAAC,MAAqB;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,IAAa,EACb,EAAyC;IAEzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,WAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,IAAa,EACb,EAAyC;IAEzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,WAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -28,7 +28,7 @@ export declare function evaluateAbac(pool: pg.Pool, tenantId: string, request: A
|
|
|
28
28
|
* Create a new ABAC policy for a tenant.
|
|
29
29
|
* Rejects if an ancestor policy with the same composite key is LOCKED.
|
|
30
30
|
*/
|
|
31
|
-
export declare function createAbacPolicy(pool: pg.Pool, tenantId: string,
|
|
31
|
+
export declare function createAbacPolicy(pool: pg.Pool, tenantId: string, rawInput: CreateAbacPolicyInput): Promise<AbacPolicy>;
|
|
32
32
|
/**
|
|
33
33
|
* Get all ABAC policies owned by a tenant (non-resolved, own policies only).
|
|
34
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abac-service.d.ts","sourceRoot":"","sources":["../../src/services/abac-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"abac-service.d.ts","sourceRoot":"","sources":["../../src/services/abac-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EAOxB,MAAM,kBAAkB,CAAC;AAM1B;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAsCT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAKT;AAMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAgE/B;AAMD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAyF/B;AAMD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC,UAAU,CAAC,CA+CrB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC,CAQvB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiDf"}
|