@spinajs/rbac-http-user 2.0.485 → 2.0.487

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +12 -5
  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
@@ -1,43 +1,10 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
2
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
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;
22
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
23
7
  };
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
8
  var __metadata = (this && this.__metadata) || function (k, v) {
42
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
10
  };
@@ -51,10 +18,10 @@ const rbac_1 = require("@spinajs/rbac");
51
18
  const http_1 = require("@spinajs/http");
52
19
  const exceptions_1 = require("@spinajs/exceptions");
53
20
  const di_1 = require("@spinajs/di");
54
- const configuration_1 = require("@spinajs/configuration");
55
- const cs = __importStar(require("cookie-signature"));
56
21
  const rbac_http_1 = require("@spinajs/rbac-http");
57
22
  const util_1 = require("@spinajs/util");
23
+ const grants_js_1 = require("../services/grants.js");
24
+ const SessionCookies_js_1 = require("../services/SessionCookies.js");
58
25
  /**
59
26
  * Current user profile management.
60
27
  * Allows an authenticated user to read and modify their own account — refresh profile data,
@@ -75,10 +42,11 @@ let UserController = class UserController extends http_1.BaseController {
75
42
  // get user data from db
76
43
  await user.refresh();
77
44
  await user.Metadata.populate();
78
- // refresh session data from DB
79
- const sId = cs.unsign(ssid, this.CoockieSecret);
80
- if (sId) {
81
- const session = await this.SessionProvider.restore(sId);
45
+ // `@Cookie(true)` hands over the already-unsigned session id the previous
46
+ // unsigned read plus a hand-rolled `cookie-signature` call duplicated what
47
+ // the framework's own extractor does, secret lookup included.
48
+ if (ssid) {
49
+ const session = await this.SessionProvider.restore(ssid);
82
50
  if (session) {
83
51
  // Session stores the user UUID (see LoginController) — RbacUserFactory
84
52
  // resolves the user from it on each request. Storing a dehydrated object
@@ -87,22 +55,28 @@ let UserController = class UserController extends http_1.BaseController {
87
55
  await this.SessionProvider.save(session);
88
56
  }
89
57
  }
90
- return new http_1.Ok(user.dehydrate());
58
+ // Same shape as every other user-bearing response ( login, whoami, 2FA
59
+ // verify ): relations included and DateTime rendered as ISO strings. Plain
60
+ // `dehydrate()` dropped Role/Metadata and emitted raw DateTime objects, so
61
+ // a client refreshing its profile got a different user than it logged in with.
62
+ return new http_1.Ok(user.dehydrateWithRelations({ dateTimeFormat: 'iso' }));
91
63
  }
92
64
  /**
93
65
  * Get current user grants
94
- * Returns the flattened RBAC grants for the authenticated user, combining all roles
95
- * the user is assigned to into a single permission map keyed by resource.
66
+ * Returns the flattened RBAC grants in effect for the authenticated user those of
67
+ * the session's active role, resolved through its inheritance chain. Switching the
68
+ * active role (`POST /auth/active-role`) changes what this returns.
96
69
  * @security cookieAuth
97
- * @returns {IGrantsMap} Combined RBAC grants map: resource → action → permission descriptor
70
+ * @returns {IGrantsMap} RBAC grants map for the active role: resource → action → permission descriptor
98
71
  * @response 401 Unauthorized — valid session required
99
72
  * @response 403 Forbidden — insufficient permissions
100
73
  */
