@spinajs/rbac-http-user 2.0.486 → 2.0.488

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 @@
1
+ {"version":3,"file":"password-reset-dto.js","sourceRoot":"","sources":["../../../src/dto/password-reset-dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,MAAM,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,uBAAuB;IADnC,MAAM,CAAC,6BAA6B,CAAC;;GACzB,uBAAuB,CAMnC;;AAED,MAAM,CAAC,MAAM,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,uBAAuB;IADnC,MAAM,CAAC,6BAA6B,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"}
@@ -7,10 +7,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Injectable } from '@spinajs/di';
11
- import { AutoinjectService, Config } from '@spinajs/configuration';
12
- import { SessionProvider } from '@spinajs/rbac';
10
+ import { Autoinject, Injectable } from '@spinajs/di';
11
+ import { AutoinjectService } from '@spinajs/configuration';
12
+ import { SessionProvider, hashSessionId } from '@spinajs/rbac';
13
+ import { Log, Logger } from '@spinajs/log';
13
14
  import { LogoutHandler } from '../logout.js';
15
+ import { SessionCookieFactory } from '../services/SessionCookies.js';
14
16
  /**
15
17
  * Default logout handler: deletes the session and clears the ssid cookie.
16
18
  * Runs last (priority 999) so any earlier handler can short-circuit (e.g.
@@ -27,30 +29,35 @@ let DefaultLogoutHandler = class DefaultLogoutHandler extends LogoutHandler {
27
29
  return { Body: null };
28
30
  }
29
31
  await this.SessionProvider.delete(context.Ssid);
32
+ this.Log.info(`Session destroyed by logout`, {
33
+ Session: hashSessionId(context.Ssid),
34
+ User: context.User?.Uuid,
35
+ });
30
36
  return {
31
37
  Body: null,
32
- Cookies: [
33
- {
34
- Name: 'ssid',
35
- Value: '',
36
- Options: {
37
- httpOnly: true,
38
- maxAge: 0,
39
- ...this.SessionCookieConfig,
40
- },
41
- },
38
+ Cookies: [this.SessionCookies.clear()],
39
+ Headers: [
40
+ // Drop everything this origin left in the browser, not just the cookie:
41
+ // a cached authenticated page is still readable after logout on a
42
+ // shared machine, and `max-age=0` on the cookie does nothing about it.
43
+ { Name: 'Clear-Site-Data', Value: '"cache", "cookies", "storage"' },
44
+ { Name: 'Cache-Control', Value: 'no-store' },
42
45
  ],
43
46
  };
44
47
  }
45
48
  };
49
+ __decorate([
50
+ Logger('rbac-session'),
51
+ __metadata("design:type", Log)
52
+ ], DefaultLogoutHandler.prototype, "Log", void 0);
46
53
  __decorate([
47
54
  AutoinjectService('rbac.session'),
48
55
  __metadata("design:type", SessionProvider)
49
56
  ], DefaultLogoutHandler.prototype, "SessionProvider", void 0);
50
57
  __decorate([
51
- Config('rbac.session.cookie', {}),
52
- __metadata("design:type", Object)
53
- ], DefaultLogoutHandler.prototype, "SessionCookieConfig", void 0);
58
+ Autoinject(SessionCookieFactory),
59
+ __metadata("design:type", SessionCookieFactory)
60
+ ], DefaultLogoutHandler.prototype, "SessionCookies", void 0);
54
61
  DefaultLogoutHandler = __decorate([
55
62
  Injectable(LogoutHandler)
56
63
  ], DefaultLogoutHandler);
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/DefaultLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAiC,MAAM,cAAc,CAAC;AAE5E;;;;GAIG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,aAAa;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;AA5BW;IADT,iBAAiB,CAAC,cAAc,CAAC;8BACN,eAAe;6DAAC;AAGlC;IADT,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;;iEACsB;AAP7C,oBAAoB;IADhC,UAAU,CAAC,aAAa,CAAC;GACb,oBAAoB,CAgChC"}
1
+ {"version":3,"file":"DefaultLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/DefaultLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAiC,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE;;;;GAIG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,aAAa;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,aAAa,CAAC,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;AAjCW;IADT,MAAM,CAAC,cAAc,CAAC;8BACP,GAAG;iDAAC;AAGV;IADT,iBAAiB,CAAC,cAAc,CAAC;8BACN,eAAe;6DAAC;AAGlC;IADT,UAAU,CAAC,oBAAoB,CAAC;8BACN,oBAAoB;4DAAC;AAVrC,oBAAoB;IADhC,UAAU,CAAC,aAAa,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"}
@@ -7,11 +7,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Injectable } from '@spinajs/di';
11
- import { AutoinjectService } from '@spinajs/configuration';
12
- import { SessionProvider, User, UserImpersonationEnded } from '@spinajs/rbac';
13
- import { _ev } from '@spinajs/queue';
10
+ import { Autoinject, Injectable } from '@spinajs/di';
14
11
  import { LogoutHandler } from '../logout.js';
12
+ import { ImpersonationService } from '../services/ImpersonationService.js';
13
+ import { SessionCookieFactory } from '../services/SessionCookies.js';
15
14
  /**
16
15
  * Logout handler that detects an active impersonation and reverts it instead
17
16
  * of destroying the session. Runs early (priority 10) so it short-circuits
@@ -23,39 +22,39 @@ let ImpersonationLogoutHandler = class ImpersonationLogoutHandler extends Logout
23
22
  this.Priority = 10;
24
23
  }
25
24
  async handle(context) {
26
- const session = context.Session;
27
- if (!session)
25
+ if (!this.Impersonation.isActive(context.Session)) {
28
26
  return null;
29
- const impersonatorUuid = session.Data.get('Impersonator');
30
- if (!impersonatorUuid)
31
- return null;
32
- const original = await User.getByUuid(impersonatorUuid);
33
- session.Data.set('User', original.Uuid);
34
- session.Data.delete('Impersonator');
35
- session.Data.delete('ImpersonationStartedAt');
36
- const restoredActiveRole = session.Data.get('OriginalActiveRole') ?? original.Role?.[0];
37
- if (restoredActiveRole) {
38
- session.Data.set('ActiveRole', restoredActiveRole);
39
27
  }
40
- session.Data.delete('OriginalActiveRole');
41
- await this.SessionProvider.save(session);
42
- await this.emitEvent(original, context.User);
43
- // Take ownership of the response: no cookie change — the original user's
44
- // session continues.
45
- return { Body: { ImpersonationEnded: true } };
46
- }
47
- /**
48
- * Hook for tests to intercept event emission without stubbing the module-level
49
- * `_ev` ESM binding.
50
- */
51
- emitEvent(original, target) {
52
- return _ev(new UserImpersonationEnded(original, target))();
28
+ const result = await this.Impersonation.revert(context.Session, context.User);
29
+ switch (result.Status) {
30
+ case 'reverted':
31
+ // Take ownership of the response: the original user's session
32
+ // continues, under the new id the revert rotated it to.
33
+ return {
34
+ Body: { ImpersonationEnded: true },
35
+ Cookies: [this.SessionCookies.issue(result.Session)],
36
+ Headers: [{ Name: 'Cache-Control', Value: 'no-store' }],
37
+ };
38
+ case 'impersonator-gone':
39
+ // The impersonator's account disappeared mid-impersonation. The stale
40
+ // block has been cleared, but there is no identity left to hand the
41
+ // session back to — defer to the default handler so the session is
42
+ // destroyed and the caller is logged out properly. Reverting used to
43
+ // dereference the missing user here and answer a logout with a 500.
44
+ return null;
45
+ default:
46
+ return null;
47
+ }
53
48
  }
