@spinajs/rbac-http-admin 2.0.485 → 2.0.487

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 (66) hide show
  1. package/README.md +104 -5
  2. package/lib/cjs/config/rbac-http-admin.d.ts +25 -0
  3. package/lib/cjs/config/rbac-http-admin.d.ts.map +1 -1
  4. package/lib/cjs/config/rbac-http-admin.js +25 -0
  5. package/lib/cjs/config/rbac-http-admin.js.map +1 -1
  6. package/lib/cjs/controllers/Users/Profile.d.ts.map +1 -1
  7. package/lib/cjs/controllers/Users/Profile.js +3 -1
  8. package/lib/cjs/controllers/Users/Profile.js.map +1 -1
  9. package/lib/cjs/controllers/Users/Roles.d.ts +15 -8
  10. package/lib/cjs/controllers/Users/Roles.d.ts.map +1 -1
  11. package/lib/cjs/controllers/Users/Roles.js +34 -16
  12. package/lib/cjs/controllers/Users/Roles.js.map +1 -1
  13. package/lib/cjs/controllers/Users/Security.d.ts +151 -11
  14. package/lib/cjs/controllers/Users/Security.d.ts.map +1 -1
  15. package/lib/cjs/controllers/Users/Security.js +303 -30
  16. package/lib/cjs/controllers/Users/Security.js.map +1 -1
  17. package/lib/cjs/controllers/Users/Users.d.ts +97 -14
  18. package/lib/cjs/controllers/Users/Users.d.ts.map +1 -1
  19. package/lib/cjs/controllers/Users/Users.js +278 -73
  20. package/lib/cjs/controllers/Users/Users.js.map +1 -1
  21. package/lib/cjs/index.d.ts +6 -1
  22. package/lib/cjs/index.d.ts.map +1 -1
  23. package/lib/cjs/index.js +5 -0
  24. package/lib/cjs/index.js.map +1 -1
  25. package/lib/cjs/interfaces.d.ts +81 -0
  26. package/lib/cjs/interfaces.d.ts.map +1 -0
  27. package/lib/cjs/interfaces.js +20 -0
  28. package/lib/cjs/interfaces.js.map +1 -0
  29. package/lib/cjs/services/RoleGuard.d.ts +96 -0
  30. package/lib/cjs/services/RoleGuard.d.ts.map +1 -0
  31. package/lib/cjs/services/RoleGuard.js +258 -0
  32. package/lib/cjs/services/RoleGuard.js.map +1 -0
  33. package/lib/mjs/config/rbac-http-admin.d.ts +25 -0
  34. package/lib/mjs/config/rbac-http-admin.d.ts.map +1 -1
  35. package/lib/mjs/config/rbac-http-admin.js +25 -0
  36. package/lib/mjs/config/rbac-http-admin.js.map +1 -1
  37. package/lib/mjs/controllers/Users/Profile.d.ts.map +1 -1
  38. package/lib/mjs/controllers/Users/Profile.js +4 -2
  39. package/lib/mjs/controllers/Users/Profile.js.map +1 -1
  40. package/lib/mjs/controllers/Users/Roles.d.ts +15 -8
  41. package/lib/mjs/controllers/Users/Roles.d.ts.map +1 -1
  42. package/lib/mjs/controllers/Users/Roles.js +35 -17
  43. package/lib/mjs/controllers/Users/Roles.js.map +1 -1
  44. package/lib/mjs/controllers/Users/Security.d.ts +151 -11
  45. package/lib/mjs/controllers/Users/Security.d.ts.map +1 -1
  46. package/lib/mjs/controllers/Users/Security.js +304 -31
  47. package/lib/mjs/controllers/Users/Security.js.map +1 -1
  48. package/lib/mjs/controllers/Users/Users.d.ts +97 -14
  49. package/lib/mjs/controllers/Users/Users.d.ts.map +1 -1
  50. package/lib/mjs/controllers/Users/Users.js +279 -74
  51. package/lib/mjs/controllers/Users/Users.js.map +1 -1
  52. package/lib/mjs/index.d.ts +6 -1
  53. package/lib/mjs/index.d.ts.map +1 -1
  54. package/lib/mjs/index.js +6 -1
  55. package/lib/mjs/index.js.map +1 -1
  56. package/lib/mjs/interfaces.d.ts +81 -0
  57. package/lib/mjs/interfaces.d.ts.map +1 -0
  58. package/lib/mjs/interfaces.js +16 -0
  59. package/lib/mjs/interfaces.js.map +1 -0
  60. package/lib/mjs/services/RoleGuard.d.ts +96 -0
  61. package/lib/mjs/services/RoleGuard.d.ts.map +1 -0
  62. package/lib/mjs/services/RoleGuard.js +252 -0
  63. package/lib/mjs/services/RoleGuard.js.map +1 -0
  64. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  65. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  66. package/package.json +14 -12
