@zincapp/znvault-cli 3.3.1 → 4.0.2
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 +32 -28
- package/dist/commands/advisor.d.ts +14 -1
- package/dist/commands/advisor.d.ts.map +1 -1
- package/dist/commands/advisor.js +355 -331
- package/dist/commands/advisor.js.map +1 -1
- package/dist/commands/agent/index.d.ts +2 -1
- package/dist/commands/agent/index.d.ts.map +1 -1
- package/dist/commands/agent/index.js +23 -19
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/apikey/conditions.d.ts.map +1 -1
- package/dist/commands/apikey/conditions.js +4 -3
- package/dist/commands/apikey/conditions.js.map +1 -1
- package/dist/commands/apikey/create.d.ts.map +1 -1
- package/dist/commands/apikey/create.js +4 -2
- package/dist/commands/apikey/create.js.map +1 -1
- package/dist/commands/apikey/delete.d.ts.map +1 -1
- package/dist/commands/apikey/delete.js +4 -2
- package/dist/commands/apikey/delete.js.map +1 -1
- package/dist/commands/apikey/enable-disable.d.ts.map +1 -1
- package/dist/commands/apikey/enable-disable.js +7 -4
- package/dist/commands/apikey/enable-disable.js.map +1 -1
- package/dist/commands/apikey/helpers.d.ts +16 -0
- package/dist/commands/apikey/helpers.d.ts.map +1 -1
- package/dist/commands/apikey/helpers.js +9 -0
- package/dist/commands/apikey/helpers.js.map +1 -1
- package/dist/commands/apikey/index.d.ts +2 -1
- package/dist/commands/apikey/index.d.ts.map +1 -1
- package/dist/commands/apikey/index.js +23 -14
- package/dist/commands/apikey/index.js.map +1 -1
- package/dist/commands/apikey/list.d.ts.map +1 -1
- package/dist/commands/apikey/list.js +4 -3
- package/dist/commands/apikey/list.js.map +1 -1
- package/dist/commands/apikey/managed/bind.d.ts.map +1 -1
- package/dist/commands/apikey/managed/bind.js +4 -3
- package/dist/commands/apikey/managed/bind.js.map +1 -1
- package/dist/commands/apikey/managed/conditions.d.ts.map +1 -1
- package/dist/commands/apikey/managed/conditions.js +5 -4
- package/dist/commands/apikey/managed/conditions.js.map +1 -1
- package/dist/commands/apikey/managed/config.d.ts.map +1 -1
- package/dist/commands/apikey/managed/config.js +4 -3
- package/dist/commands/apikey/managed/config.js.map +1 -1
- package/dist/commands/apikey/managed/create.d.ts.map +1 -1
- package/dist/commands/apikey/managed/create.js +4 -1
- package/dist/commands/apikey/managed/create.js.map +1 -1
- package/dist/commands/apikey/managed/delete.d.ts.map +1 -1
- package/dist/commands/apikey/managed/delete.js +4 -2
- package/dist/commands/apikey/managed/delete.js.map +1 -1
- package/dist/commands/apikey/managed/get.d.ts.map +1 -1
- package/dist/commands/apikey/managed/get.js +4 -2
- package/dist/commands/apikey/managed/get.js.map +1 -1
- package/dist/commands/apikey/managed/list.d.ts.map +1 -1
- package/dist/commands/apikey/managed/list.js +4 -2
- package/dist/commands/apikey/managed/list.js.map +1 -1
- package/dist/commands/apikey/managed/permissions.d.ts.map +1 -1
- package/dist/commands/apikey/managed/permissions.js +5 -3
- package/dist/commands/apikey/managed/permissions.js.map +1 -1
- package/dist/commands/apikey/managed/rotate.d.ts.map +1 -1
- package/dist/commands/apikey/managed/rotate.js +4 -3
- package/dist/commands/apikey/managed/rotate.js.map +1 -1
- package/dist/commands/apikey/permissions.d.ts.map +1 -1
- package/dist/commands/apikey/permissions.js +5 -3
- package/dist/commands/apikey/permissions.js.map +1 -1
- package/dist/commands/apikey/policies.d.ts.map +1 -1
- package/dist/commands/apikey/policies.js +10 -7
- package/dist/commands/apikey/policies.js.map +1 -1
- package/dist/commands/apikey/rotate.d.ts.map +1 -1
- package/dist/commands/apikey/rotate.js +4 -3
- package/dist/commands/apikey/rotate.js.map +1 -1
- package/dist/commands/apikey/show.d.ts.map +1 -1
- package/dist/commands/apikey/show.js +5 -4
- package/dist/commands/apikey/show.js.map +1 -1
- package/dist/commands/audit.d.ts +2 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +15 -3
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/cluster.d.ts.map +1 -1
- package/dist/commands/cluster.js +31 -14
- package/dist/commands/cluster.js.map +1 -1
- package/dist/commands/group.d.ts +2 -1
- package/dist/commands/group.d.ts.map +1 -1
- package/dist/commands/group.js +61 -39
- package/dist/commands/group.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +6 -5
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/host/index.d.ts +2 -1
- package/dist/commands/host/index.d.ts.map +1 -1
- package/dist/commands/host/index.js +22 -18
- package/dist/commands/host/index.js.map +1 -1
- package/dist/commands/kms/crud.d.ts +1 -1
- package/dist/commands/kms/crud.d.ts.map +1 -1
- package/dist/commands/kms/crud.js +6 -6
- package/dist/commands/kms/crud.js.map +1 -1
- package/dist/commands/kms/index.d.ts +2 -1
- package/dist/commands/kms/index.d.ts.map +1 -1
- package/dist/commands/kms/index.js +14 -6
- package/dist/commands/kms/index.js.map +1 -1
- package/dist/commands/kms/lifecycle.d.ts +1 -1
- package/dist/commands/kms/lifecycle.d.ts.map +1 -1
- package/dist/commands/kms/lifecycle.js +7 -7
- package/dist/commands/kms/lifecycle.js.map +1 -1
- package/dist/commands/kms/routing.d.ts +5 -0
- package/dist/commands/kms/routing.d.ts.map +1 -1
- package/dist/commands/kms/routing.js +41 -5
- package/dist/commands/kms/routing.js.map +1 -1
- package/dist/commands/policy/attachments.d.ts +9 -5
- package/dist/commands/policy/attachments.d.ts.map +1 -1
- package/dist/commands/policy/attachments.js +16 -13
- package/dist/commands/policy/attachments.js.map +1 -1
- package/dist/commands/policy/crud.d.ts +6 -5
- package/dist/commands/policy/crud.d.ts.map +1 -1
- package/dist/commands/policy/crud.js +16 -11
- package/dist/commands/policy/crud.js.map +1 -1
- package/dist/commands/policy/helpers.d.ts +16 -0
- package/dist/commands/policy/helpers.d.ts.map +1 -1
- package/dist/commands/policy/helpers.js +9 -0
- package/dist/commands/policy/helpers.js.map +1 -1
- package/dist/commands/policy/index.d.ts +2 -1
- package/dist/commands/policy/index.d.ts.map +1 -1
- package/dist/commands/policy/index.js +149 -101
- package/dist/commands/policy/index.js.map +1 -1
- package/dist/commands/policy/io.d.ts +3 -2
- package/dist/commands/policy/io.d.ts.map +1 -1
- package/dist/commands/policy/io.js +7 -5
- package/dist/commands/policy/io.js.map +1 -1
- package/dist/commands/policy/list.d.ts +6 -2
- package/dist/commands/policy/list.d.ts.map +1 -1
- package/dist/commands/policy/list.js +7 -6
- package/dist/commands/policy/list.js.map +1 -1
- package/dist/commands/quarantine.d.ts +2 -1
- package/dist/commands/quarantine.d.ts.map +1 -1
- package/dist/commands/quarantine.js +394 -339
- package/dist/commands/quarantine.js.map +1 -1
- package/dist/commands/role.d.ts +2 -1
- package/dist/commands/role.d.ts.map +1 -1
- package/dist/commands/role.js +92 -49
- package/dist/commands/role.js.map +1 -1
- package/dist/commands/ssh/index.d.ts +2 -1
- package/dist/commands/ssh/index.d.ts.map +1 -1
- package/dist/commands/ssh/index.js +18 -13
- package/dist/commands/ssh/index.js.map +1 -1
- package/dist/commands/sso/crud.d.ts +1 -1
- package/dist/commands/sso/crud.d.ts.map +1 -1
- package/dist/commands/sso/crud.js +16 -16
- package/dist/commands/sso/crud.js.map +1 -1
- package/dist/commands/sso/helpers.d.ts +7 -1
- package/dist/commands/sso/helpers.d.ts.map +1 -1
- package/dist/commands/sso/helpers.js +32 -1
- package/dist/commands/sso/helpers.js.map +1 -1
- package/dist/commands/sso/index.d.ts +2 -1
- package/dist/commands/sso/index.d.ts.map +1 -1
- package/dist/commands/sso/index.js +13 -5
- package/dist/commands/sso/index.js.map +1 -1
- package/dist/commands/superadmin/accounts.d.ts +10 -0
- package/dist/commands/superadmin/accounts.d.ts.map +1 -0
- package/dist/commands/{superadmin.js → superadmin/accounts.js} +16 -15
- package/dist/commands/superadmin/accounts.js.map +1 -0
- package/dist/commands/superadmin/index.d.ts +20 -0
- package/dist/commands/superadmin/index.d.ts.map +1 -0
- package/dist/commands/superadmin/index.js +60 -0
- package/dist/commands/superadmin/index.js.map +1 -0
- package/dist/commands/user.d.ts +2 -1
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +26 -13
- package/dist/commands/user.js.map +1 -1
- package/dist/index.js +18 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/client/apikeys.d.ts +21 -13
- package/dist/lib/client/apikeys.d.ts.map +1 -1
- package/dist/lib/client/apikeys.js +30 -26
- package/dist/lib/client/apikeys.js.map +1 -1
- package/dist/lib/client/audit.d.ts +54 -1
- package/dist/lib/client/audit.d.ts.map +1 -1
- package/dist/lib/client/audit.js +83 -9
- package/dist/lib/client/audit.js.map +1 -1
- package/dist/lib/client/index.d.ts +37 -36
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +37 -36
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/client/managed-keys.d.ts +10 -7
- package/dist/lib/client/managed-keys.d.ts.map +1 -1
- package/dist/lib/client/managed-keys.js +16 -16
- package/dist/lib/client/managed-keys.js.map +1 -1
- package/dist/lib/client/policies.d.ts +14 -10
- package/dist/lib/client/policies.d.ts.map +1 -1
- package/dist/lib/client/policies.js +22 -22
- package/dist/lib/client/policies.js.map +1 -1
- package/dist/lib/client/quarantine.d.ts +25 -9
- package/dist/lib/client/quarantine.d.ts.map +1 -1
- package/dist/lib/client/quarantine.js +44 -27
- package/dist/lib/client/quarantine.js.map +1 -1
- package/dist/lib/client/users.d.ts +30 -3
- package/dist/lib/client/users.d.ts.map +1 -1
- package/dist/lib/client/users.js +39 -15
- package/dist/lib/client/users.js.map +1 -1
- package/dist/lib/command-context.d.ts +64 -0
- package/dist/lib/command-context.d.ts.map +1 -0
- package/dist/lib/command-context.js +90 -0
- package/dist/lib/command-context.js.map +1 -0
- package/dist/lib/context-help.d.ts.map +1 -1
- package/dist/lib/context-help.js +5 -0
- package/dist/lib/context-help.js.map +1 -1
- package/dist/lib/db/health.d.ts.map +1 -1
- package/dist/lib/db/health.js +13 -4
- package/dist/lib/db/health.js.map +1 -1
- package/dist/lib/mode.d.ts +18 -4
- package/dist/lib/mode.d.ts.map +1 -1
- package/dist/lib/mode.js +13 -6
- package/dist/lib/mode.js.map +1 -1
- package/dist/tui/hooks/useApi.d.ts +14 -7
- package/dist/tui/hooks/useApi.d.ts.map +1 -1
- package/dist/tui/hooks/useApi.js.map +1 -1
- package/dist/tui/screens/Dashboard.d.ts.map +1 -1
- package/dist/tui/screens/Dashboard.js +2 -3
- package/dist/tui/screens/Dashboard.js.map +1 -1
- package/dist/types/index.d.ts +59 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/commands/superadmin.d.ts +0 -3
- package/dist/commands/superadmin.d.ts.map +0 -1
- package/dist/commands/superadmin.js.map +0 -1
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
import { HttpClient } from './http.js';
|
|
12
12
|
const TENANT_BASE = '/v1/policies';
|
|
13
13
|
const ADMIN_BASE = '/v1/superadmin/policies';
|
|
14
|
-
function basePath(tenantId) {
|
|
15
|
-
return tenantId ? ADMIN_BASE : TENANT_BASE;
|
|
14
|
+
function basePath(tenantId, asSuperadmin) {
|
|
15
|
+
return tenantId || asSuperadmin ? ADMIN_BASE : TENANT_BASE;
|
|
16
16
|
}
|
|
17
17
|
export class PoliciesClient extends HttpClient {
|
|
18
18
|
async list(options) {
|
|
19
19
|
return this.request({
|
|
20
20
|
method: 'GET',
|
|
21
|
-
path: basePath(options?.tenantId),
|
|
21
|
+
path: basePath(options?.tenantId, options?.asSuperadmin),
|
|
22
22
|
query: {
|
|
23
23
|
tenantId: options?.tenantId,
|
|
24
24
|
enabled: options?.enabled,
|
|
@@ -29,10 +29,10 @@ export class PoliciesClient extends HttpClient {
|
|
|
29
29
|
},
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
async getById(id, tenantId) {
|
|
32
|
+
async getById(id, tenantId, opts) {
|
|
33
33
|
return this.request({
|
|
34
34
|
method: 'GET',
|
|
35
|
-
path: `${basePath(tenantId)}/${id}`,
|
|
35
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}`,
|
|
36
36
|
query: tenantId ? { tenantId } : undefined,
|
|
37
37
|
});
|
|
38
38
|
}
|
|
@@ -42,30 +42,30 @@ export class PoliciesClient extends HttpClient {
|
|
|
42
42
|
const tenantId = data.tenantId;
|
|
43
43
|
return this.request({
|
|
44
44
|
method: 'POST',
|
|
45
|
-
path: basePath(tenantId),
|
|
45
|
+
path: basePath(tenantId, data.asSuperadmin),
|
|
46
46
|
query: tenantId ? { tenantId } : undefined,
|
|
47
47
|
body: data,
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
async update(id, data, tenantId) {
|
|
50
|
+
async update(id, data, tenantId, opts) {
|
|
51
51
|
return this.request({
|
|
52
52
|
method: 'PATCH',
|
|
53
|
-
path: `${basePath(tenantId)}/${id}`,
|
|
53
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}`,
|
|
54
54
|
query: tenantId ? { tenantId } : undefined,
|
|
55
55
|
body: data,
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
-
async deleteById(id, tenantId) {
|
|
58
|
+
async deleteById(id, tenantId, opts) {
|
|
59
59
|
await this.request({
|
|
60
60
|
method: 'DELETE',
|
|
61
|
-
path: `${basePath(tenantId)}/${id}`,
|
|
61
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}`,
|
|
62
62
|
query: tenantId ? { tenantId } : undefined,
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
|
-
async toggle(id, enabled, tenantId) {
|
|
65
|
+
async toggle(id, enabled, tenantId, opts) {
|
|
66
66
|
return this.request({
|
|
67
67
|
method: 'POST',
|
|
68
|
-
path: `${basePath(tenantId)}/${id}/toggle`,
|
|
68
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${id}/toggle`,
|
|
69
69
|
query: tenantId ? { tenantId } : undefined,
|
|
70
70
|
body: { enabled },
|
|
71
71
|
});
|
|
@@ -77,40 +77,40 @@ export class PoliciesClient extends HttpClient {
|
|
|
77
77
|
body: policy,
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
|
-
async getAttachments(policyId, tenantId) {
|
|
80
|
+
async getAttachments(policyId, tenantId, opts) {
|
|
81
81
|
return this.request({
|
|
82
82
|
method: 'GET',
|
|
83
|
-
path: `${basePath(tenantId)}/${policyId}/attachments`,
|
|
83
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attachments`,
|
|
84
84
|
query: tenantId ? { tenantId } : undefined,
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
|
-
async attachToUser(policyId, userId, tenantId) {
|
|
87
|
+
async attachToUser(policyId, userId, tenantId, opts) {
|
|
88
88
|
return this.request({
|
|
89
89
|
method: 'POST',
|
|
90
|
-
path: `${basePath(tenantId)}/${policyId}/attach/user`,
|
|
90
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/user`,
|
|
91
91
|
query: tenantId ? { tenantId } : undefined,
|
|
92
92
|
body: { userId },
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
|
-
async attachToRole(policyId, roleId, tenantId) {
|
|
95
|
+
async attachToRole(policyId, roleId, tenantId, opts) {
|
|
96
96
|
return this.request({
|
|
97
97
|
method: 'POST',
|
|
98
|
-
path: `${basePath(tenantId)}/${policyId}/attach/role`,
|
|
98
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/role`,
|
|
99
99
|
query: tenantId ? { tenantId } : undefined,
|
|
100
100
|
body: { roleId },
|
|
101
101
|
});
|
|
102
102
|
}
|
|
103
|
-
async detachFromUser(policyId, userId, tenantId) {
|
|
103
|
+
async detachFromUser(policyId, userId, tenantId, opts) {
|
|
104
104
|
return this.request({
|
|
105
105
|
method: 'DELETE',
|
|
106
|
-
path: `${basePath(tenantId)}/${policyId}/attach/user/${userId}`,
|
|
106
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/user/${userId}`,
|
|
107
107
|
query: tenantId ? { tenantId } : undefined,
|
|
108
108
|
});
|
|
109
109
|
}
|
|
110
|
-
async detachFromRole(policyId, roleId, tenantId) {
|
|
110
|
+
async detachFromRole(policyId, roleId, tenantId, opts) {
|
|
111
111
|
return this.request({
|
|
112
112
|
method: 'DELETE',
|
|
113
|
-
path: `${basePath(tenantId)}/${policyId}/attach/role/${roleId}`,
|
|
113
|
+
path: `${basePath(tenantId, opts?.asSuperadmin)}/${policyId}/attach/role/${roleId}`,
|
|
114
114
|
query: tenantId ? { tenantId } : undefined,
|
|
115
115
|
});
|
|
116
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/lib/client/policies.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBvC,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,UAAU,GAAG,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/lib/client/policies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* IP Quarantine management client
|
|
3
3
|
*
|
|
4
|
-
* Routing:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Routing:
|
|
5
|
+
* - `asSuperadmin: true` → `/v1/superadmin/quarantine/*` (cross-tenant;
|
|
6
|
+
* used under `znvault superadmin quarantine`). Optional `tenantId`
|
|
7
|
+
* filters to a specific tenant; omitting it targets the system
|
|
8
|
+
* (null-tenant) scope.
|
|
9
|
+
* - otherwise → `/v1/quarantine/*` (tenant-scoped; tenant derived from
|
|
10
|
+
* the JWT).
|
|
11
|
+
*
|
|
12
|
+
* Pre-v4.0.1 the routing used `tenantId` truthiness as the discriminator;
|
|
13
|
+
* that broke `znvault superadmin quarantine list` (no `--tenant`) because
|
|
14
|
+
* the request fell through to `/v1/quarantine`, which the server rejects
|
|
15
|
+
* for superadmin principals with "Superadmins must use /v1/superadmin/*
|
|
16
|
+
* routes".
|
|
7
17
|
*/
|
|
8
18
|
import { HttpClient } from './http.js';
|
|
9
19
|
import type { IpQuarantine, IpQuarantineStats, IpQuarantineConfig, IpFailureHistory, PaginatedResponse } from '../../types/index.js';
|
|
@@ -13,27 +23,33 @@ export interface ListQuarantineOptions {
|
|
|
13
23
|
includeExpired?: boolean;
|
|
14
24
|
limit?: number;
|
|
15
25
|
offset?: number;
|
|
26
|
+
asSuperadmin?: boolean;
|
|
16
27
|
}
|
|
17
28
|
export interface ReleaseResult {
|
|
18
29
|
success: boolean;
|
|
19
30
|
message: string;
|
|
20
31
|
releasedCount?: number;
|
|
21
32
|
}
|
|
33
|
+
export interface QuarantineScope {
|
|
34
|
+
asSuperadmin?: boolean;
|
|
35
|
+
tenantId?: string;
|
|
36
|
+
}
|
|
22
37
|
export declare class QuarantineClient extends HttpClient {
|
|
23
38
|
list(options?: ListQuarantineOptions): Promise<PaginatedResponse<IpQuarantine>>;
|
|
24
|
-
getById(id: string,
|
|
25
|
-
release(id: string, reason: string,
|
|
26
|
-
releaseIp(ip: string, reason: string,
|
|
39
|
+
getById(id: string, scope?: QuarantineScope): Promise<IpQuarantine>;
|
|
40
|
+
release(id: string, reason: string, scope?: QuarantineScope): Promise<ReleaseResult>;
|
|
41
|
+
releaseIp(ip: string, reason: string, scope?: QuarantineScope): Promise<ReleaseResult>;
|
|
27
42
|
getHistory(ip: string, options?: {
|
|
28
43
|
limit?: number;
|
|
29
44
|
tenantId?: string;
|
|
45
|
+
asSuperadmin?: boolean;
|
|
30
46
|
}): Promise<{
|
|
31
47
|
ip: string;
|
|
32
48
|
failures: IpFailureHistory[];
|
|
33
49
|
}>;
|
|
34
|
-
getStats(
|
|
35
|
-
getConfig(
|
|
36
|
-
updateConfig(config: Partial<Omit<IpQuarantineConfig, 'id' | 'tenantId' | 'createdAt' | 'updatedAt'>>,
|
|
50
|
+
getStats(scope?: QuarantineScope): Promise<IpQuarantineStats>;
|
|
51
|
+
getConfig(scope?: QuarantineScope): Promise<IpQuarantineConfig>;
|
|
52
|
+
updateConfig(config: Partial<Omit<IpQuarantineConfig, 'id' | 'tenantId' | 'createdAt' | 'updatedAt'>>, scope?: QuarantineScope): Promise<{
|
|
37
53
|
success: boolean;
|
|
38
54
|
config: IpQuarantineConfig;
|
|
39
55
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAaD,qBAAa,gBAAiB,SAAQ,UAAU;IACxC,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAc/E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAQnE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IASpF,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAStF,UAAU,CACd,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACtE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAWlD,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ7D,SAAS,CAAC,KAAK,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQ/D,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,EACxF,KAAK,CAAC,EAAE,eAAe,GACtB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAQ7D"}
|
|
@@ -2,80 +2,97 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* IP Quarantine management client
|
|
4
4
|
*
|
|
5
|
-
* Routing:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Routing:
|
|
6
|
+
* - `asSuperadmin: true` → `/v1/superadmin/quarantine/*` (cross-tenant;
|
|
7
|
+
* used under `znvault superadmin quarantine`). Optional `tenantId`
|
|
8
|
+
* filters to a specific tenant; omitting it targets the system
|
|
9
|
+
* (null-tenant) scope.
|
|
10
|
+
* - otherwise → `/v1/quarantine/*` (tenant-scoped; tenant derived from
|
|
11
|
+
* the JWT).
|
|
12
|
+
*
|
|
13
|
+
* Pre-v4.0.1 the routing used `tenantId` truthiness as the discriminator;
|
|
14
|
+
* that broke `znvault superadmin quarantine list` (no `--tenant`) because
|
|
15
|
+
* the request fell through to `/v1/quarantine`, which the server rejects
|
|
16
|
+
* for superadmin principals with "Superadmins must use /v1/superadmin/*
|
|
17
|
+
* routes".
|
|
8
18
|
*/
|
|
9
19
|
import { HttpClient } from './http.js';
|
|
10
|
-
function
|
|
11
|
-
return
|
|
20
|
+
function basePath(asSuperadmin) {
|
|
21
|
+
return asSuperadmin ? '/v1/superadmin/quarantine' : '/v1/quarantine';
|
|
22
|
+
}
|
|
23
|
+
function tenantQuery(scope) {
|
|
24
|
+
if (!scope?.asSuperadmin)
|
|
25
|
+
return undefined;
|
|
26
|
+
return scope.tenantId !== undefined && scope.tenantId !== ''
|
|
27
|
+
? { tenantId: scope.tenantId }
|
|
28
|
+
: undefined;
|
|
12
29
|
}
|
|
13
30
|
export class QuarantineClient extends HttpClient {
|
|
14
31
|
async list(options) {
|
|
15
32
|
return this.request({
|
|
16
33
|
method: 'GET',
|
|
17
|
-
path:
|
|
34
|
+
path: basePath(options?.asSuperadmin),
|
|
18
35
|
query: {
|
|
19
36
|
status: options?.status,
|
|
20
|
-
tenantId: options?.tenantId,
|
|
37
|
+
tenantId: options?.asSuperadmin ? options.tenantId : undefined,
|
|
21
38
|
includeExpired: options?.includeExpired,
|
|
22
39
|
limit: options?.limit ?? 50,
|
|
23
40
|
offset: options?.offset ?? 0,
|
|
24
41
|
},
|
|
25
42
|
});
|
|
26
43
|
}
|
|
27
|
-
async getById(id,
|
|
44
|
+
async getById(id, scope) {
|
|
28
45
|
return this.request({
|
|
29
46
|
method: 'GET',
|
|
30
|
-
path: `${
|
|
31
|
-
query:
|
|
47
|
+
path: `${basePath(scope?.asSuperadmin)}/${id}`,
|
|
48
|
+
query: tenantQuery(scope),
|
|
32
49
|
});
|
|
33
50
|
}
|
|
34
|
-
async release(id, reason,
|
|
51
|
+
async release(id, reason, scope) {
|
|
35
52
|
return this.request({
|
|
36
53
|
method: 'POST',
|
|
37
|
-
path: `${
|
|
38
|
-
query:
|
|
54
|
+
path: `${basePath(scope?.asSuperadmin)}/${id}/release`,
|
|
55
|
+
query: tenantQuery(scope),
|
|
39
56
|
body: { reason },
|
|
40
57
|
});
|
|
41
58
|
}
|
|
42
|
-
async releaseIp(ip, reason,
|
|
59
|
+
async releaseIp(ip, reason, scope) {
|
|
43
60
|
return this.request({
|
|
44
61
|
method: 'POST',
|
|
45
|
-
path: `${
|
|
46
|
-
query:
|
|
62
|
+
path: `${basePath(scope?.asSuperadmin)}/ip/${encodeURIComponent(ip)}/release`,
|
|
63
|
+
query: tenantQuery(scope),
|
|
47
64
|
body: { reason },
|
|
48
65
|
});
|
|
49
66
|
}
|
|
50
67
|
async getHistory(ip, options) {
|
|
51
68
|
return this.request({
|
|
52
69
|
method: 'GET',
|
|
53
|
-
path: `${
|
|
70
|
+
path: `${basePath(options?.asSuperadmin)}/ip/${encodeURIComponent(ip)}/history`,
|
|
54
71
|
query: {
|
|
55
72
|
limit: options?.limit ?? 100,
|
|
56
|
-
tenantId: options?.tenantId,
|
|
73
|
+
tenantId: options?.asSuperadmin ? options.tenantId : undefined,
|
|
57
74
|
},
|
|
58
75
|
});
|
|
59
76
|
}
|
|
60
|
-
async getStats(
|
|
77
|
+
async getStats(scope) {
|
|
61
78
|
return this.request({
|
|
62
79
|
method: 'GET',
|
|
63
|
-
path: `${
|
|
64
|
-
query:
|
|
80
|
+
path: `${basePath(scope?.asSuperadmin)}/stats`,
|
|
81
|
+
query: tenantQuery(scope),
|
|
65
82
|
});
|
|
66
83
|
}
|
|
67
|
-
async getConfig(
|
|
84
|
+
async getConfig(scope) {
|
|
68
85
|
return this.request({
|
|
69
86
|
method: 'GET',
|
|
70
|
-
path: `${
|
|
71
|
-
query:
|
|
87
|
+
path: `${basePath(scope?.asSuperadmin)}/config`,
|
|
88
|
+
query: tenantQuery(scope),
|
|
72
89
|
});
|
|
73
90
|
}
|
|
74
|
-
async updateConfig(config,
|
|
91
|
+
async updateConfig(config, scope) {
|
|
75
92
|
return this.request({
|
|
76
93
|
method: 'PUT',
|
|
77
|
-
path: `${
|
|
78
|
-
query:
|
|
94
|
+
path: `${basePath(scope?.asSuperadmin)}/config`,
|
|
95
|
+
query: tenantQuery(scope),
|
|
79
96
|
body: config,
|
|
80
97
|
});
|
|
81
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC
|
|
1
|
+
{"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../../src/lib/client/quarantine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* User and superadmin management client
|
|
3
|
+
*
|
|
4
|
+
* Routing:
|
|
5
|
+
* - `asSuperadmin: true` → `/v1/superadmin/users*` (cross-tenant; used
|
|
6
|
+
* under `znvault superadmin user`).
|
|
7
|
+
* - otherwise → `/v1/users*` (tenant principal; tenant derived from JWT).
|
|
8
|
+
*
|
|
9
|
+
* The server rejects superadmin principals on `/v1/users*` with
|
|
10
|
+
* "Superadmins must use /v1/superadmin/* routes" — so every method that can
|
|
11
|
+
* be invoked from the superadmin namespace accepts an explicit
|
|
12
|
+
* `asSuperadmin` switch rather than relying on tenant-id truthiness.
|
|
3
13
|
*/
|
|
4
14
|
import { HttpClient } from './http.js';
|
|
5
15
|
import type { User, Superadmin } from '../../types/index.js';
|
|
@@ -9,6 +19,7 @@ export declare class UsersClient extends HttpClient {
|
|
|
9
19
|
tenantId?: string;
|
|
10
20
|
role?: string;
|
|
11
21
|
status?: string;
|
|
22
|
+
asSuperadmin?: boolean;
|
|
12
23
|
}): Promise<User[]>;
|
|
13
24
|
create(data: {
|
|
14
25
|
username: string;
|
|
@@ -16,16 +27,25 @@ export declare class UsersClient extends HttpClient {
|
|
|
16
27
|
email?: string;
|
|
17
28
|
tenantId?: string;
|
|
18
29
|
role?: 'user' | 'admin';
|
|
30
|
+
asSuperadmin?: boolean;
|
|
31
|
+
}): Promise<User>;
|
|
32
|
+
getById(id: string, opts?: {
|
|
33
|
+
asSuperadmin?: boolean;
|
|
19
34
|
}): Promise<User>;
|
|
20
|
-
getById(id: string): Promise<User>;
|
|
21
35
|
update(id: string, data: {
|
|
22
36
|
email?: string;
|
|
23
37
|
password?: string;
|
|
24
38
|
role?: 'user' | 'admin';
|
|
25
39
|
status?: 'active' | 'disabled';
|
|
40
|
+
}, opts?: {
|
|
41
|
+
asSuperadmin?: boolean;
|
|
26
42
|
}): Promise<User>;
|
|
27
|
-
deleteById(id: string
|
|
28
|
-
|
|
43
|
+
deleteById(id: string, opts?: {
|
|
44
|
+
asSuperadmin?: boolean;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
unlock(id: string, opts?: {
|
|
47
|
+
asSuperadmin?: boolean;
|
|
48
|
+
}): Promise<MessageResponse>;
|
|
29
49
|
/**
|
|
30
50
|
* Reset a user's password.
|
|
31
51
|
*
|
|
@@ -36,6 +56,13 @@ export declare class UsersClient extends HttpClient {
|
|
|
36
56
|
resetPassword(id: string, newPassword: string, opts?: {
|
|
37
57
|
asSuperadmin?: boolean;
|
|
38
58
|
}): Promise<MessageResponse>;
|
|
59
|
+
/**
|
|
60
|
+
* Disable TOTP/2FA for a user.
|
|
61
|
+
*
|
|
62
|
+
* Only the tenant route (`/v1/users/:id/totp/disable`) exists today; the
|
|
63
|
+
* server enforces tenant scoping. Superadmins disabling TOTP across
|
|
64
|
+
* tenants must do so via dashboard or local-mode CLI.
|
|
65
|
+
*/
|
|
39
66
|
disableTotp(id: string): Promise<MessageResponse>;
|
|
40
67
|
}
|
|
41
68
|
export declare class SuperadminsClient extends HttpClient {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD,qBAAa,WAAY,SAAQ,UAAU;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAcb,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IASX,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACxB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;KAChC,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAQrF;;;;;;OAMG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAW3B;;;;;;OAMG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAMxD;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IACzC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAiB7B,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,UAAU,CAAC;IAQjB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ3E,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOlD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAMzD"}
|
package/dist/lib/client/users.js
CHANGED
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
// Path: src/lib/client/users.ts
|
|
2
2
|
/**
|
|
3
3
|
* User and superadmin management client
|
|
4
|
+
*
|
|
5
|
+
* Routing:
|
|
6
|
+
* - `asSuperadmin: true` → `/v1/superadmin/users*` (cross-tenant; used
|
|
7
|
+
* under `znvault superadmin user`).
|
|
8
|
+
* - otherwise → `/v1/users*` (tenant principal; tenant derived from JWT).
|
|
9
|
+
*
|
|
10
|
+
* The server rejects superadmin principals on `/v1/users*` with
|
|
11
|
+
* "Superadmins must use /v1/superadmin/* routes" — so every method that can
|
|
12
|
+
* be invoked from the superadmin namespace accepts an explicit
|
|
13
|
+
* `asSuperadmin` switch rather than relying on tenant-id truthiness.
|
|
4
14
|
*/
|
|
5
15
|
import { HttpClient } from './http.js';
|
|
16
|
+
const TENANT_BASE = '/v1/users';
|
|
17
|
+
const ADMIN_BASE = '/v1/superadmin/users';
|
|
18
|
+
function basePath(asSuperadmin) {
|
|
19
|
+
return asSuperadmin ? ADMIN_BASE : TENANT_BASE;
|
|
20
|
+
}
|
|
6
21
|
export class UsersClient extends HttpClient {
|
|
7
22
|
async list(options) {
|
|
8
23
|
const response = await this.request({
|
|
9
24
|
method: 'GET',
|
|
10
|
-
path:
|
|
25
|
+
path: basePath(options?.asSuperadmin),
|
|
11
26
|
query: {
|
|
12
27
|
tenantId: options?.tenantId,
|
|
13
28
|
role: options?.role,
|
|
@@ -18,35 +33,36 @@ export class UsersClient extends HttpClient {
|
|
|
18
33
|
return response.items;
|
|
19
34
|
}
|
|
20
35
|
async create(data) {
|
|
36
|
+
const { asSuperadmin, ...body } = data;
|
|
21
37
|
return this.request({
|
|
22
38
|
method: 'POST',
|
|
23
|
-
path:
|
|
24
|
-
body
|
|
39
|
+
path: basePath(asSuperadmin),
|
|
40
|
+
body,
|
|
25
41
|
});
|
|
26
42
|
}
|
|
27
|
-
async getById(id) {
|
|
43
|
+
async getById(id, opts) {
|
|
28
44
|
return this.request({
|
|
29
45
|
method: 'GET',
|
|
30
|
-
path:
|
|
46
|
+
path: `${basePath(opts?.asSuperadmin)}/${id}`,
|
|
31
47
|
});
|
|
32
48
|
}
|
|
33
|
-
async update(id, data) {
|
|
49
|
+
async update(id, data, opts) {
|
|
34
50
|
return this.request({
|
|
35
51
|
method: 'PUT',
|
|
36
|
-
path:
|
|
52
|
+
path: `${basePath(opts?.asSuperadmin)}/${id}`,
|
|
37
53
|
body: data,
|
|
38
54
|
});
|
|
39
55
|
}
|
|
40
|
-
async deleteById(id) {
|
|
56
|
+
async deleteById(id, opts) {
|
|
41
57
|
await this.request({
|
|
42
58
|
method: 'DELETE',
|
|
43
|
-
path:
|
|
59
|
+
path: `${basePath(opts?.asSuperadmin)}/${id}`,
|
|
44
60
|
});
|
|
45
61
|
}
|
|
46
|
-
async unlock(id) {
|
|
62
|
+
async unlock(id, opts) {
|
|
47
63
|
return this.request({
|
|
48
64
|
method: 'PUT',
|
|
49
|
-
path:
|
|
65
|
+
path: `${basePath(opts?.asSuperadmin)}/${id}`,
|
|
50
66
|
body: { status: 'active', failedAttempts: 0, lockedUntil: null },
|
|
51
67
|
});
|
|
52
68
|
}
|
|
@@ -59,25 +75,33 @@ export class UsersClient extends HttpClient {
|
|
|
59
75
|
*/
|
|
60
76
|
async resetPassword(id, newPassword, opts) {
|
|
61
77
|
const path = opts?.asSuperadmin
|
|
62
|
-
?
|
|
63
|
-
:
|
|
78
|
+
? `${ADMIN_BASE}/${id}/reset-password`
|
|
79
|
+
: `${TENANT_BASE}/${id}/reset-password`;
|
|
64
80
|
return this.request({
|
|
65
81
|
method: 'POST',
|
|
66
82
|
path,
|
|
67
83
|
body: { newPassword },
|
|
68
84
|
});
|
|
69
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Disable TOTP/2FA for a user.
|
|
88
|
+
*
|
|
89
|
+
* Only the tenant route (`/v1/users/:id/totp/disable`) exists today; the
|
|
90
|
+
* server enforces tenant scoping. Superadmins disabling TOTP across
|
|
91
|
+
* tenants must do so via dashboard or local-mode CLI.
|
|
92
|
+
*/
|
|
70
93
|
async disableTotp(id) {
|
|
71
94
|
return this.request({
|
|
72
95
|
method: 'POST',
|
|
73
|
-
path:
|
|
96
|
+
path: `${TENANT_BASE}/${id}/totp/disable`,
|
|
74
97
|
});
|
|
75
98
|
}
|
|
76
99
|
}
|
|
77
100
|
export class SuperadminsClient extends HttpClient {
|
|
78
101
|
async list() {
|
|
79
102
|
const usersClient = new UsersClient();
|
|
80
|
-
|
|
103
|
+
// Listing superadmin role members requires the admin namespace.
|
|
104
|
+
const users = await usersClient.list({ role: 'superadmin', asSuperadmin: true });
|
|
81
105
|
return users.map(u => ({
|
|
82
106
|
id: u.id,
|
|
83
107
|
username: u.username,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/lib/client/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for context-aware command registration.
|
|
3
|
+
*
|
|
4
|
+
* In v4.0, dual-purpose command groups are registered twice:
|
|
5
|
+
* - At top level (tenant context) — `--tenant` option is omitted; the active
|
|
6
|
+
* user's JWT tenant is always used.
|
|
7
|
+
* - Under `znvault superadmin <group>` (superadmin context) — `--tenant` is
|
|
8
|
+
* accepted to target cross-tenant or system resources.
|
|
9
|
+
*
|
|
10
|
+
* Command handlers don't need to branch: when `context === 'tenant'`, the
|
|
11
|
+
* `--tenant` option simply isn't registered, so `options.tenant` is always
|
|
12
|
+
* `undefined` and existing client routing falls through to the tenant scope.
|
|
13
|
+
*/
|
|
14
|
+
import type { Command } from 'commander';
|
|
15
|
+
export type CommandContext = 'tenant' | 'superadmin';
|
|
16
|
+
export interface RegisterOptions {
|
|
17
|
+
context?: CommandContext;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Add a `--tenant <id>` option to a command only if running in superadmin
|
|
21
|
+
* context. In tenant context this is a no-op.
|
|
22
|
+
*
|
|
23
|
+
* @param cmd The Commander command to extend.
|
|
24
|
+
* @param ctx The active command context.
|
|
25
|
+
* @param description Override description (defaults to "Tenant ID (superadmin only)").
|
|
26
|
+
* @param shortFlag Set to `true` to register as `-t, --tenant <id>` instead of just `--tenant <id>`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function addTenantOption(cmd: Command, ctx: CommandContext, description?: string, shortFlag?: boolean): Command;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the registration context from optional opts, defaulting to 'tenant'.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveContext(opts?: RegisterOptions): CommandContext;
|
|
33
|
+
/**
|
|
34
|
+
* Run a registration function with the given context active. The previous
|
|
35
|
+
* context is restored when `fn` returns.
|
|
36
|
+
*/
|
|
37
|
+
export declare function withRegisterContext(ctx: CommandContext, fn: () => void): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get the active registration context. Sub-files use this to decide whether
|
|
40
|
+
* to add a `--tenant` option.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getRegisterContext(): CommandContext;
|
|
43
|
+
export declare function isSuperadminContext(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Walk up a Commander Command's parent chain to detect whether the
|
|
46
|
+
* currently-invoked command lives under the `superadmin` namespace. This
|
|
47
|
+
* is the runtime equivalent of `isSuperadminContext()` (which only returns
|
|
48
|
+
* the registration-time value).
|
|
49
|
+
*
|
|
50
|
+
* Handlers receive `this: Command` or `cmd: Command` from Commander; pass
|
|
51
|
+
* that in (or `this.parent` from an action callback) and we'll detect by
|
|
52
|
+
* inspecting the chain of `.name()` values.
|
|
53
|
+
*/
|
|
54
|
+
interface CommandWithChain {
|
|
55
|
+
name(): string;
|
|
56
|
+
parent: CommandWithChain | null;
|
|
57
|
+
}
|
|
58
|
+
export declare function isInvokedUnderSuperadmin(cmd: CommandWithChain | null | undefined): boolean;
|
|
59
|
+
interface CommandLike {
|
|
60
|
+
option(flags: string, description?: string, ...rest: unknown[]): CommandLike;
|
|
61
|
+
}
|
|
62
|
+
export declare function applyTenantContextPatch(commandPrototype: CommandLike): void;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=command-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-context.d.ts","sourceRoot":"","sources":["../../src/lib/command-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,cAAc,EACnB,WAAW,SAAwC,EACnD,SAAS,UAAQ,GAChB,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,cAAc,CAErE;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAQ7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,CAEnD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;;;;;GASG;AACH,UAAU,gBAAgB;IACxB,IAAI,IAAI,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO1F;AAcD,UAAU,WAAW;IACnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;CAC9E;AAED,wBAAgB,uBAAuB,CAAC,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAmB3E"}
|