@zincapp/znvault-cli 4.24.1 → 4.24.3
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/commands/dynamic-secrets/index.d.ts.map +1 -1
- package/dist/commands/dynamic-secrets/index.js +65 -2
- package/dist/commands/dynamic-secrets/index.js.map +1 -1
- package/dist/commands/dynamic-secrets/permit.d.ts +5 -0
- package/dist/commands/dynamic-secrets/permit.d.ts.map +1 -0
- package/dist/commands/dynamic-secrets/permit.js +104 -0
- package/dist/commands/dynamic-secrets/permit.js.map +1 -0
- package/dist/commands/dynamic-secrets/recovery-fence.d.ts +5 -0
- package/dist/commands/dynamic-secrets/recovery-fence.d.ts.map +1 -0
- package/dist/commands/dynamic-secrets/recovery-fence.js +84 -0
- package/dist/commands/dynamic-secrets/recovery-fence.js.map +1 -0
- package/dist/commands/dynamic-secrets/recovery-parse.d.ts +4 -0
- package/dist/commands/dynamic-secrets/recovery-parse.d.ts.map +1 -0
- package/dist/commands/dynamic-secrets/recovery-parse.js +22 -0
- package/dist/commands/dynamic-secrets/recovery-parse.js.map +1 -0
- package/dist/commands/dynamic-secrets/recovery-types.d.ts +117 -0
- package/dist/commands/dynamic-secrets/recovery-types.d.ts.map +1 -0
- package/dist/commands/dynamic-secrets/recovery-types.js +3 -0
- package/dist/commands/dynamic-secrets/recovery-types.js.map +1 -0
- package/dist/commands/dynamic-secrets/role.d.ts +2 -5
- package/dist/commands/dynamic-secrets/role.d.ts.map +1 -1
- package/dist/commands/dynamic-secrets/role.js +10 -2
- package/dist/commands/dynamic-secrets/role.js.map +1 -1
- package/dist/commands/dynamic-secrets/types.d.ts +11 -1
- package/dist/commands/dynamic-secrets/types.d.ts.map +1 -1
- package/dist/commands/mysql/index.d.ts +2 -0
- package/dist/commands/mysql/index.d.ts.map +1 -1
- package/dist/commands/mysql/index.js +70 -2
- package/dist/commands/mysql/index.js.map +1 -1
- package/dist/commands/mysql/mycnf.d.ts +2 -2
- package/dist/commands/mysql/mycnf.d.ts.map +1 -1
- package/dist/commands/mysql/mycnf.js +1 -1
- package/dist/commands/mysql/mycnf.js.map +1 -1
- package/dist/commands/mysql/permit-broker.d.ts +35 -0
- package/dist/commands/mysql/permit-broker.d.ts.map +1 -0
- package/dist/commands/mysql/permit-broker.js +365 -0
- package/dist/commands/mysql/permit-broker.js.map +1 -0
- package/dist/commands/mysql/recovery-hpke.d.ts +32 -0
- package/dist/commands/mysql/recovery-hpke.d.ts.map +1 -0
- package/dist/commands/mysql/recovery-hpke.js +311 -0
- package/dist/commands/mysql/recovery-hpke.js.map +1 -0
- package/dist/commands/mysql/run.d.ts +59 -19
- package/dist/commands/mysql/run.d.ts.map +1 -1
- package/dist/commands/mysql/run.js +399 -46
- package/dist/commands/mysql/run.js.map +1 -1
- package/dist/commands/mysql/types.d.ts +7 -0
- package/dist/commands/mysql/types.d.ts.map +1 -1
- package/dist/lib/client/http.d.ts.map +1 -1
- package/dist/lib/client/http.js +18 -0
- package/dist/lib/client/http.js.map +1 -1
- package/dist/lib/client/types.d.ts +6 -0
- package/dist/lib/client/types.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC,cAAc,YAAY,CAAC;AAE3B,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyZrE"}
|
|
@@ -5,6 +5,8 @@ import { generateCredentials } from './creds.js';
|
|
|
5
5
|
import { listLeases, getLease, renewLease, revokeLease, } from './lease.js';
|
|
6
6
|
import { registerAllowedHostsCommands } from './allowed-hosts.js';
|
|
7
7
|
import { registerTemplatesCommands } from './templates.js';
|
|
8
|
+
import { getMintOperationStatus, issueMintPermit, revokeMintOperation, } from './permit.js';
|
|
9
|
+
import { closeRecoveryFence, getRecoveryFenceStatus, openRecoveryFence, } from './recovery-fence.js';
|
|
8
10
|
// Re-export types
|
|
9
11
|
export * from './types.js';
|
|
10
12
|
export function registerDynamicSecretsCommands(program) {
|
|
@@ -192,7 +194,7 @@ Notes:
|
|
|
192
194
|
.description('Create a new role for a connection (from a fixed template, or raw SQL as an escape hatch)')
|
|
193
195
|
.option('--name <name>', 'Role name')
|
|
194
196
|
.option('--description <desc>', 'Role description')
|
|
195
|
-
.option('--template <name>', 'Create from a fixed, versioned server template (e.g. readonly, readwrite, ddl, migrate) — mutually exclusive with the raw SQL flags below')
|
|
197
|
+
.option('--template <name>', 'Create from a fixed, versioned server template (e.g. readonly, readwrite, ddl, migrate, packleader-client-v1-recovery) — mutually exclusive with the raw SQL flags below')
|
|
196
198
|
.option('--template-version <n>', 'Template version (defaults to latest on the server if omitted)')
|
|
197
199
|
.option('--creation-statements <sql>', '[raw mode, requires dynamic-secrets:roles:write-raw] SQL statements to create credentials (semicolon-separated)')
|
|
198
200
|
.option('--revocation-statements <sql>', '[raw mode] SQL statements to revoke credentials (semicolon-separated)')
|
|
@@ -217,6 +219,11 @@ Examples:
|
|
|
217
219
|
# prints a "bundle_not_applied" warning.
|
|
218
220
|
znvault dynasec role create <mysql-connection-id> --name migrator --template migrate
|
|
219
221
|
|
|
222
|
+
# Recovery Fence v1: the server creates this role permanently disabled.
|
|
223
|
+
# It can mint only through an OPEN fence plus a one-shot permit.
|
|
224
|
+
znvault dynasec role create <mysql-connection-id> --name packleader-recovery \
|
|
225
|
+
--template packleader-client-v1-recovery --template-version 1
|
|
226
|
+
|
|
220
227
|
# Raw mode (escape hatch): hand-write the SQL yourself. Requires the
|
|
221
228
|
# separate "dynamic-secrets:roles:write-raw" permission (NOT auto-granted —
|
|
222
229
|
# ask an admin to grant it if you get a 403).
|
|
@@ -225,7 +232,7 @@ Examples:
|
|
|
225
232
|
--revocation-statements "DROP ROLE IF EXISTS \\"{{username}}\\""
|
|
226
233
|
|
|
227
234
|
Template catalog (v1, fixed server-side — see "znvault dynasec templates list"):
|
|
228
|
-
MySQL: readonly, readwrite, ddl, migrate
|
|
235
|
+
MySQL: readonly, readwrite, ddl, migrate, packleader-client-v1-recovery
|
|
229
236
|
PostgreSQL: readonly, readwrite (ddl/migrate are MySQL-only; using them
|
|
230
237
|
on a PostgreSQL connection 400s with
|
|
231
238
|
ddl_unsupported_for_engine)
|
|
@@ -244,6 +251,7 @@ Notes:
|
|
|
244
251
|
role
|
|
245
252
|
.command('update <role-id>')
|
|
246
253
|
.description('Update a role')
|
|
254
|
+
.requiredOption('--expected-config-revision <n>', 'Exact role CAS revision returned by role get')
|
|
247
255
|
.option('--description <desc>', 'Role description')
|
|
248
256
|
.option('--creation-statements <sql>', 'SQL statements to create credentials (semicolon-separated)')
|
|
249
257
|
.option('--revocation-statements <sql>', 'SQL statements to revoke credentials (semicolon-separated)')
|
|
@@ -257,6 +265,7 @@ Notes:
|
|
|
257
265
|
.command('delete <role-id>')
|
|
258
266
|
.alias('rm')
|
|
259
267
|
.description('Delete a role (blocked while retained lease history exists)')
|
|
268
|
+
.requiredOption('--expected-config-revision <n>', 'Exact role CAS revision returned by role get')
|
|
260
269
|
.option('--force', 'Skip confirmation only; does not bypass lease-history retention')
|
|
261
270
|
.option('--json', 'Output as JSON')
|
|
262
271
|
.action(deleteRole);
|
|
@@ -309,5 +318,59 @@ Notes:
|
|
|
309
318
|
// Templates Commands
|
|
310
319
|
// -------------------------------------------------------------------------
|
|
311
320
|
registerTemplatesCommands(dynasec);
|
|
321
|
+
// -------------------------------------------------------------------------
|
|
322
|
+
// Recovery Fence v1
|
|
323
|
+
// -------------------------------------------------------------------------
|
|
324
|
+
const fence = dynasec
|
|
325
|
+
.command('recovery-fence')
|
|
326
|
+
.description('Open, inspect, and close PostgreSQL-authoritative recovery fences');
|
|
327
|
+
fence
|
|
328
|
+
.command('open <role-id> <run-id>')
|
|
329
|
+
.description('Open an idempotent recovery fence around a disabled MySQL role')
|
|
330
|
+
.requiredOption('--consumer-api-key-id <id>', 'API key bound to all permits in this fence')
|
|
331
|
+
.requiredOption('--expected-role-revision <n>', 'Pinned role configuration revision')
|
|
332
|
+
.requiredOption('--expected-role-config-sha256 <hex>', 'Pinned lowercase role configuration SHA-256')
|
|
333
|
+
.requiredOption('--expires-in-seconds <n>', 'Fence lifetime (PostgreSQL clock)')
|
|
334
|
+
.requiredOption('--purpose <purpose>', 'Bounded operational purpose')
|
|
335
|
+
.option('--json', 'Output as JSON')
|
|
336
|
+
.action(openRecoveryFence);
|
|
337
|
+
fence
|
|
338
|
+
.command('status <role-id> <run-id>')
|
|
339
|
+
.description('Get recovery fence state and drain counters')
|
|
340
|
+
.option('--json', 'Output as JSON')
|
|
341
|
+
.action(getRecoveryFenceStatus);
|
|
342
|
+
fence
|
|
343
|
+
.command('close <role-id> <run-id>')
|
|
344
|
+
.description('Advance the fence epoch, drain operations, and verify final closure')
|
|
345
|
+
.requiredOption('--expected-fence-epoch <n>', 'The OPEN epoch being closed')
|
|
346
|
+
.option('--json', 'Output as JSON')
|
|
347
|
+
.action(closeRecoveryFence);
|
|
348
|
+
const permit = dynasec
|
|
349
|
+
.command('permit')
|
|
350
|
+
.description('Issue and inspect one-shot recovery mint permits');
|
|
351
|
+
permit
|
|
352
|
+
.command('issue <role-id>')
|
|
353
|
+
.description('Issue an idempotent maxMints=1 permit (strict operator permission required)')
|
|
354
|
+
.requiredOption('--fence-id <id>', 'Open recovery fence ID')
|
|
355
|
+
.requiredOption('--consumer-api-key-id <id>', 'Consumer API key bound to the permit')
|
|
356
|
+
.requiredOption('--phase <phase>', 'Recovery phase (issue one permit per phase)')
|
|
357
|
+
.requiredOption('--expires-in-seconds <n>', 'Permit lifetime')
|
|
358
|
+
.requiredOption('--credential-ttl-seconds <n>', 'Target credential lifetime')
|
|
359
|
+
.option('--privilege-overlay <overlay>', 'NONE or MYSQL_SCHEMA_LOCK_TABLES (never arbitrary SQL)', 'NONE')
|
|
360
|
+
.requiredOption('--reason <reason>', 'Auditable recovery reason')
|
|
361
|
+
.requiredOption('--idempotency-key <uuid>', 'UUID persisted with the request; reuse it unchanged after an uncertain response')
|
|
362
|
+
.option('--json', 'Output as JSON')
|
|
363
|
+
.action(issueMintPermit);
|
|
364
|
+
permit
|
|
365
|
+
.command('status <permit-id> <request-id>')
|
|
366
|
+
.description('Get an idempotent permit operation by request ID')
|
|
367
|
+
.option('--json', 'Output as JSON')
|
|
368
|
+
.action(getMintOperationStatus);
|
|
369
|
+
permit
|
|
370
|
+
.command('revoke <permit-id> <request-id>')
|
|
371
|
+
.description('Revoke by request ID, including a pre-acquire tombstone')
|
|
372
|
+
.option('--reason <reason>', 'Revocation reason')
|
|
373
|
+
.option('--json', 'Output as JSON')
|
|
374
|
+
.action(revokeMintOperation);
|
|
312
375
|
}
|
|
313
376
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAO9C,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PermitIssueOptions, PermitRevokeOptions, PermitStatusOptions } from './recovery-types.js';
|
|
2
|
+
export declare function issueMintPermit(roleId: string, options: PermitIssueOptions): Promise<void>;
|
|
3
|
+
export declare function getMintOperationStatus(permitId: string, requestId: string, options: PermitStatusOptions): Promise<void>;
|
|
4
|
+
export declare function revokeMintOperation(permitId: string, requestId: string, options: PermitRevokeOptions): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=permit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/permit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAoC7B,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqChG;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { client } from '../../lib/client.js';
|
|
2
|
+
import * as output from '../../lib/output.js';
|
|
3
|
+
import { idempotencyUuid, positiveSafeInteger } from './recovery-parse.js';
|
|
4
|
+
function printPermit(permit) {
|
|
5
|
+
output.keyValue({
|
|
6
|
+
'Permit ID': permit.permitId,
|
|
7
|
+
'Fence ID': permit.fenceId,
|
|
8
|
+
'Fence epoch': permit.fenceEpoch,
|
|
9
|
+
'State': permit.state,
|
|
10
|
+
'Consumer API key': permit.consumerApiKeyId,
|
|
11
|
+
'Phase': permit.phase,
|
|
12
|
+
'Overlay': permit.privilegeOverlay,
|
|
13
|
+
'Mints': `${permit.mintsConsumed.toString()}/${permit.maxMints.toString()}`,
|
|
14
|
+
'Credential TTL': `${permit.credentialTtlSeconds.toString()}s`,
|
|
15
|
+
'Expires': permit.expiresAt,
|
|
16
|
+
'Role revision': permit.roleRevision,
|
|
17
|
+
'Role config SHA-256': permit.roleConfigSha256,
|
|
18
|
+
'Effective grant plan SHA-256': permit.effectiveGrantPlanSha256,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function printOperation(operation) {
|
|
22
|
+
output.keyValue({
|
|
23
|
+
'Operation ID': operation.operationId,
|
|
24
|
+
'Permit ID': operation.permitId,
|
|
25
|
+
'Request ID': operation.requestId,
|
|
26
|
+
'State': operation.state,
|
|
27
|
+
'Fence ID': operation.fenceId,
|
|
28
|
+
'Fence epoch': operation.fenceEpoch,
|
|
29
|
+
'Role ID': operation.roleId,
|
|
30
|
+
'Role revision': operation.roleRevision,
|
|
31
|
+
'Lease ID': operation.leaseId ?? '-',
|
|
32
|
+
'Credential expires': operation.credentialExpiresAt ?? '-',
|
|
33
|
+
'Last error': operation.lastErrorCode ?? '-',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function issueMintPermit(roleId, options) {
|
|
37
|
+
const spinner = output.spinner('Issuing one-shot recovery mint permit...').start();
|
|
38
|
+
try {
|
|
39
|
+
if (options.privilegeOverlay !== 'NONE'
|
|
40
|
+
&& options.privilegeOverlay !== 'MYSQL_SCHEMA_LOCK_TABLES') {
|
|
41
|
+
throw new Error('--privilege-overlay must be NONE or MYSQL_SCHEMA_LOCK_TABLES');
|
|
42
|
+
}
|
|
43
|
+
const privilegeOverlay = options.privilegeOverlay;
|
|
44
|
+
const response = await client.request({
|
|
45
|
+
method: 'POST',
|
|
46
|
+
path: `/v1/dynamic-secrets/roles/${encodeURIComponent(roleId)}/mint-permits`,
|
|
47
|
+
headers: { 'Idempotency-Key': idempotencyUuid(options.idempotencyKey) },
|
|
48
|
+
body: {
|
|
49
|
+
fenceId: options.fenceId,
|
|
50
|
+
consumerApiKeyId: options.consumerApiKeyId,
|
|
51
|
+
phase: options.phase,
|
|
52
|
+
expiresInSeconds: positiveSafeInteger(options.expiresInSeconds, '--expires-in-seconds'),
|
|
53
|
+
credentialTtlSeconds: positiveSafeInteger(options.credentialTtlSeconds, '--credential-ttl-seconds'),
|
|
54
|
+
privilegeOverlay,
|
|
55
|
+
reason: options.reason,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
spinner.succeed('Recovery mint permit issued');
|
|
59
|
+
if (options.json)
|
|
60
|
+
output.json(response);
|
|
61
|
+
else
|
|
62
|
+
printPermit(response);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
spinner.fail('Failed to issue recovery mint permit');
|
|
66
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function getMintOperationStatus(permitId, requestId, options) {
|
|
71
|
+
const spinner = output.spinner('Fetching recovery mint operation...').start();
|
|
72
|
+
try {
|
|
73
|
+
const response = await client.get(`/v1/dynamic-secrets/mint-permits/${encodeURIComponent(permitId)}` +
|
|
74
|
+
`/operations/${encodeURIComponent(requestId)}`);
|
|
75
|
+
spinner.stop();
|
|
76
|
+
if (options.json)
|
|
77
|
+
output.json(response);
|
|
78
|
+
else
|
|
79
|
+
printOperation(response);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
spinner.fail('Failed to fetch recovery mint operation');
|
|
83
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function revokeMintOperation(permitId, requestId, options) {
|
|
88
|
+
const spinner = output.spinner('Revoking recovery mint operation...').start();
|
|
89
|
+
try {
|
|
90
|
+
const response = await client.put(`/v1/dynamic-secrets/mint-permits/${encodeURIComponent(permitId)}` +
|
|
91
|
+
`/operations/${encodeURIComponent(requestId)}/revoke`, options.reason ? { reason: options.reason } : {});
|
|
92
|
+
spinner.succeed('Recovery mint operation revoked');
|
|
93
|
+
if (options.json)
|
|
94
|
+
output.json(response);
|
|
95
|
+
else
|
|
96
|
+
printOperation(response);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
spinner.fail('Failed to revoke recovery mint operation');
|
|
100
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=permit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/permit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RecoveryFenceCloseOptions, RecoveryFenceOpenOptions, RecoveryFenceStatusOptions } from './recovery-types.js';
|
|
2
|
+
export declare function openRecoveryFence(roleId: string, runId: string, options: RecoveryFenceOpenOptions): Promise<void>;
|
|
3
|
+
export declare function getRecoveryFenceStatus(roleId: string, runId: string, options: RecoveryFenceStatusOptions): Promise<void>;
|
|
4
|
+
export declare function closeRecoveryFence(roleId: string, runId: string, options: RecoveryFenceCloseOptions): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=recovery-fence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-fence.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-fence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AA4B7B,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { client } from '../../lib/client.js';
|
|
2
|
+
import * as output from '../../lib/output.js';
|
|
3
|
+
import { positiveSafeInteger, sha256Hex } from './recovery-parse.js';
|
|
4
|
+
function fencePath(roleId, runId) {
|
|
5
|
+
return `/v1/dynamic-secrets/roles/${encodeURIComponent(roleId)}` +
|
|
6
|
+
`/recovery-fences/${encodeURIComponent(runId)}`;
|
|
7
|
+
}
|
|
8
|
+
function printFence(fence) {
|
|
9
|
+
output.keyValue({
|
|
10
|
+
'Fence ID': fence.fenceId,
|
|
11
|
+
'Run ID': fence.runId,
|
|
12
|
+
'State': fence.state,
|
|
13
|
+
'Fence epoch': fence.fenceEpoch,
|
|
14
|
+
'Close epoch': fence.closeEpoch ?? '-',
|
|
15
|
+
'Role enabled': String(fence.roleEnabled),
|
|
16
|
+
'Role revision': fence.roleRevision,
|
|
17
|
+
'Role config SHA-256': fence.roleConfigSha256,
|
|
18
|
+
'Grant plan SHA-256': fence.grantPlanSha256,
|
|
19
|
+
'In-flight mints': fence.inFlightMints,
|
|
20
|
+
'Active leases': fence.activeLeases,
|
|
21
|
+
'Recovery required': fence.recoveryRequired,
|
|
22
|
+
'Non-terminal operations': fence.nonterminalOperations,
|
|
23
|
+
'Ready permits': fence.readyPermits,
|
|
24
|
+
'Expires': fence.expiresAt,
|
|
25
|
+
'Closed': fence.closedAt ?? '-',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export async function openRecoveryFence(roleId, runId, options) {
|
|
29
|
+
const spinner = output.spinner('Opening PostgreSQL-authoritative recovery fence...').start();
|
|
30
|
+
try {
|
|
31
|
+
const response = await client.put(fencePath(roleId, runId), {
|
|
32
|
+
consumerApiKeyId: options.consumerApiKeyId,
|
|
33
|
+
expectedRoleRevision: positiveSafeInteger(options.expectedRoleRevision, '--expected-role-revision'),
|
|
34
|
+
expectedRoleConfigSha256: sha256Hex(options.expectedRoleConfigSha256, '--expected-role-config-sha256'),
|
|
35
|
+
expiresInSeconds: positiveSafeInteger(options.expiresInSeconds, '--expires-in-seconds'),
|
|
36
|
+
purpose: options.purpose,
|
|
37
|
+
});
|
|
38
|
+
spinner.succeed('Recovery fence opened');
|
|
39
|
+
if (options.json)
|
|
40
|
+
output.json(response);
|
|
41
|
+
else
|
|
42
|
+
printFence(response);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
spinner.fail('Failed to open recovery fence');
|
|
46
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function getRecoveryFenceStatus(roleId, runId, options) {
|
|
51
|
+
const spinner = output.spinner('Fetching recovery fence...').start();
|
|
52
|
+
try {
|
|
53
|
+
const response = await client.get(fencePath(roleId, runId));
|
|
54
|
+
spinner.stop();
|
|
55
|
+
if (options.json)
|
|
56
|
+
output.json(response);
|
|
57
|
+
else
|
|
58
|
+
printFence(response);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
spinner.fail('Failed to fetch recovery fence');
|
|
62
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function closeRecoveryFence(roleId, runId, options) {
|
|
67
|
+
const spinner = output.spinner('Closing and verifying recovery fence...').start();
|
|
68
|
+
try {
|
|
69
|
+
const response = await client.put(`${fencePath(roleId, runId)}/close`, {
|
|
70
|
+
expectedFenceEpoch: positiveSafeInteger(options.expectedFenceEpoch, '--expected-fence-epoch'),
|
|
71
|
+
});
|
|
72
|
+
spinner.succeed('Recovery fence closed and verified');
|
|
73
|
+
if (options.json)
|
|
74
|
+
output.json(response);
|
|
75
|
+
else
|
|
76
|
+
printFence(response);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
spinner.fail('Failed to close recovery fence');
|
|
80
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=recovery-fence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-fence.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-fence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-parse.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-parse.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKnD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
2
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
3
|
+
export function positiveSafeInteger(raw, option) {
|
|
4
|
+
const value = Number(raw);
|
|
5
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
6
|
+
throw new Error(`${option} must be a positive integer`);
|
|
7
|
+
}
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
export function sha256Hex(raw, option) {
|
|
11
|
+
if (!SHA256_HEX.test(raw)) {
|
|
12
|
+
throw new Error(`${option} must be a lowercase SHA-256 hex digest`);
|
|
13
|
+
}
|
|
14
|
+
return raw;
|
|
15
|
+
}
|
|
16
|
+
export function idempotencyUuid(raw) {
|
|
17
|
+
if (!UUID.test(raw)) {
|
|
18
|
+
throw new Error('--idempotency-key must be a UUID');
|
|
19
|
+
}
|
|
20
|
+
return raw;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=recovery-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-parse.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-parse.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC;AACpC,MAAM,IAAI,GAAG,4EAA4E,CAAC;AAE1F,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAc;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,6BAA6B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAc;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yCAAyC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/** Wire contracts for Dynamic Secrets Recovery Fence v1. */
|
|
2
|
+
export type RecoveryPrivilegeOverlay = 'NONE' | 'MYSQL_SCHEMA_LOCK_TABLES';
|
|
3
|
+
export type RecoveryFenceState = 'OPEN' | 'CLOSING' | 'CLOSED';
|
|
4
|
+
export type MintPermitState = 'READY' | 'CONSUMED';
|
|
5
|
+
export type MintOperationState = 'READY' | 'CLAIMED' | 'UNKNOWN' | 'CONSUMED' | 'DELIVERED' | 'REVOKING' | 'REVOKED' | 'CANCELLED_NO_TARGET' | 'FAILED_NO_TARGET' | 'EXPIRED_REVOKED' | 'RECOVERY_REQUIRED';
|
|
6
|
+
export interface RecoveryFence {
|
|
7
|
+
fenceId: string;
|
|
8
|
+
runId: string;
|
|
9
|
+
fenceEpoch: number;
|
|
10
|
+
closeEpoch: number | null;
|
|
11
|
+
state: RecoveryFenceState;
|
|
12
|
+
roleEnabled: false;
|
|
13
|
+
roleRevision: number;
|
|
14
|
+
roleConfigSha256: string;
|
|
15
|
+
grantPlanSha256: string;
|
|
16
|
+
inFlightMints: number;
|
|
17
|
+
activeLeases: number;
|
|
18
|
+
recoveryRequired: number;
|
|
19
|
+
nonterminalOperations: number;
|
|
20
|
+
readyPermits: number;
|
|
21
|
+
expiresAt: string;
|
|
22
|
+
closedAt: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface MintPermit {
|
|
25
|
+
permitId: string;
|
|
26
|
+
fenceId: string;
|
|
27
|
+
fenceEpoch: number;
|
|
28
|
+
state: MintPermitState;
|
|
29
|
+
maxMints: 1;
|
|
30
|
+
mintsConsumed: 0 | 1;
|
|
31
|
+
roleRevision: number;
|
|
32
|
+
roleConfigSha256: string;
|
|
33
|
+
grantPlanSha256: string;
|
|
34
|
+
effectiveGrantPlanSha256: string;
|
|
35
|
+
consumerApiKeyId: string;
|
|
36
|
+
phase: string;
|
|
37
|
+
privilegeOverlay: RecoveryPrivilegeOverlay;
|
|
38
|
+
credentialTtlSeconds: number;
|
|
39
|
+
expiresAt: string;
|
|
40
|
+
}
|
|
41
|
+
export interface RecoveryHpkeEnvelope {
|
|
42
|
+
version: 'hpke-v1';
|
|
43
|
+
suite: 'X25519-HKDF-SHA256-ChaCha20Poly1305';
|
|
44
|
+
enc: string;
|
|
45
|
+
ciphertext: string;
|
|
46
|
+
aadSha256: string;
|
|
47
|
+
}
|
|
48
|
+
export interface RecoveryHpkeCredential {
|
|
49
|
+
permitId: string;
|
|
50
|
+
requestId: string;
|
|
51
|
+
state: 'CONSUMED' | 'DELIVERED';
|
|
52
|
+
envelopeSha256: string;
|
|
53
|
+
deliveryFormat: 'hpke-v1';
|
|
54
|
+
envelope: RecoveryHpkeEnvelope;
|
|
55
|
+
aad: string;
|
|
56
|
+
}
|
|
57
|
+
export interface MintOperation {
|
|
58
|
+
operationId: string;
|
|
59
|
+
tenantId: string;
|
|
60
|
+
permitId: string;
|
|
61
|
+
requestId: string;
|
|
62
|
+
state: MintOperationState;
|
|
63
|
+
fenceId: string;
|
|
64
|
+
fenceEpoch: number;
|
|
65
|
+
roleId: string;
|
|
66
|
+
roleRevision: number;
|
|
67
|
+
roleConfigSha256: string;
|
|
68
|
+
grantPlanSha256: string;
|
|
69
|
+
effectiveGrantPlanSha256: string;
|
|
70
|
+
privilegeOverlay: RecoveryPrivilegeOverlay;
|
|
71
|
+
consumerApiKeyId: string;
|
|
72
|
+
leaseId: string | null;
|
|
73
|
+
username: string | null;
|
|
74
|
+
credentialExpiresAt: string | null;
|
|
75
|
+
createdAt: string;
|
|
76
|
+
claimedAt: string | null;
|
|
77
|
+
consumedAt: string | null;
|
|
78
|
+
deliveredAt: string | null;
|
|
79
|
+
terminalAt: string | null;
|
|
80
|
+
lastErrorCode: string | null;
|
|
81
|
+
credential?: RecoveryHpkeCredential;
|
|
82
|
+
}
|
|
83
|
+
export interface PermitIssueOptions {
|
|
84
|
+
fenceId: string;
|
|
85
|
+
consumerApiKeyId: string;
|
|
86
|
+
phase: string;
|
|
87
|
+
expiresInSeconds: string;
|
|
88
|
+
credentialTtlSeconds: string;
|
|
89
|
+
/** Untrusted Commander string; validated before the request is sent. */
|
|
90
|
+
privilegeOverlay: string;
|
|
91
|
+
reason: string;
|
|
92
|
+
idempotencyKey: string;
|
|
93
|
+
json?: boolean;
|
|
94
|
+
}
|
|
95
|
+
export interface PermitStatusOptions {
|
|
96
|
+
json?: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface PermitRevokeOptions {
|
|
99
|
+
reason?: string;
|
|
100
|
+
json?: boolean;
|
|
101
|
+
}
|
|
102
|
+
export interface RecoveryFenceOpenOptions {
|
|
103
|
+
consumerApiKeyId: string;
|
|
104
|
+
expectedRoleRevision: string;
|
|
105
|
+
expectedRoleConfigSha256: string;
|
|
106
|
+
expiresInSeconds: string;
|
|
107
|
+
purpose: string;
|
|
108
|
+
json?: boolean;
|
|
109
|
+
}
|
|
110
|
+
export interface RecoveryFenceStatusOptions {
|
|
111
|
+
json?: boolean;
|
|
112
|
+
}
|
|
113
|
+
export interface RecoveryFenceCloseOptions {
|
|
114
|
+
expectedFenceEpoch: string;
|
|
115
|
+
json?: boolean;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=recovery-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-types.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-types.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,0BAA0B,CAAC;AAC3E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,CAAC;AACnD,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,SAAS,GACT,SAAS,GACT,UAAU,GACV,WAAW,GACX,UAAU,GACV,SAAS,GACT,qBAAqB,GACrB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,CAAC;AAExB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,EAAE,KAAK,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC;IACZ,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,qCAAqC,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,SAAS,CAAC;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-types.js","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/recovery-types.ts"],"names":[],"mappings":"AAAA,4DAA4D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RoleCreateOptions, RoleUpdateOptions } from './types.js';
|
|
1
|
+
import type { RoleCreateOptions, RoleDeleteOptions, RoleUpdateOptions } from './types.js';
|
|
2
2
|
export declare function listRoles(options: {
|
|
3
3
|
connection?: string;
|
|
4
4
|
json?: boolean;
|
|
@@ -8,8 +8,5 @@ export declare function getRole(roleId: string, options: {
|
|
|
8
8
|
}): Promise<void>;
|
|
9
9
|
export declare function createRole(connectionId: string, options: RoleCreateOptions): Promise<void>;
|
|
10
10
|
export declare function updateRole(roleId: string, options: RoleUpdateOptions): Promise<void>;
|
|
11
|
-
export declare function deleteRole(roleId: string, options:
|
|
12
|
-
force?: boolean;
|
|
13
|
-
json?: boolean;
|
|
14
|
-
}): Promise<void>;
|
|
11
|
+
export declare function deleteRole(roleId: string, options: RoleDeleteOptions): Promise<void>;
|
|
15
12
|
//# sourceMappingURL=role.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/role.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/commands/dynamic-secrets/role.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAIpB,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C/F;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCxF;AAcD,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFhG;AAqDD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B1F;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC1F"}
|
|
@@ -7,6 +7,7 @@ import inquirer from 'inquirer';
|
|
|
7
7
|
import { client } from '../../lib/client.js';
|
|
8
8
|
import * as output from '../../lib/output.js';
|
|
9
9
|
import { formatDate, formatTtl } from './helpers.js';
|
|
10
|
+
import { positiveSafeInteger } from './recovery-parse.js';
|
|
10
11
|
export async function listRoles(options) {
|
|
11
12
|
const spinner = output.spinner('Fetching roles...').start();
|
|
12
13
|
try {
|
|
@@ -65,6 +66,9 @@ export async function getRole(roleId, options) {
|
|
|
65
66
|
'Username Template': response.usernameTemplate,
|
|
66
67
|
'Default TTL': formatTtl(response.defaultTtlSeconds),
|
|
67
68
|
'Max TTL': formatTtl(response.maxTtlSeconds),
|
|
69
|
+
'Config Revision': response.configRevision?.toString() ?? '-',
|
|
70
|
+
'Config SHA-256': response.configSha256 ?? '-',
|
|
71
|
+
'Grant Plan SHA-256': response.grantPlanSha256 ?? '-',
|
|
68
72
|
'Active Leases': String(response.activeLeases ?? 0),
|
|
69
73
|
'Created': formatDate(response.createdAt),
|
|
70
74
|
'Updated': formatDate(response.updatedAt),
|
|
@@ -224,7 +228,9 @@ function describeRoleCreateError(err, options) {
|
|
|
224
228
|
export async function updateRole(roleId, options) {
|
|
225
229
|
const spinner = output.spinner('Updating role...').start();
|
|
226
230
|
try {
|
|
227
|
-
const body = {
|
|
231
|
+
const body = {
|
|
232
|
+
expectedConfigRevision: positiveSafeInteger(options.expectedConfigRevision, '--expected-config-revision'),
|
|
233
|
+
};
|
|
228
234
|
if (options.description !== undefined)
|
|
229
235
|
body.description = options.description;
|
|
230
236
|
if (options.creationStatements)
|
|
@@ -269,7 +275,9 @@ export async function deleteRole(roleId, options) {
|
|
|
269
275
|
}
|
|
270
276
|
const spinner = output.spinner('Deleting role...').start();
|
|
271
277
|
try {
|
|
272
|
-
|
|
278
|
+
const expectedConfigRevision = positiveSafeInteger(options.expectedConfigRevision, '--expected-config-revision');
|
|
279
|
+
await client.delete(`/v1/dynamic-secrets/roles/${roleId}`
|
|
280
|
+
+ `?expectedConfigRevision=${expectedConfigRevision.toString()}`);
|
|
273
281
|
spinner.succeed('Role deleted');
|
|
274
282
|
if (options.json) {
|
|
275
283
|
output.json({ success: true, roleId });
|