@budibase/backend-core 2.8.31 → 2.8.32-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/jest.config.js +10 -4
  2. package/dist/jest.config.js.map +1 -1
  3. package/dist/package.json +14 -26
  4. package/dist/src/auth/auth.js.map +1 -1
  5. package/dist/src/cache/appMetadata.d.ts +7 -1
  6. package/dist/src/cache/appMetadata.js +5 -8
  7. package/dist/src/cache/appMetadata.js.map +1 -1
  8. package/dist/src/cache/user.js.map +1 -1
  9. package/dist/src/constants/db.d.ts +1 -39
  10. package/dist/src/constants/db.js +8 -43
  11. package/dist/src/constants/db.js.map +1 -1
  12. package/dist/src/constants/misc.d.ts +2 -0
  13. package/dist/src/constants/misc.js +2 -0
  14. package/dist/src/constants/misc.js.map +1 -1
  15. package/dist/src/db/constants.d.ts +2 -0
  16. package/dist/src/db/constants.js +13 -0
  17. package/dist/src/db/constants.js.map +1 -0
  18. package/dist/src/db/couch/index.d.ts +1 -0
  19. package/dist/src/db/couch/index.js +1 -0
  20. package/dist/src/db/couch/index.js.map +1 -1
  21. package/dist/src/db/searchIndexes/searchIndexes.js.map +1 -1
  22. package/dist/src/db/utils.js +7 -2
  23. package/dist/src/db/utils.js.map +1 -1
  24. package/dist/src/db/views.d.ts +0 -1
  25. package/dist/src/db/views.js +1 -12
  26. package/dist/src/db/views.js.map +1 -1
  27. package/dist/src/environment.d.ts +11 -4
  28. package/dist/src/environment.js +21 -70
  29. package/dist/src/environment.js.map +1 -1
  30. package/dist/src/events/identification.js +3 -3
  31. package/dist/src/events/identification.js.map +1 -1
  32. package/dist/src/logging/index.d.ts +1 -1
  33. package/dist/src/logging/index.js +2 -3
  34. package/dist/src/logging/index.js.map +1 -1
  35. package/dist/src/logging/pino/logger.js +40 -24
  36. package/dist/src/logging/pino/logger.js.map +1 -1
  37. package/dist/src/logging/system.d.ts +9 -0
  38. package/dist/src/logging/system.js +101 -0
  39. package/dist/src/logging/system.js.map +1 -0
  40. package/dist/src/middleware/adminOnly.d.ts +2 -2
  41. package/dist/src/middleware/adminOnly.js +2 -2
  42. package/dist/src/middleware/adminOnly.js.map +1 -1
  43. package/dist/src/middleware/builderOnly.d.ts +2 -2
  44. package/dist/src/middleware/builderOnly.js +16 -2
  45. package/dist/src/middleware/builderOnly.js.map +1 -1
  46. package/dist/src/middleware/builderOrAdmin.d.ts +2 -2
  47. package/dist/src/middleware/builderOrAdmin.js +17 -4
  48. package/dist/src/middleware/builderOrAdmin.js.map +1 -1
  49. package/dist/src/security/permissions.d.ts +31 -18
  50. package/dist/src/security/permissions.js +46 -57
  51. package/dist/src/security/permissions.js.map +1 -1
  52. package/dist/src/security/roles.js +7 -4
  53. package/dist/src/security/roles.js.map +1 -1
  54. package/dist/src/users/db.d.ts +38 -0
  55. package/dist/src/users/db.js +407 -0
  56. package/dist/src/users/db.js.map +1 -0
  57. package/dist/src/users/events.d.ts +5 -0
  58. package/dist/src/users/events.js +169 -0
  59. package/dist/src/users/events.js.map +1 -0
  60. package/dist/src/users/index.d.ts +4 -0
  61. package/dist/src/users/index.js +23 -0
  62. package/dist/src/users/index.js.map +1 -0
  63. package/dist/src/users/lookup.d.ts +13 -0
  64. package/dist/src/users/lookup.js +112 -0
  65. package/dist/src/users/lookup.js.map +1 -0
  66. package/dist/src/{users.d.ts → users/users.d.ts} +4 -2
  67. package/dist/src/{users.js → users/users.js} +24 -4
  68. package/dist/src/users/users.js.map +1 -0
  69. package/dist/src/users/utils.d.ts +14 -0
  70. package/dist/src/users/utils.js +92 -0
  71. package/dist/src/users/utils.js.map +1 -0
  72. package/dist/tests/core/utilities/jestUtils.d.ts +7 -0
  73. package/dist/tests/core/utilities/jestUtils.js +14 -1
  74. package/dist/tests/core/utilities/jestUtils.js.map +1 -1
  75. package/dist/tests/core/utilities/mocks/events.d.ts +0 -1
  76. package/dist/tests/core/utilities/mocks/events.js +0 -1
  77. package/dist/tests/core/utilities/mocks/events.js.map +1 -1
  78. package/dist/tests/core/utilities/mocks/licenses.d.ts +1 -0
  79. package/dist/tests/core/utilities/mocks/licenses.js +8 -4
  80. package/dist/tests/core/utilities/mocks/licenses.js.map +1 -1
  81. package/dist/tests/core/utilities/structures/accounts.js +3 -3
  82. package/dist/tests/core/utilities/structures/accounts.js.map +1 -1
  83. package/dist/tests/core/utilities/structures/scim.js +1 -5
  84. package/dist/tests/core/utilities/structures/scim.js.map +1 -1
  85. package/dist/tests/core/utilities/structures/sso.js +2 -2
  86. package/dist/tests/core/utilities/structures/sso.js.map +1 -1
  87. package/dist/tests/core/utilities/structures/users.d.ts +3 -1
  88. package/dist/tests/core/utilities/structures/users.js +13 -1
  89. package/dist/tests/core/utilities/structures/users.js.map +1 -1
  90. package/dist/tsconfig.build.tsbuildinfo +1 -1
  91. package/jest.config.ts +1 -2
  92. package/package.json +14 -26
  93. package/scripts/test.sh +2 -2
  94. package/src/auth/auth.ts +1 -1
  95. package/src/cache/appMetadata.ts +10 -8
  96. package/src/cache/tests/writethrough.spec.ts +7 -7
  97. package/src/cache/user.ts +1 -1
  98. package/src/constants/db.ts +4 -42
  99. package/src/constants/misc.ts +2 -0
  100. package/src/db/constants.ts +10 -0
  101. package/src/db/couch/index.ts +1 -0
  102. package/src/db/searchIndexes/searchIndexes.ts +1 -1
  103. package/src/db/utils.ts +9 -3
  104. package/src/db/views.ts +0 -11
  105. package/src/environment.ts +24 -4
  106. package/src/events/identification.ts +3 -2
  107. package/src/logging/index.ts +1 -3
  108. package/src/logging/pino/logger.ts +45 -24
  109. package/src/logging/system.ts +81 -0
  110. package/src/logging/tests/system.spec.ts +61 -0
  111. package/src/middleware/adminOnly.ts +4 -6
  112. package/src/middleware/builderOnly.ts +15 -6
  113. package/src/middleware/builderOrAdmin.ts +16 -8
  114. package/src/middleware/tests/builder.spec.ts +180 -0
  115. package/src/security/permissions.ts +5 -21
  116. package/src/security/roles.ts +1 -1
  117. package/src/security/tests/permissions.spec.ts +1 -1
  118. package/src/users/db.ts +460 -0
  119. package/src/users/events.ts +176 -0
  120. package/src/users/index.ts +4 -0
  121. package/src/users/lookup.ts +102 -0
  122. package/src/{users.ts → users/users.ts} +33 -7
  123. package/src/users/utils.ts +55 -0
  124. package/tests/core/utilities/jestUtils.ts +21 -0
  125. package/tests/core/utilities/mocks/events.ts +0 -2
  126. package/tests/core/utilities/mocks/licenses.ts +7 -3
  127. package/tests/core/utilities/structures/accounts.ts +3 -5
  128. package/tests/core/utilities/structures/scim.ts +4 -5
  129. package/tests/core/utilities/structures/sso.ts +2 -2
  130. package/tests/core/utilities/structures/users.ts +19 -0
  131. package/tsconfig.json +2 -2
  132. package/dist/src/users.js.map +0 -1
