@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.
Files changed (65) hide show
  1. package/lib/api/team/access-key-manager.js +104 -0
  2. package/lib/api/team/invitation-manager.js +461 -0
  3. package/lib/api/team/notification-manager.js +189 -0
  4. package/lib/api/team/oauth-manager.js +60 -0
  5. package/lib/api/team/org-crud-manager.js +202 -0
  6. package/lib/api/team/org-manager.js +56 -0
  7. package/lib/api/team/org-member-manager.js +403 -0
  8. package/lib/api/team/org-query-manager.js +126 -0
  9. package/lib/api/team/org-resource-manager.js +186 -0
  10. package/lib/api/team/passport-manager.js +670 -0
  11. package/lib/api/team/rbac-manager.js +335 -0
  12. package/lib/api/team/session-manager.js +540 -0
  13. package/lib/api/team/store-manager.js +198 -0
  14. package/lib/api/team/tag-manager.js +230 -0
  15. package/lib/api/team/user-auth-manager.js +132 -0
  16. package/lib/api/team/user-manager.js +78 -0
  17. package/lib/api/team/user-query-manager.js +299 -0
  18. package/lib/api/team/user-social-manager.js +354 -0
  19. package/lib/api/team/user-update-manager.js +224 -0
  20. package/lib/api/team/verify-code-manager.js +161 -0
  21. package/lib/api/team.js +439 -3287
  22. package/lib/blocklet/manager/disk/auth-manager.js +68 -0
  23. package/lib/blocklet/manager/disk/backup-manager.js +288 -0
  24. package/lib/blocklet/manager/disk/cleanup-manager.js +157 -0
  25. package/lib/blocklet/manager/disk/component-manager.js +83 -0
  26. package/lib/blocklet/manager/disk/config-manager.js +191 -0
  27. package/lib/blocklet/manager/disk/controller-manager.js +64 -0
  28. package/lib/blocklet/manager/disk/delete-reset-manager.js +328 -0
  29. package/lib/blocklet/manager/disk/download-manager.js +96 -0
  30. package/lib/blocklet/manager/disk/env-config-manager.js +311 -0
  31. package/lib/blocklet/manager/disk/federated-manager.js +651 -0
  32. package/lib/blocklet/manager/disk/hook-manager.js +124 -0
  33. package/lib/blocklet/manager/disk/install-component-manager.js +95 -0
  34. package/lib/blocklet/manager/disk/install-core-manager.js +448 -0
  35. package/lib/blocklet/manager/disk/install-download-manager.js +313 -0
  36. package/lib/blocklet/manager/disk/install-manager.js +36 -0
  37. package/lib/blocklet/manager/disk/install-upgrade-manager.js +340 -0
  38. package/lib/blocklet/manager/disk/job-manager.js +467 -0
  39. package/lib/blocklet/manager/disk/lifecycle-manager.js +26 -0
  40. package/lib/blocklet/manager/disk/notification-manager.js +343 -0
  41. package/lib/blocklet/manager/disk/query-manager.js +562 -0
  42. package/lib/blocklet/manager/disk/settings-manager.js +507 -0
  43. package/lib/blocklet/manager/disk/start-manager.js +611 -0
  44. package/lib/blocklet/manager/disk/stop-restart-manager.js +292 -0
  45. package/lib/blocklet/manager/disk/update-manager.js +153 -0
  46. package/lib/blocklet/manager/disk.js +669 -5796
  47. package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +5 -0
  48. package/lib/blocklet/manager/lock.js +18 -0
  49. package/lib/event/index.js +28 -24
  50. package/lib/util/blocklet/app-utils.js +192 -0
  51. package/lib/util/blocklet/blocklet-loader.js +258 -0
  52. package/lib/util/blocklet/config-manager.js +232 -0
  53. package/lib/util/blocklet/did-document.js +240 -0
  54. package/lib/util/blocklet/environment.js +555 -0
  55. package/lib/util/blocklet/health-check.js +449 -0
  56. package/lib/util/blocklet/install-utils.js +365 -0
  57. package/lib/util/blocklet/logo.js +57 -0
  58. package/lib/util/blocklet/meta-utils.js +269 -0
  59. package/lib/util/blocklet/port-manager.js +141 -0
  60. package/lib/util/blocklet/process-manager.js +504 -0
  61. package/lib/util/blocklet/runtime-info.js +105 -0
  62. package/lib/util/blocklet/validation.js +418 -0
  63. package/lib/util/blocklet.js +98 -3066
  64. package/lib/util/wallet-app-notification.js +40 -0
  65. 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
+ };