@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
@@ -10,13 +10,17 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
- import { BaseController, BasePath, Body, Get, Ok, Patch, Policy } from '@spinajs/http';
13
+ import { AutoinjectService } from '@spinajs/configuration';
14
+ import { BaseController, BasePath, Body, Del, Get, NotFound, Ok, Param, Patch, Policy, Post } from '@spinajs/http';
15
+ import { activate, ban, changePassword, deactivate, expirePassword, hashSessionId, passwordChangeRequest, SessionProvider, unban, User, USER_COMMON_METADATA } from '@spinajs/rbac';
16
+ import { AuthorizedPolicy, Permission, Resource, User as CurrentUser } from '@spinajs/rbac-http';
14
17
  import { FromModel } from '@spinajs/orm-http';
15
- import { activate, changePassword, deactivate, SessionProvider, User } from '@spinajs/rbac';
16
- import { AuthorizedPolicy, Permission, Resource } from "@spinajs/rbac-http";
17
18
  import { Schema } from '@spinajs/validation';
18
- import { resetUser2Fa } from '@spinajs/rbac-http-user';
19
- import { Autoinject } from '@spinajs/di';
19
+ import { disableUser2Fa, enableUser2Fa, resetUser2Fa } from '@spinajs/rbac-http-user';
20
+ import { Log, Logger } from '@spinajs/log';
21
+ import { RoleGuard } from '../../interfaces.js';
22
+ // Side effect only — see the note in Users.ts.
23
+ import '../../services/RoleGuard.js';
20
24
  let ChangePasswordDto = class ChangePasswordDto {
21
25
  constructor(data) {
22
26
  Object.assign(this, data);
@@ -36,30 +40,53 @@ ChangePasswordDto = __decorate([
36
40
  if: {
37
41
  properties: {
38
42
  password: { type: 'string' },
39
- confirmPassword: { type: 'string' }
40
- }
43
+ confirmPassword: { type: 'string' },
44
+ },
41
45
  },
42
46
  then: {
43
47
  properties: {
44
- confirmPassword: { const: { $data: '1/password' } }
45
- }
46
- }
47
- }
48
- ]
48
+ confirmPassword: { const: { $data: '1/password' } },
49
+ },
50
+ },
51
+ },
52
+ ],
49
53
  }),
50
54
  __metadata("design:paramtypes", [Object])
51
55
  ], ChangePasswordDto);
56
+ export { ChangePasswordDto };
57
+ let BanUserDto = class BanUserDto {
58
+ constructor(data) {
59
+ Object.assign(this, data);
60
+ }
61
+ };
62
+ BanUserDto = __decorate([
63
+ Schema({
64
+ type: 'object',
65
+ $id: 'arrow.common.banUserDTO',
66
+ properties: {
67
+ reason: { type: 'string', maxLength: 255, description: 'Why the account is banned. Stored in user metadata.' },
68
+ duration: { type: 'number', minimum: 1, description: 'Ban duration in seconds. Defaults to 24h.' },
69
+ },
70
+ }),
71
+ __metadata("design:paramtypes", [Object])
72
+ ], BanUserDto);
73
+ export { BanUserDto };
52
74
  /**
53
75
  * User account security management (admin).
54
- * Administrative controls for user account security: password changes, 2FA reset,
55
- * account activation/deactivation, and forced session logout.
76
+ * Administrative controls for user account security: passwords, 2FA, account
77
+ * activation, bans, login lockouts and live sessions.
78
+ *
79
+ * Every route that takes an account out of service goes through the configured
80
+ * {@link RoleGuard} first — an administrator must not be able to lock themselves,
81
+ * or the installation, out through this API.
56
82
  * @tags Admin Users
57
83
  */
