@spinajs/rbac-http-user 2.0.486 → 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 (239) hide show
  1. package/lib/cjs/config/rbac-http.d.ts +0 -15
  2. package/lib/cjs/config/rbac-http.d.ts.map +1 -1
  3. package/lib/cjs/config/rbac-http.js +6 -16
  4. package/lib/cjs/config/rbac-http.js.map +1 -1
  5. package/lib/cjs/controllers/ActiveRoleController.d.ts +2 -1
  6. package/lib/cjs/controllers/ActiveRoleController.d.ts.map +1 -1
  7. package/lib/cjs/controllers/ActiveRoleController.js +7 -17
  8. package/lib/cjs/controllers/ActiveRoleController.js.map +1 -1
  9. package/lib/cjs/controllers/ImpersonationController.d.ts +7 -9
  10. package/lib/cjs/controllers/ImpersonationController.d.ts.map +1 -1
  11. package/lib/cjs/controllers/ImpersonationController.js +31 -56
  12. package/lib/cjs/controllers/ImpersonationController.js.map +1 -1
  13. package/lib/cjs/controllers/LoginController.d.ts +10 -3
  14. package/lib/cjs/controllers/LoginController.d.ts.map +1 -1
  15. package/lib/cjs/controllers/LoginController.js +39 -40
  16. package/lib/cjs/controllers/LoginController.js.map +1 -1
  17. package/lib/cjs/controllers/PasswordResetController.d.ts +54 -0
  18. package/lib/cjs/controllers/PasswordResetController.d.ts.map +1 -0
  19. package/lib/cjs/controllers/PasswordResetController.js +129 -0
  20. package/lib/cjs/controllers/PasswordResetController.js.map +1 -0
  21. package/lib/cjs/controllers/SessionsController.d.ts +65 -0
  22. package/lib/cjs/controllers/SessionsController.d.ts.map +1 -0
  23. package/lib/cjs/controllers/SessionsController.js +143 -0
  24. package/lib/cjs/controllers/SessionsController.js.map +1 -0
  25. package/lib/cjs/controllers/TwoFactorAuthController.d.ts +24 -23
  26. package/lib/cjs/controllers/TwoFactorAuthController.d.ts.map +1 -1
  27. package/lib/cjs/controllers/TwoFactorAuthController.js +39 -72
  28. package/lib/cjs/controllers/TwoFactorAuthController.js.map +1 -1
  29. package/lib/cjs/controllers/TwoFactorAuthUserController.d.ts +98 -0
  30. package/lib/cjs/controllers/TwoFactorAuthUserController.d.ts.map +1 -0
  31. package/lib/cjs/controllers/TwoFactorAuthUserController.js +195 -0
  32. package/lib/cjs/controllers/TwoFactorAuthUserController.js.map +1 -0
  33. package/lib/cjs/controllers/UserController.d.ts +10 -7
  34. package/lib/cjs/controllers/UserController.d.ts.map +1 -1
  35. package/lib/cjs/controllers/UserController.js +56 -58
  36. package/lib/cjs/controllers/UserController.js.map +1 -1
  37. package/lib/cjs/controllers/UserMetadataController.d.ts +6 -12
  38. package/lib/cjs/controllers/UserMetadataController.d.ts.map +1 -1
  39. package/lib/cjs/controllers/UserMetadataController.js +23 -72
  40. package/lib/cjs/controllers/UserMetadataController.js.map +1 -1
  41. package/lib/cjs/dto/confirm-password-dto.d.ts +23 -0
  42. package/lib/cjs/dto/confirm-password-dto.d.ts.map +1 -0
  43. package/lib/cjs/dto/{restore-password-dto.js → confirm-password-dto.js} +16 -12
  44. package/lib/cjs/dto/confirm-password-dto.js.map +1 -0
  45. package/lib/cjs/dto/password-reset-dto.d.ts +58 -0
  46. package/lib/cjs/dto/password-reset-dto.d.ts.map +1 -0
  47. package/lib/cjs/dto/password-reset-dto.js +57 -0
  48. package/lib/cjs/dto/password-reset-dto.js.map +1 -0
  49. package/lib/cjs/handlers/DefaultLogoutHandler.d.ts +4 -1
  50. package/lib/cjs/handlers/DefaultLogoutHandler.d.ts.map +1 -1
  51. package/lib/cjs/handlers/DefaultLogoutHandler.js +20 -13
  52. package/lib/cjs/handlers/DefaultLogoutHandler.js.map +1 -1
  53. package/lib/cjs/handlers/ImpersonationLogoutHandler.d.ts +4 -7
  54. package/lib/cjs/handlers/ImpersonationLogoutHandler.d.ts.map +1 -1
  55. package/lib/cjs/handlers/ImpersonationLogoutHandler.js +30 -31
  56. package/lib/cjs/handlers/ImpersonationLogoutHandler.js.map +1 -1
  57. package/lib/cjs/index.d.ts +20 -0
  58. package/lib/cjs/index.d.ts.map +1 -1
  59. package/lib/cjs/index.js +22 -0
  60. package/lib/cjs/index.js.map +1 -1
  61. package/lib/cjs/logout.d.ts +7 -0
  62. package/lib/cjs/logout.d.ts.map +1 -1
  63. package/lib/cjs/logout.js.map +1 -1
  64. package/lib/cjs/policies/2FaPolicy.d.ts +21 -1
  65. package/lib/cjs/policies/2FaPolicy.d.ts.map +1 -1
  66. package/lib/cjs/policies/2FaPolicy.js +31 -7
  67. package/lib/cjs/policies/2FaPolicy.js.map +1 -1
  68. package/lib/cjs/services/ImpersonationService.d.ts +90 -0
  69. package/lib/cjs/services/ImpersonationService.d.ts.map +1 -0
  70. package/lib/cjs/services/ImpersonationService.js +147 -0
  71. package/lib/cjs/services/ImpersonationService.js.map +1 -0
  72. package/lib/cjs/services/SessionCookies.d.ts +41 -0
  73. package/lib/cjs/services/SessionCookies.d.ts.map +1 -0
  74. package/lib/cjs/services/SessionCookies.js +62 -0
  75. package/lib/cjs/services/SessionCookies.js.map +1 -0
  76. package/lib/cjs/services/UserMetadataService.d.ts +53 -0
  77. package/lib/cjs/services/UserMetadataService.d.ts.map +1 -0
  78. package/lib/cjs/services/UserMetadataService.js +94 -0
  79. package/lib/cjs/services/UserMetadataService.js.map +1 -0
  80. package/lib/cjs/services/grants.d.ts +29 -0
  81. package/lib/cjs/services/grants.d.ts.map +1 -0
  82. package/lib/cjs/services/grants.js +43 -0
  83. package/lib/cjs/services/grants.js.map +1 -0
  84. package/lib/mjs/config/rbac-http.d.ts +0 -15
  85. package/lib/mjs/config/rbac-http.d.ts.map +1 -1
  86. package/lib/mjs/config/rbac-http.js +6 -16
  87. package/lib/mjs/config/rbac-http.js.map +1 -1
  88. package/lib/mjs/controllers/ActiveRoleController.d.ts +2 -1
  89. package/lib/mjs/controllers/ActiveRoleController.d.ts.map +1 -1
  90. package/lib/mjs/controllers/ActiveRoleController.js +8 -18
  91. package/lib/mjs/controllers/ActiveRoleController.js.map +1 -1
  92. package/lib/mjs/controllers/ImpersonationController.d.ts +7 -9
  93. package/lib/mjs/controllers/ImpersonationController.d.ts.map +1 -1
  94. package/lib/mjs/controllers/ImpersonationController.js +32 -57
  95. package/lib/mjs/controllers/ImpersonationController.js.map +1 -1
  96. package/lib/mjs/controllers/LoginController.d.ts +10 -3
  97. package/lib/mjs/controllers/LoginController.d.ts.map +1 -1
  98. package/lib/mjs/controllers/LoginController.js +42 -43
  99. package/lib/mjs/controllers/LoginController.js.map +1 -1
  100. package/lib/mjs/controllers/PasswordResetController.d.ts +54 -0
  101. package/lib/mjs/controllers/PasswordResetController.d.ts.map +1 -0
  102. package/lib/mjs/controllers/PasswordResetController.js +126 -0
  103. package/lib/mjs/controllers/PasswordResetController.js.map +1 -0
  104. package/lib/mjs/controllers/SessionsController.d.ts +65 -0
  105. package/lib/mjs/controllers/SessionsController.d.ts.map +1 -0
  106. package/lib/mjs/controllers/SessionsController.js +140 -0
  107. package/lib/mjs/controllers/SessionsController.js.map +1 -0
  108. package/lib/mjs/controllers/TwoFactorAuthController.d.ts +24 -23
  109. package/lib/mjs/controllers/TwoFactorAuthController.d.ts.map +1 -1
  110. package/lib/mjs/controllers/TwoFactorAuthController.js +43 -76
  111. package/lib/mjs/controllers/TwoFactorAuthController.js.map +1 -1
  112. package/lib/mjs/controllers/TwoFactorAuthUserController.d.ts +98 -0
  113. package/lib/mjs/controllers/TwoFactorAuthUserController.d.ts.map +1 -0
  114. package/lib/mjs/controllers/TwoFactorAuthUserController.js +192 -0
  115. package/lib/mjs/controllers/TwoFactorAuthUserController.js.map +1 -0
  116. package/lib/mjs/controllers/UserController.d.ts +10 -7
  117. package/lib/mjs/controllers/UserController.d.ts.map +1 -1
  118. package/lib/mjs/controllers/UserController.js +59 -28
  119. package/lib/mjs/controllers/UserController.js.map +1 -1
  120. package/lib/mjs/controllers/UserMetadataController.d.ts +6 -12
  121. package/lib/mjs/controllers/UserMetadataController.d.ts.map +1 -1
  122. package/lib/mjs/controllers/UserMetadataController.js +23 -72
  123. package/lib/mjs/controllers/UserMetadataController.js.map +1 -1
  124. package/lib/mjs/dto/confirm-password-dto.d.ts +23 -0
  125. package/lib/mjs/dto/confirm-password-dto.d.ts.map +1 -0
  126. package/lib/mjs/dto/{user-dto.js → confirm-password-dto.js} +15 -10
  127. package/lib/mjs/dto/confirm-password-dto.js.map +1 -0
  128. package/lib/mjs/dto/password-reset-dto.d.ts +58 -0
  129. package/lib/mjs/dto/password-reset-dto.d.ts.map +1 -0
  130. package/lib/mjs/dto/password-reset-dto.js +54 -0
  131. package/lib/mjs/dto/password-reset-dto.js.map +1 -0
  132. package/lib/mjs/handlers/DefaultLogoutHandler.d.ts +4 -1
  133. package/lib/mjs/handlers/DefaultLogoutHandler.d.ts.map +1 -1
  134. package/lib/mjs/handlers/DefaultLogoutHandler.js +23 -16
  135. package/lib/mjs/handlers/DefaultLogoutHandler.js.map +1 -1
  136. package/lib/mjs/handlers/ImpersonationLogoutHandler.d.ts +4 -7
  137. package/lib/mjs/handlers/ImpersonationLogoutHandler.d.ts.map +1 -1
  138. package/lib/mjs/handlers/ImpersonationLogoutHandler.js +31 -32
  139. package/lib/mjs/handlers/ImpersonationLogoutHandler.js.map +1 -1
  140. package/lib/mjs/index.d.ts +20 -0
  141. package/lib/mjs/index.d.ts.map +1 -1
  142. package/lib/mjs/index.js +22 -0
  143. package/lib/mjs/index.js.map +1 -1
  144. package/lib/mjs/logout.d.ts +7 -0
  145. package/lib/mjs/logout.d.ts.map +1 -1
  146. package/lib/mjs/logout.js.map +1 -1
  147. package/lib/mjs/policies/2FaPolicy.d.ts +21 -1
  148. package/lib/mjs/policies/2FaPolicy.d.ts.map +1 -1
  149. package/lib/mjs/policies/2FaPolicy.js +29 -6
  150. package/lib/mjs/policies/2FaPolicy.js.map +1 -1
  151. package/lib/mjs/services/ImpersonationService.d.ts +90 -0
  152. package/lib/mjs/services/ImpersonationService.d.ts.map +1 -0
  153. package/lib/mjs/services/ImpersonationService.js +144 -0
  154. package/lib/mjs/services/ImpersonationService.js.map +1 -0
  155. package/lib/mjs/services/SessionCookies.d.ts +41 -0
  156. package/lib/mjs/services/SessionCookies.d.ts.map +1 -0
  157. package/lib/mjs/services/SessionCookies.js +59 -0
  158. package/lib/mjs/services/SessionCookies.js.map +1 -0
  159. package/lib/mjs/services/UserMetadataService.d.ts +53 -0
  160. package/lib/mjs/services/UserMetadataService.d.ts.map +1 -0
  161. package/lib/mjs/services/UserMetadataService.js +91 -0
  162. package/lib/mjs/services/UserMetadataService.js.map +1 -0
  163. package/lib/mjs/services/grants.d.ts +29 -0
  164. package/lib/mjs/services/grants.d.ts.map +1 -0
  165. package/lib/mjs/services/grants.js +38 -0
  166. package/lib/mjs/services/grants.js.map +1 -0
  167. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  168. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  169. package/package.json +17 -11
  170. package/lib/cjs/controllers/AuthController.d.ts +0 -1
  171. package/lib/cjs/controllers/AuthController.d.ts.map +0 -1
  172. package/lib/cjs/controllers/AuthController.js +0 -211
  173. package/lib/cjs/controllers/AuthController.js.map +0 -1
  174. package/lib/cjs/controllers/FederatedLoginController.d.ts +0 -1
  175. package/lib/cjs/controllers/FederatedLoginController.d.ts.map +0 -1
  176. package/lib/cjs/controllers/FederatedLoginController.js +0 -38
  177. package/lib/cjs/controllers/FederatedLoginController.js.map +0 -1
  178. package/lib/cjs/dto/login-dto.d.ts +0 -17
  179. package/lib/cjs/dto/login-dto.d.ts.map +0 -1
  180. package/lib/cjs/dto/login-dto.js +0 -33
  181. package/lib/cjs/dto/login-dto.js.map +0 -1
  182. package/lib/cjs/dto/restore-password-dto.d.ts +0 -24
  183. package/lib/cjs/dto/restore-password-dto.d.ts.map +0 -1
  184. package/lib/cjs/dto/restore-password-dto.js.map +0 -1
  185. package/lib/cjs/dto/user-dto.d.ts +0 -22
  186. package/lib/cjs/dto/user-dto.d.ts.map +0 -1
  187. package/lib/cjs/dto/user-dto.js +0 -33
  188. package/lib/cjs/dto/user-dto.js.map +0 -1
  189. package/lib/cjs/fingerprint/FingerprintJs.d.ts +0 -1
  190. package/lib/cjs/fingerprint/FingerprintJs.d.ts.map +0 -1
  191. package/lib/cjs/fingerprint/FingerprintJs.js +0 -5
  192. package/lib/cjs/fingerprint/FingerprintJs.js.map +0 -1
  193. package/lib/cjs/middlewares/AttributeFilter.d.ts +0 -11
  194. package/lib/cjs/middlewares/AttributeFilter.d.ts.map +0 -1
  195. package/lib/cjs/middlewares/AttributeFilter.js +0 -19
  196. package/lib/cjs/middlewares/AttributeFilter.js.map +0 -1
  197. package/lib/cjs/policies/AllowFederatedLoginPolicy.d.ts +0 -7
  198. package/lib/cjs/policies/AllowFederatedLoginPolicy.d.ts.map +0 -1
  199. package/lib/cjs/policies/AllowFederatedLoginPolicy.js +0 -32
  200. package/lib/cjs/policies/AllowFederatedLoginPolicy.js.map +0 -1
  201. package/lib/cjs/policies/CaptchaPolicy.d.ts +0 -1
  202. package/lib/cjs/policies/CaptchaPolicy.d.ts.map +0 -1
  203. package/lib/cjs/policies/CaptchaPolicy.js +0 -1
  204. package/lib/cjs/policies/CaptchaPolicy.js.map +0 -1
  205. package/lib/mjs/controllers/AuthController.d.ts +0 -2
  206. package/lib/mjs/controllers/AuthController.d.ts.map +0 -1
  207. package/lib/mjs/controllers/AuthController.js +0 -212
  208. package/lib/mjs/controllers/AuthController.js.map +0 -1
  209. package/lib/mjs/controllers/FederatedLoginController.d.ts +0 -2
  210. package/lib/mjs/controllers/FederatedLoginController.d.ts.map +0 -1
  211. package/lib/mjs/controllers/FederatedLoginController.js +0 -39
  212. package/lib/mjs/controllers/FederatedLoginController.js.map +0 -1
  213. package/lib/mjs/dto/login-dto.d.ts +0 -17
  214. package/lib/mjs/dto/login-dto.d.ts.map +0 -1
  215. package/lib/mjs/dto/login-dto.js +0 -30
  216. package/lib/mjs/dto/login-dto.js.map +0 -1
  217. package/lib/mjs/dto/restore-password-dto.d.ts +0 -24
  218. package/lib/mjs/dto/restore-password-dto.d.ts.map +0 -1
  219. package/lib/mjs/dto/restore-password-dto.js +0 -31
  220. package/lib/mjs/dto/restore-password-dto.js.map +0 -1
  221. package/lib/mjs/dto/user-dto.d.ts +0 -22
  222. package/lib/mjs/dto/user-dto.d.ts.map +0 -1
  223. package/lib/mjs/dto/user-dto.js.map +0 -1
  224. package/lib/mjs/fingerprint/FingerprintJs.d.ts +0 -2
  225. package/lib/mjs/fingerprint/FingerprintJs.d.ts.map +0 -1
  226. package/lib/mjs/fingerprint/FingerprintJs.js +0 -6
  227. package/lib/mjs/fingerprint/FingerprintJs.js.map +0 -1
  228. package/lib/mjs/middlewares/AttributeFilter.d.ts +0 -11
  229. package/lib/mjs/middlewares/AttributeFilter.d.ts.map +0 -1
  230. package/lib/mjs/middlewares/AttributeFilter.js +0 -15
  231. package/lib/mjs/middlewares/AttributeFilter.js.map +0 -1
  232. package/lib/mjs/policies/AllowFederatedLoginPolicy.d.ts +0 -7
  233. package/lib/mjs/policies/AllowFederatedLoginPolicy.d.ts.map +0 -1
  234. package/lib/mjs/policies/AllowFederatedLoginPolicy.js +0 -28
  235. package/lib/mjs/policies/AllowFederatedLoginPolicy.js.map +0 -1
  236. package/lib/mjs/policies/CaptchaPolicy.d.ts +0 -2
  237. package/lib/mjs/policies/CaptchaPolicy.d.ts.map +0 -1
  238. package/lib/mjs/policies/CaptchaPolicy.js +0 -2
  239. package/lib/mjs/policies/CaptchaPolicy.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PasswordResetConfirmDto = exports.PasswordResetConfirmDtoSchema = exports.PasswordResetRequestDto = exports.PasswordResetRequestDtoSchema = void 0;
