@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,10 +10,15 @@ 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, Ok, Param, Patch, Policy } from '@spinajs/http';
14
- import { grant, revoke } from '@spinajs/rbac';
15
- import { AuthorizedPolicy, Permission, Resource } from "@spinajs/rbac-http";
13
+ import { AutoinjectService } from '@spinajs/configuration';
14
+ import { BaseController, BasePath, Body, Ok, Patch, Policy } from '@spinajs/http';
15
+ import { FromModel } from '@spinajs/orm-http';
16
+ import { grant, revoke, User } from '@spinajs/rbac';
17
+ import { AuthorizedPolicy, Permission, Resource, User as CurrentUser } from '@spinajs/rbac-http';
16
18
  import { Schema } from '@spinajs/validation';
19
+ import { RoleGuard } from '../../interfaces.js';
20
+ // Side effect only — see the note in Users.ts.
21
+ import '../../services/RoleGuard.js';
17
22
  let RoleDto = class RoleDto {
18
23
  constructor(data) {
19
24
  Object.assign(this, data);
@@ -30,9 +35,14 @@ RoleDto = __decorate([
30
35
  }),
31
36
  __metadata("design:paramtypes", [Object])
32
37
  ], RoleDto);
38
+ export { RoleDto };
33
39
  /**
34
40
  * User role management (admin).
35
41
  * Grants and revokes RBAC roles for user accounts.
42
+ *
43
+ * Both routes run the configured {@link RoleGuard} before touching anything: a
44
+ * role is the one thing in this API that can grant MORE than the caller has, so
45
+ * "may update users" is not by itself an answer to "may hand out this role".
36
46
  * @tags Admin Users
37
47
  */
