@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.
- package/lib/cjs/config/rbac-http.d.ts +0 -15
- package/lib/cjs/config/rbac-http.d.ts.map +1 -1
- package/lib/cjs/config/rbac-http.js +6 -16
- package/lib/cjs/config/rbac-http.js.map +1 -1
- package/lib/cjs/controllers/ActiveRoleController.d.ts +2 -1
- package/lib/cjs/controllers/ActiveRoleController.d.ts.map +1 -1
- package/lib/cjs/controllers/ActiveRoleController.js +7 -17
- package/lib/cjs/controllers/ActiveRoleController.js.map +1 -1
- package/lib/cjs/controllers/ImpersonationController.d.ts +7 -9
- package/lib/cjs/controllers/ImpersonationController.d.ts.map +1 -1
- package/lib/cjs/controllers/ImpersonationController.js +31 -56
- package/lib/cjs/controllers/ImpersonationController.js.map +1 -1
- package/lib/cjs/controllers/LoginController.d.ts +10 -3
- package/lib/cjs/controllers/LoginController.d.ts.map +1 -1
- package/lib/cjs/controllers/LoginController.js +39 -40
- package/lib/cjs/controllers/LoginController.js.map +1 -1
- package/lib/cjs/controllers/PasswordResetController.d.ts +54 -0
- package/lib/cjs/controllers/PasswordResetController.d.ts.map +1 -0
- package/lib/cjs/controllers/PasswordResetController.js +129 -0
- package/lib/cjs/controllers/PasswordResetController.js.map +1 -0
- package/lib/cjs/controllers/SessionsController.d.ts +65 -0
- package/lib/cjs/controllers/SessionsController.d.ts.map +1 -0
- package/lib/cjs/controllers/SessionsController.js +143 -0
- package/lib/cjs/controllers/SessionsController.js.map +1 -0
- package/lib/cjs/controllers/TwoFactorAuthController.d.ts +24 -23
- package/lib/cjs/controllers/TwoFactorAuthController.d.ts.map +1 -1
- package/lib/cjs/controllers/TwoFactorAuthController.js +39 -72
- package/lib/cjs/controllers/TwoFactorAuthController.js.map +1 -1
- package/lib/cjs/controllers/TwoFactorAuthUserController.d.ts +98 -0
- package/lib/cjs/controllers/TwoFactorAuthUserController.d.ts.map +1 -0
- package/lib/cjs/controllers/TwoFactorAuthUserController.js +195 -0
- package/lib/cjs/controllers/TwoFactorAuthUserController.js.map +1 -0
- package/lib/cjs/controllers/UserController.d.ts +10 -7
- package/lib/cjs/controllers/UserController.d.ts.map +1 -1
- package/lib/cjs/controllers/UserController.js +56 -58
- package/lib/cjs/controllers/UserController.js.map +1 -1
- package/lib/cjs/controllers/UserMetadataController.d.ts +6 -12
- package/lib/cjs/controllers/UserMetadataController.d.ts.map +1 -1
- package/lib/cjs/controllers/UserMetadataController.js +23 -72
- package/lib/cjs/controllers/UserMetadataController.js.map +1 -1
- package/lib/cjs/dto/confirm-password-dto.d.ts +23 -0
- package/lib/cjs/dto/confirm-password-dto.d.ts.map +1 -0
- package/lib/cjs/dto/{restore-password-dto.js → confirm-password-dto.js} +16 -12
- package/lib/cjs/dto/confirm-password-dto.js.map +1 -0
- package/lib/cjs/dto/password-reset-dto.d.ts +58 -0
- package/lib/cjs/dto/password-reset-dto.d.ts.map +1 -0
- package/lib/cjs/dto/password-reset-dto.js +57 -0
- package/lib/cjs/dto/password-reset-dto.js.map +1 -0
- package/lib/cjs/handlers/DefaultLogoutHandler.d.ts +4 -1
- package/lib/cjs/handlers/DefaultLogoutHandler.d.ts.map +1 -1
- package/lib/cjs/handlers/DefaultLogoutHandler.js +20 -13
- package/lib/cjs/handlers/DefaultLogoutHandler.js.map +1 -1
- package/lib/cjs/handlers/ImpersonationLogoutHandler.d.ts +4 -7
- package/lib/cjs/handlers/ImpersonationLogoutHandler.d.ts.map +1 -1
- package/lib/cjs/handlers/ImpersonationLogoutHandler.js +30 -31
- package/lib/cjs/handlers/ImpersonationLogoutHandler.js.map +1 -1
- package/lib/cjs/index.d.ts +20 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +22 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/logout.d.ts +7 -0
- package/lib/cjs/logout.d.ts.map +1 -1
- package/lib/cjs/logout.js.map +1 -1
- package/lib/cjs/policies/2FaPolicy.d.ts +21 -1
- package/lib/cjs/policies/2FaPolicy.d.ts.map +1 -1
- package/lib/cjs/policies/2FaPolicy.js +31 -7
- package/lib/cjs/policies/2FaPolicy.js.map +1 -1
- package/lib/cjs/services/ImpersonationService.d.ts +90 -0
- package/lib/cjs/services/ImpersonationService.d.ts.map +1 -0
- package/lib/cjs/services/ImpersonationService.js +147 -0
- package/lib/cjs/services/ImpersonationService.js.map +1 -0
- package/lib/cjs/services/SessionCookies.d.ts +41 -0
- package/lib/cjs/services/SessionCookies.d.ts.map +1 -0
- package/lib/cjs/services/SessionCookies.js +62 -0
- package/lib/cjs/services/SessionCookies.js.map +1 -0
- package/lib/cjs/services/UserMetadataService.d.ts +53 -0
- package/lib/cjs/services/UserMetadataService.d.ts.map +1 -0
- package/lib/cjs/services/UserMetadataService.js +94 -0
- package/lib/cjs/services/UserMetadataService.js.map +1 -0
- package/lib/cjs/services/grants.d.ts +29 -0
- package/lib/cjs/services/grants.d.ts.map +1 -0
- package/lib/cjs/services/grants.js +43 -0
- package/lib/cjs/services/grants.js.map +1 -0
- package/lib/mjs/config/rbac-http.d.ts +0 -15
- package/lib/mjs/config/rbac-http.d.ts.map +1 -1
- package/lib/mjs/config/rbac-http.js +6 -16
- package/lib/mjs/config/rbac-http.js.map +1 -1
- package/lib/mjs/controllers/ActiveRoleController.d.ts +2 -1
- package/lib/mjs/controllers/ActiveRoleController.d.ts.map +1 -1
- package/lib/mjs/controllers/ActiveRoleController.js +8 -18
- package/lib/mjs/controllers/ActiveRoleController.js.map +1 -1
- package/lib/mjs/controllers/ImpersonationController.d.ts +7 -9
- package/lib/mjs/controllers/ImpersonationController.d.ts.map +1 -1
- package/lib/mjs/controllers/ImpersonationController.js +32 -57
- package/lib/mjs/controllers/ImpersonationController.js.map +1 -1
- package/lib/mjs/controllers/LoginController.d.ts +10 -3
- package/lib/mjs/controllers/LoginController.d.ts.map +1 -1
- package/lib/mjs/controllers/LoginController.js +42 -43
- package/lib/mjs/controllers/LoginController.js.map +1 -1
- package/lib/mjs/controllers/PasswordResetController.d.ts +54 -0
- package/lib/mjs/controllers/PasswordResetController.d.ts.map +1 -0
- package/lib/mjs/controllers/PasswordResetController.js +126 -0
- package/lib/mjs/controllers/PasswordResetController.js.map +1 -0
- package/lib/mjs/controllers/SessionsController.d.ts +65 -0
- package/lib/mjs/controllers/SessionsController.d.ts.map +1 -0
- package/lib/mjs/controllers/SessionsController.js +140 -0
- package/lib/mjs/controllers/SessionsController.js.map +1 -0
- package/lib/mjs/controllers/TwoFactorAuthController.d.ts +24 -23
- package/lib/mjs/controllers/TwoFactorAuthController.d.ts.map +1 -1
- package/lib/mjs/controllers/TwoFactorAuthController.js +43 -76
- package/lib/mjs/controllers/TwoFactorAuthController.js.map +1 -1
- package/lib/mjs/controllers/TwoFactorAuthUserController.d.ts +98 -0
- package/lib/mjs/controllers/TwoFactorAuthUserController.d.ts.map +1 -0
- package/lib/mjs/controllers/TwoFactorAuthUserController.js +192 -0
- package/lib/mjs/controllers/TwoFactorAuthUserController.js.map +1 -0
- package/lib/mjs/controllers/UserController.d.ts +10 -7
- package/lib/mjs/controllers/UserController.d.ts.map +1 -1
- package/lib/mjs/controllers/UserController.js +59 -28
- package/lib/mjs/controllers/UserController.js.map +1 -1
- package/lib/mjs/controllers/UserMetadataController.d.ts +6 -12
- package/lib/mjs/controllers/UserMetadataController.d.ts.map +1 -1
- package/lib/mjs/controllers/UserMetadataController.js +23 -72
- package/lib/mjs/controllers/UserMetadataController.js.map +1 -1
- package/lib/mjs/dto/confirm-password-dto.d.ts +23 -0
- package/lib/mjs/dto/confirm-password-dto.d.ts.map +1 -0
- package/lib/mjs/dto/{user-dto.js → confirm-password-dto.js} +15 -10
- package/lib/mjs/dto/confirm-password-dto.js.map +1 -0
- package/lib/mjs/dto/password-reset-dto.d.ts +58 -0
- package/lib/mjs/dto/password-reset-dto.d.ts.map +1 -0
- package/lib/mjs/dto/password-reset-dto.js +54 -0
- package/lib/mjs/dto/password-reset-dto.js.map +1 -0
- package/lib/mjs/handlers/DefaultLogoutHandler.d.ts +4 -1
- package/lib/mjs/handlers/DefaultLogoutHandler.d.ts.map +1 -1
- package/lib/mjs/handlers/DefaultLogoutHandler.js +23 -16
- package/lib/mjs/handlers/DefaultLogoutHandler.js.map +1 -1
- package/lib/mjs/handlers/ImpersonationLogoutHandler.d.ts +4 -7
- package/lib/mjs/handlers/ImpersonationLogoutHandler.d.ts.map +1 -1
- package/lib/mjs/handlers/ImpersonationLogoutHandler.js +31 -32
- package/lib/mjs/handlers/ImpersonationLogoutHandler.js.map +1 -1
- package/lib/mjs/index.d.ts +20 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +22 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/logout.d.ts +7 -0
- package/lib/mjs/logout.d.ts.map +1 -1
- package/lib/mjs/logout.js.map +1 -1
- package/lib/mjs/policies/2FaPolicy.d.ts +21 -1
- package/lib/mjs/policies/2FaPolicy.d.ts.map +1 -1
- package/lib/mjs/policies/2FaPolicy.js +29 -6
- package/lib/mjs/policies/2FaPolicy.js.map +1 -1
- package/lib/mjs/services/ImpersonationService.d.ts +90 -0
- package/lib/mjs/services/ImpersonationService.d.ts.map +1 -0
- package/lib/mjs/services/ImpersonationService.js +144 -0
- package/lib/mjs/services/ImpersonationService.js.map +1 -0
- package/lib/mjs/services/SessionCookies.d.ts +41 -0
- package/lib/mjs/services/SessionCookies.d.ts.map +1 -0
- package/lib/mjs/services/SessionCookies.js +59 -0
- package/lib/mjs/services/SessionCookies.js.map +1 -0
- package/lib/mjs/services/UserMetadataService.d.ts +53 -0
- package/lib/mjs/services/UserMetadataService.d.ts.map +1 -0
- package/lib/mjs/services/UserMetadataService.js +91 -0
- package/lib/mjs/services/UserMetadataService.js.map +1 -0
- package/lib/mjs/services/grants.d.ts +29 -0
- package/lib/mjs/services/grants.d.ts.map +1 -0
- package/lib/mjs/services/grants.js +38 -0
- package/lib/mjs/services/grants.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +17 -11
- package/lib/cjs/controllers/AuthController.d.ts +0 -1
- package/lib/cjs/controllers/AuthController.d.ts.map +0 -1
- package/lib/cjs/controllers/AuthController.js +0 -211
- package/lib/cjs/controllers/AuthController.js.map +0 -1
- package/lib/cjs/controllers/FederatedLoginController.d.ts +0 -1
- package/lib/cjs/controllers/FederatedLoginController.d.ts.map +0 -1
- package/lib/cjs/controllers/FederatedLoginController.js +0 -38
- package/lib/cjs/controllers/FederatedLoginController.js.map +0 -1
- package/lib/cjs/dto/login-dto.d.ts +0 -17
- package/lib/cjs/dto/login-dto.d.ts.map +0 -1
- package/lib/cjs/dto/login-dto.js +0 -33
- package/lib/cjs/dto/login-dto.js.map +0 -1
- package/lib/cjs/dto/restore-password-dto.d.ts +0 -24
- package/lib/cjs/dto/restore-password-dto.d.ts.map +0 -1
- package/lib/cjs/dto/restore-password-dto.js.map +0 -1
- package/lib/cjs/dto/user-dto.d.ts +0 -22
- package/lib/cjs/dto/user-dto.d.ts.map +0 -1
- package/lib/cjs/dto/user-dto.js +0 -33
- package/lib/cjs/dto/user-dto.js.map +0 -1
- package/lib/cjs/fingerprint/FingerprintJs.d.ts +0 -1
- package/lib/cjs/fingerprint/FingerprintJs.d.ts.map +0 -1
- package/lib/cjs/fingerprint/FingerprintJs.js +0 -5
- package/lib/cjs/fingerprint/FingerprintJs.js.map +0 -1
- package/lib/cjs/middlewares/AttributeFilter.d.ts +0 -11
- package/lib/cjs/middlewares/AttributeFilter.d.ts.map +0 -1
- package/lib/cjs/middlewares/AttributeFilter.js +0 -19
- package/lib/cjs/middlewares/AttributeFilter.js.map +0 -1
- package/lib/cjs/policies/AllowFederatedLoginPolicy.d.ts +0 -7
- package/lib/cjs/policies/AllowFederatedLoginPolicy.d.ts.map +0 -1
- package/lib/cjs/policies/AllowFederatedLoginPolicy.js +0 -32
- package/lib/cjs/policies/AllowFederatedLoginPolicy.js.map +0 -1
- package/lib/cjs/policies/CaptchaPolicy.d.ts +0 -1
- package/lib/cjs/policies/CaptchaPolicy.d.ts.map +0 -1
- package/lib/cjs/policies/CaptchaPolicy.js +0 -1
- package/lib/cjs/policies/CaptchaPolicy.js.map +0 -1
- package/lib/mjs/controllers/AuthController.d.ts +0 -2
- package/lib/mjs/controllers/AuthController.d.ts.map +0 -1
- package/lib/mjs/controllers/AuthController.js +0 -212
- package/lib/mjs/controllers/AuthController.js.map +0 -1
- package/lib/mjs/controllers/FederatedLoginController.d.ts +0 -2
- package/lib/mjs/controllers/FederatedLoginController.d.ts.map +0 -1
- package/lib/mjs/controllers/FederatedLoginController.js +0 -39
- package/lib/mjs/controllers/FederatedLoginController.js.map +0 -1
- package/lib/mjs/dto/login-dto.d.ts +0 -17
- package/lib/mjs/dto/login-dto.d.ts.map +0 -1
- package/lib/mjs/dto/login-dto.js +0 -30
- package/lib/mjs/dto/login-dto.js.map +0 -1
- package/lib/mjs/dto/restore-password-dto.d.ts +0 -24
- package/lib/mjs/dto/restore-password-dto.d.ts.map +0 -1
- package/lib/mjs/dto/restore-password-dto.js +0 -31
- package/lib/mjs/dto/restore-password-dto.js.map +0 -1
- package/lib/mjs/dto/user-dto.d.ts +0 -22
- package/lib/mjs/dto/user-dto.d.ts.map +0 -1
- package/lib/mjs/dto/user-dto.js.map +0 -1
- package/lib/mjs/fingerprint/FingerprintJs.d.ts +0 -2
- package/lib/mjs/fingerprint/FingerprintJs.d.ts.map +0 -1
- package/lib/mjs/fingerprint/FingerprintJs.js +0 -6
- package/lib/mjs/fingerprint/FingerprintJs.js.map +0 -1
- package/lib/mjs/middlewares/AttributeFilter.d.ts +0 -11
- package/lib/mjs/middlewares/AttributeFilter.d.ts.map +0 -1
- package/lib/mjs/middlewares/AttributeFilter.js +0 -15
- package/lib/mjs/middlewares/AttributeFilter.js.map +0 -1
- package/lib/mjs/policies/AllowFederatedLoginPolicy.d.ts +0 -7
- package/lib/mjs/policies/AllowFederatedLoginPolicy.d.ts.map +0 -1
- package/lib/mjs/policies/AllowFederatedLoginPolicy.js +0 -28
- package/lib/mjs/policies/AllowFederatedLoginPolicy.js.map +0 -1
- package/lib/mjs/policies/CaptchaPolicy.d.ts +0 -2
- package/lib/mjs/policies/CaptchaPolicy.d.ts.map +0 -1
- package/lib/mjs/policies/CaptchaPolicy.js +0 -2
- package/lib/mjs/policies/CaptchaPolicy.js.map +0 -1
|
@@ -11,14 +11,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { PasswordDto } from '../dto/password-dto.js';
|
|
14
|
-
import { User as UserModel, PasswordProvider, SessionProvider, passwordMatch, changePassword,
|
|
15
|
-
import { BaseController, BasePath, Get, Ok, Body, Patch,
|
|
14
|
+
import { User as UserModel, PasswordProvider, SessionProvider, UserSession, passwordMatch, changePassword, AccessControl } from '@spinajs/rbac';
|
|
15
|
+
import { BaseController, BasePath, Get, Ok, Body, Patch, Policy } from '@spinajs/http';
|
|
16
16
|
import { InvalidArgument } from '@spinajs/exceptions';
|
|
17
17
|
import { Autoinject } from '@spinajs/di';
|
|
18
|
-
import {
|
|
19
|
-
import * as cs from 'cookie-signature';
|
|
20
|
-
import { AuthorizedPolicy, Permission, Resource, User } from '@spinajs/rbac-http';
|
|
18
|
+
import { AuthorizedPolicy, Permission, Resource, User, Session as SessionRouteArg, SessionId as SessionIdArg } from '@spinajs/rbac-http';
|
|
21
19
|
import { _chain, _either } from '@spinajs/util';
|
|
20
|
+
import { activeRoleOf, grantsFor } from '../services/grants.js';
|
|
21
|
+
import { SessionCookieFactory } from '../services/SessionCookies.js';
|
|
22
22
|
/**
|
|
23
23
|
* Current user profile management.
|
|
24
24
|
* Allows an authenticated user to read and modify their own account — refresh profile data,
|
|
@@ -39,10 +39,11 @@ let UserController = class UserController extends BaseController {
|
|
|
39
39
|
// get user data from db
|
|
40
40
|
await user.refresh();
|
|
41
41
|
await user.Metadata.populate();
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
// `@Cookie(true)` hands over the already-unsigned session id — the previous
|
|
43
|
+
// unsigned read plus a hand-rolled `cookie-signature` call duplicated what
|
|
44
|
+
// the framework's own extractor does, secret lookup included.
|
|
45
|
+
if (ssid) {
|
|
46
|
+
const session = await this.SessionProvider.restore(ssid);
|
|
46
47
|
if (session) {
|
|
47
48
|
// Session stores the user UUID (see LoginController) — RbacUserFactory
|
|
48
49
|
// resolves the user from it on each request. Storing a dehydrated object
|
|
@@ -51,22 +52,28 @@ let UserController = class UserController extends BaseController {
|
|
|
51
52
|
await this.SessionProvider.save(session);
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
+
// Same shape as every other user-bearing response ( login, whoami, 2FA
|
|
56
|
+
// verify ): relations included and DateTime rendered as ISO strings. Plain
|
|
57
|
+
// `dehydrate()` dropped Role/Metadata and emitted raw DateTime objects, so
|
|
58
|
+
// a client refreshing its profile got a different user than it logged in with.
|
|
59
|
+
return new Ok(user.dehydrateWithRelations({ dateTimeFormat: 'iso' }));
|
|
55
60
|
}
|
|
56
61
|
/**
|
|
57
62
|
* Get current user grants
|
|
58
|
-
* Returns the flattened RBAC grants for the authenticated user
|
|
59
|
-
* the
|
|
63
|
+
* Returns the flattened RBAC grants in effect for the authenticated user — those of
|
|
64
|
+
* the session's active role, resolved through its inheritance chain. Switching the
|
|
65
|
+
* active role (`POST /auth/active-role`) changes what this returns.
|
|
60
66
|
* @security cookieAuth
|
|
61
|
-
* @returns {IGrantsMap}
|
|
67
|
+
* @returns {IGrantsMap} RBAC grants map for the active role: resource → action → permission descriptor
|
|
62
68
|
* @response 401 Unauthorized — valid session required
|
|
63
69
|
* @response 403 Forbidden — insufficient permissions
|
|
64
70
|
*/
|
|
65
|
-
async getGrants(user) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
async getGrants(user, session) {
|
|
72
|
+
// Enforcement is bound to the session's ActiveRole, so reporting the union
|
|
73
|
+
// of every assigned role told clients about actions the server would then
|
|
74
|
+
// refuse — a user holding both 'admin' and 'user' saw admin grants while
|
|
75
|
+
// acting as 'user'. Resolve exactly what the middleware resolves.
|
|
76
|
+
return new Ok(grantsFor(this.AC, activeRoleOf(user, session)));
|
|
70
77
|
}
|
|
71
78
|
/**
|
|
72
79
|
* Change own password
|
|
@@ -77,23 +84,41 @@ let UserController = class UserController extends BaseController {
|
|
|
77
84
|
* @response 401 Unauthorized — valid session required
|
|
78
85
|
* @response 403 Forbidden — insufficient permissions
|
|
79
86
|
*/
|
|
80
|
-
async newPassword(user, pwd) {
|
|
87
|
+
async newPassword(user, pwd, session) {
|
|
81
88
|
if (pwd.Password !== pwd.ConfirmPassword) {
|
|
82
89
|
throw new InvalidArgument('password does not match');
|
|
83
90
|
}
|
|
84
|
-
|
|
91
|
+
await _chain(user, _either(passwordMatch(pwd.OldPassword), changePassword(pwd.Password), () => {
|
|
85
92
|
throw new InvalidArgument('Old password is incorrect');
|
|
86
|
-
}))
|
|
93
|
+
}));
|
|
94
|
+
// `changePassword` destroys every session of this user — anyone who got in
|
|
95
|
+
// with the old password is out, which is the whole point. That includes the
|
|
96
|
+
// caller's own session, so it is replaced here with a brand new one ( a new
|
|
97
|
+
// id, not the old one revived ) and the client is handed the new cookie.
|
|
98
|
+
const replacement = new UserSession();
|
|
99
|
+
replacement.UserId = user.Id;
|
|
100
|
+
if (session) {
|
|
101
|
+
for (const [key, value] of session.Data) {
|
|
102
|
+
replacement.Data.set(key, value);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
replacement.Data.set('User', user.Uuid);
|
|
107
|
+
replacement.Data.set('Logged', true);
|
|
108
|
+
replacement.Data.set('Authorized', true);
|
|
109
|
+
replacement.Data.set('ActiveRole', user.Role?.[0]);
|
|
110
|
+
}
|
|
111
|
+
await this.SessionProvider.save(replacement);
|
|
112
|
+
return new Ok(null, {
|
|
113
|
+
Coockies: [this.SessionCookies.issue(replacement)],
|
|
114
|
+
Headers: [{ Name: 'Cache-Control', Value: 'no-store' }],
|
|
115
|
+
});
|
|
87
116
|
}
|
|
88
117
|
};
|
|
89
118
|
__decorate([
|
|
90
119
|
Autoinject(),
|
|
91
120
|
__metadata("design:type", PasswordProvider)
|
|
92
121
|
], UserController.prototype, "PasswordProvider", void 0);
|
|
93
|
-
__decorate([
|
|
94
|
-
Config('http.cookie.secret'),
|
|
95
|
-
__metadata("design:type", String)
|
|
96
|
-
], UserController.prototype, "CoockieSecret", void 0);
|
|
97
122
|
__decorate([
|
|
98
123
|
Autoinject(),
|
|
99
124
|
__metadata("design:type", SessionProvider)
|
|
@@ -102,11 +127,15 @@ __decorate([
|
|
|
102
127
|
Autoinject(AccessControl),
|
|
103
128
|
__metadata("design:type", AccessControl)
|
|
104
129
|
], UserController.prototype, "AC", void 0);
|
|
130
|
+
__decorate([
|
|
131
|
+
Autoinject(SessionCookieFactory),
|
|
132
|
+
__metadata("design:type", SessionCookieFactory)
|
|
133
|
+
], UserController.prototype, "SessionCookies", void 0);
|
|
105
134
|
__decorate([
|
|
106
135
|
Get(),
|
|
107
136
|
Permission(['readOwn']),
|
|
108
137
|
__param(0, User()),
|
|
109
|
-
__param(1,
|
|
138
|
+
__param(1, SessionIdArg()),
|
|
110
139
|
__metadata("design:type", Function),
|
|
111
140
|
__metadata("design:paramtypes", [UserModel, String]),
|
|
112
141
|
__metadata("design:returntype", Promise)
|
|
@@ -115,8 +144,9 @@ __decorate([
|
|
|
115
144
|
Get("grants"),
|
|
116
145
|
Permission(['readOwn']),
|
|
117
146
|
__param(0, User()),
|
|
147
|
+
__param(1, SessionRouteArg()),
|
|
118
148
|
__metadata("design:type", Function),
|
|
119
|
-
__metadata("design:paramtypes", [UserModel]),
|
|
149
|
+
__metadata("design:paramtypes", [UserModel, Object]),
|
|
120
150
|
__metadata("design:returntype", Promise)
|
|
121
151
|
], UserController.prototype, "getGrants", null);
|
|
122
152
|
__decorate([
|
|
@@ -124,8 +154,9 @@ __decorate([
|
|
|
124
154
|
Permission(["updateOwn"]),
|
|
125
155
|
__param(0, User()),
|
|
126
156
|
__param(1, Body()),
|
|
157
|
+
__param(2, SessionRouteArg()),
|
|
127
158
|
__metadata("design:type", Function),
|
|
128
|
-
__metadata("design:paramtypes", [UserModel, PasswordDto]),
|
|
159
|
+
__metadata("design:paramtypes", [UserModel, PasswordDto, Object]),
|
|
129
160
|
__metadata("design:returntype", Promise)
|
|
130
161
|
], UserController.prototype, "newPassword", null);
|
|
131
162
|
UserController = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserController.js","sourceRoot":"","sources":["../../../src/controllers/UserController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,
|
|
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;
|
|
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"}
|
|
@@ -12,22 +12,21 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
12
|
};
|
|
13
13
|
import { Post, BasePath, Ok, Del, Body, Get, Query, Param, Policy, BaseController, Patch } from '@spinajs/http';
|
|
14
14
|
import { User as UserModel, UserMetadata } from '@spinajs/rbac';
|
|
15
|
+
import { Autoinject } from '@spinajs/di';
|
|
15
16
|
import { AuthorizedPolicy, Permission, Resource, User } from '@spinajs/rbac-http';
|
|
16
17
|
import { AsModel, PaginationDTO, OrderDTO, Filter, FromModel } from '@spinajs/orm-http';
|
|
17
18
|
import { UserMetadataDto } from '../dto/metadata-dto.js';
|
|
18
|
-
import { InsertBehaviour, SortOrder } from '@spinajs/orm';
|
|
19
19
|
import { FilterableUserMetadata } from '../models/FilterableUserMetadata.js';
|
|
20
|
-
|
|
21
|
-
* Fallback page size. A request without a `limit` used to reach `take(0)`,
|
|
22
|
-
* which the query builder rejects ( "take count should be a positive number" ),
|
|
23
|
-
* so plain listing requests failed instead of returning the first page.
|
|
24
|
-
*/
|
|
25
|
-
const DEFAULT_PAGE_SIZE = 10;
|
|
20
|
+
import { UserMetadataService } from '../services/UserMetadataService.js';
|
|
26
21
|
/**
|
|
27
22
|
* User metadata management.
|
|
28
23
|
* Provides CRUD operations for key-value metadata entries attached to user accounts.
|
|
29
24
|
* Admin routes operate on any user (identified by UUID), while own routes operate on the
|
|
30
25
|
* currently authenticated user's metadata.
|
|
26
|
+
*
|
|
27
|
+
* Both families delegate to {@link UserMetadataService}, which owns the owner
|
|
28
|
+
* scoping — the only thing that ever differed between them is where the owner
|
|
29
|
+
* id comes from.
|
|
31
30
|
* @tags User Metadata
|
|
32
31
|
*/
|
|
33
32
|
let UserMetadataController = class UserMetadataController extends BaseController {
|
|
@@ -46,13 +45,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
46
45
|
* @response 404 User not found
|
|
47
46
|
*/
|
|
48
47
|
async readUserMeta(user, pagination, order, filter) {
|
|
49
|
-
|
|
50
|
-
return new Ok(FilterableUserMetadata.select().where({
|
|
51
|
-
user_id: user.Id
|
|
52
|
-
}).filter(filter?.filters ?? [], filter?.op)
|
|
53
|
-
.take(limit)
|
|
54
|
-
.skip(limit * (pagination?.page ?? 0))
|
|
55
|
-
.order(order?.column ?? 'Id', order?.order ?? SortOrder.DESC));
|
|
48
|
+
return new Ok(this.Metadata.list(user.Id, pagination, order, filter));
|
|
56
49
|
}
|
|
57
50
|
/**
|
|
58
51
|
* Get a single metadata entry for a specific user (admin)
|
|
@@ -66,10 +59,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
66
59
|
* @response 404 User or metadata key not found
|
|
67
60
|
*/
|
|
68
61
|
async getUserMeta(user, key) {
|
|
69
|
-
return new Ok(
|
|
70
|
-
Key: key,
|
|
71
|
-
user_id: user.Id
|
|
72
|
-
}).firstOrFail());
|
|
62
|
+
return new Ok(this.Metadata.getByKey(user.Id, key));
|
|
73
63
|
}
|
|
74
64
|
/**
|
|
75
65
|
* Add or update metadata for a specific user (admin)
|
|
@@ -82,8 +72,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
82
72
|
* @response 404 User not found
|
|
83
73
|
*/
|
|
84
74
|
async addUserMetadata(user, metadata) {
|
|
85
|
-
|
|
86
|
-
await metadata.insert(InsertBehaviour.InsertOrUpdate);
|
|
75
|
+
await this.Metadata.upsert(user.Id, metadata);
|
|
87
76
|
return new Ok();
|
|
88
77
|
}
|
|
89
78
|
/**
|
|
@@ -99,11 +88,10 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
99
88
|
* @response 404 User or metadata entry not found
|
|
100
89
|
*/
|
|
101
90
|
async updateUserMetadata(meta, _user, data) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
});
|
|
91
|
+
// @FromModel already resolved the entry within the addressed user's
|
|
92
|
+
// scope ( so a miss is a 404 ); the write still goes through the
|
|
93
|
+
// owner-scoped service so the predicate is not restated here.
|
|
94
|
+
await this.Metadata.update(_user.Id, meta.Id, data);
|
|
107
95
|
return new Ok();
|
|
108
96
|
}
|
|
109
97
|
/**
|
|
@@ -118,24 +106,9 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
118
106
|
* @response 404 User or metadata entry not found
|
|
119
107
|
*/
|
|
120
108
|
async deleteUserMetadata(user, meta) {
|
|
121
|
-
|
|
122
|
-
// goes in as the primary key and ownership is AND-ed on top of it —
|
|
123
|
-
// deleting by id alone would let any user id delete anybody's entry.
|
|
124
|
-
await UserMetadata.destroy(meta).andWhere('user_id', user.Id);
|
|
109
|
+
await this.Metadata.delete(user.Id, meta);
|
|
125
110
|
return new Ok();
|
|
126
111
|
}
|
|
127
|
-
/**
|
|
128
|
-
* List own metadata
|
|
129
|
-
* Returns a paginated, filtered, and ordered list of metadata entries for the authenticated user.
|
|
130
|
-
* @security cookieAuth
|
|
131
|
-
* @param pagination.page Page number (zero-based)
|
|
132
|
-
* @param pagination.limit Number of entries per page
|
|
133
|
-
* @param order.column Column to sort by (default: Id)
|
|
134
|
-
* @param order.order Sort direction: ASC or DESC (default: DESC)
|
|
135
|
-
* @returns {IUserMetadataEntry[]} Paginated list of own metadata entries
|
|
136
|
-
* @response 401 Unauthorized — valid session required
|
|
137
|
-
* @response 403 Forbidden — readOwn permission required
|
|
138
|
-
*/
|
|
139
112
|
/**
|
|
140
113
|
* List own metadata
|
|
141
114
|
* Returns a paginated, filtered, and ordered list of metadata entries for the authenticated user.
|
|
@@ -149,15 +122,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
149
122
|
* @response 403 Forbidden — readOwn permission required
|
|
150
123
|
*/
|
|
151
124
|
async readMeta(user, pagination, order, filter) {
|
|
152
|
-
|
|
153
|
-
// ownership for the metadata model (queries resolve to the unsafe base
|
|
154
|
-
// model without an @OrmResource), so every own-route filters by the
|
|
155
|
-
// authenticated user's id directly.
|
|
156
|
-
const limit = pagination?.limit || DEFAULT_PAGE_SIZE;
|
|
157
|
-
return new Ok(FilterableUserMetadata.select().where('user_id', user.Id).filter(filter?.filters ?? [], filter?.op)
|
|
158
|
-
.take(limit)
|
|
159
|
-
.skip(limit * (pagination?.page ?? 0))
|
|
160
|
-
.order(order?.column ?? 'Id', order?.order ?? SortOrder.DESC));
|
|
125
|
+
return new Ok(this.Metadata.list(user.Id, pagination, order, filter));
|
|
161
126
|
}
|
|
162
127
|
/**
|
|
163
128
|
* Get own metadata entry by key
|
|
@@ -170,10 +135,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
170
135
|
* @response 404 Metadata key not found
|
|
171
136
|
*/
|
|
172
137
|
async getMeta(user, key) {
|
|
173
|
-
return new Ok(
|
|
174
|
-
Key: key,
|
|
175
|
-
user_id: user.Id,
|
|
176
|
-
}).firstOrFail());
|
|
138
|
+
return new Ok(this.Metadata.getByKey(user.Id, key));
|
|
177
139
|
}
|
|
178
140
|
/**
|
|
179
141
|
* Add or update own metadata
|
|
@@ -184,10 +146,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
184
146
|
* @response 403 Forbidden — updateOwn permission required
|
|
185
147
|
*/
|
|
186
148
|
async addMetadata(user, metadata) {
|
|
187
|
-
|
|
188
|
-
// supplied in the request body
|
|
189
|
-
metadata.user_id = user.Id;
|
|
190
|
-
await metadata.insert(InsertBehaviour.InsertOrUpdate);
|
|
149
|
+
await this.Metadata.upsert(user.Id, metadata);
|
|
191
150
|
return new Ok();
|
|
192
151
|
}
|
|
193
152
|
/**
|
|
@@ -202,19 +161,7 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
202
161
|
* @response 404 Metadata entry not found
|
|
203
162
|
*/
|
|
204
163
|
async updateMetadata(user, meta, data) {
|
|
205
|
-
|
|
206
|
-
// filter. Without the grouping the flat "Key = ? OR Id = ? AND user_id = ?"
|
|
207
|
-
// binds as "Key = ? OR (Id = ? AND user_id = ?)", letting any user update
|
|
208
|
-
// another user's metadata by its Key. Scoping by user_id explicitly (not
|
|
209
|
-
// relying on the query middleware, which does not fire for this model)
|
|
210
|
-
// keeps the update owner-bound.
|
|
211
|
-
await UserMetadata.update({
|
|
212
|
-
Key: data.Key,
|
|
213
|
-
Value: data.Value,
|
|
214
|
-
Type: data.Type
|
|
215
|
-
}).where(function () {
|
|
216
|
-
this.where("Key", meta).orWhere("Id", meta);
|
|
217
|
-
}).andWhere('user_id', user.Id);
|
|
164
|
+
await this.Metadata.update(user.Id, meta, data);
|
|
218
165
|
return new Ok();
|
|
219
166
|
}
|
|
220
167
|
/**
|
|
@@ -228,10 +175,14 @@ let UserMetadataController = class UserMetadataController extends BaseController
|
|
|
228
175
|
* @response 404 Metadata entry not found
|
|
229
176
|
*/
|
|
230
177
|
async deleteMetadata(user, meta) {
|
|
231
|
-
await
|
|
178
|
+
await this.Metadata.delete(user.Id, meta);
|
|
232
179
|
return new Ok();
|
|
233
180
|
}
|
|
234
181
|
};
|
|
182
|
+
__decorate([
|
|
183
|
+
Autoinject(UserMetadataService),
|
|
184
|
+
__metadata("design:type", UserMetadataService)
|
|
185
|
+
], UserMetadataController.prototype, "Metadata", void 0);
|
|
235
186
|
__decorate([
|
|
236
187
|
Get(":user/metadata"),
|
|
237
188
|
Permission(['readAny']),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserMetadataController.js","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"UserMetadataController.js","sourceRoot":"","sources":["../../../src/controllers/UserMetadataController.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -8,23 +8,28 @@ 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
10
|
import { Schema } from '@spinajs/validation';
|
|
11
|
-
export const
|
|
11
|
+
export const ConfirmPasswordDtoSchema = {
|
|
12
12
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
13
|
-
title: '
|
|
13
|
+
title: 'Confirm password DTO',
|
|
14
14
|
type: 'object',
|
|
15
15
|
properties: {
|
|
16
|
-
|
|
17
|
-
Login: { type: 'string', maxLength: 64 },
|
|
16
|
+
Password: { type: 'string', maxLength: 32, description: 'Current password, re-entered to confirm a sensitive change' },
|
|
18
17
|
},
|
|
18
|
+
required: ['Password'],
|
|
19
19
|
};
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Re-authentication payload for sensitive self-service operations — enabling or
|
|
22
|
+
* disabling 2FA. A hijacked session alone must not be enough to weaken a
|
|
23
|
+
* user's second factor.
|
|
24
|
+
*/
|
|
25
|
+
let ConfirmPasswordDto = class ConfirmPasswordDto {
|
|
21
26
|
constructor(data) {
|
|
22
27
|
Object.assign(this, data);
|
|
23
28
|
}
|
|
24
29
|
};
|
|
25
|
-
|
|
26
|
-
Schema(
|
|
30
|
+
ConfirmPasswordDto = __decorate([
|
|
31
|
+
Schema(ConfirmPasswordDtoSchema),
|
|
27
32
|
__metadata("design:paramtypes", [Object])
|
|
28
|
-
],
|
|
29
|
-
export {
|
|
30
|
-
//# sourceMappingURL=
|
|
33
|
+
], ConfirmPasswordDto);
|
|
34
|
+
export { ConfirmPasswordDto };
|
|
35
|
+
//# 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,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,MAAM,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,kBAAkB;IAD9B,MAAM,CAAC,wBAAwB,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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Schema } from '@spinajs/validation';
|
|
11
|
+
export const PasswordResetRequestDtoSchema = {
|
|
12
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
13
|
+
title: 'Password reset request DTO',
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
Email: { type: 'string', format: 'email', description: 'Email address of the account to reset' },
|
|
17
|
+
},
|
|
18
|
+
required: ['Email'],
|
|
19
|
+
};
|
|
20
|
+
/** Payload starting a password reset — identifies the account by email. */
|
|
21
|
+
let PasswordResetRequestDto = class PasswordResetRequestDto {
|
|
22
|
+
constructor(data) {
|
|
23
|
+
Object.assign(this, data);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
PasswordResetRequestDto = __decorate([
|
|
27
|
+
Schema(PasswordResetRequestDtoSchema),
|
|
28
|
+
__metadata("design:paramtypes", [Object])
|
|
29
|
+
], PasswordResetRequestDto);
|
|
30
|
+
export { PasswordResetRequestDto };
|
|
31
|
+
export const PasswordResetConfirmDtoSchema = {
|
|
32
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
33
|
+
title: 'Password reset confirmation DTO',
|
|
34
|
+
type: 'object',
|
|
35
|
+
properties: {
|
|
36
|
+
Email: { type: 'string', format: 'email', description: 'Email address the reset token was issued for' },
|
|
37
|
+
Token: { type: 'string', maxLength: 64, minLength: 1, description: 'Reset token delivered to the user' },
|
|
38
|
+
Password: { type: 'string', maxLength: 32, minLength: 6, description: 'New password (6–32 characters)' },
|
|
39
|
+
ConfirmPassword: { type: 'string', maxLength: 32, minLength: 6, description: 'Must match Password' },
|
|
40
|
+
},
|
|
41
|
+
required: ['Email', 'Token', 'Password', 'ConfirmPassword'],
|
|
42
|
+
};
|
|
43
|
+
/** Payload completing a password reset with the issued token. */
|
|
44
|
+
let PasswordResetConfirmDto = class PasswordResetConfirmDto {
|
|
45
|
+
constructor(data) {
|
|
46
|
+
Object.assign(this, data);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
PasswordResetConfirmDto = __decorate([
|
|
50
|
+
Schema(PasswordResetConfirmDtoSchema),
|
|
51
|
+
__metadata("design:paramtypes", [Object])
|
|
52
|
+
], PasswordResetConfirmDto);
|
|
53
|
+
export { PasswordResetConfirmDto };
|
|
54
|
+
//# sourceMappingURL=password-reset-dto.js.map
|