13
+ const validation_1 = require("@spinajs/validation");
14
+ exports.PasswordResetRequestDtoSchema = {
15
+ $schema: 'http://json-schema.org/draft-07/schema#',
16
+ title: 'Password reset request DTO',
17
+ type: 'object',
18
+ properties: {
19
+ Email: { type: 'string', format: 'email', description: 'Email address of the account to reset' },
20
+ },
21
+ required: ['Email'],
22
+ };
23
+ /** Payload starting a password reset — identifies the account by email. */
24
+ let PasswordResetRequestDto = class PasswordResetRequestDto {
25
+ constructor(data) {
26
+ Object.assign(this, data);
27
+ }
28
+ };
29
+ exports.PasswordResetRequestDto = PasswordResetRequestDto;
30
+ exports.PasswordResetRequestDto = PasswordResetRequestDto = __decorate([
31
+ (0, validation_1.Schema)(exports.PasswordResetRequestDtoSchema),
32
+ __metadata("design:paramtypes", [Object])
33
+ ], PasswordResetRequestDto);
34
+ exports.PasswordResetConfirmDtoSchema = {
35
+ $schema: 'http://json-schema.org/draft-07/schema#',
36
+ title: 'Password reset confirmation DTO',
37
+ type: 'object',
38
+ properties: {
39
+ Email: { type: 'string', format: 'email', description: 'Email address the reset token was issued for' },
40
+ Token: { type: 'string', maxLength: 64, minLength: 1, description: 'Reset token delivered to the user' },
41
+ Password: { type: 'string', maxLength: 32, minLength: 6, description: 'New password (6–32 characters)' },
42
+ ConfirmPassword: { type: 'string', maxLength: 32, minLength: 6, description: 'Must match Password' },
43
+ },
44
+ required: ['Email', 'Token', 'Password', 'ConfirmPassword'],
45
+ };
46
+ /** Payload completing a password reset with the issued token. */
47
+ let PasswordResetConfirmDto = class PasswordResetConfirmDto {
48
+ constructor(data) {
49
+ Object.assign(this, data);
50
+ }
51
+ };
52
+ exports.PasswordResetConfirmDto = PasswordResetConfirmDto;
53
+ exports.PasswordResetConfirmDto = PasswordResetConfirmDto = __decorate([
54
+ (0, validation_1.Schema)(exports.PasswordResetConfirmDtoSchema),
55
+ __metadata("design:paramtypes", [Object])
56
+ ], PasswordResetConfirmDto);
57
+ //# sourceMappingURL=password-reset-dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-reset-dto.js","sourceRoot":"","sources":["../../../src/dto/password-reset-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAEhC,QAAA,6BAA6B,GAAG;IAC3C,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,4BAA4B;IACnC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,uCAAuC,EAAE;KACjG;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,2EAA2E;AAEpE,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAGlC,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AANY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAM,EAAC,qCAA6B,CAAC;;GACzB,uBAAuB,CAMnC;AAEY,QAAA,6BAA6B,GAAG;IAC3C,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,iCAAiC;IACxC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,8CAA8C,EAAE;QACvG,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE;QACxG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE;QACxG,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE;KACrG;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,CAAC;CAC5D,CAAC;AAEF,iEAAiE;AAE1D,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IASlC,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AAZY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAM,EAAC,qCAA6B,CAAC;;GACzB,uBAAuB,CAYnC"}
@@ -1,5 +1,7 @@
1
1
  import { SessionProvider } from '@spinajs/rbac';