101
- async getGrants(user) {
102
- const grants = this.AC.getGrants();
103
- const userGrants = user.Role.map(r => (0, rbac_1._unwindGrants)(r, grants));
104
- const combinedGrants = Object.assign({}, ...userGrants);
105
- return new http_1.Ok(combinedGrants);
74
+ async getGrants(user, session) {
75
+ // Enforcement is bound to the session's ActiveRole, so reporting the union
76
+ // of every assigned role told clients about actions the server would then
77
+ // refuse a user holding both 'admin' and 'user' saw admin grants while
78
+ // acting as 'user'. Resolve exactly what the middleware resolves.
79
+ return new http_1.Ok((0, grants_js_1.grantsFor)(this.AC, (0, grants_js_1.activeRoleOf)(user, session)));
106
80
  }
107
81
  /**
108
82
  * Change own password
@@ -113,13 +87,35 @@ let UserController = class UserController extends http_1.BaseController {
113
87
  * @response 401 Unauthorized — valid session required
114
88
  * @response 403 Forbidden — insufficient permissions
115
89
  */
116
- async newPassword(user, pwd) {
90
+ async newPassword(user, pwd, session) {
117
91
  if (pwd.Password !== pwd.ConfirmPassword) {
118
92
  throw new exceptions_1.InvalidArgument('password does not match');
119
93
  }
120
- return new http_1.Ok((0, util_1._chain)(user, (0, util_1._either)((0, rbac_1.passwordMatch)(pwd.OldPassword), (0, rbac_1.changePassword)(pwd.Password), () => {
94
+ await (0, util_1._chain)(user, (0, util_1._either)((0, rbac_1.passwordMatch)(pwd.OldPassword), (0, rbac_1.changePassword)(pwd.Password), () => {
121
95
  throw new exceptions_1.InvalidArgument('Old password is incorrect');
122
- })));
96
+ }));
97
+ // `changePassword` destroys every session of this user — anyone who got in
98
+ // with the old password is out, which is the whole point. That includes the
99
+ // caller's own session, so it is replaced here with a brand new one ( a new
100
+ // id, not the old one revived ) and the client is handed the new cookie.
101
+ const replacement = new rbac_1.UserSession();
102
+ replacement.UserId = user.Id;
103
+ if (session) {
104
+ for (const [key, value] of session.Data) {
105
+ replacement.Data.set(key, value);
106
+ }
107
+ }
108
+ else {
109
+ replacement.Data.set('User', user.Uuid);
110
+ replacement.Data.set('Logged', true);
111
+ replacement.Data.set('Authorized', true);
112
+ replacement.Data.set('ActiveRole', user.Role?.[0]);
113
+ }
114
+ await this.SessionProvider.save(replacement);
115
+ return new http_1.Ok(null, {
116
+ Coockies: [this.SessionCookies.issue(replacement)],
117
+ Headers: [{ Name: 'Cache-Control', Value: 'no-store' }],
118
+ });
123
119
  }
124
120
  };
125
121
  exports.UserController = UserController;
@@ -127,10 +123,6 @@ __decorate([
127
123
  (0, di_1.Autoinject)(),
128
124
  __metadata("design:type", rbac_1.PasswordProvider)
129
125
  ], UserController.prototype, "PasswordProvider", void 0);
130
- __decorate([
131
- (0, configuration_1.Config)('http.cookie.secret'),
132
- __metadata("design:type", String)
133
- ], UserController.prototype, "CoockieSecret", void 0);
134
126
  __decorate([
135
127
  (0, di_1.Autoinject)(),
136
128
  __metadata("design:type", rbac_1.SessionProvider)
@@ -139,11 +131,15 @@ __decorate([
139
131
  (0, di_1.Autoinject)(rbac_1.AccessControl),
140
132
  __metadata("design:type", rbac_1.AccessControl)
141
133
  ], UserController.prototype, "AC", void 0);
134
+ __decorate([
135
+ (0, di_1.Autoinject)(SessionCookies_js_1.SessionCookieFactory),
136
+ __metadata("design:type", SessionCookies_js_1.SessionCookieFactory)
137
+ ], UserController.prototype, "SessionCookies", void 0);
142
138
  __decorate([
143
139
  (0, http_1.Get)(),
144
140
  (0, rbac_http_1.Permission)(['readOwn']),
145
141
  __param(0, (0, rbac_http_1.User)()),
146
- __param(1, (0, http_1.Cookie)()),
142
+ __param(1, (0, rbac_http_1.SessionId)()),
147
143
  __metadata("design:type", Function),
148
144
  __metadata("design:paramtypes", [rbac_1.User, String]),
149
145
  __metadata("design:returntype", Promise)
@@ -152,8 +148,9 @@ __decorate([
152
148
  (0, http_1.Get)("grants"),
153
149
  (0, rbac_http_1.Permission)(['readOwn']),
154
150
  __param(0, (0, rbac_http_1.User)()),
151
+ __param(1, (0, rbac_http_1.Session)()),
155
152
  __metadata("design:type", Function),
156
- __metadata("design:paramtypes", [rbac_1.User]),
153
+ __metadata("design:paramtypes", [rbac_1.User, Object]),
157
154
  __metadata("design:returntype", Promise)
158
155
  ], UserController.prototype, "getGrants", null);
159
156
  __decorate([
@@ -161,8 +158,9 @@ __decorate([
161
158
  (0, rbac_http_1.Permission)(["updateOwn"]),
162
159
  __param(0, (0, rbac_http_1.User)()),
163
160
  __param(1, (0, http_1.Body)()),
161
+ __param(2, (0, rbac_http_1.Session)()),
164
162
  __metadata("design:type", Function),
165
- __metadata("design:paramtypes", [rbac_1.User, password_dto_js_1.PasswordDto]),
163
+ __metadata("design:paramtypes", [rbac_1.User, password_dto_js_1.PasswordDto, Object]),
166
164
  __metadata("design:returntype", Promise)
167
165
  ], UserController.prototype, "newPassword", null);
168
166
  exports.UserController = UserController = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"UserController.js","sourceRoot":"","sources":["../../../src/controllers/UserController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserController.js","sourceRoot":"","sources":["../../../src/controllers/UserController.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,20 @@ import { User as UserModel, UserMetadata } from '@spinajs/rbac';
3
3
  import { PaginationDTO, OrderDTO, IFilterRequest } from '@spinajs/orm-http';
4
4
  import { UserMetadataDto } from '../dto/metadata-dto.js';
5
5
  import { FilterableUserMetadata } from '../models/FilterableUserMetadata.js';
6
+ import { UserMetadataService } from '../services/UserMetadataService.js';
6
7
  /**
7
8
  * User metadata management.
8
9
  * Provides CRUD operations for key-value metadata entries attached to user accounts.
9
10
  * Admin routes operate on any user (identified by UUID), while own routes operate on the
10
11
  * currently authenticated user's metadata.
12
+ *
13
+ * Both families delegate to {@link UserMetadataService}, which owns the owner
14
+ * scoping — the only thing that ever differed between them is where the owner
15
+ * id comes from.
11
16
  * @tags User Metadata
12
17
  */
13
18
  export declare class UserMetadataController extends BaseController {
19
+ protected Metadata: UserMetadataService;
14
20
  /**
15
21
  * List metadata for a specific user (admin)
16
22
  * Returns a paginated, filtered, and ordered list of metadata entries for the given user.
@@ -74,18 +80,6 @@ export declare class UserMetadataController extends BaseController {
74
80
  * @response 404 User or metadata entry not found
75
81
  */
76
82
  deleteUserMetadata(user: UserModel, meta: number): Promise<Ok<any>>;
77
- /**
78
- * List own metadata
79
- * Returns a paginated, filtered, and ordered list of metadata entries for the authenticated user.
80
- * @security cookieAuth
81
- * @param pagination.page Page number (zero-based)
82
- * @param pagination.limit Number of entries per page
83
- * @param order.column Column to sort by (default: Id)
84
- * @param order.order Sort direction: ASC or DESC (default: DESC)
85
- * @returns {IUserMetadataEntry[]} Paginated list of own metadata entries
86
- * @response 401 Unauthorized — valid session required
87
- * @response 403 Forbidden — readOwn permission required
88
- */
89
83
  /**
90
84
  * List own metadata
91
85
  * Returns a paginated, filtered, and ordered list of metadata entries for the authenticated user.
@@ -1 +1 @@
1
- {"version":3,"file":"UserMetadataController.d.ts","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,EAAE,EAAwC,cAAc,EAAS,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAW,aAAa,EAAE,QAAQ,EAAU,cAAc,EAAa,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAS7E;;;;;;GAMG;AACH,qBAGa,sBAAuB,SAAQ,cAAc;IAEtD;;;;;;;;;;;;;OAaG;IAGU,YAAY,CACc,IAAI,EAAE,SAAS,EACzC,UAAU,CAAC,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,QAAQ,EAEzB,MAAM,CAAC,EAAE,cAAc;IAc3B;;;;;;;;;;OAUG;IAGU,WAAW,CACe,IAAI,EAAE,SAAS,EACzC,GAAG,EAAE,MAAM;IAOxB;;;;;;;;;OASG;IAGU,eAAe,CACW,IAAI,EAAE,SAAS,EACvC,QAAQ,EAAE,YAAY;IAOrC;;;;;;;;;;;OAWG;IAGU,kBAAkB,CAOxB,IAAI,EAAE,YAAY,EACc,KAAK,EAAE,SAAS,EAC3C,IAAI,EAAE,eAAe;IAUjC;;;;;;;;;;OAUG;IAGU,kBAAkB,CACQ,IAAI,EAAE,SAAS,EACzC,IAAI,EAAE,MAAM;IASzB;;;;;;;;;;;OAWG;IAIH;;;;;;;;;;;OAWG;IAGU,QAAQ,CACT,IAAI,EAAE,SAAS,EACd,UAAU,CAAC,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,QAAQ,EAEzB,MAAM,CAAC,EAAE,cAAc;IAe3B;;;;;;;;;OASG;IAGU,OAAO,CAAS,IAAI,EAAE,SAAS,EAAW,GAAG,EAAE,MAAM;IAOlE;;;;;;;OAOG;IAGU,WAAW,CAAS,IAAI,EAAE,SAAS,EAAa,QAAQ,EAAE,YAAY;IAQnF;;;;;;;;;;OAUG;IAGU,cAAc,CAAS,IAAI,EAAE,SAAS,EAAW,IAAI,EAAE,MAAM,EAAU,IAAI,EAAE,eAAe;IAkBzG;;;;;;;;;OASG;IAGU,cAAc,CAAS,IAAI,EAAE,SAAS,EAAW,IAAI,EAAE,MAAM;CAK7E"}
1
+ {"version":3,"file":"UserMetadataController.d.ts","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,EAAE,EAAwC,cAAc,EAAS,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGhE,OAAO,EAAW,aAAa,EAAE,QAAQ,EAAU,cAAc,EAAa,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;;;;;GAUG;AACH,qBAGa,sBAAuB,SAAQ,cAAc;IAGtD,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IAExC;;;;;;;;;;;;;OAaG;IAGU,YAAY,CACc,IAAI,EAAE,SAAS,EACzC,UAAU,CAAC,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,QAAQ,EAEzB,MAAM,CAAC,EAAE,cAAc;IAM3B;;;;;;;;;;OAUG;IAGU,WAAW,CACe,IAAI,EAAE,SAAS,EACzC,GAAG,EAAE,MAAM;IAIxB;;;;;;;;;OASG;IAGU,eAAe,CACW,IAAI,EAAE,SAAS,EACvC,QAAQ,EAAE,YAAY;IAMrC;;;;;;;;;;;OAWG;IAGU,kBAAkB,CAOxB,IAAI,EAAE,YAAY,EACc,KAAK,EAAE,SAAS,EAC3C,IAAI,EAAE,eAAe;IAUjC;;;;;;;;;;OAUG;IAGU,kBAAkB,CACQ,IAAI,EAAE,SAAS,EACzC,IAAI,EAAE,MAAM;IAMzB;;;;;;;;;;;OAWG;IAGU,QAAQ,CACT,IAAI,EAAE,SAAS,EACd,UAAU,CAAC,EAAE,aAAa,EAC1B,KAAK,CAAC,EAAE,QAAQ,EAEzB,MAAM,CAAC,EAAE,cAAc;IAK3B;;;;;;;;;OASG;IAGU,OAAO,CAAS,IAAI,EAAE,SAAS,EAAW,GAAG,EAAE,MAAM;IAIlE;;;;;;;OAOG;IAGU,WAAW,CAAS,IAAI,EAAE,SAAS,EAAa,QAAQ,EAAE,YAAY;IAKnF;;;;;;;;;;OAUG;IAGU,cAAc,CAAS,IAAI,EAAE,SAAS,EAAW,IAAI,EAAE,MAAM,EAAU,IAAI,EAAE,eAAe;IAMzG;;;;;;;;;OASG;IAGU,cAAc,CAAS,IAAI,EAAE,SAAS,EAAW,IAAI,EAAE,MAAM;CAK7E"}
@@ -15,22 +15,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.UserMetadataController = void 0;
16
16
  const http_1 = require("@spinajs/http");
17
17
  const rbac_1 = require("@spinajs/rbac");
18
+ const di_1 = require("@spinajs/di");
18
19
  const rbac_http_1 = require("@spinajs/rbac-http");
19
20
  const orm_http_1 = require("@spinajs/orm-http");
20
21
  const metadata_dto_js_1 = require("../dto/metadata-dto.js");
21
- const orm_1 = require("@spinajs/orm");
22
22
  const FilterableUserMetadata_js_1 = require("../models/FilterableUserMetadata.js");
23
- /**
24
- * Fallback page size. A request without a `limit` used to reach `take(0)`,
25
- * which the query builder rejects ( "take count should be a positive number" ),
26
- * so plain listing requests failed instead of returning the first page.
27
- */
28
- const DEFAULT_PAGE_SIZE = 10;
23
+ const UserMetadataService_js_1 = require("../services/UserMetadataService.js");
29
24
  /**
30
25
  * User metadata management.
31
26
  * Provides CRUD operations for key-value metadata entries attached to user accounts.
32
27
  * Admin routes operate on any user (identified by UUID), while own routes operate on the
33
28
  * currently authenticated user's metadata.
29
+ *
30
+ * Both families delegate to {@link UserMetadataService}, which owns the owner
31
+ * scoping — the only thing that ever differed between them is where the owner
32
+ * id comes from.
34
33
  * @tags User Metadata
35
34
  */
36
35
  let UserMetadataController = class UserMetadataController extends http_1.BaseController {
@@ -49,13 +48,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
49
48
  * @response 404 User not found
50
49
  */
51
50
  async readUserMeta(user, pagination, order, filter) {
52
- const limit = pagination?.limit || DEFAULT_PAGE_SIZE;
53
- return new http_1.Ok(FilterableUserMetadata_js_1.FilterableUserMetadata.select().where({
54
- user_id: user.Id
55
- }).filter(filter?.filters ?? [], filter?.op)
56
- .take(limit)
57
- .skip(limit * (pagination?.page ?? 0))
58
- .order(order?.column ?? 'Id', order?.order ?? orm_1.SortOrder.DESC));
51
+ return new http_1.Ok(this.Metadata.list(user.Id, pagination, order, filter));
59
52
  }
60
53
  /**
61
54
  * Get a single metadata entry for a specific user (admin)
@@ -69,10 +62,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
69
62
  * @response 404 User or metadata key not found
70
63
  */
71
64
  async getUserMeta(user, key) {
72
- return new http_1.Ok(rbac_1.UserMetadata.where({
73
- Key: key,
74
- user_id: user.Id
75
- }).firstOrFail());
65
+ return new http_1.Ok(this.Metadata.getByKey(user.Id, key));
76
66
  }
77
67
  /**
78
68
  * Add or update metadata for a specific user (admin)
@@ -85,8 +75,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
85
75
  * @response 404 User not found
86
76
  */
87
77
  async addUserMetadata(user, metadata) {
88
- metadata.User.attach(user);
89
- await metadata.insert(orm_1.InsertBehaviour.InsertOrUpdate);
78
+ await this.Metadata.upsert(user.Id, metadata);
90
79
  return new http_1.Ok();
91
80
  }
92
81
  /**
@@ -102,11 +91,10 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
102
91
  * @response 404 User or metadata entry not found
103
92
  */
104
93
  async updateUserMetadata(meta, _user, data) {
105
- await meta.update({
106
- Key: data.Key,
107
- Value: data.Value,
108
- Type: data.Type
109
- });
94
+ // @FromModel already resolved the entry within the addressed user's
95
+ // scope ( so a miss is a 404 ); the write still goes through the
96
+ // owner-scoped service so the predicate is not restated here.
97
+ await this.Metadata.update(_user.Id, meta.Id, data);
110
98
  return new http_1.Ok();
111
99
  }
112
100
  /**
@@ -121,24 +109,9 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
121
109
  * @response 404 User or metadata entry not found
122
110
  */
123
111
  async deleteUserMetadata(user, meta) {
124
- // NOTE: destroy() refuses to build an unbounded DELETE, so the entry id
125
- // goes in as the primary key and ownership is AND-ed on top of it —
126
- // deleting by id alone would let any user id delete anybody's entry.
127
- await rbac_1.UserMetadata.destroy(meta).andWhere('user_id', user.Id);
112
+ await this.Metadata.delete(user.Id, meta);
128
113
  return new http_1.Ok();
129
114
  }
130
- /**
131
- * List own metadata
132
- * Returns a paginated, filtered, and ordered list of metadata entries for the authenticated user.
133
- * @security cookieAuth
134
- * @param pagination.page Page number (zero-based)
135
- * @param pagination.limit Number of entries per page
136
- * @param order.column Column to sort by (default: Id)
137
- * @param order.order Sort direction: ASC or DESC (default: DESC)
138
- * @returns {IUserMetadataEntry[]} Paginated list of own metadata entries
139
- * @response 401 Unauthorized — valid session required
140
- * @response 403 Forbidden — readOwn permission required
141
- */
142
115
  /**
143
116
  * List own metadata
144
117
  * Returns a paginated, filtered, and ordered list of metadata entries for the authenticated user.
@@ -152,15 +125,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
152
125
  * @response 403 Forbidden — readOwn permission required
153
126
  */
154
127
  async readMeta(user, pagination, order, filter) {
155
- // Explicit owner scoping: the rbac query middleware does not enforce
156
- // ownership for the metadata model (queries resolve to the unsafe base
157
- // model without an @OrmResource), so every own-route filters by the
158
- // authenticated user's id directly.
159
- const limit = pagination?.limit || DEFAULT_PAGE_SIZE;
160
- return new http_1.Ok(FilterableUserMetadata_js_1.FilterableUserMetadata.select().where('user_id', user.Id).filter(filter?.filters ?? [], filter?.op)
161
- .take(limit)
162
- .skip(limit * (pagination?.page ?? 0))
163
- .order(order?.column ?? 'Id', order?.order ?? orm_1.SortOrder.DESC));
128
+ return new http_1.Ok(this.Metadata.list(user.Id, pagination, order, filter));
164
129
  }
165
130
  /**
166
131
  * Get own metadata entry by key
@@ -173,10 +138,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
173
138
  * @response 404 Metadata key not found
174
139
  */
175
140
  async getMeta(user, key) {
176
- return new http_1.Ok(rbac_1.UserMetadata.where({
177
- Key: key,
178
- user_id: user.Id,
179
- }).firstOrFail());
141
+ return new http_1.Ok(this.Metadata.getByKey(user.Id, key));
180
142
  }
181
143
  /**
182
144
  * Add or update own metadata
@@ -187,10 +149,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
187
149
  * @response 403 Forbidden — updateOwn permission required
188
150
  */
189
151
  async addMetadata(user, metadata) {
190
- // force ownership to the authenticated user — never trust a user_id
191
- // supplied in the request body
192
- metadata.user_id = user.Id;
193
- await metadata.insert(orm_1.InsertBehaviour.InsertOrUpdate);
152
+ await this.Metadata.upsert(user.Id, metadata);
194
153
  return new http_1.Ok();
195
154
  }
196
155
  /**
@@ -205,19 +164,7 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
205
164
  * @response 404 Metadata entry not found
206
165
  */
207
166
  async updateMetadata(user, meta, data) {
208
- // The Key/Id lookup is grouped and AND-ed with an explicit ownership
209
- // filter. Without the grouping the flat "Key = ? OR Id = ? AND user_id = ?"
210
- // binds as "Key = ? OR (Id = ? AND user_id = ?)", letting any user update
211
- // another user's metadata by its Key. Scoping by user_id explicitly (not
212
- // relying on the query middleware, which does not fire for this model)
213
- // keeps the update owner-bound.
214
- await rbac_1.UserMetadata.update({
215
- Key: data.Key,
216
- Value: data.Value,
217
- Type: data.Type
218
- }).where(function () {
219
- this.where("Key", meta).orWhere("Id", meta);
220
- }).andWhere('user_id', user.Id);
167
+ await this.Metadata.update(user.Id, meta, data);
221
168
  return new http_1.Ok();
222
169
  }
223
170
  /**
@@ -231,11 +178,15 @@ let UserMetadataController = class UserMetadataController extends http_1.BaseCon
231
178
  * @response 404 Metadata entry not found
232
179
  */
233
180
  async deleteMetadata(user, meta) {
234
- await rbac_1.UserMetadata.destroy(meta).andWhere('user_id', user.Id);
181
+ await this.Metadata.delete(user.Id, meta);
235
182
  return new http_1.Ok();
236
183
  }
237
184
  };
238
185
  exports.UserMetadataController = UserMetadataController;
186
+ __decorate([
187
+ (0, di_1.Autoinject)(UserMetadataService_js_1.UserMetadataService),
188
+ __metadata("design:type", UserMetadataService_js_1.UserMetadataService)
189
+ ], UserMetadataController.prototype, "Metadata", void 0);
239
190
  __decorate([
240
191
  (0, http_1.Get)(":user/metadata"),
241
192
  (0, rbac_http_1.Permission)(['readAny']),
@@ -1 +1 @@
1
- {"version":3,"file":"UserMetadataController.js","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserMetadataController.js","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wCAAgH;AAChH,wCAAgE;AAChE,oCAAyC;AACzC,kDAAkF;AAClF,gDAAwG;AACxG,4DAAyD;AACzD,mFAA6E;AAC7E,+EAAyE;AAEzE;;;;;;;;;;GAUG;AAII,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,qBAAc;IAKtD;;;;;;;;;;;;;OAaG;IAGU,AAAN,KAAK,CAAC,YAAY,CACc,IAAe,EACzC,UAA0B,EAC1B,KAAgB,EAEzB,MAAuB;QAEvB,OAAO,IAAI,SAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAGD;;;;;;;;;;OAUG;IAGU,AAAN,KAAK,CAAC,WAAW,CACe,IAAe,EACzC,GAAW;QACpB,OAAO,IAAI,SAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;OASG;IAGU,AAAN,KAAK,CAAC,eAAe,CACW,IAAe,EACvC,QAAsB;QAEjC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,IAAI,SAAE,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;OAWG;IAGU,AAAN,KAAK,CAAC,kBAAkB,CAOxB,IAAkB,EACc,KAAgB,EAC3C,IAAqB;QAE7B,oEAAoE;QACpE,iEAAiE;QACjE,8DAA8D;QAC9D,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAEpD,OAAO,IAAI,SAAE,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;;;;;OAUG;IAGU,AAAN,KAAK,CAAC,kBAAkB,CACQ,IAAe,EACzC,IAAY;QACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAE1C,OAAO,IAAI,SAAE,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;OAWG;IAGU,AAAN,KAAK,CAAC,QAAQ,CACT,IAAe,EACd,UAA0B,EAC1B,KAAgB,EAEzB,MAAuB;QAEvB,OAAO,IAAI,SAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;;OASG;IAGU,AAAN,KAAK,CAAC,OAAO,CAAS,IAAe,EAAW,GAAW;QAC9D,OAAO,IAAI,SAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;OAOG;IAGU,AAAN,KAAK,CAAC,WAAW,CAAS,IAAe,EAAa,QAAsB;QAC/E,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,IAAI,SAAE,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;;;;;OAUG;IAGU,AAAN,KAAK,CAAC,cAAc,CAAS,IAAe,EAAW,IAAY,EAAU,IAAqB;QACrG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEhD,OAAO,IAAI,SAAE,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;;;;OASG;IAGU,AAAN,KAAK,CAAC,cAAc,CAAS,IAAe,EAAW,IAAY;QACtE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAE1C,OAAO,IAAI,SAAE,EAAE,CAAC;IACpB,CAAC;CACJ,CAAA;AAxNY,wDAAsB;AAGrB;IADT,IAAA,eAAU,EAAC,4CAAmB,CAAC;8BACZ,4CAAmB;wDAAC;AAkB3B;IAFZ,IAAA,UAAG,EAAC,gBAAgB,CAAC;IACrB,IAAA,sBAAU,EAAC,CAAC,SAAS,CAAC,CAAC;IAEnB,WAAA,IAAA,oBAAS,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,WAAA,IAAA,YAAK,GAAE,CAAA;IACP,WAAA,IAAA,YAAK,GAAE,CAAA;IACP,WAAA,IAAA,iBAAM,EAAC,kDAAsB,CAAC,CAAA;;qCAHU,WAAS;QAC5B,wBAAa;QAClB,mBAAQ;;0DAK5B;AAgBY;IAFZ,IAAA,UAAG,EAAC,qBAAqB,CAAC;IAC1B,IAAA,sBAAU,EAAC,CAAC,SAAS,CAAC,CAAC;IAEnB,WAAA,IAAA,oBAAS,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,WAAA,IAAA,YAAK,GAAE,CAAA;;qCADiC,WAAS;;yDAGrD;AAcY;IAFZ,IAAA,WAAI,EAAC,gBAAgB,CAAC;IACtB,IAAA,sBAAU,EAAC,CAAC,WAAW,CAAC,CAAC;IAErB,WAAA,IAAA,oBAAS,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,WAAA,IAAA,kBAAO,GAAE,CAAA;;qCAD+B,WAAS;QAC7B,mBAAY;;6DAIpC;AAgBY;IAFZ,IAAA,YAAK,EAAC,uBAAuB,CAAC;IAC9B,IAAA,sBAAU,EAAC,CAAC,WAAW,CAAC,CAAC;IAErB,WAAA,IAAA,oBAAS,EAAC;QACP,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAC/C,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QACnC,CAAC,CAAC;KACL,CAAC,CAAA;IACD,WAAA,IAAA,oBAAS,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,WAAA,IAAA,WAAI,GAAE,CAAA;;qCAFE,mBAAY;QACqB,WAAS;QACrC,iCAAe;;gEAQhC;AAeY;IAFZ,IAAA,UAAG,EAAC,sBAAsB,CAAC;IAC3B,IAAA,sBAAU,EAAC,CAAC,WAAW,CAAC,CAAC;IAErB,WAAA,IAAA,oBAAS,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IACjC,WAAA,IAAA,YAAK,GAAE,CAAA;;qCADiC,WAAS;;gEAKrD;AAgBY;IAFZ,IAAA,UAAG,EAAC,UAAU,CAAC;IACf,IAAA,sBAAU,EAAC,CAAC,SAAS,CAAC,CAAC;IAEnB,WAAA,IAAA,gBAAI,GAAE,CAAA;IACN,WAAA,IAAA,YAAK,GAAE,CAAA;IACP,WAAA,IAAA,YAAK,GAAE,CAAA;IACP,WAAA,IAAA,iBAAM,EAAC,kDAAsB,CAAC,CAAA;;qCAHjB,WAAS;QACD,wBAAa;QAClB,mBAAQ;;sDAK5B;AAcY;IAFZ,IAAA,UAAG,EAAC,eAAe,CAAC;IACpB,IAAA,sBAAU,EAAC,CAAC,SAAS,CAAC,CAAC;IACF,WAAA,IAAA,gBAAI,GAAE,CAAA;IAAmB,WAAA,IAAA,YAAK,GAAE,CAAA;;qCAAnB,WAAS;;qDAE3C;AAYY;IAFZ,IAAA,WAAI,EAAC,UAAU,CAAC;IAChB,IAAA,sBAAU,EAAC,CAAC,WAAW,CAAC,CAAC;IACA,WAAA,IAAA,gBAAI,GAAE,CAAA;IAAmB,WAAA,IAAA,kBAAO,GAAE,CAAA;;qCAArB,WAAS,EAAuB,mBAAY;;yDAGlF;AAeY;IAFZ,IAAA,YAAK,EAAC,gBAAgB,CAAC;IACvB,IAAA,sBAAU,EAAC,CAAC,WAAW,CAAC,CAAC;IACG,WAAA,IAAA,gBAAI,GAAE,CAAA;IAAmB,WAAA,IAAA,YAAK,GAAE,CAAA;IAAgB,WAAA,IAAA,WAAI,GAAE,CAAA;;qCAAzC,WAAS,UAAuC,iCAAe;;4DAIxG;AAcY;IAFZ,IAAA,UAAG,EAAC,gBAAgB,CAAC;IACrB,IAAA,sBAAU,EAAC,CAAC,WAAW,CAAC,CAAC;IACG,WAAA,IAAA,gBAAI,GAAE,CAAA;IAAmB,WAAA,IAAA,YAAK,GAAE,CAAA;;qCAAnB,WAAS;;4DAIlD;iCAvNQ,sBAAsB;IAHlC,IAAA,eAAQ,EAAC,MAAM,CAAC;IAChB,IAAA,oBAAQ,EAAC,eAAe,CAAC;IACzB,IAAA,aAAM,EAAC,4BAAgB,CAAC;GACZ,sBAAsB,CAwNlC"}
@@ -0,0 +1,23 @@
1
+ export declare const ConfirmPasswordDtoSchema: {
2
+ $schema: string;
3
+ title: string;
4
+ type: string;
5
+ properties: {
6
+ Password: {
7
+ type: string;
8
+ maxLength: number;
9
+ description: string;
10
+ };
11
+ };
12
+ required: string[];
13
+ };
14
+ /**
15
+ * Re-authentication payload for sensitive self-service operations — enabling or
16
+ * disabling 2FA. A hijacked session alone must not be enough to weaken a
17
+ * user's second factor.
18
+ */
19
+ export declare class ConfirmPasswordDto {
20
+ Password: string;
21
+ constructor(data: any);
22
+ }
23
+ //# sourceMappingURL=confirm-password-dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-password-dto.d.ts","sourceRoot":"","sources":["../../../src/dto/confirm-password-dto.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB;;;;;;;;;;;;CAQpC,CAAC;AAEF;;;;GAIG;AACH,qBACa,kBAAkB;IACtB,QAAQ,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,GAAG;CAGtB"}
@@ -9,26 +9,30 @@ 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.RestorePasswordDto = exports.RestorePasswordDtoSchema = void 0;
12
+ exports.ConfirmPasswordDto = exports.ConfirmPasswordDtoSchema = void 0;
13
13
  const validation_1 = require("@spinajs/validation");
14
- exports.RestorePasswordDtoSchema = {
14
+ exports.ConfirmPasswordDtoSchema = {
15
15
  $schema: 'http://json-schema.org/draft-07/schema#',
16
- title: 'User password DTO',
16
+ title: 'Confirm password DTO',
17
17
  type: 'object',
18
18
  properties: {
19
- Password: { type: 'string', maxLength: 32, minLength: 6 },
20
- ConfirmPassword: { type: 'string', maxLength: 32, minLength: 6 },
19
+ Password: { type: 'string', maxLength: 32, description: 'Current password, re-entered to confirm a sensitive change' },
21
20
  },
22
- required: ['Password', 'ConfirmPassword'],
21
+ required: ['Password'],
23
22
  };
24
- let RestorePasswordDto = class RestorePasswordDto {
23
+ /**
24
+ * Re-authentication payload for sensitive self-service operations — enabling or
25
+ * disabling 2FA. A hijacked session alone must not be enough to weaken a
26
+ * user's second factor.
27
+ */
28
+ let ConfirmPasswordDto = class ConfirmPasswordDto {
25
29
  constructor(data) {
26
30
  Object.assign(this, data);
27
31
  }
28
32
  };
29
- exports.RestorePasswordDto = RestorePasswordDto;
30
- exports.RestorePasswordDto = RestorePasswordDto = __decorate([
31
- (0, validation_1.Schema)(exports.RestorePasswordDtoSchema),
33
+ exports.ConfirmPasswordDto = ConfirmPasswordDto;
34
+ exports.ConfirmPasswordDto = ConfirmPasswordDto = __decorate([
35
+ (0, validation_1.Schema)(exports.ConfirmPasswordDtoSchema),
32
36
  __metadata("design:paramtypes", [Object])
33
- ], RestorePasswordDto);
34
- //# sourceMappingURL=restore-password-dto.js.map
37
+ ], ConfirmPasswordDto);
38
+ //# sourceMappingURL=confirm-password-dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-password-dto.js","sourceRoot":"","sources":["../../../src/dto/confirm-password-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAEhC,QAAA,wBAAwB,GAAG;IACtC,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,sBAAsB;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,4DAA4D,EAAE;KACvH;IACD,QAAQ,EAAE,CAAC,UAAU,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAG7B,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AANY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAM,EAAC,gCAAwB,CAAC;;GACpB,kBAAkB,CAM9B"}
@@ -0,0 +1,58 @@
1
+ export declare const PasswordResetRequestDtoSchema: {
2
+ $schema: string;
3
+ title: string;
4
+ type: string;
5
+ properties: {
6
+ Email: {
7
+ type: string;
8
+ format: string;
9
+ description: string;
10
+ };
11
+ };
12
+ required: string[];
13
+ };
14
+ /** Payload starting a password reset — identifies the account by email. */
15
+ export declare class PasswordResetRequestDto {
16
+ Email: string;
17
+ constructor(data: any);
18
+ }
19
+ export declare const PasswordResetConfirmDtoSchema: {
20
+ $schema: string;
21
+ title: string;
22
+ type: string;
23
+ properties: {
24
+ Email: {
25
+ type: string;
26
+ format: string;
27
+ description: string;
28
+ };
29
+ Token: {
30
+ type: string;
31
+ maxLength: number;
32
+ minLength: number;
33
+ description: string;
34
+ };
35
+ Password: {
36
+ type: string;
37
+ maxLength: number;
38
+ minLength: number;
39
+ description: string;
40
+ };
41
+ ConfirmPassword: {
42
+ type: string;
43
+ maxLength: number;
44
+ minLength: number;
45
+ description: string;
46
+ };
47
+ };
48
+ required: string[];
49
+ };
50
+ /** Payload completing a password reset with the issued token. */
51
+ export declare class PasswordResetConfirmDto {
52
+ Email: string;
53
+ Token: string;
54
+ Password: string;
55
+ ConfirmPassword: string;
56
+ constructor(data: any);
57
+ }
58
+ //# sourceMappingURL=password-reset-dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-reset-dto.d.ts","sourceRoot":"","sources":["../../../src/dto/password-reset-dto.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,6BAA6B;;;;;;;;;;;;CAQzC,CAAC;AAEF,2EAA2E;AAC3E,qBACa,uBAAuB;IAC3B,KAAK,EAAE,MAAM,CAAC;gBAET,IAAI,EAAE,GAAG;CAGtB;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWzC,CAAC;AAEF,iEAAiE;AACjE,qBACa,uBAAuB;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,KAAK,EAAE,MAAM,CAAC;IAEd,QAAQ,EAAE,MAAM,CAAC;IAEjB,eAAe,EAAE,MAAM,CAAC;gBAEnB,IAAI,EAAE,GAAG;CAGtB"}