54
49
  };
55
50
  __decorate([
56
- AutoinjectService('rbac.session'),
57
- __metadata("design:type", SessionProvider)
58
- ], ImpersonationLogoutHandler.prototype, "SessionProvider", void 0);
51
+ Autoinject(ImpersonationService),
52
+ __metadata("design:type", ImpersonationService)
53
+ ], ImpersonationLogoutHandler.prototype, "Impersonation", void 0);
54
+ __decorate([
55
+ Autoinject(SessionCookieFactory),
56
+ __metadata("design:type", SessionCookieFactory)
57
+ ], ImpersonationLogoutHandler.prototype, "SessionCookies", void 0);
59
58
  ImpersonationLogoutHandler = __decorate([
60
59
  Injectable(LogoutHandler)
61
60
  ], ImpersonationLogoutHandler);
@@ -1 +1 @@
1
- {"version":3,"file":"ImpersonationLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/ImpersonationLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAiC,MAAM,cAAc,CAAC;AAE5E;;;;GAIG;AAEI,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,aAAa;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,IAAI,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,GAAG,CAAC,IAAI,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC;CACF,CAAA;AAnCW;IADT,iBAAiB,CAAC,cAAc,CAAC;8BACN,eAAe;mEAAC;AAJjC,0BAA0B;IADtC,UAAU,CAAC,aAAa,CAAC;GACb,0BAA0B,CAuCtC"}
1
+ {"version":3,"file":"ImpersonationLogoutHandler.js","sourceRoot":"","sources":["../../../src/handlers/ImpersonationLogoutHandler.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAiC,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE;;;;GAIG;AAEI,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,aAAa;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;AAlCW;IADT,UAAU,CAAC,oBAAoB,CAAC;8BACR,oBAAoB;iEAAC;AAGpC;IADT,UAAU,CAAC,oBAAoB,CAAC;8BACP,oBAAoB;kEAAC;AAPpC,0BAA0B;IADtC,UAAU,CAAC,aAAa,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/mjs/index.js CHANGED
@@ -16,9 +16,31 @@ export * from './handlers/ImpersonationLogoutHandler.js';
16
16
  export * from './handlers/DefaultLogoutHandler.js';
17
17
  export * from './controllers/UserMetadataController.js';
18
18
  export * from "./controllers/TwoFactorAuthController.js";
19
+ export * from "./controllers/TwoFactorAuthUserController.js";
20
+ export * from "./controllers/PasswordResetController.js";
21
+ export * from "./controllers/SessionsController.js";
19
22
  export * from "./cli/EnableUser2Fa.js";
20
23
  export * from "./2fa/Default2FaToken.js";
21
24
  export * from './actions/2fa.js';
25
+ export * from './services/SessionCookies.js';
26
+ export * from './services/grants.js';
27
+ export * from './services/ImpersonationService.js';
28
+ export * from './services/UserMetadataService.js';
29
+ export * from './policies/2FaPolicy.js';
30
+ // Emitted on the 2FA lifecycle and routed by name in this package's config —
31
+ // consumers need the classes themselves to subscribe by type.
32
+ export * from './events/User2FaEnabled.js';
33
+ export * from './events/User2FaDisabled.js';
34
+ export * from './events/User2FaPassed.js';
35
+ export * from './events/User2FaReset.js';
36
+ export * from './dto/confirm-password-dto.js';
37
+ export * from './dto/impersonate-dto.js';
38
+ export * from './dto/metadata-dto.js';
39
+ export * from './dto/password-dto.js';
40
+ export * from './dto/password-reset-dto.js';
41
+ export * from './dto/switchRole-dto.js';
42
+ export * from './dto/token-dto.js';
43
+ export * from './dto/userLogin-dto.js';
22
44
  let RbacHttpUserBootstrapper = class RbacHttpUserBootstrapper extends Bootstrapper {
23
45
  bootstrap() {
24
46
  UserMetadataBase._hiddenKeys = [
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,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;AAI1B,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,YAAY;IAC/C,SAAS;QACZ,gBAAgB,CAAC,WAAW,GAAG;YAC3B,GAAG,gBAAgB,CAAC,WAAW;YAC/B,sBAAsB,CAAC,KAAK;YAC5B,sBAAsB,CAAC,GAAG;SAC7B,CAAA;IACL,CAAC;CACJ,CAAA;AARY,wBAAwB;IADpC,UAAU,CAAC,YAAY,CAAC;GACZ,wBAAwB,CAQpC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,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;AAExC,6EAA6E;AAC7E,8DAA8D;AAC9D,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;AAIhC,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,YAAY;IAC/C,SAAS;QACZ,gBAAgB,CAAC,WAAW,GAAG;YAC3B,GAAG,gBAAgB,CAAC,WAAW;YAC/B,sBAAsB,CAAC,KAAK;YAC5B,sBAAsB,CAAC,GAAG;SAC7B,CAAA;IACL,CAAC;CACJ,CAAA;AARY,wBAAwB;IADpC,UAAU,CAAC,YAAY,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,MAAM,OAAgB,aAAa;IAAnC;QACE;;;WAGG;QACI,aAAQ,GAAW,GAAG,CAAC;IAGhC,CAAC;CAAA"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/logout.ts"],"names":[],"mappings":"AA2CA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,aAAa;IAAnC;QACE;;;WAGG;QACI,aAAQ,GAAW,GAAG,CAAC;IAGhC,CAAC;CAAA"}
@@ -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"}
@@ -11,14 +11,41 @@ import { InvalidOperation } from '@spinajs/exceptions';
11
11
  import { Config } from '@spinajs/configuration';
12
12
  import { BasePolicy } from '@spinajs/http';
13
13
  import { Forbidden } from '@spinajs/exceptions';
14
- export class TwoFacRouteEnabled extends BasePolicy {
14
+ /**
15
+ * Guards routes that only make sense when 2FA is switched on system-wide.
16
+ *
17
+ * This is the whole check for self-service routes: an already authorized user
18
+ * managing their own TOTP device has no pending 2FA step to look at. The
19
+ * login-window routes need more — see {@link TwoFacRouteEnabled}.
20
+ */
21
+ export class TwoFactorAuthEnabled extends BasePolicy {
15
22
  isEnabled() {
16
23
  return true;
17
24
  }
18
- execute(req) {
25
+ execute(_req) {
19
26
  if (this.TwoFactorConfig.enabled === false) {
20
27
  throw new InvalidOperation('2 factor auth is not enabled');
21
28
  }
29
+ return Promise.resolve();
30
+ }
31
+ }
32
+ __decorate([
33
+ Config('rbac.twoFactorAuth'),
34
+ __metadata("design:type", Object)
35
+ ], TwoFactorAuthEnabled.prototype, "TwoFactorConfig", void 0);
36
+ /**
37
+ * Guards the routes that belong to the login-time 2FA step: the caller has
38
+ * passed password authentication and the session is parked awaiting TOTP
39
+ * verification.
40
+ *
41
+ * Combined with `NotAuthorizedPolicy` this window is deliberately narrow. It is
42
+ * NOT the right guard for managing a TOTP device — a session sitting in this
43
+ * window has not proven possession of the second factor yet, so anything it can
44
+ * reach must not be able to weaken 2FA.
45
+ */
46
+ export class TwoFacRouteEnabled extends TwoFactorAuthEnabled {
47
+ async execute(req) {
48
+ await super.execute(req);
22
49
  if (!req.storage || !req.storage.Session) {
23
50
  throw new InvalidOperation('Session is not set');
24
51
  }
@@ -31,8 +58,4 @@ export class TwoFacRouteEnabled extends BasePolicy {
31
58
  return Promise.resolve();
32
59
  }
33
60
  }
34
- __decorate([
35
- Config('rbac.twoFactorAuth'),
36
- __metadata("design:type", Object)
37
- ], TwoFacRouteEnabled.prototype, "TwoFactorConfig", void 0);
38
61
  //# sourceMappingURL=2FaPolicy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"2FaPolicy.js","sourceRoot":"","sources":["../../../src/policies/2FaPolicy.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAuB,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,OAAO,kBAAmB,SAAQ,UAAU;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,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,IAAI,gBAAgB,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,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,CAAC;QAGD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAxBW;IADT,MAAM,CAAC,oBAAoB,CAAC;;2DACkB"}
1
+ {"version":3,"file":"2FaPolicy.js","sourceRoot":"","sources":["../../../src/policies/2FaPolicy.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAuB,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,UAAU;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,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAbW;IADT,MAAM,CAAC,oBAAoB,CAAC;;6DACkB;AAejD;;;;;;;;;GASG;AACH,MAAM,OAAO,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,gBAAgB,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,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -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"}