2
+ import { Log } from '@spinajs/log';
2
3
  import { LogoutHandler, ILogoutContext, ILogoutResult } from '../logout.js';
4
+ import { SessionCookieFactory } from '../services/SessionCookies.js';
3
5
  /**
4
6
  * Default logout handler: deletes the session and clears the ssid cookie.
5
7
  * Runs last (priority 999) so any earlier handler can short-circuit (e.g.
@@ -7,8 +9,9 @@ import { LogoutHandler, ILogoutContext, ILogoutResult } from '../logout.js';
7
9
  */
8
10
  export declare class DefaultLogoutHandler extends LogoutHandler {
9
11
  Priority: number;
12
+ protected Log: Log;
10
13
  protected SessionProvider: SessionProvider;
11
- protected SessionCookieConfig: Record<string, unknown>;
14
+ protected SessionCookies: SessionCookieFactory;
12
15
  handle(context: ILogoutContext): Promise<ILogoutResult | null>;
13
16
  }
14
17
  //# sourceMappingURL=DefaultLogoutHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultLogoutHandler.d.ts","sourceRoot":"","sources":["../../../src/handlers/DefaultLogoutHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE5E;;;;GAIG;AACH,qBACa,oBAAqB,SAAQ,aAAa;IAC9C,QAAQ,SAAO;IAGtB,SAAS,CAAC,eAAe,EAAG,eAAe,CAAC;IAG5C,SAAS,CAAC,mBAAmB,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3C,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAuB5E"}