38
48
  let Roles = class Roles extends BaseController {
@@ -42,13 +52,14 @@ let Roles = class Roles extends BaseController {
42
52
  * @security cookieAuth
43
53
  * @param login User login name
44
54
  * @response 200 Role granted successfully
45
- * @response 400 Invalid role name
55
+ * @response 400 Unknown role name
46
56
  * @response 401 Unauthorized — valid session required
47
- * @response 403 Forbidden — updateAny permission required on users resource
57
+ * @response 403 Forbidden — updateAny permission required, or the role grants more than the caller holds
48
58
  * @response 404 User not found
49
59
  */
50
- async addRole(login, roleDto) {
51
- await grant(login, roleDto.role);
60
+ async addRole(actor, user, roleDto) {
61
+ await this.RoleGuard.assertCanAssignRoles(actor, user, [roleDto.role]);
62
+ await grant(user, roleDto.role);
52
63
  return new Ok();
53
64
  }
54
65
  /**
@@ -57,32 +68,39 @@ let Roles = class Roles extends BaseController {
57
68
  * @security cookieAuth
58
69
  * @param login User login name
59
70
  * @response 200 Role revoked successfully
60
- * @response 400 Invalid role name
71
+ * @response 400 Unknown role name
61
72
  * @response 401 Unauthorized — valid session required
62
- * @response 403 Forbidden — updateAny permission required on users resource
73
+ * @response 403 Forbidden — updateAny permission required, or the revocation would lock the caller or the installation out
63
74
  * @response 404 User not found
64
75
  */
65
- async revokeRole(login, roleDto) {
66
- await revoke(login, roleDto.role);
76
+ async revokeRole(actor, user, roleDto) {
77
+ await this.RoleGuard.assertCanRevokeRole(actor, user, roleDto.role);
78
+ await revoke(user, roleDto.role);
67
79
  return new Ok();
68
80
  }
69
81
  };
82
+ __decorate([
83
+ AutoinjectService('rbac.admin.roleGuard'),
84
+ __metadata("design:type", RoleGuard)
85
+ ], Roles.prototype, "RoleGuard", void 0);
70
86
  __decorate([
71
87
  Patch('add/:login'),
72
88
  Permission(['updateAny']),
73
- __param(0, Param()),
74
- __param(1, Body()),
89
+ __param(0, CurrentUser()),
90
+ __param(1, FromModel({ queryField: 'Login', paramField: 'login', include: ['Metadata'] })),
91
+ __param(2, Body()),
75
92
  __metadata("design:type", Function),
76
- __metadata("design:paramtypes", [String, RoleDto]),
93
+ __metadata("design:paramtypes", [User, User, RoleDto]),
77
94
  __metadata("design:returntype", Promise)
78
95
  ], Roles.prototype, "addRole", null);
79
96
  __decorate([
80
97
  Patch('revoke/:login'),
81
98
  Permission(['updateAny']),
82
- __param(0, Param()),
83
- __param(1, Body()),
99
+ __param(0, CurrentUser()),
100
+ __param(1, FromModel({ queryField: 'Login', paramField: 'login', include: ['Metadata'] })),
101
+ __param(2, Body()),
84
102
  __metadata("design:type", Function),
85
- __metadata("design:paramtypes", [String, RoleDto]),
103
+ __metadata("design:paramtypes", [User, User, RoleDto]),
86
104
  __metadata("design:returntype", Promise)
87
105
  ], Roles.prototype, "revokeRole", null);
88
106
  Roles = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"Roles.js","sourceRoot":"","sources":["../../../../src/controllers/Users/Roles.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAS,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,IAQM,OAAO,GARb,MAQM,OAAO;IAGT,YAAY,IAAsB;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;CACJ,CAAA;AANK,OAAO;IARZ,MAAM,CAAC;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,sBAAsB;QAC3B,UAAU,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE;SAC1G;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACrB,CAAC;;GACI,OAAO,CAMZ;AAGD;;;;GAIG;AAII,IAAM,KAAK,GAAX,MAAM,KAAM,SAAQ,cAAc;IACrC;;;;;;;;;;OAUG;IAGU,AAAN,KAAK,CAAC,OAAO,CAAU,KAAa,EAAU,OAAgB;QACjE,MAAM,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,EAAE,EAAE,CAAA;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IAGU,AAAN,KAAK,CAAC,UAAU,CAAU,KAAa,EAAU,OAAgB;QACpE,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,EAAE,EAAE,CAAA;IACnB,CAAC;CACJ,CAAA;AAtBgB;IAFZ,KAAK,CAAC,YAAY,CAAC;IACnB,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;IACJ,WAAA,KAAK,EAAE,CAAA;IAAiB,WAAA,IAAI,EAAE,CAAA;;6CAAU,OAAO;;oCAGpE;AAeY;IAFZ,KAAK,CAAC,eAAe,CAAC;IACtB,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC;IACD,WAAA,KAAK,EAAE,CAAA;IAAiB,WAAA,IAAI,EAAE,CAAA;;6CAAU,OAAO;;uCAGvE;AAnCQ,KAAK;IAHjB,QAAQ,CAAC,YAAY,CAAC;IACtB,MAAM,CAAC,gBAAgB,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC;GACL,KAAK,CAoCjB"}
1
+ {"version":3,"file":"Roles.js","sourceRoot":"","sources":["../../../../src/controllers/Users/Roles.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,51 @@
1
- import { BaseController, Ok } from '@spinajs/http';
1
+ import { BaseController, NotFound, Ok } from '@spinajs/http';
2
2
  import { SessionProvider, User } from '@spinajs/rbac';
3
- declare class ChangePasswordDto {
3
+ import type { ISession } from '@spinajs/rbac';
4
+ import { Log } from '@spinajs/log';
5
+ import { RoleGuard } from '../../interfaces.js';
6
+ import '../../services/RoleGuard.js';
7
+ export declare class ChangePasswordDto {
4
8
  password: string;
5
9
  confirmPassword: string;
6
10
  constructor(data: any);
7
11
  }
12
+ export declare class BanUserDto {
13
+ reason?: string;
14
+ duration?: number;
15
+ constructor(data: Partial<BanUserDto>);
16
+ }
17
+ /** One live session of a user, as reported to an administrator. */
18
+ export interface IAdminSessionEntry {
19
+ /**
20
+ * Opaque handle for the session, NOT the session id — the id is a working
21
+ * credential and an admin listing must not hand out the means to
22
+ * impersonate the accounts it lists.
23
+ */
24
+ Handle: string;
25
+ /** ISO instant the session was opened */
26
+ Created: string;
27
+ /** ISO instant the session expires, or null when it never does */
28
+ Expires: string | null;
29
+ }
8
30
  /**
9
31
  * User account security management (admin).
10
- * Administrative controls for user account security: password changes, 2FA reset,
11
- * account activation/deactivation, and forced session logout.
32
+ * Administrative controls for user account security: passwords, 2FA, account
33
+ * activation, bans, login lockouts and live sessions.
34
+ *
35
+ * Every route that takes an account out of service goes through the configured
36
+ * {@link RoleGuard} first — an administrator must not be able to lock themselves,
37
+ * or the installation, out through this API.
12
38
  * @tags Admin Users
13
39
  */
14
40
  export declare class Security extends BaseController {
41
+ protected Log: Log;
15
42
  protected SessionProvider: SessionProvider;
43
+ protected RoleGuard: RoleGuard;
16
44
  /**
17
45
  * Change user password (admin)
18
46
  * Sets a new password for the specified user. Both password and confirmPassword must match.
19
- * Minimum length is 8 characters.
47
+ * Minimum length is 8 characters. Every session of that user is destroyed — the credential
48
+ * they were opened with no longer exists.
20
49
  * @security cookieAuth
21
50
  * @param user User UUID path parameter
22
51
  * @response 200 Password changed successfully
@@ -26,6 +55,31 @@ export declare class Security extends BaseController {
26
55
  * @response 404 User not found
27
56
  */
28
57
  changeUserPassword(user: User, dto: ChangePasswordDto): Promise<Ok<any>>;
58
+ /**
59
+ * Send a password reset link (admin)
60
+ * Issues a single-use reset token into the user's metadata and emits
61
+ * `UserPasswordChangeRequest` so the application can deliver it. The token itself is never
62
+ * returned. This is how a freshly created account is handed over to its owner — the
63
+ * temporary password generated at creation is deliberately discarded.
64
+ * @security cookieAuth
65
+ * @param user User UUID path parameter
66
+ * @response 200 Reset token issued
67
+ * @response 401 Unauthorized — valid session required
68
+ * @response 403 Forbidden — updateAny permission required on users resource
69
+ * @response 404 User not found
70
+ */
71
+ requestPasswordReset(user: User): Promise<Ok<any>>;
72
+ /**
73
+ * Expire a user password (admin)
74
+ * Marks the password as expired, which deactivates the account until a new one is set.
75
+ * @security cookieAuth
76
+ * @param user User UUID path parameter
77
+ * @response 200 Password expired
78
+ * @response 401 Unauthorized — valid session required
79
+ * @response 403 Forbidden — deleteAny permission required, or refused by the role guard
80
+ * @response 404 User not found
81
+ */
82
+ expireUserPassword(actor: User, user: User): Promise<Ok<any>>;
29
83
  /**
30
84
  * Reset user two-factor authentication (admin)
31
85
  * Clears the TOTP secret and disables 2FA for the specified user.
@@ -38,17 +92,42 @@ export declare class Security extends BaseController {
38
92
  * @response 404 User not found
39
93
  */
40
94
  reset2faToken(user: User): Promise<Ok<any>>;
95
+ /**
96
+ * Enable two-factor authentication for a user (admin)
97
+ * Initializes a TOTP secret for the account. Returns whatever the configured
98
+ * two-factor provider produces for enrolment (an otpauth url for the default provider) —
99
+ * deliver it to the user over a channel you trust.
100
+ * @security cookieAuth
101
+ * @param user User UUID path parameter
102
+ * @response 200 2FA enabled
103
+ * @response 401 Unauthorized — valid session required
104
+ * @response 403 Forbidden — updateAny permission required on users resource
105
+ * @response 404 User not found
106
+ */
107
+ enable2Fa(user: User): Promise<Ok<unknown>>;
108
+ /**
109
+ * Disable two-factor authentication for a user (admin)
110
+ * Removes the TOTP secret and turns the second factor off for the account.
111
+ * @security cookieAuth
112
+ * @param user User UUID path parameter
113
+ * @response 200 2FA disabled
114
+ * @response 401 Unauthorized — valid session required
115
+ * @response 403 Forbidden — updateAny permission required on users resource
116
+ * @response 404 User not found
117
+ */
118
+ disable2Fa(user: User): Promise<Ok<any>>;
41
119
  /**
42
120
  * Deactivate user account (admin)
43
- * Marks the user account as inactive, preventing login without deleting the record.
121
+ * Marks the user account as inactive and destroys its sessions, preventing login without
122
+ * deleting the record.
44
123
  * @security cookieAuth
45
124
  * @param user User UUID path parameter
46
125
  * @response 200 Account deactivated successfully
47
126
  * @response 401 Unauthorized — valid session required
48
- * @response 403 Forbidden — deleteAny permission required on users resource
127
+ * @response 403 Forbidden — deleteAny permission required, or refused by the role guard
49
128
  * @response 404 User not found
50
129
  */
51
- deactivateUser(user: User): Promise<Ok<any>>;
130
+ deactivateUser(actor: User, user: User): Promise<Ok<any>>;
52
131
  /**
53
132
  * Activate user account (admin)
54
133
  * Marks a previously deactivated user account as active, restoring login access.
@@ -56,10 +135,71 @@ export declare class Security extends BaseController {
56
135
  * @param user User UUID path parameter
57
136
  * @response 200 Account activated successfully
58
137
  * @response 401 Unauthorized — valid session required
59
- * @response 403 Forbidden — deleteAny permission required on users resource
138
+ * @response 403 Forbidden — updateAny permission required on users resource
60
139
  * @response 404 User not found
61
140
  */
62
141
  activateUser(user: User): Promise<Ok<any>>;
142
+ /**
143
+ * Ban a user (admin)
144
+ * Bans the account for `duration` seconds (24h when omitted), records the reason, and
145
+ * destroys every session it holds.
146
+ * @security cookieAuth
147
+ * @param user User UUID path parameter
148
+ * @response 200 Account banned
149
+ * @response 400 Account is already banned
150
+ * @response 401 Unauthorized — valid session required
151
+ * @response 403 Forbidden — deleteAny permission required, or refused by the role guard
152
+ * @response 404 User not found
153
+ */
154
+ banUser(actor: User, user: User, dto: BanUserDto): Promise<Ok<any>>;
155
+ /**
156
+ * Unban a user (admin)
157
+ * Clears the ban metadata from the account.
158
+ * @security cookieAuth
159
+ * @param user User UUID path parameter
160
+ * @response 200 Account unbanned
161
+ * @response 400 Account is not banned
162
+ * @response 401 Unauthorized — valid session required
163
+ * @response 403 Forbidden — updateAny permission required on users resource
164
+ * @response 404 User not found
165
+ */
166
+ unbanUser(user: User): Promise<Ok<any>>;
167
+ /**
168
+ * Clear a login lockout (admin)
169
+ * Removes the failed-attempt counter and the lockout window opened by the login throttle,
170
+ * letting the user try again immediately. Without this the only remedy is waiting out
171
+ * `rbac.password.lockoutTime`.
172
+ * @security cookieAuth
173
+ * @param user User UUID path parameter
174
+ * @response 200 Lockout cleared
175
+ * @response 401 Unauthorized — valid session required
176
+ * @response 403 Forbidden — updateAny permission required on users resource
177
+ * @response 404 User not found
178
+ */
179
+ unlockUser(user: User): Promise<Ok<any>>;
180
+ /**
181
+ * List sessions of a user (admin)
182
+ * Returns every live session of the account, newest first, identified by an opaque handle.
183
+ * @security cookieAuth
184
+ * @param user User UUID path parameter
185
+ * @returns {IAdminSessionEntry[]} Live sessions of the user
186
+ * @response 401 Unauthorized — valid session required
187
+ * @response 403 Forbidden — readAny permission required on users resource
188
+ * @response 404 User not found
189
+ */
190
+ listSessions(user: User): Promise<Ok<IAdminSessionEntry[]>>;
191
+ /**
192
+ * Revoke one session of a user (admin)
193
+ * Ends a single session, addressed by the handle returned from the listing.
194
+ * @security cookieAuth
195
+ * @param user User UUID path parameter
196
+ * @param handle Session handle as returned by `GET /users/security/sessions/:user`
197
+ * @response 200 Session revoked
198
+ * @response 401 Unauthorized — valid session required
199
+ * @response 403 Forbidden — updateAny permission required on users resource
200
+ * @response 404 No such session for this user
201
+ */
202
+ revokeSession(user: User, handle: string): Promise<Ok | NotFound>;
63
203
  /**
64
204
  * Force logout user (admin)
65
205
  * Invalidates all active sessions for the specified user, immediately ending any current logins.
@@ -70,7 +210,7 @@ export declare class Security extends BaseController {
70
210
  * @response 403 Forbidden — updateAny permission required on users resource
71
211
  * @response 404 User not found
72
212
  */
73
- logoutUser(user: User): Promise<Ok<any>>;
213
+ logoutUser(user: User): Promise<Ok<null>>;
214
+ protected toEntry(session: ISession): IAdminSessionEntry;
74
215
  }
75
- export {};
76
216
  //# sourceMappingURL=Security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../../../src/controllers/Users/Security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAuB,EAAE,EAAiB,MAAM,eAAe,CAAC;AAEvF,OAAO,EAA+C,eAAe,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAMnG,cAwBM,iBAAiB;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;gBAEnB,IAAI,EAAE,GAAG;CAGxB;AAGD;;;;;GAKG;AACH,qBAGa,QAAS,SAAQ,cAAc;IAGxC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAE3C;;;;;;;;;;;OAWG;IAGU,kBAAkB,CAAoC,IAAI,EAAE,IAAI,EAAU,GAAG,EAAE,iBAAiB;IAK7G;;;;;;;;;;OAUG;IAGU,aAAa,CAAoC,IAAI,EAAE,IAAI;IAKxE;;;;;;;;;OASG;IAGU,cAAc,CAAoC,IAAI,EAAE,IAAI;IAKzE;;;;;;;;;OASG;IAGU,YAAY,CAAoC,IAAI,EAAE,IAAI;IAKvE;;;;;;;;;OASG;IAGU,UAAU,CAAoC,IAAI,EAAE,IAAI;CAIxE"}
1
+ {"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../../../src/controllers/Users/Security.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA4B,QAAQ,EAAE,EAAE,EAA8B,MAAM,eAAe,CAAC;AACnH,OAAO,EAAmG,eAAe,EAAS,IAAI,EAAwB,MAAM,eAAe,CAAC;AACpL,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,6BAA6B,CAAC;AAErC,qBAwBa,iBAAiB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;gBAEnB,IAAI,EAAE,GAAG;CAGtB;AAED,qBAQa,UAAU;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC;CAGtC;AAED,mEAAmE;AACnE,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAEhB,kEAAkE;IAClE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,qBAGa,QAAS,SAAQ,cAAc;IAE1C,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAG3C,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;IAE/B;;;;;;;;;;;;OAYG;IAGU,kBAAkB,CAA2D,IAAI,EAAE,IAAI,EAAU,GAAG,EAAE,iBAAiB;IAKpI;;;;;;;;;;;;OAYG;IAGU,oBAAoB,CAA2D,IAAI,EAAE,IAAI;IAKtG;;;;;;;;;OASG;IAGU,kBAAkB,CAAgB,KAAK,EAAE,IAAI,EAA4D,IAAI,EAAE,IAAI;IAShI;;;;;;;;;;OAUG;IAGU,aAAa,CAA2D,IAAI,EAAE,IAAI;IAK/F;;;;;;;;;;;OAWG;IAGU,SAAS,CAA2D,IAAI,EAAE,IAAI;IAI3F;;;;;;;;;OASG;IAGU,UAAU,CAA2D,IAAI,EAAE,IAAI;IAK5F;;;;;;;;;;OAUG;IAGU,cAAc,CAAgB,KAAK,EAAE,IAAI,EAA4D,IAAI,EAAE,IAAI;IAO5H;;;;;;;;;OASG;IAGU,YAAY,CAA2D,IAAI,EAAE,IAAI;IAK9F;;;;;;;;;;;OAWG;IAGU,OAAO,CAAgB,KAAK,EAAE,IAAI,EAA4D,IAAI,EAAE,IAAI,EAAU,GAAG,EAAE,UAAU;IAO9I;;;;;;;;;;OAUG;IAGU,SAAS,CAA2D,IAAI,EAAE,IAAI;IAK3F;;;;;;;;;;;OAWG;IAGU,UAAU,CAA2D,IAAI,EAAE,IAAI;IAS5F;;;;;;;;;OASG;IAGU,YAAY,CAAoC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAQ3G;;;;;;;;;;OAUG;IAGU,aAAa,CAAoC,IAAI,EAAE,IAAI,EAAW,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC;IAiB1H;;;;;;;;;OASG;IAGU,UAAU,CAAoC,IAAI,EAAE,IAAI;IAQrE,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,kBAAkB;CAOzD"}