@@ -0,0 +1,407 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.UserDB = void 0;
39
+ const environment_1 = __importDefault(require("../environment"));
40
+ const eventHelpers = __importStar(require("./events"));
41
+ const accounts = __importStar(require("../accounts"));
42
+ const cache = __importStar(require("../cache"));
43
+ const context_1 = require("../context");
44
+ const dbUtils = __importStar(require("../db"));
45
+ const errors_1 = require("../errors");
46
+ const platform = __importStar(require("../platform"));
47
+ const sessions = __importStar(require("../security/sessions"));
48
+ const usersCore = __importStar(require("./users"));
49
+ const types_1 = require("@budibase/types");
50
+ const accountSdk = __importStar(require("../accounts"));
51
+ const utils_1 = require("./utils");
52
+ const lookup_1 = require("./lookup");
53
+ const utils_2 = require("../utils");
54
+ const bulkDeleteProcessing = (dbUser) => __awaiter(void 0, void 0, void 0, function* () {
55
+ const userId = dbUser._id;
56
+ yield platform.users.removeUser(dbUser);
57
+ yield eventHelpers.handleDeleteEvents(dbUser);
58
+ yield cache.user.invalidateUser(userId);
59
+ yield sessions.invalidateSessions(userId, { reason: "bulk-deletion" });
60
+ });
61
+ class UserDB {
62
+ static init(quotaFns, groupFns, featureFns) {
63
+ UserDB.quotas = quotaFns;
64
+ UserDB.groups = groupFns;
65
+ UserDB.features = featureFns;
66
+ }
67
+ static isPreventPasswordActions(user, account) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ // when in maintenance mode we allow sso users with the admin role
70
+ // to perform any password action - this prevents lockout
71
+ if (environment_1.default.ENABLE_SSO_MAINTENANCE_MODE && (0, utils_1.isAdmin)(user)) {
72
+ return false;
73
+ }
74
+ // SSO is enforced for all users
75
+ if (yield UserDB.features.isSSOEnforced()) {
76
+ return true;
77
+ }
78
+ // Check local sso
79
+ if ((0, types_1.isSSOUser)(user)) {
80
+ return true;
81
+ }
82
+ // Check account sso
83
+ if (!account) {
84
+ account = yield accountSdk.getAccountByTenantId((0, context_1.getTenantId)());
85
+ }
86
+ return !!(account && account.email === user.email && (0, types_1.isSSOAccount)(account));
87
+ });
88
+ }
89
+ static buildUser(user, opts = {
90
+ hashPassword: true,
91
+ requirePassword: true,
92
+ }, tenantId, dbUser, account) {
93
+ return __awaiter(this, void 0, void 0, function* () {
94
+ let { password, _id } = user;
95
+ // don't require a password if the db user doesn't already have one
96
+ if (dbUser && !dbUser.password) {
97
+ opts.requirePassword = false;
98
+ }
99
+ let hashedPassword;
100
+ if (password) {
101
+ if (yield UserDB.isPreventPasswordActions(user, account)) {
102
+ throw new errors_1.HTTPError("Password change is disabled for this user", 400);
103
+ }
104
+ hashedPassword = opts.hashPassword ? yield (0, utils_2.hash)(password) : password;
105
+ }
106
+ else if (dbUser) {
107
+ hashedPassword = dbUser.password;
108
+ }
109
+ // passwords are never required if sso is enforced
110
+ const requirePasswords = opts.requirePassword && !(yield UserDB.features.isSSOEnforced());
111
+ if (!hashedPassword && requirePasswords) {
112
+ throw "Password must be specified.";
113
+ }
114
+ _id = _id || dbUtils.generateGlobalUserID();
115
+ const fullUser = Object.assign(Object.assign(Object.assign({ createdAt: Date.now() }, dbUser), user), { _id, password: hashedPassword, tenantId });
116
+ // make sure the roles object is always present
117
+ if (!fullUser.roles) {
118
+ fullUser.roles = {};
119
+ }
120
+ // add the active status to a user if its not provided
121
+ if (fullUser.status == null) {
122
+ fullUser.status = types_1.UserStatus.ACTIVE;
123
+ }
124
+ return fullUser;
125
+ });
126
+ }
127
+ static allUsers() {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ const db = (0, context_1.getGlobalDB)();
130
+ const response = yield db.allDocs(dbUtils.getGlobalUserParams(null, {
131
+ include_docs: true,
132
+ }));
133
+ return response.rows.map((row) => row.doc);
134
+ });
135
+ }
136
+ static countUsersByApp(appId) {
137
+ return __awaiter(this, void 0, void 0, function* () {
138
+ let response = yield usersCore.searchGlobalUsersByApp(appId, {});
139
+ return {
140
+ userCount: response.length,
141
+ };
142
+ });
143
+ }
144
+ static getUsersByAppAccess(appId) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ const opts = {
147
+ include_docs: true,
148
+ limit: 50,
149
+ };
150
+ let response = yield usersCore.searchGlobalUsersByAppAccess(appId, opts);
151
+ return response;
152
+ });
153
+ }
154
+ static getUserByEmail(email) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ return usersCore.getGlobalUserByEmail(email);
157
+ });
158
+ }
159
+ /**
160
+ * Gets a user by ID from the global database, based on the current tenancy.
161
+ */
162
+ static getUser(userId) {
163
+ return __awaiter(this, void 0, void 0, function* () {
164
+ const user = yield usersCore.getById(userId);
165
+ if (user) {
166
+ delete user.password;
167
+ }
168
+ return user;
169
+ });
170
+ }
171
+ static save(user, opts = {}) {
172
+ var _a, _b;
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ // default booleans to true
175
+ if (opts.hashPassword == null) {
176
+ opts.hashPassword = true;
177
+ }
178
+ if (opts.requirePassword == null) {
179
+ opts.requirePassword = true;
180
+ }
181
+ const tenantId = (0, context_1.getTenantId)();
182
+ const db = (0, context_1.getGlobalDB)();
183
+ let { email, _id, userGroups = [], roles } = user;
184
+ if (!email && !_id) {
185
+ throw new Error("_id or email is required");
186
+ }
187
+ if (((_b = (_a = user.builder) === null || _a === void 0 ? void 0 : _a.apps) === null || _b === void 0 ? void 0 : _b.length) &&
188
+ !(yield UserDB.features.isAppBuildersEnabled())) {
189
+ throw new Error("Unable to update app builders, please check license");
190
+ }
191
+ let dbUser;
192
+ if (_id) {
193
+ // try to get existing user from db
194
+ try {
195
+ dbUser = (yield db.get(_id));
196
+ if (email && dbUser.email !== email) {
197
+ throw "Email address cannot be changed";
198
+ }
199
+ email = dbUser.email;
200
+ }
201
+ catch (e) {
202
+ if (e.status === 404) {
203
+ // do nothing, save this new user with the id specified - required for SSO auth
204
+ }
205
+ else {
206
+ throw e;
207
+ }
208
+ }
209
+ }
210
+ if (!dbUser && email) {
211
+ // no id was specified - load from email instead
212
+ dbUser = yield usersCore.getGlobalUserByEmail(email);
213
+ if (dbUser && dbUser._id !== _id) {
214
+ throw new errors_1.EmailUnavailableError(email);
215
+ }
216
+ }
217
+ const change = dbUser ? 0 : 1; // no change if there is existing user
218
+ return UserDB.quotas.addUsers(change, () => __awaiter(this, void 0, void 0, function* () {
219
+ yield (0, utils_1.validateUniqueUser)(email, tenantId);
220
+ let builtUser = yield UserDB.buildUser(user, opts, tenantId, dbUser);
221
+ // don't allow a user to update its own roles/perms
222
+ if (opts.currentUserId && opts.currentUserId === (dbUser === null || dbUser === void 0 ? void 0 : dbUser._id)) {
223
+ builtUser = usersCore.cleanseUserObject(builtUser, dbUser);
224
+ }
225
+ if (!dbUser && (roles === null || roles === void 0 ? void 0 : roles.length)) {
226
+ builtUser.roles = Object.assign({}, roles);
227
+ }
228
+ // make sure we set the _id field for a new user
229
+ // Also if this is a new user, associate groups with them
230
+ let groupPromises = [];
231
+ if (!_id) {
232
+ _id = builtUser._id;
233
+ if (userGroups.length > 0) {
234
+ for (let groupId of userGroups) {
235
+ groupPromises.push(UserDB.groups.addUsers(groupId, [_id]));
236
+ }
237
+ }
238
+ }
239
+ try {
240
+ // save the user to db
241
+ let response = yield db.put(builtUser);
242
+ builtUser._rev = response.rev;
243
+ yield eventHelpers.handleSaveEvents(builtUser, dbUser);
244
+ yield platform.users.addUser(tenantId, builtUser._id, builtUser.email);
245
+ yield cache.user.invalidateUser(response.id);
246
+ yield Promise.all(groupPromises);
247
+ // finally returned the saved user from the db
248
+ return db.get(builtUser._id);
249
+ }
250
+ catch (err) {
251
+ if (err.status === 409) {
252
+ throw "User exists already";
253
+ }
254
+ else {
255
+ throw err;
256
+ }
257
+ }
258
+ }));
259
+ });
260
+ }
261
+ static bulkCreate(newUsersRequested, groups) {
262
+ return __awaiter(this, void 0, void 0, function* () {
263
+ const tenantId = (0, context_1.getTenantId)();
264
+ let usersToSave = [];
265
+ let newUsers = [];
266
+ const emails = newUsersRequested.map((user) => user.email);
267
+ const existingEmails = yield (0, lookup_1.searchExistingEmails)(emails);
268
+ const unsuccessful = [];
269
+ for (const newUser of newUsersRequested) {
270
+ if (newUsers.find((x) => x.email.toLowerCase() === newUser.email.toLowerCase()) ||
271
+ existingEmails.includes(newUser.email.toLowerCase())) {
272
+ unsuccessful.push({
273
+ email: newUser.email,
274
+ reason: `Unavailable`,
275
+ });
276
+ continue;
277
+ }
278
+ newUser.userGroups = groups;
279
+ newUsers.push(newUser);
280
+ }
281
+ const account = yield accountSdk.getAccountByTenantId(tenantId);
282
+ return UserDB.quotas.addUsers(newUsers.length, () => __awaiter(this, void 0, void 0, function* () {
283
+ // create the promises array that will be called by bulkDocs
284
+ newUsers.forEach((user) => {
285
+ usersToSave.push(UserDB.buildUser(user, {
286
+ hashPassword: true,
287
+ requirePassword: user.requirePassword,
288
+ }, tenantId, undefined, // no dbUser
289
+ account));
290
+ });
291
+ const usersToBulkSave = yield Promise.all(usersToSave);
292
+ yield usersCore.bulkUpdateGlobalUsers(usersToBulkSave);
293
+ // Post-processing of bulk added users, e.g. events and cache operations
294
+ for (const user of usersToBulkSave) {
295
+ // TODO: Refactor to bulk insert users into the info db
296
+ // instead of relying on looping tenant creation
297
+ yield platform.users.addUser(tenantId, user._id, user.email);
298
+ yield eventHelpers.handleSaveEvents(user, undefined);
299
+ }
300
+ const saved = usersToBulkSave.map(user => {
301
+ return {
302
+ _id: user._id,
303
+ email: user.email,
304
+ };
305
+ });
306
+ // now update the groups
307
+ if (Array.isArray(saved) && groups) {
308
+ const groupPromises = [];
309
+ const createdUserIds = saved.map(user => user._id);
310
+ for (let groupId of groups) {
311
+ groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds));
312
+ }
313
+ yield Promise.all(groupPromises);
314
+ }
315
+ return {
316
+ successful: saved,
317
+ unsuccessful,
318
+ };
319
+ }));
320
+ });
321
+ }
322
+ static bulkDelete(userIds) {
323
+ return __awaiter(this, void 0, void 0, function* () {
324
+ const db = (0, context_1.getGlobalDB)();
325
+ const response = {
326
+ successful: [],
327
+ unsuccessful: [],
328
+ };
329
+ // remove the account holder from the delete request if present
330
+ const account = yield (0, utils_1.getAccountHolderFromUserIds)(userIds);
331
+ if (account) {
332
+ userIds = userIds.filter(u => u !== account.budibaseUserId);
333
+ // mark user as unsuccessful
334
+ response.unsuccessful.push({
335
+ _id: account.budibaseUserId,
336
+ email: account.email,
337
+ reason: "Account holder cannot be deleted",
338
+ });
339
+ }
340
+ // Get users and delete
341
+ const allDocsResponse = yield db.allDocs({
342
+ include_docs: true,
343
+ keys: userIds,
344
+ });
345
+ const usersToDelete = allDocsResponse.rows.map((user) => {
346
+ return user.doc;
347
+ });
348
+ // Delete from DB
349
+ const toDelete = usersToDelete.map(user => (Object.assign(Object.assign({}, user), { _deleted: true })));
350
+ const dbResponse = yield usersCore.bulkUpdateGlobalUsers(toDelete);
351
+ yield UserDB.quotas.removeUsers(toDelete.length);
352
+ for (let user of usersToDelete) {
353
+ yield bulkDeleteProcessing(user);
354
+ }
355
+ // Build Response
356
+ // index users by id
357
+ const userIndex = {};
358
+ usersToDelete.reduce((prev, current) => {
359
+ prev[current._id] = current;
360
+ return prev;
361
+ }, userIndex);
362
+ // add the successful and unsuccessful users to response
363
+ dbResponse.forEach(item => {
364
+ const email = userIndex[item.id].email;
365
+ if (item.ok) {
366
+ response.successful.push({ _id: item.id, email });
367
+ }
368
+ else {
369
+ response.unsuccessful.push({
370
+ _id: item.id,
371
+ email,
372
+ reason: "Database error",
373
+ });
374
+ }
375
+ });
376
+ return response;
377
+ });
378
+ }
379
+ static destroy(id) {
380
+ return __awaiter(this, void 0, void 0, function* () {
381
+ const db = (0, context_1.getGlobalDB)();
382
+ const dbUser = (yield db.get(id));
383
+ const userId = dbUser._id;
384
+ if (!environment_1.default.SELF_HOSTED && !environment_1.default.DISABLE_ACCOUNT_PORTAL) {
385
+ // root account holder can't be deleted from inside budibase
386
+ const email = dbUser.email;
387
+ const account = yield accounts.getAccount(email);
388
+ if (account) {
389
+ if (dbUser.userId === (0, context_1.getIdentity)()._id) {
390
+ throw new errors_1.HTTPError('Please visit "Account" to delete this user', 400);
391
+ }
392
+ else {
393
+ throw new errors_1.HTTPError("Account holder cannot be deleted", 400);
394
+ }
395
+ }
396
+ }
397
+ yield platform.users.removeUser(dbUser);
398
+ yield db.remove(userId, dbUser._rev);
399
+ yield UserDB.quotas.removeUsers(1);
400
+ yield eventHelpers.handleDeleteEvents(dbUser);
401
+ yield cache.user.invalidateUser(userId);
402
+ yield sessions.invalidateSessions(userId, { reason: "deletion" });
403
+ });
404
+ }
405
+ }
406
+ exports.UserDB = UserDB;
407
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/users/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { User } from "@budibase/types";
2
+ export declare const handleDeleteEvents: (user: any) => Promise<void>;
3
+ export declare const handleSaveEvents: (user: User, existingUser: User | undefined) => Promise<void>;
4
+ export declare const isAddingBuilder: (user: any, existingUser: any) => boolean;
5
+ export declare const isRemovingBuilder: (user: any, existingUser: any) => boolean;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.isRemovingBuilder = exports.isAddingBuilder = exports.handleSaveEvents = exports.handleDeleteEvents = void 0;
39
+ const environment_1 = __importDefault(require("../environment"));
40
+ const events = __importStar(require("../events"));
41
+ const accounts = __importStar(require("../accounts"));
42
+ const context_1 = require("../context");
43
+ const utils_1 = require("./utils");
44
+ const handleDeleteEvents = (user) => __awaiter(void 0, void 0, void 0, function* () {
45
+ yield events.user.deleted(user);
46
+ if ((0, utils_1.hasBuilderPermissions)(user)) {
47
+ yield events.user.permissionBuilderRemoved(user);
48
+ }
49
+ if ((0, utils_1.hasAdminPermissions)(user)) {
50
+ yield events.user.permissionAdminRemoved(user);
51
+ }
52
+ });
53
+ exports.handleDeleteEvents = handleDeleteEvents;
54
+ const assignAppRoleEvents = (user, roles, existingRoles) => __awaiter(void 0, void 0, void 0, function* () {
55
+ for (const [appId, role] of Object.entries(roles)) {
56
+ // app role in existing is not same as new
57
+ if (!existingRoles || existingRoles[appId] !== role) {
58
+ yield events.role.assigned(user, role);
59
+ }
60
+ }
61
+ });
62
+ const unassignAppRoleEvents = (user, roles, existingRoles) => __awaiter(void 0, void 0, void 0, function* () {
63
+ if (!existingRoles) {
64
+ return;
65
+ }
66
+ for (const [appId, role] of Object.entries(existingRoles)) {
67
+ // app role in new is not same as existing
68
+ if (!roles || roles[appId] !== role) {
69
+ yield events.role.unassigned(user, role);
70
+ }
71
+ }
72
+ });
73
+ const handleAppRoleEvents = (user, existingUser) => __awaiter(void 0, void 0, void 0, function* () {
74
+ const roles = user.roles;
75
+ const existingRoles = existingUser === null || existingUser === void 0 ? void 0 : existingUser.roles;
76
+ yield assignAppRoleEvents(user, roles, existingRoles);
77
+ yield unassignAppRoleEvents(user, roles, existingRoles);
78
+ });
79
+ const handleSaveEvents = (user, existingUser) => __awaiter(void 0, void 0, void 0, function* () {
80
+ const tenantId = (0, context_1.getTenantId)();
81
+ let tenantAccount;
82
+ if (!environment_1.default.SELF_HOSTED && !environment_1.default.DISABLE_ACCOUNT_PORTAL) {
83
+ tenantAccount = yield accounts.getAccountByTenantId(tenantId);
84
+ }
85
+ yield events.identification.identifyUser(user, tenantAccount);
86
+ if (existingUser) {
87
+ yield events.user.updated(user);
88
+ if ((0, exports.isRemovingBuilder)(user, existingUser)) {
89
+ yield events.user.permissionBuilderRemoved(user);
90
+ }
91
+ if (isRemovingAdmin(user, existingUser)) {
92
+ yield events.user.permissionAdminRemoved(user);
93
+ }
94
+ if (isOnboardingComplete(user, existingUser)) {
95
+ yield events.user.onboardingComplete(user);
96
+ }
97
+ if (!existingUser.forceResetPassword &&
98
+ user.forceResetPassword &&
99
+ user.password) {
100
+ yield events.user.passwordForceReset(user);
101
+ }
102
+ if (user.password !== existingUser.password) {
103
+ yield events.user.passwordUpdated(user);
104
+ }
105
+ }
106
+ else {
107
+ yield events.user.created(user);
108
+ }
109
+ if ((0, exports.isAddingBuilder)(user, existingUser)) {
110
+ yield events.user.permissionBuilderAssigned(user);
111
+ }
112
+ if (isAddingAdmin(user, existingUser)) {
113
+ yield events.user.permissionAdminAssigned(user);
114
+ }
115
+ yield handleAppRoleEvents(user, existingUser);
116
+ });
117
+ exports.handleSaveEvents = handleSaveEvents;
118
+ const isAddingBuilder = (user, existingUser) => {
119
+ return isAddingPermission(user, existingUser, utils_1.hasBuilderPermissions);
120
+ };
121
+ exports.isAddingBuilder = isAddingBuilder;
122
+ const isRemovingBuilder = (user, existingUser) => {
123
+ return isRemovingPermission(user, existingUser, utils_1.hasBuilderPermissions);
124
+ };
125
+ exports.isRemovingBuilder = isRemovingBuilder;
126
+ const isAddingAdmin = (user, existingUser) => {
127
+ return isAddingPermission(user, existingUser, utils_1.hasAdminPermissions);
128
+ };
129
+ const isRemovingAdmin = (user, existingUser) => {
130
+ return isRemovingPermission(user, existingUser, utils_1.hasAdminPermissions);
131
+ };
132
+ const isOnboardingComplete = (user, existingUser) => {
133
+ return !(existingUser === null || existingUser === void 0 ? void 0 : existingUser.onboardedAt) && typeof user.onboardedAt === "string";
134
+ };
135
+ /**
136
+ * Check if a permission is being added to a new or existing user.
137
+ */
138
+ const isAddingPermission = (user, existingUser, hasPermission) => {
139
+ // new user doesn't have the permission
140
+ if (!hasPermission(user)) {
141
+ return false;
142
+ }
143
+ // existing user has the permission
144
+ if (existingUser && hasPermission(existingUser)) {
145
+ return false;
146
+ }
147
+ // permission is being added
148
+ return true;
149
+ };
150
+ /**
151
+ * Check if a permission is being removed from an existing user.
152
+ */
153
+ const isRemovingPermission = (user, existingUser, hasPermission) => {
154
+ // new user has the permission
155
+ if (hasPermission(user)) {
156
+ return false;
157
+ }
158
+ // no existing user or existing user doesn't have the permission
159
+ if (!existingUser) {
160
+ return false;
161
+ }
162
+ // existing user doesn't have the permission
163
+ if (!hasPermission(existingUser)) {
164
+ return false;
165
+ }
166
+ // permission is being removed
167
+ return true;
168
+ };
169
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/users/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./users";
2
+ export * from "./utils";
3
+ export * from "./lookup";
4
+ export { UserDB } from "./db";
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.UserDB = void 0;
18
+ __exportStar(require("./users"), exports);
19
+ __exportStar(require("./utils"), exports);
20
+ __exportStar(require("./lookup"), exports);
21
+ var db_1 = require("./db");
22
+ Object.defineProperty(exports, "UserDB", { enumerable: true, get: function () { return db_1.UserDB; } });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/users/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,0CAAuB;AACvB,2CAAwB;AACxB,2BAA6B;AAApB,4FAAA,MAAM,OAAA"}
@@ -0,0 +1,13 @@
1
+ import { AccountMetadata, PlatformUser, PlatformUserByEmail, User } from "@budibase/types";
2
+ /**
3
+ * Apply a system-wide search on emails:
4
+ * - in tenant
5
+ * - cross tenant
6
+ * - accounts
7
+ * return an array of emails that match the supplied emails.
8
+ */
9
+ export declare function searchExistingEmails(emails: string[]): Promise<string[]>;
10
+ export declare function getPlatformUser(identifier: string): Promise<PlatformUser | null>;
11
+ export declare function getExistingTenantUsers(emails: string[]): Promise<User[]>;
12
+ export declare function getExistingPlatformUsers(emails: string[]): Promise<PlatformUserByEmail[]>;
13
+ export declare function getExistingAccounts(emails: string[]): Promise<AccountMetadata[]>;