1
+ {"version":3,"file":"DefaultLogoutHandler.d.ts","sourceRoot":"","sources":["../../../src/handlers/DefaultLogoutHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE;;;;GAIG;AACH,qBACa,oBAAqB,SAAQ,aAAa;IAC9C,QAAQ,SAAO;IAGtB,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,eAAe,EAAG,eAAe,CAAC;IAG5C,SAAS,CAAC,cAAc,EAAG,oBAAoB,CAAC;IAEnC,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAyB5E"}
@@ -13,7 +13,9 @@ exports.DefaultLogoutHandler = void 0;
13
13
  const di_1 = require("@spinajs/di");
14
14
  const configuration_1 = require("@spinajs/configuration");
15
15
  const rbac_1 = require("@spinajs/rbac");
16
+ const log_1 = require("@spinajs/log");
16
17
  const logout_js_1 = require("../logout.js");
18
+ const SessionCookies_js_1 = require("../services/SessionCookies.js");
17
19
  /**
18
20
  * Default logout handler: deletes the session and clears the ssid cookie.
19
21
  * Runs last (priority 999) so any earlier handler can short-circuit (e.g.
@@ -30,31 +32,36 @@ let DefaultLogoutHandler = class DefaultLogoutHandler extends logout_js_1.Logout
30
32
  return { Body: null };
31
33
  }
32
34
  await this.SessionProvider.delete(context.Ssid);
35
+ this.Log.info(`Session destroyed by logout`, {
36
+ Session: (0, rbac_1.hashSessionId)(context.Ssid),
37
+ User: context.User?.Uuid,
38
+ });
33
39
  return {
34
40
  Body: null,
35
- Cookies: [
36
- {
37
- Name: 'ssid',
38
- Value: '',
39
- Options: {
40
- httpOnly: true,
41
- maxAge: 0,
42
- ...this.SessionCookieConfig,
43
- },
44
- },
41
+ Cookies: [this.SessionCookies.clear()],
42
+ Headers: [
43
+ // Drop everything this origin left in the browser, not just the cookie:
44
+ // a cached authenticated page is still readable after logout on a
45
+ // shared machine, and `max-age=0` on the cookie does nothing about it.
46
+ { Name: 'Clear-Site-Data', Value: '"cache", "cookies", "storage"' },
47
+ { Name: 'Cache-Control', Value: 'no-store' },
45
48
  ],
46
49
  };
47
50
  }
48
51
  };
49
52
  exports.DefaultLogoutHandler = DefaultLogoutHandler;
53
+ __decorate([
54
+ (0, log_1.Logger)('rbac-session'),
55
+ __metadata("design:type", log_1.Log)
56
+ ], DefaultLogoutHandler.prototype, "Log", void 0);
50
57
  __decorate([
51
58
  (0, configuration_1.AutoinjectService)('rbac.session'),
52
59
  __metadata("design:type", rbac_1.SessionProvider)
53
60
  ], DefaultLogoutHandler.prototype, "SessionProvider", void 0);
54
61
  __decorate([
55
- (0, configuration_1.Config)('rbac.session.cookie', {}),
56
- __metadata("design:type", Object)
57
- ], DefaultLogoutHandler.prototype, "SessionCookieConfig", void 0);
62
+ (0, di_1.Autoinject)(SessionCookies_js_1.SessionCookieFactory),
63
+ __metadata("design:type", SessionCookies_js_1.SessionCookieFactory)
64
+ ], DefaultLogoutHandler.prototype, "SessionCookies", void 0);
58
65
  exports.DefaultLogoutHandler = DefaultLogoutHandler = __decorate([
59
66
  (0, di_1.Injectable)(logout_js_1.LogoutHandler)
60
67
  ], DefaultLogoutHandler);
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/DefaultLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,0DAAmE;AACnE,wCAAgD;AAChD,4CAA4E;AAE5E;;;;GAIG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,yBAAa;IAAhD;;QACE,aAAQ,GAAG,GAAG,CAAC;IA+BxB,CAAC;IAvBQ,KAAK,CAAC,MAAM,CAAC,OAAuB;QACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,+DAA+D;YAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO;YACL,IAAI,EAAE,IAAI;YACV,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE;wBACP,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE,CAAC;wBACT,GAAG,IAAI,CAAC,mBAAmB;qBAC5B;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAhCY,oDAAoB;AAIrB;IADT,IAAA,iCAAiB,EAAC,cAAc,CAAC;8BACN,sBAAe;6DAAC;AAGlC;IADT,IAAA,sBAAM,EAAC,qBAAqB,EAAE,EAAE,CAAC;;iEACsB;+BAP7C,oBAAoB;IADhC,IAAA,eAAU,EAAC,yBAAa,CAAC;GACb,oBAAoB,CAgChC"}
1
+ {"version":3,"file":"DefaultLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/DefaultLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAqD;AACrD,0DAA2D;AAC3D,wCAA+D;AAC/D,sCAA2C;AAC3C,4CAA4E;AAC5E,qEAAqE;AAErE;;;;GAIG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,yBAAa;IAAhD;;QACE,aAAQ,GAAG,GAAG,CAAC;IAoCxB,CAAC;IAzBQ,KAAK,CAAC,MAAM,CAAC,OAAuB;QACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,+DAA+D;YAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC3C,OAAO,EAAE,IAAA,oBAAa,EAAC,OAAO,CAAC,IAAI,CAAC;YACpC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI;SACzB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,EAAE;gBACP,wEAAwE;gBACxE,kEAAkE;gBAClE,uEAAuE;gBACvE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,+BAA+B,EAAE;gBACnE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE;aAC7C;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AArCY,oDAAoB;AAIrB;IADT,IAAA,YAAM,EAAC,cAAc,CAAC;8BACP,SAAG;iDAAC;AAGV;IADT,IAAA,iCAAiB,EAAC,cAAc,CAAC;8BACN,sBAAe;6DAAC;AAGlC;IADT,IAAA,eAAU,EAAC,wCAAoB,CAAC;8BACN,wCAAoB;4DAAC;+BAVrC,oBAAoB;IADhC,IAAA,eAAU,EAAC,yBAAa,CAAC;GACb,oBAAoB,CAqChC"}
@@ -1,5 +1,6 @@
1
- import { SessionProvider, User } from '@spinajs/rbac';
2
1
  import { LogoutHandler, ILogoutContext, ILogoutResult } from '../logout.js';
2
+ import { ImpersonationService } from '../services/ImpersonationService.js';
3
+ import { SessionCookieFactory } from '../services/SessionCookies.js';
3
4
  /**
4
5
  * Logout handler that detects an active impersonation and reverts it instead
5
6
  * of destroying the session. Runs early (priority 10) so it short-circuits
@@ -7,12 +8,8 @@ import { LogoutHandler, ILogoutContext, ILogoutResult } from '../logout.js';
7
8
  */
8
9
  export declare class ImpersonationLogoutHandler extends LogoutHandler {
9
10
  Priority: number;
10
- protected SessionProvider: SessionProvider;
11
+ protected Impersonation: ImpersonationService;
12
+ protected SessionCookies: SessionCookieFactory;
11
13
  handle(context: ILogoutContext): Promise<ILogoutResult | null>;
12
- /**
13
- * Hook for tests to intercept event emission without stubbing the module-level
14
- * `_ev` ESM binding.
15
- */
16
- protected emitEvent(original: User, target: User): Promise<void>;
17
14
  }
18
15
  //# sourceMappingURL=ImpersonationLogoutHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImpersonationLogoutHandler.d.ts","sourceRoot":"","sources":["../../../src/handlers/ImpersonationLogoutHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,IAAI,EAA0B,MAAM,eAAe,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE5E;;;;GAIG;AACH,qBACa,0BAA2B,SAAQ,aAAa;IACpD,QAAQ,SAAM;IAGrB,SAAS,CAAC,eAAe,EAAG,eAAe,CAAC;IAE/B,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA0B3E;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAGjE"}
1
+ {"version":3,"file":"ImpersonationLogoutHandler.d.ts","sourceRoot":"","sources":["../../../src/handlers/ImpersonationLogoutHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE;;;;GAIG;AACH,qBACa,0BAA2B,SAAQ,aAAa;IACpD,QAAQ,SAAM;IAGrB,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAG9C,SAAS,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAElC,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CA6B5E"}
@@ -11,10 +11,9 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ImpersonationLogoutHandler = void 0;
13
13
  const di_1 = require("@spinajs/di");
14
- const configuration_1 = require("@spinajs/configuration");
15
- const rbac_1 = require("@spinajs/rbac");
16
- const queue_1 = require("@spinajs/queue");
17
14
  const logout_js_1 = require("../logout.js");
15
+ const ImpersonationService_js_1 = require("../services/ImpersonationService.js");
16
+ const SessionCookies_js_1 = require("../services/SessionCookies.js");
18
17
  /**
19
18
  * Logout handler that detects an active impersonation and reverts it instead
20
19
  * of destroying the session. Runs early (priority 10) so it short-circuits
@@ -26,40 +25,40 @@ let ImpersonationLogoutHandler = class ImpersonationLogoutHandler extends logout
26
25
  this.Priority = 10;
27
26
  }
28
27
  async handle(context) {
29
- const session = context.Session;
30
- if (!session)
28
+ if (!this.Impersonation.isActive(context.Session)) {
31
29
  return null;
32
- const impersonatorUuid = session.Data.get('Impersonator');
33
- if (!impersonatorUuid)
34
- return null;
35
- const original = await rbac_1.User.getByUuid(impersonatorUuid);
36
- session.Data.set('User', original.Uuid);
37
- session.Data.delete('Impersonator');
38
- session.Data.delete('ImpersonationStartedAt');
39
- const restoredActiveRole = session.Data.get('OriginalActiveRole') ?? original.Role?.[0];
40
- if (restoredActiveRole) {
41
- session.Data.set('ActiveRole', restoredActiveRole);
42
30
  }
43
- session.Data.delete('OriginalActiveRole');
44
- await this.SessionProvider.save(session);
45
- await this.emitEvent(original, context.User);
46
- // Take ownership of the response: no cookie change — the original user's
47
- // session continues.
48
- return { Body: { ImpersonationEnded: true } };
49
- }
50
- /**
51
- * Hook for tests to intercept event emission without stubbing the module-level
52
- * `_ev` ESM binding.
53
- */
54
- emitEvent(original, target) {
55
- return (0, queue_1._ev)(new rbac_1.UserImpersonationEnded(original, target))();
31
+ const result = await this.Impersonation.revert(context.Session, context.User);
32
+ switch (result.Status) {
33
+ case 'reverted':
34
+ // Take ownership of the response: the original user's session
35
+ // continues, under the new id the revert rotated it to.
36
+ return {
37
+ Body: { ImpersonationEnded: true },
38
+ Cookies: [this.SessionCookies.issue(result.Session)],
39
+ Headers: [{ Name: 'Cache-Control', Value: 'no-store' }],
40
+ };
41
+ case 'impersonator-gone':
42
+ // The impersonator's account disappeared mid-impersonation. The stale
43
+ // block has been cleared, but there is no identity left to hand the
44
+ // session back to — defer to the default handler so the session is
45
+ // destroyed and the caller is logged out properly. Reverting used to
46
+ // dereference the missing user here and answer a logout with a 500.
47
+ return null;
48
+ default:
49
+ return null;
50
+ }
56
51
  }
57
52
  };
58
53
  exports.ImpersonationLogoutHandler = ImpersonationLogoutHandler;
59
54
  __decorate([
60
- (0, configuration_1.AutoinjectService)('rbac.session'),
61
- __metadata("design:type", rbac_1.SessionProvider)
62
- ], ImpersonationLogoutHandler.prototype, "SessionProvider", void 0);
55
+ (0, di_1.Autoinject)(ImpersonationService_js_1.ImpersonationService),
56
+ __metadata("design:type", ImpersonationService_js_1.ImpersonationService)
57
+ ], ImpersonationLogoutHandler.prototype, "Impersonation", void 0);
58
+ __decorate([
59
+ (0, di_1.Autoinject)(SessionCookies_js_1.SessionCookieFactory),
60
+ __metadata("design:type", SessionCookies_js_1.SessionCookieFactory)
61
+ ], ImpersonationLogoutHandler.prototype, "SessionCookies", void 0);
63
62
  exports.ImpersonationLogoutHandler = ImpersonationLogoutHandler = __decorate([
64
63
  (0, di_1.Injectable)(logout_js_1.LogoutHandler)
65
64
  ], ImpersonationLogoutHandler);
