@abtnode/core 1.17.8-beta-20260109-075740-5f484e08 → 1.17.8-beta-20260113-015027-32a1cec4
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/lib/api/team/access-key-manager.js +104 -0
- package/lib/api/team/invitation-manager.js +461 -0
- package/lib/api/team/notification-manager.js +189 -0
- package/lib/api/team/oauth-manager.js +60 -0
- package/lib/api/team/org-crud-manager.js +202 -0
- package/lib/api/team/org-manager.js +56 -0
- package/lib/api/team/org-member-manager.js +403 -0
- package/lib/api/team/org-query-manager.js +126 -0
- package/lib/api/team/org-resource-manager.js +186 -0
- package/lib/api/team/passport-manager.js +670 -0
- package/lib/api/team/rbac-manager.js +335 -0
- package/lib/api/team/session-manager.js +540 -0
- package/lib/api/team/store-manager.js +198 -0
- package/lib/api/team/tag-manager.js +230 -0
- package/lib/api/team/user-auth-manager.js +132 -0
- package/lib/api/team/user-manager.js +78 -0
- package/lib/api/team/user-query-manager.js +299 -0
- package/lib/api/team/user-social-manager.js +354 -0
- package/lib/api/team/user-update-manager.js +224 -0
- package/lib/api/team/verify-code-manager.js +161 -0
- package/lib/api/team.js +439 -3287
- package/lib/blocklet/manager/disk/auth-manager.js +68 -0
- package/lib/blocklet/manager/disk/backup-manager.js +288 -0
- package/lib/blocklet/manager/disk/cleanup-manager.js +157 -0
- package/lib/blocklet/manager/disk/component-manager.js +83 -0
- package/lib/blocklet/manager/disk/config-manager.js +191 -0
- package/lib/blocklet/manager/disk/controller-manager.js +64 -0
- package/lib/blocklet/manager/disk/delete-reset-manager.js +328 -0
- package/lib/blocklet/manager/disk/download-manager.js +96 -0
- package/lib/blocklet/manager/disk/env-config-manager.js +311 -0
- package/lib/blocklet/manager/disk/federated-manager.js +651 -0
- package/lib/blocklet/manager/disk/hook-manager.js +124 -0
- package/lib/blocklet/manager/disk/install-component-manager.js +95 -0
- package/lib/blocklet/manager/disk/install-core-manager.js +448 -0
- package/lib/blocklet/manager/disk/install-download-manager.js +313 -0
- package/lib/blocklet/manager/disk/install-manager.js +36 -0
- package/lib/blocklet/manager/disk/install-upgrade-manager.js +340 -0
- package/lib/blocklet/manager/disk/job-manager.js +467 -0
- package/lib/blocklet/manager/disk/lifecycle-manager.js +26 -0
- package/lib/blocklet/manager/disk/notification-manager.js +343 -0
- package/lib/blocklet/manager/disk/query-manager.js +562 -0
- package/lib/blocklet/manager/disk/settings-manager.js +507 -0
- package/lib/blocklet/manager/disk/start-manager.js +611 -0
- package/lib/blocklet/manager/disk/stop-restart-manager.js +292 -0
- package/lib/blocklet/manager/disk/update-manager.js +153 -0
- package/lib/blocklet/manager/disk.js +669 -5796
- package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +5 -0
- package/lib/blocklet/manager/lock.js +18 -0
- package/lib/event/index.js +28 -24
- package/lib/util/blocklet/app-utils.js +192 -0
- package/lib/util/blocklet/blocklet-loader.js +258 -0
- package/lib/util/blocklet/config-manager.js +232 -0
- package/lib/util/blocklet/did-document.js +240 -0
- package/lib/util/blocklet/environment.js +555 -0
- package/lib/util/blocklet/health-check.js +449 -0
- package/lib/util/blocklet/install-utils.js +365 -0
- package/lib/util/blocklet/logo.js +57 -0
- package/lib/util/blocklet/meta-utils.js +269 -0
- package/lib/util/blocklet/port-manager.js +141 -0
- package/lib/util/blocklet/process-manager.js +504 -0
- package/lib/util/blocklet/runtime-info.js +105 -0
- package/lib/util/blocklet/validation.js +418 -0
- package/lib/util/blocklet.js +98 -3066
- package/lib/util/wallet-app-notification.js +40 -0
- package/package.json +22 -22
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
const pick = require('lodash/pick');
|
|
2
|
+
const logger = require('@abtnode/logger')('@abtnode/core:api:team:rbac');
|
|
3
|
+
const { ROLES, genPermissionName } = require('@abtnode/constant');
|
|
4
|
+
|
|
5
|
+
const { validateCreateRole, validateUpdateRole } = require('../../validators/role');
|
|
6
|
+
const { validateCreatePermission, validateUpdatePermission } = require('../../validators/permission');
|
|
7
|
+
|
|
8
|
+
const validateReservedRole = (role) => {
|
|
9
|
+
if (Object.values(ROLES).includes(role)) {
|
|
10
|
+
throw new Error(`The role ${role} is reserved`);
|
|
11
|
+
}
|
|
12
|
+
return true;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Get role
|
|
17
|
+
* @param {Object} api - TeamAPI instance
|
|
18
|
+
* @param {Object} params
|
|
19
|
+
* @param {string} params.teamDid - Team DID
|
|
20
|
+
* @param {Object} params.role - Role data
|
|
21
|
+
* @returns {Promise<Object>}
|
|
22
|
+
*/
|
|
23
|
+
async function getRole(api, { teamDid, role: { name } = {} }) {
|
|
24
|
+
if (!name) {
|
|
25
|
+
throw new Error('role name is invalid');
|
|
26
|
+
}
|
|
27
|
+
const rbac = await api.getRBAC(teamDid);
|
|
28
|
+
const role = await rbac.getRole(name);
|
|
29
|
+
return role ? pick(role, ['name', 'grants', 'title', 'description', 'extra', 'orgId']) : null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Create role
|
|
34
|
+
* @param {Object} api - TeamAPI instance
|
|
35
|
+
* @param {Object} params
|
|
36
|
+
* @param {string} params.teamDid - Team DID
|
|
37
|
+
* @param {string} params.name - Role name
|
|
38
|
+
* @param {string} params.description - Role description
|
|
39
|
+
* @param {string} params.title - Role title
|
|
40
|
+
* @param {string} params.childName - Child name
|
|
41
|
+
* @param {Array} params.permissions - Permissions
|
|
42
|
+
* @param {string} params.extra - Extra data (JSON string)
|
|
43
|
+
* @param {string} params.orgId - Organization ID
|
|
44
|
+
* @returns {Promise<Object>}
|
|
45
|
+
*/
|
|
46
|
+
async function createRole(api, { teamDid, name, description, title, childName, permissions = [], extra: raw, orgId }) {
|
|
47
|
+
logger.info('create role', { teamDid, name, description, childName, permissions, raw });
|
|
48
|
+
const attrs = { name, title, description, childName, permissions, orgId };
|
|
49
|
+
|
|
50
|
+
if (raw) {
|
|
51
|
+
try {
|
|
52
|
+
attrs.extra = JSON.parse(raw);
|
|
53
|
+
} catch (err) {
|
|
54
|
+
throw new Error('extra should be a valid json string');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await validateCreateRole(pick(attrs, ['name', 'title', 'description', 'extra']));
|
|
59
|
+
|
|
60
|
+
validateReservedRole(name);
|
|
61
|
+
|
|
62
|
+
const rbac = await api.getRBAC(teamDid);
|
|
63
|
+
|
|
64
|
+
let role;
|
|
65
|
+
try {
|
|
66
|
+
role = await rbac.createRole(attrs);
|
|
67
|
+
return pick(role, ['name', 'title', 'grants', 'description', 'extra', 'orgId']);
|
|
68
|
+
} catch (err) {
|
|
69
|
+
if (new RegExp(`Item ${name} already exists`).test(err.message)) {
|
|
70
|
+
throw new Error(`Id ${name} already exists`);
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Update role
|
|
78
|
+
* @param {Object} api - TeamAPI instance
|
|
79
|
+
* @param {Object} params
|
|
80
|
+
* @param {string} params.teamDid - Team DID
|
|
81
|
+
* @param {Object} params.role - Role data
|
|
82
|
+
* @param {string} params.orgId - Organization ID
|
|
83
|
+
* @returns {Promise<Object>}
|
|
84
|
+
*/
|
|
85
|
+
async function updateRole(api, { teamDid, role: { name, title, description, extra: raw } = {}, orgId }) {
|
|
86
|
+
logger.info('update role', { teamDid, name, title, description, raw });
|
|
87
|
+
|
|
88
|
+
const attrs = { name, title, description, orgId };
|
|
89
|
+
|
|
90
|
+
if (raw) {
|
|
91
|
+
try {
|
|
92
|
+
attrs.extra = JSON.parse(raw);
|
|
93
|
+
} catch (err) {
|
|
94
|
+
throw new Error('extra should be a valid json string');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
await validateUpdateRole(pick(attrs, ['name', 'title', 'description', 'extra']));
|
|
99
|
+
const rbac = await api.getRBAC(teamDid);
|
|
100
|
+
const state = await rbac.updateRole(attrs);
|
|
101
|
+
return pick(state, ['name', 'title', 'grants', 'description', 'extra', 'orgId']);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get permissions
|
|
106
|
+
* @param {Object} api - TeamAPI instance
|
|
107
|
+
* @param {Object} params
|
|
108
|
+
* @param {string} params.teamDid - Team DID
|
|
109
|
+
* @returns {Promise<Array>}
|
|
110
|
+
*/
|
|
111
|
+
async function getPermissions(api, { teamDid }) {
|
|
112
|
+
const rbac = await api.getRBAC(teamDid);
|
|
113
|
+
const permissions = await rbac.getPermissions();
|
|
114
|
+
return permissions.map((d) => {
|
|
115
|
+
d.isProtected = !!(d.extra && d.extra.isProtected);
|
|
116
|
+
return pick(d, ['name', 'description', 'isProtected']);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Create permission
|
|
122
|
+
* @param {Object} api - TeamAPI instance
|
|
123
|
+
* @param {Object} params
|
|
124
|
+
* @param {string} params.teamDid - Team DID
|
|
125
|
+
* @param {string} params.name - Permission name
|
|
126
|
+
* @param {string} params.description - Permission description
|
|
127
|
+
* @returns {Promise<Object>}
|
|
128
|
+
*/
|
|
129
|
+
async function createPermission(api, { teamDid, name, description }) {
|
|
130
|
+
logger.info('create permissions', { teamDid, name });
|
|
131
|
+
|
|
132
|
+
await validateCreatePermission({ name, description });
|
|
133
|
+
|
|
134
|
+
const rbac = await api.getRBAC(teamDid);
|
|
135
|
+
const added = await rbac.createPermission({ name, description });
|
|
136
|
+
|
|
137
|
+
return pick(added, ['name', 'description']);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Update permission
|
|
142
|
+
* @param {Object} api - TeamAPI instance
|
|
143
|
+
* @param {Object} params
|
|
144
|
+
* @param {string} params.teamDid - Team DID
|
|
145
|
+
* @param {Object} params.permission - Permission data
|
|
146
|
+
* @returns {Promise<Object>}
|
|
147
|
+
*/
|
|
148
|
+
async function updatePermission(api, { teamDid, permission: { name, description } = {} }) {
|
|
149
|
+
logger.info('update permission', { teamDid, name, description });
|
|
150
|
+
|
|
151
|
+
await validateUpdatePermission({ name, description });
|
|
152
|
+
|
|
153
|
+
const rbac = await api.getRBAC(teamDid);
|
|
154
|
+
const state = await rbac.updatePermission({ name, description });
|
|
155
|
+
|
|
156
|
+
return pick(state, ['name', 'description']);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Grant permission to role
|
|
161
|
+
* @param {Object} api - TeamAPI instance
|
|
162
|
+
* @param {Object} params
|
|
163
|
+
* @param {string} params.teamDid - Team DID
|
|
164
|
+
* @param {string} params.roleName - Role name
|
|
165
|
+
* @param {string} params.grantName - Grant name
|
|
166
|
+
* @returns {Promise<boolean>}
|
|
167
|
+
*/
|
|
168
|
+
async function grant(api, { teamDid, roleName, grantName }) {
|
|
169
|
+
logger.info('grant', { teamDid, roleName, grantName });
|
|
170
|
+
|
|
171
|
+
const rbac = await api.getRBAC(teamDid);
|
|
172
|
+
await rbac.grant(roleName, grantName);
|
|
173
|
+
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Revoke permission from role
|
|
179
|
+
* @param {Object} api - TeamAPI instance
|
|
180
|
+
* @param {Object} params
|
|
181
|
+
* @param {string} params.teamDid - Team DID
|
|
182
|
+
* @param {string} params.roleName - Role name
|
|
183
|
+
* @param {string} params.grantName - Grant name
|
|
184
|
+
* @returns {Promise<boolean>}
|
|
185
|
+
*/
|
|
186
|
+
async function revoke(api, { teamDid, roleName, grantName }) {
|
|
187
|
+
logger.info('revoke', { teamDid, roleName, grantName });
|
|
188
|
+
|
|
189
|
+
const rbac = await api.getRBAC(teamDid);
|
|
190
|
+
await rbac.revoke(roleName, grantName);
|
|
191
|
+
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Update grants for role
|
|
197
|
+
* @param {Object} api - TeamAPI instance
|
|
198
|
+
* @param {Object} params
|
|
199
|
+
* @param {string} params.teamDid - Team DID
|
|
200
|
+
* @param {string} params.roleName - Role name
|
|
201
|
+
* @param {Array} params.grantNames - Grant names
|
|
202
|
+
* @returns {Promise<Object>}
|
|
203
|
+
*/
|
|
204
|
+
async function updateGrants(api, { teamDid, roleName, grantNames }) {
|
|
205
|
+
logger.info('update grants', { teamDid, roleName, grantNames });
|
|
206
|
+
|
|
207
|
+
const rbac = await api.getRBAC(teamDid);
|
|
208
|
+
const role = await rbac.updateGrants(roleName, grantNames);
|
|
209
|
+
|
|
210
|
+
return pick(role, ['name', 'grants', 'title', 'description']);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Delete role
|
|
215
|
+
* @param {Object} api - TeamAPI instance
|
|
216
|
+
* @param {Object} params
|
|
217
|
+
* @param {string} params.teamDid - Team DID
|
|
218
|
+
* @param {string} params.name - Role name
|
|
219
|
+
* @returns {Promise<boolean>}
|
|
220
|
+
*/
|
|
221
|
+
async function deleteRole(api, { teamDid, name }) {
|
|
222
|
+
logger.info('delete role', { teamDid, name });
|
|
223
|
+
|
|
224
|
+
validateReservedRole(name);
|
|
225
|
+
|
|
226
|
+
const rbac = await api.getRBAC(teamDid);
|
|
227
|
+
await rbac.removeRole(name);
|
|
228
|
+
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Delete permission
|
|
234
|
+
* @param {Object} api - TeamAPI instance
|
|
235
|
+
* @param {Object} params
|
|
236
|
+
* @param {string} params.teamDid - Team DID
|
|
237
|
+
* @param {string} params.name - Permission name
|
|
238
|
+
* @returns {Promise<boolean>}
|
|
239
|
+
*/
|
|
240
|
+
async function deletePermission(api, { teamDid, name }) {
|
|
241
|
+
logger.info('delete permission', { teamDid, name });
|
|
242
|
+
|
|
243
|
+
const rbac = await api.getRBAC(teamDid);
|
|
244
|
+
|
|
245
|
+
const permission = await rbac.getPermission(name);
|
|
246
|
+
if (permission.extra && permission.extra.isProtected) {
|
|
247
|
+
throw new Error(`The permission ${name} is reserved`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
await rbac.removePermission(name);
|
|
251
|
+
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Get permissions by role
|
|
257
|
+
* @param {Object} api - TeamAPI instance
|
|
258
|
+
* @param {Object} params
|
|
259
|
+
* @param {string} params.teamDid - Team DID
|
|
260
|
+
* @param {Object} params.role - Role data
|
|
261
|
+
* @returns {Promise<Array>}
|
|
262
|
+
*/
|
|
263
|
+
async function getPermissionsByRole(api, { teamDid, role }) {
|
|
264
|
+
const rbac = await api.getRBAC(teamDid);
|
|
265
|
+
|
|
266
|
+
const permissions = await rbac.getScope(role.name, true);
|
|
267
|
+
|
|
268
|
+
return permissions.map((d) => pick(d, ['name', 'description']));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Check if role has permission
|
|
273
|
+
* @param {Object} api - TeamAPI instance
|
|
274
|
+
* @param {Object} params
|
|
275
|
+
* @param {string} params.teamDid - Team DID
|
|
276
|
+
* @param {string} params.role - Role name
|
|
277
|
+
* @param {string} params.permission - Permission name
|
|
278
|
+
* @returns {Promise<boolean>}
|
|
279
|
+
*/
|
|
280
|
+
async function hasPermission(api, { teamDid, role, permission }) {
|
|
281
|
+
const rbac = await api.getRBAC(teamDid);
|
|
282
|
+
|
|
283
|
+
const has = await rbac.can(role, ...permission.split('_'));
|
|
284
|
+
|
|
285
|
+
return has;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Refresh blocklet interface permissions
|
|
290
|
+
* @param {Object} api - TeamAPI instance
|
|
291
|
+
* @param {Object} blockletMeta - Blocklet metadata
|
|
292
|
+
* @returns {Promise<void>}
|
|
293
|
+
*/
|
|
294
|
+
async function refreshBlockletInterfacePermissions(api, blockletMeta) {
|
|
295
|
+
const { did, interfaces } = blockletMeta;
|
|
296
|
+
|
|
297
|
+
const rbac = await api.getRBAC(did);
|
|
298
|
+
|
|
299
|
+
const oldPermissions = await getPermissions(api, { teamDid: did });
|
|
300
|
+
|
|
301
|
+
await Promise.all(
|
|
302
|
+
(interfaces || []).map(async ({ name, type }) => {
|
|
303
|
+
const permissionName = genPermissionName(name);
|
|
304
|
+
if (type === 'web') {
|
|
305
|
+
if (!oldPermissions.some((x) => x.name === permissionName)) {
|
|
306
|
+
await rbac.createPermission({
|
|
307
|
+
name: permissionName,
|
|
308
|
+
description: `Access resources under the ${name} interface`,
|
|
309
|
+
extra: {
|
|
310
|
+
isProtected: true,
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
})
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
module.exports = {
|
|
320
|
+
validateReservedRole,
|
|
321
|
+
getRole,
|
|
322
|
+
createRole,
|
|
323
|
+
updateRole,
|
|
324
|
+
getPermissions,
|
|
325
|
+
createPermission,
|
|
326
|
+
updatePermission,
|
|
327
|
+
grant,
|
|
328
|
+
revoke,
|
|
329
|
+
updateGrants,
|
|
330
|
+
deleteRole,
|
|
331
|
+
deletePermission,
|
|
332
|
+
getPermissionsByRole,
|
|
333
|
+
hasPermission,
|
|
334
|
+
refreshBlockletInterfacePermissions,
|
|
335
|
+
};
|