58
84
  let Security = class Security extends BaseController {
59
85
  /**
60
86
  * Change user password (admin)
61
87
  * Sets a new password for the specified user. Both password and confirmPassword must match.
62
- * Minimum length is 8 characters.
88
+ * Minimum length is 8 characters. Every session of that user is destroyed — the credential
89
+ * they were opened with no longer exists.
63
90
  * @security cookieAuth
64
91
  * @param user User UUID path parameter
65
92
  * @response 200 Password changed successfully
@@ -72,6 +99,40 @@ let Security = class Security extends BaseController {
72
99
  await changePassword(dto.password)(user);
73
100
  return new Ok();
74
101
  }
102
+ /**
103
+ * Send a password reset link (admin)
104
+ * Issues a single-use reset token into the user's metadata and emits
105
+ * `UserPasswordChangeRequest` so the application can deliver it. The token itself is never
106
+ * returned. This is how a freshly created account is handed over to its owner — the
107
+ * temporary password generated at creation is deliberately discarded.
108
+ * @security cookieAuth
109
+ * @param user User UUID path parameter
110
+ * @response 200 Reset token issued
111
+ * @response 401 Unauthorized — valid session required
112
+ * @response 403 Forbidden — updateAny permission required on users resource
113
+ * @response 404 User not found
114
+ */
115
+ async requestPasswordReset(user) {
116
+ await passwordChangeRequest(user);
117
+ return new Ok();
118
+ }
119
+ /**
120
+ * Expire a user password (admin)
121
+ * Marks the password as expired, which deactivates the account until a new one is set.
122
+ * @security cookieAuth
123
+ * @param user User UUID path parameter
124
+ * @response 200 Password expired
125
+ * @response 401 Unauthorized — valid session required
126
+ * @response 403 Forbidden — deleteAny permission required, or refused by the role guard
127
+ * @response 404 User not found
128
+ */
129
+ async expireUserPassword(actor, user) {
130
+ // Expiry deactivates the account, so it is guarded like every other way
131
+ // of taking an account out of service.
132
+ await this.RoleGuard.assertCanDisableAccount(actor, user, 'deactivate');
133
+ await expirePassword(user);
134
+ return new Ok();
135
+ }
75
136
  /**
76
137
  * Reset user two-factor authentication (admin)
77
138
  * Clears the TOTP secret and disables 2FA for the specified user.
@@ -87,17 +148,48 @@ let Security = class Security extends BaseController {
87
148
  await resetUser2Fa(user);
88
149
  return new Ok();
89
150
  }
151
+ /**
152
+ * Enable two-factor authentication for a user (admin)
153
+ * Initializes a TOTP secret for the account. Returns whatever the configured
154
+ * two-factor provider produces for enrolment (an otpauth url for the default provider) —
155
+ * deliver it to the user over a channel you trust.
156
+ * @security cookieAuth
157
+ * @param user User UUID path parameter
158
+ * @response 200 2FA enabled
159
+ * @response 401 Unauthorized — valid session required
160
+ * @response 403 Forbidden — updateAny permission required on users resource
161
+ * @response 404 User not found
162
+ */
163
+ async enable2Fa(user) {
164
+ return new Ok(await enableUser2Fa(user));
165
+ }
166
+ /**
167
+ * Disable two-factor authentication for a user (admin)
168
+ * Removes the TOTP secret and turns the second factor off for the account.
169
+ * @security cookieAuth
170
+ * @param user User UUID path parameter
171
+ * @response 200 2FA disabled
172
+ * @response 401 Unauthorized — valid session required
173
+ * @response 403 Forbidden — updateAny permission required on users resource
174
+ * @response 404 User not found
175
+ */
176
+ async disable2Fa(user) {
177
+ await disableUser2Fa(user);
178
+ return new Ok();
179
+ }
90
180
  /**
91
181
  * Deactivate user account (admin)
92
- * Marks the user account as inactive, preventing login without deleting the record.
182
+ * Marks the user account as inactive and destroys its sessions, preventing login without
183
+ * deleting the record.
93
184
  * @security cookieAuth
94
185
  * @param user User UUID path parameter
95
186
  * @response 200 Account deactivated successfully
96
187
  * @response 401 Unauthorized — valid session required
97
- * @response 403 Forbidden — deleteAny permission required on users resource
188
+ * @response 403 Forbidden — deleteAny permission required, or refused by the role guard
98
189
  * @response 404 User not found
99
190
  */
100
- async deactivateUser(user) {
191
+ async deactivateUser(actor, user) {
192
+ await this.RoleGuard.assertCanDisableAccount(actor, user, 'deactivate');
101
193
  await deactivate(user);
102
194
  return new Ok();
103
195
  }
@@ -108,13 +200,101 @@ let Security = class Security extends BaseController {
108
200
  * @param user User UUID path parameter
109
201
  * @response 200 Account activated successfully
110
202
  * @response 401 Unauthorized — valid session required
111
- * @response 403 Forbidden — deleteAny permission required on users resource
203
+ * @response 403 Forbidden — updateAny permission required on users resource
112
204
  * @response 404 User not found
113
205
  */
114
206
  async activateUser(user) {
115
207
  await activate(user);
116
208
  return new Ok();
117
209
  }
210
+ /**
211
+ * Ban a user (admin)
212
+ * Bans the account for `duration` seconds (24h when omitted), records the reason, and
213
+ * destroys every session it holds.
214
+ * @security cookieAuth
215
+ * @param user User UUID path parameter
216
+ * @response 200 Account banned
217
+ * @response 400 Account is already banned
218
+ * @response 401 Unauthorized — valid session required
219
+ * @response 403 Forbidden — deleteAny permission required, or refused by the role guard
220
+ * @response 404 User not found
221
+ */
222
+ async banUser(actor, user, dto) {
223
+ await this.RoleGuard.assertCanDisableAccount(actor, user, 'ban');
224
+ await ban(user, dto?.reason, dto?.duration);
225
+ return new Ok();
226
+ }
227
+ /**
228
+ * Unban a user (admin)
229
+ * Clears the ban metadata from the account.
230
+ * @security cookieAuth
231
+ * @param user User UUID path parameter
232
+ * @response 200 Account unbanned
233
+ * @response 400 Account is not banned
234
+ * @response 401 Unauthorized — valid session required
235
+ * @response 403 Forbidden — updateAny permission required on users resource
236
+ * @response 404 User not found
237
+ */
238
+ async unbanUser(user) {
239
+ await unban(user);
240
+ return new Ok();
241
+ }
242
+ /**
243
+ * Clear a login lockout (admin)
244
+ * Removes the failed-attempt counter and the lockout window opened by the login throttle,
245
+ * letting the user try again immediately. Without this the only remedy is waiting out
246
+ * `rbac.password.lockoutTime`.
247
+ * @security cookieAuth
248
+ * @param user User UUID path parameter
249
+ * @response 200 Lockout cleared
250
+ * @response 401 Unauthorized — valid session required
251
+ * @response 403 Forbidden — updateAny permission required on users resource
252
+ * @response 404 User not found
253
+ */
254
+ async unlockUser(user) {
255
+ await user.Metadata.delete(USER_COMMON_METADATA.USER_LOGIN_ATTEMPTS);
256
+ await user.Metadata.delete(USER_COMMON_METADATA.USER_LOGIN_LOCKED_UNTIL);
257
+ this.Log.info(`Login lockout cleared`, { User: user.Uuid });
258
+ return new Ok();
259
+ }
260
+ /**
261
+ * List sessions of a user (admin)
262
+ * Returns every live session of the account, newest first, identified by an opaque handle.
263
+ * @security cookieAuth
264
+ * @param user User UUID path parameter
265
+ * @returns {IAdminSessionEntry[]} Live sessions of the user
266
+ * @response 401 Unauthorized — valid session required
267
+ * @response 403 Forbidden — readAny permission required on users resource
268
+ * @response 404 User not found
269
+ */
270
+ async listSessions(user) {
271
+ const sessions = await this.SessionProvider.listByUser(user.Id);
272
+ const entries = sessions.map((s) => this.toEntry(s)).sort((a, b) => (a.Created < b.Created ? 1 : -1));
273
+ return new Ok(entries, { Headers: [{ Name: 'Cache-Control', Value: 'no-store' }] });
274
+ }
275
+ /**
276
+ * Revoke one session of a user (admin)
277
+ * Ends a single session, addressed by the handle returned from the listing.
278
+ * @security cookieAuth
279
+ * @param user User UUID path parameter
280
+ * @param handle Session handle as returned by `GET /users/security/sessions/:user`
281
+ * @response 200 Session revoked
282
+ * @response 401 Unauthorized — valid session required
283
+ * @response 403 Forbidden — updateAny permission required on users resource
284
+ * @response 404 No such session for this user
285
+ */
286
+ async revokeSession(user, handle) {
287
+ // Resolved through THIS user's session list, so a handle belonging to
288
+ // somebody else cannot be revoked through their uuid.
289
+ const sessions = await this.SessionProvider.listByUser(user.Id);
290
+ const match = sessions.find((s) => hashSessionId(s.SessionId) === handle);
291
+ if (!match) {
292
+ return new NotFound({ error: { code: 'E_SESSION_NOT_FOUND', message: 'No such session' } });
293
+ }
294
+ await this.SessionProvider.delete(match.SessionId);
295
+ this.Log.info(`Session revoked by administrator`, { Session: handle, User: user.Uuid });
296
+ return new Ok(null, { Headers: [{ Name: 'Cache-Control', Value: 'no-store' }] });
297
+ }
118
298
  /**
119
299
  * Force logout user (admin)
120
300
  * Invalidates all active sessions for the specified user, immediately ending any current logins.
@@ -127,50 +307,143 @@ let Security = class Security extends BaseController {
127
307
  */
128
308
  async logoutUser(user) {
129
309
  await this.SessionProvider.deleteByUser(user.Id);
130
- return new Ok();
310
+ this.Log.info(`All sessions revoked by administrator`, { User: user.Uuid });
311
+ return new Ok(null, { Headers: [{ Name: 'Cache-Control', Value: 'no-store' }] });
312
+ }
313
+ toEntry(session) {
314
+ return {
315
+ Handle: hashSessionId(session.SessionId),
316
+ Created: session.Creation?.toISO() ?? '',
317
+ Expires: session.Expiration?.toISO() ?? null,
318
+ };
131
319
  }
132
320
  };
133
321
  __decorate([
134
- Autoinject(SessionProvider),
322
+ Logger('rbac-admin'),
323
+ __metadata("design:type", Log)
324
+ ], Security.prototype, "Log", void 0);
325
+ __decorate([
326
+ AutoinjectService('rbac.session'),
135
327
  __metadata("design:type", SessionProvider)
136
328
  ], Security.prototype, "SessionProvider", void 0);
329
+ __decorate([
330
+ AutoinjectService('rbac.admin.roleGuard'),
331
+ __metadata("design:type", RoleGuard)
332
+ ], Security.prototype, "RoleGuard", void 0);
137
333
  __decorate([
138
334
  Patch('changePassword/:user'),
139
335
  Permission(['updateAny']),
140
- __param(0, FromModel({ queryField: "Uuid" })),
336
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
141
337
  __param(1, Body()),
142
338
  __metadata("design:type", Function),
143
339
  __metadata("design:paramtypes", [User, ChangePasswordDto]),
144
340
  __metadata("design:returntype", Promise)
145
341
  ], Security.prototype, "changeUserPassword", null);
342
+ __decorate([
343
+ Post('password-reset-request/:user'),
344
+ Permission(['updateAny']),
345
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
346
+ __metadata("design:type", Function),
347
+ __metadata("design:paramtypes", [User]),
348
+ __metadata("design:returntype", Promise)
349
+ ], Security.prototype, "requestPasswordReset", null);
350
+ __decorate([
351
+ Post('expire-password/:user'),
352
+ Permission(['deleteAny']),
353
+ __param(0, CurrentUser()),
354
+ __param(1, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
355
+ __metadata("design:type", Function),
356
+ __metadata("design:paramtypes", [User, User]),
357
+ __metadata("design:returntype", Promise)
358
+ ], Security.prototype, "expireUserPassword", null);
146
359
  __decorate([
147
360
  Patch('reset2fa/:user'),
148
361
  Permission(['updateAny']),
149
- __param(0, FromModel({ queryField: "Uuid" })),
362
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
150
363
  __metadata("design:type", Function),
151
364
  __metadata("design:paramtypes", [User]),
152
365
  __metadata("design:returntype", Promise)
153
366
  ], Security.prototype, "reset2faToken", null);
154
367
  __decorate([
155
- Get('deactivate/:user'),
156
- Permission(['deleteAny']),
157
- __param(0, FromModel({ queryField: "Uuid" })),
368
+ Post('2fa/enable/:user'),
369
+ Permission(['updateAny']),
370
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
158
371
  __metadata("design:type", Function),
159
372
  __metadata("design:paramtypes", [User]),
160
373
  __metadata("design:returntype", Promise)
161
- ], Security.prototype, "deactivateUser", null);
374
+ ], Security.prototype, "enable2Fa", null);
162
375
  __decorate([
163
- Get('activate/:user'),
376
+ Post('2fa/disable/:user'),
377
+ Permission(['updateAny']),
378
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
379
+ __metadata("design:type", Function),
380
+ __metadata("design:paramtypes", [User]),
381
+ __metadata("design:returntype", Promise)
382
+ ], Security.prototype, "disable2Fa", null);
383
+ __decorate([
384
+ Post('deactivate/:user'),
164
385
  Permission(['deleteAny']),
165
- __param(0, FromModel({ queryField: "Uuid" })),
386
+ __param(0, CurrentUser()),
387
+ __param(1, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
388
+ __metadata("design:type", Function),
389
+ __metadata("design:paramtypes", [User, User]),
390
+ __metadata("design:returntype", Promise)
391
+ ], Security.prototype, "deactivateUser", null);
392
+ __decorate([
393
+ Post('activate/:user'),
394
+ Permission(['updateAny']),
395
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
166
396
  __metadata("design:type", Function),
167
397
  __metadata("design:paramtypes", [User]),
168
398
  __metadata("design:returntype", Promise)
169
399
  ], Security.prototype, "activateUser", null);
170
400
  __decorate([
171
- Get('logout/:user'),
401
+ Post('ban/:user'),
402
+ Permission(['deleteAny']),
403
+ __param(0, CurrentUser()),
404
+ __param(1, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
405
+ __param(2, Body()),
406
+ __metadata("design:type", Function),
407
+ __metadata("design:paramtypes", [User, User, BanUserDto]),
408
+ __metadata("design:returntype", Promise)
409
+ ], Security.prototype, "banUser", null);
410
+ __decorate([
411
+ Post('unban/:user'),
412
+ Permission(['updateAny']),
413
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
414
+ __metadata("design:type", Function),
415
+ __metadata("design:paramtypes", [User]),
416
+ __metadata("design:returntype", Promise)
417
+ ], Security.prototype, "unbanUser", null);
418
+ __decorate([
419
+ Post('unlock/:user'),
420
+ Permission(['updateAny']),
421
+ __param(0, FromModel({ queryField: 'Uuid', include: ['Metadata'] })),
422
+ __metadata("design:type", Function),
423
+ __metadata("design:paramtypes", [User]),
424
+ __metadata("design:returntype", Promise)
425
+ ], Security.prototype, "unlockUser", null);
426
+ __decorate([
427
+ Get('sessions/:user'),
428
+ Permission(['readAny']),
429
+ __param(0, FromModel({ queryField: 'Uuid' })),
430
+ __metadata("design:type", Function),
431
+ __metadata("design:paramtypes", [User]),
432
+ __metadata("design:returntype", Promise)
433
+ ], Security.prototype, "listSessions", null);
434
+ __decorate([
435
+ Del('sessions/:user/:handle'),
436
+ Permission(['updateAny']),
437
+ __param(0, FromModel({ queryField: 'Uuid' })),
438
+ __param(1, Param()),
439
+ __metadata("design:type", Function),
440
+ __metadata("design:paramtypes", [User, String]),
441
+ __metadata("design:returntype", Promise)
442
+ ], Security.prototype, "revokeSession", null);
443
+ __decorate([
444
+ Del('sessions/:user'),
172
445
  Permission(['updateAny']),
173
- __param(0, FromModel({ queryField: "Uuid" })),
446
+ __param(0, FromModel({ queryField: 'Uuid' })),
174
447
  __metadata("design:type", Function),
175
448
  __metadata("design:paramtypes", [User]),
176
449
  __metadata("design:returntype", Promise)
@@ -1 +1 @@
1
- {"version":3,"file":"Security.js","sourceRoot":"","sources":["../../../../src/controllers/Users/Security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Security.js","sourceRoot":"","sources":["../../../../src/controllers/Users/Security.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,32 @@
1
1
  import { BaseController, Ok } from '@spinajs/http';
2
2
  import { IFilterRequest, OrderDTO, PaginationDTO } from '@spinajs/orm-http';
3
3
  import { PasswordProvider, User } from '@spinajs/rbac';
4
- declare class UserDto {
4
+ import { RoleGuard } from '../../interfaces.js';
5
+ import '../../services/RoleGuard.js';
6
+ export declare class CreateUserDto {
5
7
  Login: string;
6
8
  Email: string;
7
9
  Role: string;
8
10
  Metadata?: {
9
11
  [key: string]: any;
10
12
  };
11
- constructor(data: Partial<UserDto>);
13
+ constructor(data: Partial<CreateUserDto>);
14
+ }
15
+ /**
16
+ * PATCH body. Separate from {@link CreateUserDto} because the two have opposite
17
+ * requirements: creation needs all three fields, an update needs none of them.
18
+ * Sharing one schema made every documented partial update fail validation with
19
+ * a 400 before the handler ever ran.
20
+ *
21
+ * Metadata is deliberately absent — it is managed through the dedicated
22
+ * `/user/:uuid/metadata` routes, which validate one entry at a time and can
23
+ * refuse the keys that decide account access.
24
+ */
25
+ export declare class UpdateUserDto {
26
+ Login?: string;
27
+ Email?: string;
28
+ Role?: string;
29
+ constructor(data: Partial<UpdateUserDto>);
12
30
  }
13
31
  /**
14
32
  * User account management (admin).
@@ -18,6 +36,7 @@ declare class UserDto {
18
36
  */
19
37
  export declare class Users extends BaseController {
20
38
  protected PasswordProvider: PasswordProvider;
39
+ protected RoleGuard: RoleGuard;
21
40
  /**
22
41
  * List users (admin)
23
42
  * Returns a paginated, sortable, filterable list of all users. Supports optional inclusion
@@ -28,15 +47,27 @@ export declare class Users extends BaseController {
28
47
  * user:niceName metadata (eq, neq, like).
29
48
  * @security cookieAuth
30
49
  * @param pagination.page Page number (zero-based)
31
- * @param pagination.limit Number of users per page (default: 10)
32
- * @param order.column Column to sort by (default: CreatedAt)
50
+ * @param pagination.limit Number of users per page (default: 10, max: 100)
51
+ * @param order.column Column to sort by (default: CreatedAt). One of Uuid, Login, Email, Role, IsActive, CreatedAt, LastLoginAt, DeletedAt
33
52
  * @param order.order Sort direction: ASC or DESC (default: DESC)
34
53
  * @param include Relations to include — currently supports: Metadata
35
54
  * @returns {IUserData[]} Paginated list of user accounts, each with optional Metadata relation
55
+ * @response 400 Sort column is not sortable
36
56
  * @response 401 Unauthorized — valid session required
37
57
  * @response 403 Forbidden — readAny permission required on users resource
38
58
  */
39
59
  list(pagination?: PaginationDTO, order?: OrderDTO, include?: string[], filter?: IFilterRequest): Promise<Ok<import("@spinajs/orm").ModelDataWithRelationData<User>[]>>;
60
+ /**
61
+ * List assignable roles (admin)
62
+ * Returns the roles the calling administrator is allowed to grant, as decided by the
63
+ * configured role guard — the system role and anything granting more than the caller
64
+ * holds are left out, so a UI cannot offer an operation the guard will refuse.
65
+ * @security cookieAuth
66
+ * @returns {string[]} Role names the caller may assign
67
+ * @response 401 Unauthorized — valid session required
68
+ * @response 403 Forbidden — readAny permission required on users resource
69
+ */
70
+ assignableRoles(actor: User): Promise<Ok<string[]>>;
40
71
  /**
41
72
  * Get user by UUID (admin)
42
73
  * Retrieves a single user record by UUID. Supports optional inclusion of related Metadata.
@@ -63,30 +94,82 @@ export declare class Users extends BaseController {
63
94
  getByLogin(user: User, include?: string[]): Promise<Ok<import("@spinajs/orm").ModelDataWithRelationData<User>>>;
64
95
  /**
65
96
  * Create user (admin)
66
- * Creates a new user account with a system-generated temporary password.
67
- * The temporary password is not returned — it should be delivered to the user via email or other channel.
97
+ * Creates a new user account with a system-generated temporary password. The account is
98
+ * created inactive and the temporary password is never returned — issue a reset link with
99
+ * `POST /users/security/password-reset-request/:user` and activate the account once the
100
+ * user has set their own password.
68
101
  * @security cookieAuth
69
102
  * @returns {IUserData} Created user account
70
- * @response 400 Validation error — missing required fields or invalid format
103
+ * @response 400 Validation error — missing required fields, invalid format, unknown role or a protected metadata key
71
104
  * @response 401 Unauthorized — valid session required
72
- * @response 403 Forbidden — createAny permission required on users resource
105
+ * @response 403 Forbidden — createAny permission required, or the requested role grants more than the caller holds
73
106
  * @response 409 Login or email already in use
74
107
  */
75
- addUser(data: UserDto): Promise<Ok<import("@spinajs/orm").ModelDataWithRelationData<User>>>;
108
+ addUser(actor: User, data: CreateUserDto): Promise<Ok<import("@spinajs/orm").ModelDataWithRelationData<User>>>;
76
109
  /**
77
110
  * Update user (admin)
78
111
  * Partially updates a user account. All fields are optional — only provided fields are changed.
79
- * Metadata is merged: existing keys are updated, new keys are added, unlisted keys are preserved.
112
+ * Metadata is NOT handled here; use the `/user/:uuid/metadata` routes.
80
113
  * @security cookieAuth
81
114
  * @param user User UUID path parameter
82
115
  * @response 200 User updated successfully
83
- * @response 400 Validation error — invalid field format
116
+ * @response 400 Validation error — invalid field format or unknown role
84
117
  * @response 401 Unauthorized — valid session required
85
- * @response 403 Forbidden — updateAny permission required on users resource
118
+ * @response 403 Forbidden — updateAny permission required, or the role change is refused by the role guard
86
119
  * @response 404 User not found
87
120
  * @response 409 Login or email already in use by another account
88
121
  */
89
- updateUser(user: User, data: UserDto): Promise<Ok<any>>;
122
+ updateUser(actor: User, user: User, data: UpdateUserDto): Promise<Ok<any>>;
123
+ /**
124
+ * Delete user (admin)
125
+ * Soft-deletes the account (`DeletedAt` is stamped, the row is kept) and destroys every
126
+ * session it holds, so a deleted user stops acting immediately rather than when their
127
+ * cookie happens to expire.
128
+ * @security cookieAuth
129
+ * @param user User UUID path parameter
130
+ * @response 200 User deleted
131
+ * @response 401 Unauthorized — valid session required
132
+ * @response 403 Forbidden — deleteAny permission required, or the deletion is refused by the role guard
133
+ * @response 404 User not found
134
+ */
135
+ removeUser(actor: User, user: User): Promise<Ok<any>>;
136
+ /**
137
+ * Restore a deleted user (admin)
138
+ * Clears `DeletedAt` on a soft-deleted account. The account keeps its previous
139
+ * `IsActive` state — restoring is not activating.
140
+ * @security cookieAuth
141
+ * @param uuid User UUID path parameter
142
+ * @response 200 User restored
143
+ * @response 400 User is not deleted
144
+ * @response 401 Unauthorized — valid session required
145
+ * @response 403 Forbidden — deleteAny permission required on users resource
146
+ * @response 404 User not found
147
+ */
148
+ restoreUser(uuid: string): Promise<Ok<any>>;
149
+ /**
150
+ * The requested sort column, or the default. Rejects anything outside
151
+ * {@link SORTABLE_COLUMNS}.
152
+ */
153
+ protected sortColumn(order?: OrderDTO): string;
154
+ /**
155
+ * Refuses metadata keys that decide account access.
156
+ *
157
+ * `user:pwd_reset:token` is a bearer credential for the public reset endpoint
158
+ * and `user:2fa:*` is the second factor itself — writing either through a
159
+ * generic key-value merge hands out an account rather than annotating one.
160
+ * Ban and lockout keys are refused for the same reason bans have their own
161
+ * route: written directly they skip the event, the email and the session
162
+ * revocation that make a ban mean something.
163
+ */
164
+ protected assertNoProtectedMetadata(metadata?: {
165
+ [key: string]: any;
166
+ }): void;
167
+ /**
168
+ * Rejects a login / email already taken by another account.
169
+ *
170
+ * Soft-deleted rows are included on purpose: they still occupy the unique
171
+ * indexes, so ignoring them would trade this 409 for a driver error and a 500.
172
+ */
173
+ protected assertUnique(login?: string, email?: string, exceptUserId?: number): Promise<void>;
90
174
  }
91
- export {};
92
175
  //# sourceMappingURL=Users.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Users.d.ts","sourceRoot":"","sources":["../../../../src/controllers/Users/Users.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAuB,EAAE,EAA8B,MAAM,eAAe,CAAC;AAEpG,OAAO,EAAyD,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnI,OAAO,EAAU,gBAAgB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI/D,cAoBM,OAAO;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;gBAE7B,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC;CAGnC;AA4ED;;;;;GAKG;AACH,qBAGa,KAAM,SAAQ,cAAc;IAGvC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAA;IAE5C;;;;;;;;;;;;;;;;;OAiBG;IAGU,IAAI,CACN,UAAU,CAAC,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,QAAQ,EAQzB,OAAO,CAAC,EAAE,MAAM,EAAE,EAElB,MAAM,CAAC,EAAE,cAAc;IAqCzB;;;;;;;;;;OAUG;IAEU,aAAa,CAAoC,IAAI,EAAE,IAAI,EAOxE,OAAO,CAAC,EAAE,MAAM,EAAE;IAMlB;;;;;;;;;;OAUG;IAEU,UAAU,CAAqC,IAAI,EAAE,IAAI,EAOtE,OAAO,CAAC,EAAE,MAAM,EAAE;IAOlB;;;;;;;;;;OAUG;IAGU,OAAO,CACV,IAAI,EAAE,OAAO;IAavB;;;;;;;;;;;;OAYG;IAGU,UAAU,CACc,IAAI,EAAE,IAAI,EACrC,IAAI,EAAE,OAAO;CAuBxB"}
1
+ {"version":3,"file":"Users.d.ts","sourceRoot":"","sources":["../../../../src/controllers/Users/Users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAA4B,EAAE,EAAqC,MAAM,eAAe,CAAC;AAGhH,OAAO,EAAyD,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnI,OAAO,EAAsB,gBAAgB,EAAE,IAAI,EAA6C,MAAM,eAAe,CAAC;AAItH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOhD,OAAO,6BAA6B,CAAC;AAqBrC,qBAgBa,aAAa;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;gBAE7B,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC;CAGzC;AAED;;;;;;;;;GASG;AACH,qBAUa,aAAa;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;gBAET,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC;CAGzC;AA2ED;;;;;GAKG;AACH,qBAGa,KAAM,SAAQ,cAAc;IAEvC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAG7C,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;IAE/B;;;;;;;;;;;;;;;;;;OAkBG;IAGU,IAAI,CACN,UAAU,CAAC,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,QAAQ,EAQzB,OAAO,CAAC,EAAE,MAAM,EAAE,EAElB,MAAM,CAAC,EAAE,cAAc;IAgDzB;;;;;;;;;OASG;IAGU,eAAe,CAAgB,KAAK,EAAE,IAAI;IAIvD;;;;;;;;;;OAUG;IAGU,aAAa,CACW,IAAI,EAAE,IAAI,EAQ7C,OAAO,CAAC,EAAE,MAAM,EAAE;IAOpB;;;;;;;;;;OAUG;IAGU,UAAU,CACe,IAAI,EAAE,IAAI,EAQ9C,OAAO,CAAC,EAAE,MAAM,EAAE;IAOpB;;;;;;;;;;;;OAYG;IAGU,OAAO,CAAgB,KAAK,EAAE,IAAI,EAAU,IAAI,EAAE,aAAa;IAc5E;;;;;;;;;;;;OAYG;IAGU,UAAU,CAAgB,KAAK,EAAE,IAAI,EAA4D,IAAI,EAAE,IAAI,EAAU,IAAI,EAAE,aAAa;IA6BrJ;;;;;;;;;;;OAWG;IAGU,UAAU,CAAgB,KAAK,EAAE,IAAI,EAA4D,IAAI,EAAE,IAAI;IAOxH;;;;;;;;;;;OAWG;IAGU,WAAW,CAAU,IAAI,EAAE,MAAM;IAmB9C;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM;IAc9C;;;;;;;;;OASG;IACH,SAAS,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI;IAqB5E;;;;;OAKG;cACa,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBnG"}