@@ -1 +1 @@
1
- {"version":3,"file":"ImpersonationLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/ImpersonationLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,0DAA2D;AAC3D,wCAA8E;AAC9E,0CAAqC;AACrC,4CAA4E;AAE5E;;;;GAIG;AAEI,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,yBAAa;IAAtD;;QACE,aAAQ,GAAG,EAAE,CAAC;IAsCvB,CAAC;IAjCQ,KAAK,CAAC,MAAM,CAAC,OAAuB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAuB,CAAC;QAChF,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,WAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAExD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC9C,MAAM,kBAAkB,GAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAwB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChH,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE1C,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,yEAAyE;QACzE,qBAAqB;QACrB,OAAO,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;IAChD,CAAC;IAED;;;OAGG;IACO,SAAS,CAAC,QAAc,EAAE,MAAY;QAC9C,OAAO,IAAA,WAAG,EAAC,IAAI,6BAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC;CACF,CAAA;AAvCY,gEAA0B;AAI3B;IADT,IAAA,iCAAiB,EAAC,cAAc,CAAC;8BACN,sBAAe;mEAAC;qCAJjC,0BAA0B;IADtC,IAAA,eAAU,EAAC,yBAAa,CAAC;GACb,0BAA0B,CAuCtC"}
1
+ {"version":3,"file":"ImpersonationLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/ImpersonationLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAqD;AACrD,4CAA4E;AAC5E,iFAA2E;AAC3E,qEAAqE;AAErE;;;;GAIG;AAEI,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,yBAAa;IAAtD;;QACE,aAAQ,GAAG,EAAE,CAAC;IAqCvB,CAAC;IA7BQ,KAAK,CAAC,MAAM,CAAC,OAAuB;QACzC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9E,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,UAAU;gBACb,8DAA8D;gBAC9D,wDAAwD;gBACxD,OAAO;oBACL,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE;oBAClC,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;iBACxD,CAAC;YAEJ,KAAK,mBAAmB;gBACtB,sEAAsE;gBACtE,oEAAoE;gBACpE,mEAAmE;gBACnE,qEAAqE;gBACrE,oEAAoE;gBACpE,OAAO,IAAI,CAAC;YAEd;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF,CAAA;AAtCY,gEAA0B;AAI3B;IADT,IAAA,eAAU,EAAC,8CAAoB,CAAC;8BACR,8CAAoB;iEAAC;AAGpC;IADT,IAAA,eAAU,EAAC,wCAAoB,CAAC;8BACP,wCAAoB;kEAAC;qCAPpC,0BAA0B;IADtC,IAAA,eAAU,EAAC,yBAAa,CAAC;GACb,0BAA0B,CAsCtC"}
@@ -8,9 +8,29 @@ export * from './handlers/ImpersonationLogoutHandler.js';
8
8
  export * from './handlers/DefaultLogoutHandler.js';