@@ -12,23 +12,49 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.Users = void 0;
15
+ exports.Users = exports.UpdateUserDto = exports.CreateUserDto = void 0;
16
16
  const di_1 = require("@spinajs/di");
17
+ const configuration_1 = require("@spinajs/configuration");
17
18
  const http_1 = require("@spinajs/http");
19
+ const exceptions_1 = require("@spinajs/exceptions");
18
20
  const orm_1 = require("@spinajs/orm");
19
21
  const orm_http_1 = require("@spinajs/orm-http");
20
22
  const rbac_1 = require("@spinajs/rbac");
21
23
  const rbac_http_1 = require("@spinajs/rbac-http");
22
24
  const validation_1 = require("@spinajs/validation");
23
- let UserDto = class UserDto {
25
+ const interfaces_js_1 = require("../../interfaces.js");
26
+ // Side effect only: registers DefaultRoleGuard under the RoleGuard base so
27
+ // `rbac.admin.roleGuard.service` has something to resolve to. The type import
28
+ // above is erased at compile time, and controllers are loaded by path rather
29
+ // than through the package index, so without this the guard is missing in
30
+ // exactly the deployments that never import the package themselves.
31
+ require("../../services/RoleGuard.js");
32
+ /**
33
+ * Columns a client may sort by.
34
+ *
35
+ * `OrderDTO.column` is a free-form string and reaches the query builder as an
36
+ * identifier. The compiler escapes it, so this is not an injection hole — but an
37
+ * unknown column produced a driver error and a 500 where the request was simply
38
+ * wrong. Whitelisting turns that into a 400 and keeps the sortable surface a
39
+ * deliberate decision rather than "whatever columns the table happens to have".
40
+ */
41
+ const SORTABLE_COLUMNS = ['Uuid', 'Login', 'Email', 'Role', 'IsActive', 'CreatedAt', 'LastLoginAt', 'DeletedAt'];
42
+ /**
43
+ * Upper bound on `pagination.limit`. An admin list endpoint with no ceiling is
44
+ * a table dump one query string away.
45
+ */
46
+ const MAX_PAGE_SIZE = 100;
47
+ const DEFAULT_PAGE_SIZE = 10;
48
+ let CreateUserDto = class CreateUserDto {
24
49
  constructor(data) {
25
50
  Object.assign(this, data);
26
51
  }
27
52
  };
28
- UserDto = __decorate([
53
+ exports.CreateUserDto = CreateUserDto;
54
+ exports.CreateUserDto = CreateUserDto = __decorate([
29
55
  (0, validation_1.Schema)({
30
56
  type: 'object',
31
- $id: 'arrow.common.userDto',
57
+ $id: 'arrow.common.createUserDto',
32
58
  properties: {
33
59
  Login: { type: 'string', minLength: 3, maxLength: 32, description: 'Unique login name (3–32 characters)' },
34
60
  Email: { type: 'string', format: 'email', description: 'Unique email address' },
@@ -36,10 +62,6 @@ UserDto = __decorate([
36
62
  Metadata: {
37
63
  type: 'object',
38
64
  $id: 'arrow.common.userMetadata',
39
- properties: {
40
- Key: { type: 'string', minLength: 1, maxLength: 64, description: 'Metadata key' },
41
- Value: { type: 'string', minLength: 0, maxLength: 256, description: 'Metadata value' },
42
- },
43
65
  additionalProperties: true,
44
66
  description: 'Optional key-value metadata to attach to the user account',
45
67
  },
@@ -47,7 +69,36 @@ UserDto = __decorate([
47
69
  required: ['Login', 'Email', 'Role'],
48
70
  }),
49
71
  __metadata("design:paramtypes", [Object])
50
- ], UserDto);
72
+ ], CreateUserDto);
73
+ /**
74
+ * PATCH body. Separate from {@link CreateUserDto} because the two have opposite
75
+ * requirements: creation needs all three fields, an update needs none of them.
76
+ * Sharing one schema made every documented partial update fail validation with
77
+ * a 400 before the handler ever ran.
78
+ *
79
+ * Metadata is deliberately absent — it is managed through the dedicated
80
+ * `/user/:uuid/metadata` routes, which validate one entry at a time and can
81
+ * refuse the keys that decide account access.
82
+ */
83
+ let UpdateUserDto = class UpdateUserDto {
84
+ constructor(data) {
85
+ Object.assign(this, data);
86
+ }
87
+ };
88
+ exports.UpdateUserDto = UpdateUserDto;
89
+ exports.UpdateUserDto = UpdateUserDto = __decorate([
90
+ (0, validation_1.Schema)({
91
+ type: 'object',
92
+ $id: 'arrow.common.updateUserDto',
93
+ properties: {
94
+ Login: { type: 'string', minLength: 3, maxLength: 32, description: 'Unique login name (3–32 characters)' },
95
+ Email: { type: 'string', format: 'email', description: 'Unique email address' },
96
+ Role: { type: 'string', minLength: 1, maxLength: 32, description: 'RBAC role to assign to the user' },
97
+ },
98
+ additionalProperties: false,
99
+ }),
100
+ __metadata("design:paramtypes", [Object])
101
+ ], UpdateUserDto);
51
102
  /**
52
103
  * User model filter
53
104
  * We declare it here to not include orm-http in rbac module
@@ -84,15 +135,15 @@ const USER_FILTER = [
84
135
  },
85
136
  {
86
137
  column: 'Role',
87
- operators: ['eq', 'neq']
138
+ operators: ['eq', 'neq'],
88
139
  },
89
140
  {
90
141
  column: 'user:niceName',
91
142
  operators: ['eq', 'neq', 'like', 'b-like', 'e-like'],
92
143
  query: (operator, value) => {
93
144
  return function () {
94
- this.whereExist("Metadata", function () {
95
- this.where('Key', "user:niceName");
145
+ this.whereExist('Metadata', function () {
146
+ this.where('Key', 'user:niceName');
96
147
  // NOTE: `operator` is the filter operator coming from the request
97
148
  // ( eq / neq / like ... ), NOT an SQL one. It has to be translated
98
149
  // before it reaches the query builder, which only understands SQL
@@ -116,8 +167,8 @@ const USER_FILTER = [
116
167
  }
117
168
  });
118
169
  };
119
- }
120
- }
170
+ },
171
+ },
121
172
  ];
122
173
  /**
123
174
  * User account management (admin).
@@ -136,32 +187,40 @@ let Users = class Users extends http_1.BaseController {
136
187
  * user:niceName metadata (eq, neq, like).
137
188
  * @security cookieAuth
138
189
  * @param pagination.page Page number (zero-based)
139
- * @param pagination.limit Number of users per page (default: 10)
140
- * @param order.column Column to sort by (default: CreatedAt)
190
+ * @param pagination.limit Number of users per page (default: 10, max: 100)
191
+ * @param order.column Column to sort by (default: CreatedAt). One of Uuid, Login, Email, Role, IsActive, CreatedAt, LastLoginAt, DeletedAt
141
192
  * @param order.order Sort direction: ASC or DESC (default: DESC)
142
193
  * @param include Relations to include — currently supports: Metadata
143
194
  * @returns {IUserData[]} Paginated list of user accounts, each with optional Metadata relation
195
+ * @response 400 Sort column is not sortable
144
196
  * @response 401 Unauthorized — valid session required
145
197
  * @response 403 Forbidden — readAny permission required on users resource
146
198
  */
147
199
  async list(pagination, order, include, filter) {
200
+ // ONE limit for both take and skip. They used to disagree — take fell back
201
+ // to 10 while skip fell back to 0 — so any request that sent a page but no
202
+ // limit silently got page 0 whatever it asked for.
203
+ const limit = Math.min(pagination?.limit || DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);
204
+ const column = this.sortColumn(order);
148
205
  const result = await rbac_1.User.select()
149
- .leftJoin("Metadata", function () {
206
+ .leftJoin('Metadata', function () {
150
207
  // TODO: allow to inject custom meta props that need to be selected
151
208
  // eg. user:niceName, user:avatar etc.
152
209
  // this is used for filtering / sorting by custom meta props
153
210
  this.where('Key', 'user:niceName');
154
211
  }, function () {
155
- this.select('Value', "user:niceName");
212
+ this.select('Value', 'user:niceName');
156
213
  })
157
214
  .populate(include ?? [])
158
- .take(pagination?.limit ?? 10)
159
- .skip((pagination?.limit ?? 0) * (pagination?.page ?? 0))
160
- .order(order?.column ?? 'CreatedAt', order?.order ?? orm_1.SortOrder.DESC)
215
+ .take(limit)
216
+ .skip(limit * (pagination?.page ?? 0))
217
+ .order(column, order?.order ?? orm_1.SortOrder.DESC)
161
218
  .filter(filter?.filters ?? [], filter?.op, USER_FILTER);
162
- const count = await rbac_1.User.query().filter(filter?.filters ?? [], filter?.op, USER_FILTER).selectCount();
219
+ const count = await rbac_1.User.query()
220
+ .filter(filter?.filters ?? [], filter?.op, USER_FILTER)
221
+ .selectCount();
163
222
  return new http_1.Ok(result.map((x) => x.dehydrateWithRelations({
164
- dateTimeFormat: "iso"
223
+ dateTimeFormat: 'iso',
165
224
  })), {
166
225
  Headers: [
167
226
  {
@@ -171,6 +230,19 @@ let Users = class Users extends http_1.BaseController {
171
230
  ],
172
231
  });
173
232
  }
233
+ /**
234
+ * List assignable roles (admin)
235
+ * Returns the roles the calling administrator is allowed to grant, as decided by the
236
+ * configured role guard — the system role and anything granting more than the caller
237
+ * holds are left out, so a UI cannot offer an operation the guard will refuse.
238
+ * @security cookieAuth
239
+ * @returns {string[]} Role names the caller may assign
240
+ * @response 401 Unauthorized — valid session required
241
+ * @response 403 Forbidden — readAny permission required on users resource
242
+ */
243
+ async assignableRoles(actor) {
244
+ return new http_1.Ok(this.RoleGuard.assignableRoles(actor));
245
+ }
174
246
  /**
175
247
  * Get user by UUID (admin)
176
248
  * Retrieves a single user record by UUID. Supports optional inclusion of related Metadata.
@@ -205,16 +277,21 @@ let Users = class Users extends http_1.BaseController {
205
277
  }
206
278
  /**
207
279
  * Create user (admin)
208
- * Creates a new user account with a system-generated temporary password.
209
- * The temporary password is not returned — it should be delivered to the user via email or other channel.
280
+ * Creates a new user account with a system-generated temporary password. The account is
281
+ * created inactive and the temporary password is never returned — issue a reset link with
282
+ * `POST /users/security/password-reset-request/:user` and activate the account once the
283
+ * user has set their own password.
210
284
  * @security cookieAuth
211
285
  * @returns {IUserData} Created user account
212
- * @response 400 Validation error — missing required fields or invalid format
286
+ * @response 400 Validation error — missing required fields, invalid format, unknown role or a protected metadata key
213
287
  * @response 401 Unauthorized — valid session required
214
- * @response 403 Forbidden — createAny permission required on users resource
288
+ * @response 403 Forbidden — createAny permission required, or the requested role grants more than the caller holds
215
289
  * @response 409 Login or email already in use
216
290
  */
217
- async addUser(data) {
291
+ async addUser(actor, data) {
292
+ await this.RoleGuard.assertCanAssignRoles(actor, null, [data.Role]);
293
+ this.assertNoProtectedMetadata(data.Metadata);
294
+ await this.assertUnique(data.Login, data.Email);
218
295
  const temporaryPassword = this.PasswordProvider.generate();
219
296
  const { User: created } = await (0, rbac_1.create)(data.Email, data.Login, temporaryPassword, [data.Role], undefined, data.Metadata);
220
297
  // NOTE: create() returns { User, Password } where Password is the plaintext
@@ -225,58 +302,158 @@ let Users = class Users extends http_1.BaseController {
225
302
  /**
226
303
  * Update user (admin)
227
304
  * Partially updates a user account. All fields are optional — only provided fields are changed.
228
- * Metadata is merged: existing keys are updated, new keys are added, unlisted keys are preserved.
305
+ * Metadata is NOT handled here; use the `/user/:uuid/metadata` routes.
229
306
  * @security cookieAuth
230
307
  * @param user User UUID path parameter
231
308
  * @response 200 User updated successfully
232
- * @response 400 Validation error — invalid field format
309
+ * @response 400 Validation error — invalid field format or unknown role
233
310
  * @response 401 Unauthorized — valid session required
234
- * @response 403 Forbidden — updateAny permission required on users resource
311
+ * @response 403 Forbidden — updateAny permission required, or the role change is refused by the role guard
235
312
  * @response 404 User not found
236
313
  * @response 409 Login or email already in use by another account
237
314
  */
238
- async updateUser(user, data) {
315
+ async updateUser(actor, user, data) {
316
+ if (data.Role) {
317
+ const next = [data.Role];
318
+ const added = next.filter((r) => !user.Role.includes(r));
319
+ const removed = user.Role.filter((r) => !next.includes(r));
320
+ // A role list REPLACEMENT is a grant and a revoke at the same time, and
321
+ // both halves have their own rules — dropping the caller's last privileged
322
+ // role through PATCH must fail exactly as `revoke` does.
323
+ await this.RoleGuard.assertCanAssignRoles(actor, user, added);
324
+ for (const role of removed) {
325
+ await this.RoleGuard.assertCanRevokeRole(actor, user, role);
326
+ }
327
+ }
328
+ if ((data.Login && data.Login !== user.Login) || (data.Email && data.Email !== user.Email)) {
329
+ await this.assertUnique(data.Login !== user.Login ? data.Login : undefined, data.Email !== user.Email ? data.Email : undefined, user.Id);
330
+ }
239
331
  user.Login = data.Login ?? user.Login;
240
332
  user.Email = data.Email ?? user.Email;
241
- // TODO
242
- // fix array assign
243
333
  user.Role = data.Role ? [data.Role] : user.Role;
244
- if (data.Metadata) {
245
- for (const key in data.Metadata) {
246
- user.Metadata[key] = data.Metadata[key];
247
- }
248
- }
249
334
  await user.update();
250
- await user.Metadata.update();
251
335
  return new http_1.Ok();
252
336
  }
253
- };
254
- exports.Users = Users;
255
- __decorate([
256
- (0, di_1.Autoinject)(),
257
- __metadata("design:type", rbac_1.PasswordProvider
258
337
  /**
259
- * List users (admin)
260
- * Returns a paginated, sortable, filterable list of all users. Supports optional inclusion
261
- * of related Metadata. The total user count (matching current filters) is returned in the
262
- * X-Total-Count response header.
263
- * Filterable fields: Uuid (eq), Email (eq, like), Login (eq, like), CreatedAt, LastLoginAt,
264
- * DeletedAt (eq, gte, lte, lt, gt, isnull, notnull), IsActive (eq), Role (eq, neq),
265
- * user:niceName metadata (eq, neq, like).
338
+ * Delete user (admin)
339
+ * Soft-deletes the account (`DeletedAt` is stamped, the row is kept) and destroys every
340
+ * session it holds, so a deleted user stops acting immediately rather than when their
341
+ * cookie happens to expire.
266
342
  * @security cookieAuth
267
- * @param pagination.page Page number (zero-based)
268
- * @param pagination.limit Number of users per page (default: 10)
269
- * @param order.column Column to sort by (default: CreatedAt)
270
- * @param order.order Sort direction: ASC or DESC (default: DESC)
271
- * @param include Relations to include — currently supports: Metadata
272
- * @returns {IUserData[]} Paginated list of user accounts, each with optional Metadata relation
343
+ * @param user User UUID path parameter
344
+ * @response 200 User deleted
273
345
  * @response 401 Unauthorized — valid session required
274
- * @response 403 Forbidden — readAny permission required on users resource
346
+ * @response 403 Forbidden — deleteAny permission required, or the deletion is refused by the role guard
347
+ * @response 404 User not found
348
+ */
349
+ async removeUser(actor, user) {
350
+ await this.RoleGuard.assertCanDisableAccount(actor, user, 'delete');
351
+ await (0, rbac_1.deleteUser)(user);
352
+ return new http_1.Ok();
353
+ }
354
+ /**
355
+ * Restore a deleted user (admin)
356
+ * Clears `DeletedAt` on a soft-deleted account. The account keeps its previous
357
+ * `IsActive` state — restoring is not activating.
358
+ * @security cookieAuth
359
+ * @param uuid User UUID path parameter
360
+ * @response 200 User restored
361
+ * @response 400 User is not deleted
362
+ * @response 401 Unauthorized — valid session required
363
+ * @response 403 Forbidden — deleteAny permission required on users resource
364
+ * @response 404 User not found
365
+ */
366
+ async restoreUser(uuid) {
367
+ // Loaded by hand rather than through @FromModel: every model query filters
368
+ // soft-deleted rows out by default, so the one row this route exists for is
369
+ // exactly the row @FromModel can never find.
370
+ const user = await rbac_1.User.query().withDeleted().where('Uuid', uuid).first();
371
+ if (!user) {
372
+ throw new exceptions_1.ResourceNotFound(`User ${uuid} not found`);
373
+ }
374
+ if (!user.DeletedAt) {
375
+ throw new exceptions_1.InvalidArgument(`User ${uuid} is not deleted`);
376
+ }
377
+ await (0, rbac_1._user_update)({ DeletedAt: null })(user);
378
+ return new http_1.Ok();
379
+ }
380
+ /**
381
+ * The requested sort column, or the default. Rejects anything outside
382
+ * {@link SORTABLE_COLUMNS}.
383
+ */
384
+ sortColumn(order) {
385
+ const column = order?.column;
386
+ if (!column) {
387
+ return 'CreatedAt';
388
+ }
389
+ if (!SORTABLE_COLUMNS.includes(column)) {
390
+ throw new exceptions_1.InvalidArgument(`Cannot sort by '${column}'. Sortable columns are: ${SORTABLE_COLUMNS.join(', ')}`);
391
+ }
392
+ return column;
393
+ }
394
+ /**
395
+ * Refuses metadata keys that decide account access.
396
+ *
397
+ * `user:pwd_reset:token` is a bearer credential for the public reset endpoint
398
+ * and `user:2fa:*` is the second factor itself — writing either through a
399
+ * generic key-value merge hands out an account rather than annotating one.
400
+ * Ban and lockout keys are refused for the same reason bans have their own
401
+ * route: written directly they skip the event, the email and the session
402
+ * revocation that make a ban mean something.
403
+ */
404
+ assertNoProtectedMetadata(metadata) {
405
+ if (!metadata) {
406
+ return;
407
+ }
408
+ const offending = Object.keys(metadata).filter((key) => {
409
+ // A glob reaches the metadata relation's setter as a PATTERN and rewrites
410
+ // every matching entry, so `*` alone would overwrite the whole set —
411
+ // including the protected keys listed above.
412
+ if (key.includes('*') || key.includes('?')) {
413
+ return true;
414
+ }
415
+ return rbac_1.USER_SECURITY_METADATA_KEYS.includes(key);
416
+ });
417
+ if (offending.length > 0) {
418
+ throw new exceptions_1.InvalidArgument(`Metadata keys cannot be set through this endpoint: ${offending.join(', ')}`);
419
+ }
420
+ }
421
+ /**
422
+ * Rejects a login / email already taken by another account.
423
+ *
424
+ * Soft-deleted rows are included on purpose: they still occupy the unique
425
+ * indexes, so ignoring them would trade this 409 for a driver error and a 500.
275
426
  */
276
- )
427
+ async assertUnique(login, email, exceptUserId) {
428
+ const clashes = [];
429
+ if (login) {
430
+ const found = await rbac_1.User.query().withDeleted().where('Login', login).first();
431
+ if (found && found.Id !== exceptUserId) {
432
+ clashes.push('Login');
433
+ }
434
+ }
435
+ if (email) {
436
+ const found = await rbac_1.User.query().withDeleted().where('Email', email).first();
437
+ if (found && found.Id !== exceptUserId) {
438
+ clashes.push('Email');
439
+ }
440
+ }
441
+ if (clashes.length > 0) {
442
+ throw new exceptions_1.ResourceDuplicated(`${clashes.join(' and ')} already in use`);
443
+ }
444
+ }
445
+ };
446
+ exports.Users = Users;
447
+ __decorate([
448
+ (0, di_1.Autoinject)(),
449
+ __metadata("design:type", rbac_1.PasswordProvider)
277
450
  ], Users.prototype, "PasswordProvider", void 0);
278
451
  __decorate([
279
- (0, http_1.Get)("/"),
452
+ (0, configuration_1.AutoinjectService)('rbac.admin.roleGuard'),
453
+ __metadata("design:type", interfaces_js_1.RoleGuard)
454
+ ], Users.prototype, "RoleGuard", void 0);
455
+ __decorate([
456
+ (0, http_1.Get)('/'),
280
457
  (0, rbac_http_1.Permission)(['readAny']),
281
458
  __param(0, (0, http_1.Query)()),
282
459
  __param(1, (0, http_1.Query)()),
@@ -294,8 +471,17 @@ __decorate([
294
471
  __metadata("design:returntype", Promise)
295
472
  ], Users.prototype, "list", null);
296
473
  __decorate([
297
- (0, http_1.Get)(":user"),
298
- __param(0, (0, orm_http_1.FromModel)({ queryField: "Uuid" })),
474
+ (0, http_1.Get)('roles'),
475
+ (0, rbac_http_1.Permission)(['readAny']),
476
+ __param(0, (0, rbac_http_1.User)()),
477
+ __metadata("design:type", Function),
478
+ __metadata("design:paramtypes", [rbac_1.User]),
479
+ __metadata("design:returntype", Promise)
480
+ ], Users.prototype, "assignableRoles", null);
481
+ __decorate([
482
+ (0, http_1.Get)(':user'),
483
+ (0, rbac_http_1.Permission)(['readAny']),
484
+ __param(0, (0, orm_http_1.FromModel)({ queryField: 'Uuid' })),
299
485
  __param(1, (0, http_1.Query)({
300
486
  type: 'array',
301
487
  items: {
@@ -308,8 +494,9 @@ __decorate([
308
494
  __metadata("design:returntype", Promise)
309
495
  ], Users.prototype, "getSingleUser", null);
310
496
  __decorate([
311
- (0, http_1.Get)("byLogin/:user"),
312
- __param(0, (0, orm_http_1.FromModel)({ queryField: "Login" })),
497
+ (0, http_1.Get)('byLogin/:user'),
498
+ (0, rbac_http_1.Permission)(['readAny']),
499
+ __param(0, (0, orm_http_1.FromModel)({ queryField: 'Login' })),
313
500
  __param(1, (0, http_1.Query)({
314
501
  type: 'array',
315
502
  items: {
@@ -322,23 +509,41 @@ __decorate([
322
509
  __metadata("design:returntype", Promise)
323
510
  ], Users.prototype, "getByLogin", null);
324
511
  __decorate([
325
- (0, http_1.Post)("/"),
512
+ (0, http_1.Post)('/'),
326
513
  (0, rbac_http_1.Permission)(['createAny']),
327
- __param(0, (0, http_1.Body)()),
514
+ __param(0, (0, rbac_http_1.User)()),
515
+ __param(1, (0, http_1.Body)()),
328
516
  __metadata("design:type", Function),
329
- __metadata("design:paramtypes", [UserDto]),
517
+ __metadata("design:paramtypes", [rbac_1.User, CreateUserDto]),
330
518
  __metadata("design:returntype", Promise)
331
519
  ], Users.prototype, "addUser", null);
332
520
  __decorate([
333
- (0, http_1.Patch)(":user"),
521
+ (0, http_1.Patch)(':user'),
334
522
  (0, rbac_http_1.Permission)(['updateAny']),
335
- __param(0, (0, orm_http_1.FromModel)({ queryField: "Uuid" })),
336
- __param(1, (0, http_1.Body)()),
523
+ __param(0, (0, rbac_http_1.User)()),
524
+ __param(1, (0, orm_http_1.FromModel)({ queryField: 'Uuid', include: ['Metadata'] })),
525
+ __param(2, (0, http_1.Body)()),
337
526
  __metadata("design:type", Function),
338
- __metadata("design:paramtypes", [rbac_1.User,
339
- UserDto]),
527
+ __metadata("design:paramtypes", [rbac_1.User, rbac_1.User, UpdateUserDto]),
340
528
  __metadata("design:returntype", Promise)
341
529
  ], Users.prototype, "updateUser", null);
530
+ __decorate([
531
+ (0, http_1.Del)(':user'),
532
+ (0, rbac_http_1.Permission)(['deleteAny']),
533
+ __param(0, (0, rbac_http_1.User)()),
534
+ __param(1, (0, orm_http_1.FromModel)({ queryField: 'Uuid', include: ['Metadata'] })),
535
+ __metadata("design:type", Function),
536
+ __metadata("design:paramtypes", [rbac_1.User, rbac_1.User]),
537
+ __metadata("design:returntype", Promise)
538
+ ], Users.prototype, "removeUser", null);
539
+ __decorate([
540
+ (0, http_1.Patch)(':uuid/restore'),
541
+ (0, rbac_http_1.Permission)(['deleteAny']),
542
+ __param(0, (0, http_1.Param)()),
543
+ __metadata("design:type", Function),
544
+ __metadata("design:paramtypes", [String]),
545
+ __metadata("design:returntype", Promise)
546
+ ], Users.prototype, "restoreUser", null);
342
547
  exports.Users = Users = __decorate([
343
548
  (0, http_1.BasePath)('users'),
344
549
  (0, http_1.Policy)(rbac_http_1.AuthorizedPolicy),
@@ -1 +1 @@
1
- {"version":3,"file":"Users.js","sourceRoot":"","sources":["../../../../src/controllers/Users/Users.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Users.js","sourceRoot":"","sources":["../../../../src/controllers/Users/Users.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,7 @@
1
- export * from "./controllers/Users/Users.js";
1
+ export * from './interfaces.js';
2
+ export * from './services/RoleGuard.js';
3
+ export * from './controllers/Users/Users.js';
4
+ export * from './controllers/Users/Roles.js';
5
+ export * from './controllers/Users/Security.js';
6
+ export * from './controllers/Users/Profile.js';
2
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AAExC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC"}
package/lib/cjs/index.js CHANGED
@@ -14,5 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./interfaces.js"), exports);
18
+ __exportStar(require("./services/RoleGuard.js"), exports);
17
19
  __exportStar(require("./controllers/Users/Users.js"), exports);
20
+ __exportStar(require("./controllers/Users/Roles.js"), exports);
21
+ __exportStar(require("./controllers/Users/Security.js"), exports);
22
+ __exportStar(require("./controllers/Users/Profile.js"), exports);
18
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,0DAAwC;AAExC,+DAA6C;AAC7C,+DAA6C;AAC7C,kEAAgD;AAChD,iEAA+C"}
@@ -0,0 +1,81 @@
1
+ import { User } from '@spinajs/rbac';
2
+ /**
3
+ * What an administrator is allowed to do to roles and to accounts, read from
4
+ * `rbac.admin.roleGuard`.
5
+ *
6
+ * Every check is switchable because the right answer is deployment-specific: a
7
+ * single-tenant back office with two trusted operators wants none of this, a
8
+ * multi-tenant one wants all of it. The shipped defaults are the strict end —
9
+ * an application that needs less has to say so explicitly.
10
+ */
11
+ export interface IRoleGuardConfig {
12
+ /** Registered name of the {@link RoleGuard} implementation to use. */
13
+ service: string;
14
+ /** Reject role names that are not declared in `rbac.grants` / `rbac.roles`. */
15
+ requireKnownRole: boolean;
16
+ /** Refuse to grant or revoke `rbac.systemRole` over HTTP, whoever is asking. */
17
+ protectSystemRole: boolean;
18
+ /**
19
+ * Refuse to grant a role whose resolved grants are not a subset of the
20
+ * caller's own. Without this, `updateAny` on `users` is a path to every other
21
+ * permission in the system — an administrator simply grants themselves more.
22
+ */
23
+ preventEscalation: boolean;
24
+ /**
25
+ * Refuse operations that would strip the CALLER of their own privileged role
26
+ * or of their own account ( self-deactivation, self-deletion, self-ban ).
27
+ */
28
+ preventSelfLockout: boolean;
29
+ /**
30
+ * Refuse operations that would leave zero usable accounts holding a
31
+ * privileged role — the "locked out of your own installation" case.
32
+ */
33
+ preventLastPrivilegedRemoval: boolean;
34
+ /**
35
+ * Resource + action that make a role "privileged" for the two guards above.
36
+ * Action is written in accesscontrol grant notation, as it appears in
37
+ * `rbac.grants` ( `update:any`, not `updateAny` ).
38
+ */
39
+ privilegedResource: string;
40
+ privilegedAction: string;
41
+ }
42
+ /**
43
+ * Role and account-state guard for the admin API.
44
+ *
45
+ * The checks live here rather than in the controllers because the same rule has
46
+ * to hold on every path that can change what an account may do: granting a role,
47
+ * revoking one, rewriting the whole role list through `PATCH /users/:uuid`, and
48
+ * taking an account out of service. A rule implemented per-controller is a rule
49
+ * that will be missing from the next controller.
50
+ *
51
+ * All methods THROW on refusal ( `Forbidden` / `InvalidArgument`, which the http
52
+ * error map turns into 403 / 400 ) and return normally when the operation is
53
+ * allowed.
54
+ */
55
+ export declare abstract class RoleGuard {
56
+ /**
57
+ * May `actor` put `roles` on `target`?
58
+ *
59
+ * @param actor - the authenticated administrator making the request
60
+ * @param target - the account being changed, or null when it does not exist yet ( creation )
61
+ * @param roles - roles that would be assigned
62
+ */
63
+ abstract assertCanAssignRoles(actor: User, target: User | null, roles: string[]): Promise<void>;
64
+ /**
65
+ * May `actor` take `role` away from `target`?
66
+ */
67
+ abstract assertCanRevokeRole(actor: User, target: User, role: string): Promise<void>;
68
+ /**
69
+ * May `actor` take `target` out of service ( deactivate / delete / ban )?
70
+ */
71
+ abstract assertCanDisableAccount(actor: User, target: User, action: AccountDisableAction): Promise<void>;
72
+ /**
73
+ * Roles `actor` is allowed to hand out, for populating an admin UI. Returning
74
+ * this rather than the full role list keeps the UI from offering an operation
75
+ * the guard will refuse.
76
+ */
77
+ abstract assignableRoles(actor: User): string[];
78
+ }
79
+ /** Operations that end an account's ability to act. */
80
+ export type AccountDisableAction = 'deactivate' | 'delete' | 'ban';
81
+ //# sourceMappingURL=interfaces.d.ts.map