9
9
  export * from './controllers/UserMetadataController.js';
10
10
  export * from "./controllers/TwoFactorAuthController.js";
11
+ export * from "./controllers/TwoFactorAuthUserController.js";
12
+ export * from "./controllers/PasswordResetController.js";
13
+ export * from "./controllers/SessionsController.js";
11
14
  export * from "./cli/EnableUser2Fa.js";
12
15
  export * from "./2fa/Default2FaToken.js";
13
16
  export * from './actions/2fa.js';
17
+ export * from './services/SessionCookies.js';
18
+ export * from './services/grants.js';
19
+ export * from './services/ImpersonationService.js';
20
+ export * from './services/UserMetadataService.js';
21
+ export * from './policies/2FaPolicy.js';
22
+ export * from './events/User2FaEnabled.js';
23
+ export * from './events/User2FaDisabled.js';
24
+ export * from './events/User2FaPassed.js';
25
+ export * from './events/User2FaReset.js';
26
+ export * from './dto/confirm-password-dto.js';
27
+ export * from './dto/impersonate-dto.js';
28
+ export * from './dto/metadata-dto.js';
29
+ export * from './dto/password-dto.js';
30
+ export * from './dto/password-reset-dto.js';
31
+ export * from './dto/switchRole-dto.js';
32
+ export * from './dto/token-dto.js';
33
+ export * from './dto/userLogin-dto.js';
14
34
  export declare class RbacHttpUserBootstrapper extends Bootstrapper {
15
35
  bootstrap(): void;
16
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAIvD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,aAAa,CAAC;AAC5B,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AAEzD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kBAAkB,CAAC;AAGjC,qBACa,wBAAyB,SAAQ,YAAY;IAC/C,SAAS,IAAI,IAAI;CAO3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAIvD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAEhD,cAAc,aAAa,CAAC;AAC5B,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAElD,cAAc,yBAAyB,CAAC;AAIxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AAGvC,qBACa,wBAAyB,SAAQ,YAAY;IAC/C,SAAS,IAAI,IAAI;CAO3B"}
package/lib/cjs/index.js CHANGED
@@ -33,9 +33,31 @@ __exportStar(require("./handlers/ImpersonationLogoutHandler.js"), exports);
33
33
  __exportStar(require("./handlers/DefaultLogoutHandler.js"), exports);
34
34
  __exportStar(require("./controllers/UserMetadataController.js"), exports);
35
35
  __exportStar(require("./controllers/TwoFactorAuthController.js"), exports);
36
+ __exportStar(require("./controllers/TwoFactorAuthUserController.js"), exports);
37
+ __exportStar(require("./controllers/PasswordResetController.js"), exports);
38
+ __exportStar(require("./controllers/SessionsController.js"), exports);
36
39
  __exportStar(require("./cli/EnableUser2Fa.js"), exports);
37
40
  __exportStar(require("./2fa/Default2FaToken.js"), exports);
38
41
  __exportStar(require("./actions/2fa.js"), exports);
42
+ __exportStar(require("./services/SessionCookies.js"), exports);
43
+ __exportStar(require("./services/grants.js"), exports);
44
+ __exportStar(require("./services/ImpersonationService.js"), exports);
45
+ __exportStar(require("./services/UserMetadataService.js"), exports);
46
+ __exportStar(require("./policies/2FaPolicy.js"), exports);
47
+ // Emitted on the 2FA lifecycle and routed by name in this package's config —
48
+ // consumers need the classes themselves to subscribe by type.
49
+ __exportStar(require("./events/User2FaEnabled.js"), exports);
50
+ __exportStar(require("./events/User2FaDisabled.js"), exports);
51
+ __exportStar(require("./events/User2FaPassed.js"), exports);
52
+ __exportStar(require("./events/User2FaReset.js"), exports);
53
+ __exportStar(require("./dto/confirm-password-dto.js"), exports);
54
+ __exportStar(require("./dto/impersonate-dto.js"), exports);
55
+ __exportStar(require("./dto/metadata-dto.js"), exports);
56
+ __exportStar(require("./dto/password-dto.js"), exports);
57
+ __exportStar(require("./dto/password-reset-dto.js"), exports);
58
+ __exportStar(require("./dto/switchRole-dto.js"), exports);
59
+ __exportStar(require("./dto/token-dto.js"), exports);
60
+ __exportStar(require("./dto/userLogin-dto.js"), exports);
39
61
  let RbacHttpUserBootstrapper = class RbacHttpUserBootstrapper extends di_1.Bootstrapper {
40
62
  bootstrap() {
41
63
  rbac_1.UserMetadataBase._hiddenKeys = [
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,oCAAuD;AACvD,wCAAiD;AACjD,iEAAkE;AAElE,mEAAiD;AACjD,wEAAsD;AACtD,2EAAyD;AACzD,kEAAgD;AAEhD,8CAA4B;AAC5B,2EAAyD;AACzD,qEAAmD;AACnD,0EAAwD;AACxD,2EAAyD;AAEzD,yDAAuC;AACvC,2DAAyC;AAEzC,mDAAiC;AAI1B,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,iBAAY;IAC/C,SAAS;QACZ,uBAAgB,CAAC,WAAW,GAAG;YAC3B,GAAG,uBAAgB,CAAC,WAAW;YAC/B,2CAAsB,CAAC,KAAK;YAC5B,2CAAsB,CAAC,GAAG;SAC7B,CAAA;IACL,CAAC;CACJ,CAAA;AARY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,eAAU,EAAC,iBAAY,CAAC;GACZ,wBAAwB,CAQpC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,oCAAuD;AACvD,wCAAiD;AACjD,iEAAkE;AAElE,mEAAiD;AACjD,wEAAsD;AACtD,2EAAyD;AACzD,kEAAgD;AAEhD,8CAA4B;AAC5B,2EAAyD;AACzD,qEAAmD;AACnD,0EAAwD;AACxD,2EAAyD;AACzD,+EAA6D;AAC7D,2EAAyD;AACzD,sEAAoD;AAEpD,yDAAuC;AACvC,2DAAyC;AAEzC,mDAAiC;AAEjC,+DAA6C;AAC7C,uDAAqC;AACrC,qEAAmD;AACnD,oEAAkD;AAElD,0DAAwC;AAExC,6EAA6E;AAC7E,8DAA8D;AAC9D,6DAA2C;AAC3C,8DAA4C;AAC5C,4DAA0C;AAC1C,2DAAyC;AAEzC,gEAA8C;AAC9C,2DAAyC;AACzC,wDAAsC;AACtC,wDAAsC;AACtC,8DAA4C;AAC5C,0DAAwC;AACxC,qDAAmC;AACnC,yDAAuC;AAIhC,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,iBAAY;IAC/C,SAAS;QACZ,uBAAgB,CAAC,WAAW,GAAG;YAC3B,GAAG,uBAAgB,CAAC,WAAW;YAC/B,2CAAsB,CAAC,KAAK;YAC5B,2CAAsB,CAAC,GAAG;SAC7B,CAAA;IACL,CAAC;CACJ,CAAA;AARY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,eAAU,EAAC,iBAAY,CAAC;GACZ,wBAAwB,CAQpC"}
@@ -18,12 +18,19 @@ export interface ILogoutCookie {
18
18
  Value: string;
19
19
  Options: Record<string, unknown>;
20
20
  }
21
+ /** Response header a handler may attach to its response */
22
+ export interface ILogoutHeader {
23
+ Name: string;
24
+ Value: string;
25
+ }
21
26
  /** Response payload a handler returns when it takes ownership of the logout */
22
27
  export interface ILogoutResult {
23
28
  /** Response body */
24
29
  Body?: unknown;
25
30
  /** Cookie operations to attach */
26
31
  Cookies?: ILogoutCookie[];
32
+ /** Response headers to attach ( eg. `Clear-Site-Data` ) */
33
+ Headers?: ILogoutHeader[];
27
34
  }
28
35
  /**
29
36
  * Pluggable logout step. Handlers are resolved via `DI.resolve(Array.ofType(LogoutHandler))`
@@ -1 +1 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IAEb,oDAAoD;IACpD,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEzB,mDAAmD;IACnD,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,kCAAkC;IAClC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,aAAa;IACjC;;;OAGG;IACI,QAAQ,EAAE,MAAM,CAAO;aAEd,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAC/E"}
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IAEb,oDAAoD;IACpD,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEzB,mDAAmD;IACnD,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,kCAAkC;IAClC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAE1B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,aAAa;IACjC;;;OAGG;IACI,QAAQ,EAAE,MAAM,CAAO;aAEd,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAC/E"}
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/logout.ts"],"names":[],"mappings":";;;AAkCA;;;;;;;;;;;;;;GAcG;AACH,MAAsB,aAAa;IAAnC;QACE;;;WAGG;QACI,aAAQ,GAAW,GAAG,CAAC;IAGhC,CAAC;CAAA;AARD,sCAQC"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/logout.ts"],"names":[],"mappings":";;;AA2CA;;;;;;;;;;;;;;GAcG;AACH,MAAsB,aAAa;IAAnC;QACE;;;WAGG;QACI,aAAQ,GAAW,GAAG,CAAC;IAGhC,CAAC;CAAA;AARD,sCAQC"}
@@ -1,8 +1,28 @@
1
1
  import { BasePolicy, Request as sRequest } from '@spinajs/http';
2
2
  import { TwoFactorAuthConfig } from '@spinajs/rbac-http';
3
- export declare class TwoFacRouteEnabled extends BasePolicy {
3
+ /**
4
+ * Guards routes that only make sense when 2FA is switched on system-wide.
5
+ *
6
+ * This is the whole check for self-service routes: an already authorized user
7
+ * managing their own TOTP device has no pending 2FA step to look at. The
8
+ * login-window routes need more — see {@link TwoFacRouteEnabled}.
9
+ */
10
+ export declare class TwoFactorAuthEnabled extends BasePolicy {
4
11
  protected TwoFactorConfig: TwoFactorAuthConfig;
5
12
  isEnabled(): boolean;
13
+ execute(_req: sRequest): Promise<void>;
14
+ }
15
+ /**
16
+ * Guards the routes that belong to the login-time 2FA step: the caller has
17
+ * passed password authentication and the session is parked awaiting TOTP
18
+ * verification.
19
+ *
20
+ * Combined with `NotAuthorizedPolicy` this window is deliberately narrow. It is
21
+ * NOT the right guard for managing a TOTP device — a session sitting in this
22
+ * window has not proven possession of the second factor yet, so anything it can
23
+ * reach must not be able to weaken 2FA.
24
+ */
25
+ export declare class TwoFacRouteEnabled extends TwoFactorAuthEnabled {
6
26
  execute(req: sRequest): Promise<void>;
7
27
  }
8
28
  //# sourceMappingURL=2FaPolicy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"2FaPolicy.d.ts","sourceRoot":"","sources":["../../../src/policies/2FaPolicy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAIzD,qBAAa,kBAAmB,SAAQ,UAAU;IAEhD,SAAS,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAExC,SAAS,IAAI,OAAO;IAGpB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB7C"}
1
+ {"version":3,"file":"2FaPolicy.d.ts","sourceRoot":"","sources":["../../../src/policies/2FaPolicy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,UAAU;IAElD,SAAS,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAExC,SAAS,IAAI,OAAO;IAIpB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAO9C;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,oBAAoB;IAC7C,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBnD"}
@@ -9,19 +9,47 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.TwoFacRouteEnabled = void 0;
12
+ exports.TwoFacRouteEnabled = exports.TwoFactorAuthEnabled = void 0;
13
13
  const exceptions_1 = require("@spinajs/exceptions");
14
14
  const configuration_1 = require("@spinajs/configuration");
15
15
  const http_1 = require("@spinajs/http");
16
16
  const exceptions_2 = require("@spinajs/exceptions");
17
- class TwoFacRouteEnabled extends http_1.BasePolicy {
17
+ /**
18
+ * Guards routes that only make sense when 2FA is switched on system-wide.
19
+ *
20
+ * This is the whole check for self-service routes: an already authorized user
21
+ * managing their own TOTP device has no pending 2FA step to look at. The
22
+ * login-window routes need more — see {@link TwoFacRouteEnabled}.
23
+ */
24
+ class TwoFactorAuthEnabled extends http_1.BasePolicy {
18
25
  isEnabled() {
19
26
  return true;
20
27
  }
21
- execute(req) {
28
+ execute(_req) {
22
29
  if (this.TwoFactorConfig.enabled === false) {
23
30
  throw new exceptions_1.InvalidOperation('2 factor auth is not enabled');
24
31
  }
32
+ return Promise.resolve();
33
+ }
34
+ }
35
+ exports.TwoFactorAuthEnabled = TwoFactorAuthEnabled;
36
+ __decorate([
37
+ (0, configuration_1.Config)('rbac.twoFactorAuth'),
38
+ __metadata("design:type", Object)
39
+ ], TwoFactorAuthEnabled.prototype, "TwoFactorConfig", void 0);
40
+ /**
41
+ * Guards the routes that belong to the login-time 2FA step: the caller has
42
+ * passed password authentication and the session is parked awaiting TOTP
43
+ * verification.
44
+ *
45
+ * Combined with `NotAuthorizedPolicy` this window is deliberately narrow. It is
46
+ * NOT the right guard for managing a TOTP device — a session sitting in this
47
+ * window has not proven possession of the second factor yet, so anything it can
48
+ * reach must not be able to weaken 2FA.
49
+ */
50
+ class TwoFacRouteEnabled extends TwoFactorAuthEnabled {
51
+ async execute(req) {
52
+ await super.execute(req);
25
53
  if (!req.storage || !req.storage.Session) {
26
54
  throw new exceptions_1.InvalidOperation('Session is not set');
27
55
  }
@@ -35,8 +63,4 @@ class TwoFacRouteEnabled extends http_1.BasePolicy {
35
63
  }
36
64
  }
37
65
  exports.TwoFacRouteEnabled = TwoFacRouteEnabled;
38
- __decorate([
39
- (0, configuration_1.Config)('rbac.twoFactorAuth'),
40
- __metadata("design:type", Object)
41
- ], TwoFacRouteEnabled.prototype, "TwoFactorConfig", void 0);
42
66
  //# sourceMappingURL=2FaPolicy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"2FaPolicy.js","sourceRoot":"","sources":["../../../src/policies/2FaPolicy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAuD;AACvD,0DAAgD;AAChD,wCAAgE;AAEhE,oDAAgD;AAGhD,MAAa,kBAAmB,SAAQ,iBAAU;IAIzC,SAAS;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACM,OAAO,CAAC,GAAa;QAC1B,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,6BAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,IAAI,6BAAgB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;QAED;;WAEG;QACH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,sBAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,CAAC;QAGD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AA1BD,gDA0BC;AAxBW;IADT,IAAA,sBAAM,EAAC,oBAAoB,CAAC;;2DACkB"}
1
+ {"version":3,"file":"2FaPolicy.js","sourceRoot":"","sources":["../../../src/policies/2FaPolicy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAuD;AACvD,0DAAgD;AAChD,wCAAgE;AAEhE,oDAAgD;AAEhD;;;;;;GAMG;AACH,MAAa,oBAAqB,SAAQ,iBAAU;IAI3C,SAAS;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,IAAc;QAC3B,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,6BAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAfD,oDAeC;AAbW;IADT,IAAA,sBAAM,EAAC,oBAAoB,CAAC;;6DACkB;AAejD;;;;;;;;;GASG;AACH,MAAa,kBAAmB,SAAQ,oBAAoB;IACnD,KAAK,CAAC,OAAO,CAAC,GAAa;QAChC,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,IAAI,6BAAgB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;QAED;;WAEG;QACH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,sBAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAjBD,gDAiBC"}
@@ -0,0 +1,90 @@
1
+ import { SessionProvider, User } from '@spinajs/rbac';
2
+ import type { ISession } from '@spinajs/rbac';
3
+ /** Session keys holding the impersonation block. */
4
+ export declare const IMPERSONATION_KEYS: {
5
+ readonly IMPERSONATOR: "Impersonator";
6
+ readonly STARTED_AT: "ImpersonationStartedAt";
7
+ readonly ORIGINAL_ACTIVE_ROLE: "OriginalActiveRole";
8
+ /**
9
+ * Numeric id of the impersonator, stashed because `session.UserId` is handed
10
+ * over to the target for the duration — see {@link ImpersonationService.start}.
11
+ */
12
+ readonly ORIGINAL_USER_ID: "OriginalUserId";
13
+ };
14
+ /** Outcome of an attempt to end an impersonation. */
15
+ export type RevertResult =
16
+ /** Impersonation ended; the original user is back in the session. */
17
+ {
18
+ Status: 'reverted';
19
+ Original: User;
20
+ ActiveRole: string | undefined;
21
+ Session: ISession;
22
+ }
23
+ /** The session carried no impersonation — nothing was changed. */
24
+ | {
25
+ Status: 'not-impersonating';
26
+ }
27
+ /** The impersonator no longer exists; the stale block was cleared. */
28
+ | {
29
+ Status: 'impersonator-gone';
30
+ };
31
+ /**
32
+ * Owns the impersonation session block.
33
+ *
34
+ * The revert path is reachable two ways — explicitly via `DELETE /auth/impersonate`
35
+ * and implicitly when an impersonating user logs out — and both used to carry
36
+ * their own copy of the key juggling. The copies had already drifted: the logout
37
+ * handler dereferenced a deleted impersonator without a guard and answered a
38
+ * logout with a 500, while the controller handled that same case.
39
+ */
40
+ export declare class ImpersonationService {
41
+ protected SessionProvider: SessionProvider;
42
+ /** True when the session is currently acting as somebody else. */
43
+ isActive(session: ISession | null | undefined): boolean;
44
+ /**
45
+ * Begin acting as `target`. The impersonator's own ActiveRole is stashed so
46
+ * `revert` can restore it, and the effective ActiveRole becomes the target's
47
+ * first role.
48
+ *
49
+ * Two things beyond the key juggling:
50
+ *
51
+ * - the session id is REGENERATED. Assuming another identity is a privilege
52
+ * change, and a privilege change on a session id that an attacker may
53
+ * already know is the definition of session fixation.
54
+ * - `session.UserId` is handed over to the target and the impersonator's own
55
+ * id is stashed. Ownership is what `deleteByUser` keys on, so while the
56
+ * impersonation runs, "log this user out everywhere" aimed at the target
57
+ * reaches the impersonating session too — which is exactly what an
58
+ * administrator killing a compromised account expects.
59
+ *
60
+ * @returns the regenerated session and the ActiveRole now in effect
61
+ */
62
+ start(session: ISession, impersonator: User, target: User, startedAt: string): Promise<{
63
+ Session: ISession;
64
+ ActiveRole: string | undefined;
65
+ }>;
66
+ /**
67
+ * End an active impersonation and put the original user back in the session.
68
+ *
69
+ * The session survives either way — reverting is not a logout. When the
70
+ * original user is gone the impersonation block is still cleared, so the
71
+ * session stops claiming an identity that cannot be resolved, and the caller
72
+ * is told to re-authenticate rather than being handed a 500.
73
+ */
74
+ revert(session: ISession | null | undefined, target: User): Promise<RevertResult>;
75
+ /** Drops the impersonation keys and persists the session under the same id. */
76
+ protected clearBlock(session: ISession): Promise<void>;
77
+ /** Removes the impersonation keys from session data without persisting. */
78
+ protected dropBlockKeys(session: ISession): void;
79
+ /**
80
+ * Load the original (impersonator) user, or undefined when the account is
81
+ * gone. Extracted so tests can stub it without a database.
82
+ */
83
+ protected loadOriginal(uuid: string): Promise<User | undefined>;
84
+ /**
85
+ * Hook for tests to intercept event emission without stubbing the
86
+ * module-level `_ev` ESM binding.
87
+ */
88
+ protected emitEnded(original: User, target: User): Promise<void>;
89
+ }
90
+ //# sourceMappingURL=ImpersonationService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImpersonationService.d.ts","sourceRoot":"","sources":["../../../src/services/ImpersonationService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,IAAI,EAA6C,MAAM,eAAe,CAAC;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,oDAAoD;AACpD,eAAO,MAAM,kBAAkB;;;;IAK7B;;;OAGG;;CAEK,CAAC;AAEX,qDAAqD;AACrD,MAAM,MAAM,YAAY;AACtB,qEAAqE;AACnE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE;AAC3F,kEAAkE;GAChE;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE;AACjC,sEAAsE;GACpE;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEpC;;;;;;;;GAQG;AACH,qBACa,oBAAoB;IAE/B,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IAE3C,kEAAkE;IAC3D,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;IAI9D;;;;;;;;;;;;;;;;;OAiBG;IACU,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAwB1J;;;;;;;OAOG;IACU,MAAM,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAuC9F,+EAA+E;cAC/D,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D,2EAA2E;IAC3E,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAOhD;;;OAGG;cACa,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAIrE;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAGjE"}