@acorex-platform/module-security-management-server 0.0.15 → 0.0.18

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 (36) hide show
  1. package/contracts/src/entities/users/users.entity.js +110 -213
  2. package/contracts/src/entities/users/users.entity.js.map +1 -1
  3. package/contracts/src/entities/users/users.types.d.ts +9 -1
  4. package/contracts/src/index.d.ts +3 -0
  5. package/contracts/src/index.js +3 -0
  6. package/contracts/src/index.js.map +1 -1
  7. package/contracts/src/resolve-user-effective-state.d.ts +10 -0
  8. package/contracts/src/resolve-user-effective-state.js +46 -0
  9. package/contracts/src/resolve-user-effective-state.js.map +1 -0
  10. package/contracts/src/server-commands.d.ts +18 -0
  11. package/contracts/src/server-commands.js +12 -0
  12. package/contracts/src/server-commands.js.map +1 -0
  13. package/contracts/src/user-password-reset.d.ts +9 -0
  14. package/contracts/src/user-password-reset.js +5 -0
  15. package/contracts/src/user-password-reset.js.map +1 -0
  16. package/package.json +9 -2
  17. package/src/lib/middlewares/user-effective-state.middleware.d.ts +13 -0
  18. package/src/lib/middlewares/user-effective-state.middleware.js +57 -0
  19. package/src/lib/middlewares/user-effective-state.middleware.js.map +1 -0
  20. package/src/lib/password-reset/complete-password-reset.command.d.ts +9 -0
  21. package/src/lib/password-reset/complete-password-reset.command.js +41 -0
  22. package/src/lib/password-reset/complete-password-reset.command.js.map +1 -0
  23. package/src/lib/password-reset/send-password-reset-email.command.d.ts +21 -0
  24. package/src/lib/password-reset/send-password-reset-email.command.js +48 -0
  25. package/src/lib/password-reset/send-password-reset-email.command.js.map +1 -0
  26. package/src/lib/password-reset/user-password-reset.service.d.ts +31 -0
  27. package/src/lib/password-reset/user-password-reset.service.js +282 -0
  28. package/src/lib/password-reset/user-password-reset.service.js.map +1 -0
  29. package/src/lib/security-management-server.module.js +25 -0
  30. package/src/lib/security-management-server.module.js.map +1 -1
  31. package/src/lib/seed/user/resolve-user-effective-state.util.d.ts +2 -12
  32. package/src/lib/seed/user/resolve-user-effective-state.util.js +5 -56
  33. package/src/lib/seed/user/resolve-user-effective-state.util.js.map +1 -1
  34. package/src/lib/seed/user/user.mock.d.ts +1 -0
  35. package/src/lib/seed/user/user.mock.js +8 -2
  36. package/src/lib/seed/user/user.mock.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-password-reset.js","sourceRoot":"","sources":["../../../../../libs/modules/security-management/server/contracts/src/user-password-reset.ts"],"names":[],"mappings":";AAAA,kDAAkD;;AAYlD,YAAY"}
package/package.json CHANGED
@@ -1,12 +1,19 @@
1
1
  {
2
2
  "name": "@acorex-platform/module-security-management-server",
3
- "version": "0.0.15",
3
+ "version": "0.0.18",
4
4
  "type": "commonjs",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
7
7
  "peerDependencies": {
8
8
  "@nestjs/common": "^11.0.0",
9
- "@acorex-platform/module-common-server": "0.0.15"
9
+ "@acorex-platform/framework-server": "0.0.18",
10
+ "@acorex-platform/framework-shared": "0.0.18",
11
+ "@acorex-platform/module-communication-management-server": "0.0.18",
12
+ "@acorex-platform/module-content-management-server": "0.0.18",
13
+ "@acorex-platform/module-organization-management-server": "0.0.18",
14
+ "@acorex-platform/module-security-management-server": "0.0.18",
15
+ "@acorex-platform/module-settings-management-server": "0.0.18",
16
+ "@acorex-platform/module-common-server": "0.0.18"
10
17
  },
11
18
  "exports": {
12
19
  "./package.json": "./package.json",
@@ -0,0 +1,13 @@
1
+ import { AXPEntityOp, EntityStorageContext, EntityStorageMiddleware } from '@acorex-platform/framework-server/core';
2
+ /**
3
+ * Keeps persisted `effectiveState` in sync with `accountState` + `accessState`
4
+ * on SecurityManagement.User create/update.
5
+ */
6
+ export declare class UserEffectiveStateMiddleware implements EntityStorageMiddleware {
7
+ readonly target: {
8
+ entity: string;
9
+ ops: AXPEntityOp[];
10
+ order: number;
11
+ };
12
+ execute(ctx: EntityStorageContext, next: () => Promise<void>): Promise<void>;
13
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserEffectiveStateMiddleware = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const module_security_management_contracts_1 = require("@acorex-platform/module-security-management-contracts");
6
+ const common_1 = require("@nestjs/common");
7
+ //#region ---- User effective state middleware ----
8
+ const USER_ENTITY = 'SecurityManagement.User';
9
+ /**
10
+ * Keeps persisted `effectiveState` in sync with `accountState` + `accessState`
11
+ * on SecurityManagement.User create/update.
12
+ */
13
+ let UserEffectiveStateMiddleware = class UserEffectiveStateMiddleware {
14
+ constructor() {
15
+ this.target = {
16
+ entity: USER_ENTITY,
17
+ ops: ['create', 'update'],
18
+ order: 4,
19
+ };
20
+ }
21
+ execute(ctx, next) {
22
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
23
+ var _a;
24
+ if (!ctx.data || typeof ctx.data !== 'object') {
25
+ yield next();
26
+ return;
27
+ }
28
+ const patch = ctx.data;
29
+ let accountState = patch['accountState'];
30
+ let accessState = patch['accessState'];
31
+ if (ctx.op === 'update' && ctx.id && (accountState === undefined || accessState === undefined)) {
32
+ try {
33
+ const existing = (yield ctx.backend.getOne(ctx.entityName, ctx.id));
34
+ if (existing) {
35
+ accountState = accountState !== null && accountState !== void 0 ? accountState : existing['accountState'];
36
+ accessState = accessState !== null && accessState !== void 0 ? accessState : existing['accessState'];
37
+ }
38
+ }
39
+ catch (_b) {
40
+ /* keep patch-only values */
41
+ }
42
+ }
43
+ patch['effectiveState'] = (0, module_security_management_contracts_1.resolveAXMUserEffectiveState)({
44
+ accountState,
45
+ accessState: (_a = accessState) !== null && _a !== void 0 ? _a : module_security_management_contracts_1.AXMUserAccessState.Allowed,
46
+ });
47
+ ctx.data = patch;
48
+ yield next();
49
+ });
50
+ }
51
+ };
52
+ exports.UserEffectiveStateMiddleware = UserEffectiveStateMiddleware;
53
+ exports.UserEffectiveStateMiddleware = UserEffectiveStateMiddleware = tslib_1.__decorate([
54
+ (0, common_1.Injectable)()
55
+ ], UserEffectiveStateMiddleware);
56
+ //#endregion
57
+ //# sourceMappingURL=user-effective-state.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-effective-state.middleware.js","sourceRoot":"","sources":["../../../../../../libs/modules/security-management/server/src/lib/middlewares/user-effective-state.middleware.ts"],"names":[],"mappings":";;;;AAKA,gHAG+D;AAE/D,2CAA4C;AAE5C,mDAAmD;AAEnD,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C;;;GAGG;AAEI,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IAAlC;QACI,WAAM,GAAG;YAChB,MAAM,EAAE,WAAW;YACnB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAkB;YAC1C,KAAK,EAAE,CAAC;SACT,CAAC;IAmCJ,CAAC;IAjCO,OAAO,CAAC,GAAyB,EAAE,IAAyB;;;YAChE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9C,MAAM,IAAI,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAA+B,CAAC;YAClD,IAAI,YAAY,GAAG,KAAK,CAAC,cAAc,CAAuB,CAAC;YAC/D,IAAI,WAAW,GAAG,KAAK,CAAC,aAAa,CAAuB,CAAC;YAE7D,IAAI,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,CAAC,EAAE,CAAC;gBAC/F,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAGrD,CAAC;oBACd,IAAI,QAAQ,EAAE,CAAC;wBACb,YAAY,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAK,QAAQ,CAAC,cAAc,CAAwB,CAAC;wBAChF,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAK,QAAQ,CAAC,aAAa,CAAwB,CAAC;oBAC/E,CAAC;gBACH,CAAC;gBAAC,WAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;YACH,CAAC;YAED,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAA,mEAA4B,EAAC;gBACrD,YAAY;gBACZ,WAAW,EAAE,MAAC,WAA8C,mCAAI,yDAAkB,CAAC,OAAO;aAC3F,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;YAEjB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;KAAA;CACF,CAAA;AAxCY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,mBAAU,GAAE;GACA,4BAA4B,CAwCxC;AAED,YAAY"}
@@ -0,0 +1,9 @@
1
+ import type { AXPCommand } from '@acorex-platform/framework-shared/runtime';
2
+ import type { AXPExecuteCommandResult } from '@acorex-platform/framework-shared/core';
3
+ import { type AXMCompletePasswordResetInput } from '@acorex-platform/module-security-management-contracts';
4
+ import { UserPasswordResetService } from './user-password-reset.service';
5
+ export declare class CompletePasswordResetCommand implements AXPCommand<AXMCompletePasswordResetInput, unknown> {
6
+ private readonly passwordReset;
7
+ constructor(passwordReset: UserPasswordResetService);
8
+ execute(input: AXMCompletePasswordResetInput): Promise<AXPExecuteCommandResult>;
9
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletePasswordResetCommand = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const abstract_1 = require("@acorex-platform/framework-server/domain/abstract");
7
+ const module_security_management_contracts_1 = require("@acorex-platform/module-security-management-contracts");
8
+ const user_password_reset_service_1 = require("./user-password-reset.service");
9
+ //#region ---- Complete password reset command ----
10
+ let CompletePasswordResetCommand = class CompletePasswordResetCommand {
11
+ constructor(passwordReset) {
12
+ this.passwordReset = passwordReset;
13
+ }
14
+ execute(input) {
15
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
16
+ try {
17
+ const result = yield this.passwordReset.completePasswordReset(input !== null && input !== void 0 ? input : { token: '', newPassword: '' });
18
+ return {
19
+ success: result.success,
20
+ message: result.message ? { text: result.message } : undefined,
21
+ };
22
+ }
23
+ catch (error) {
24
+ return {
25
+ success: false,
26
+ message: {
27
+ text: error instanceof Error ? error.message : 'Failed to reset password.',
28
+ },
29
+ };
30
+ }
31
+ });
32
+ }
33
+ };
34
+ exports.CompletePasswordResetCommand = CompletePasswordResetCommand;
35
+ exports.CompletePasswordResetCommand = CompletePasswordResetCommand = tslib_1.__decorate([
36
+ (0, abstract_1.ServerHandler)({ key: module_security_management_contracts_1.AXMSecurityManagementServerCommands.CompletePasswordReset }),
37
+ (0, common_1.Injectable)(),
38
+ tslib_1.__metadata("design:paramtypes", [user_password_reset_service_1.UserPasswordResetService])
39
+ ], CompletePasswordResetCommand);
40
+ //#endregion
41
+ //# sourceMappingURL=complete-password-reset.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-password-reset.command.js","sourceRoot":"","sources":["../../../../../../libs/modules/security-management/server/src/lib/password-reset/complete-password-reset.command.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAG5C,gFAAkF;AAClF,gHAG+D;AAE/D,+EAAyE;AAEzE,mDAAmD;AAI5C,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IAGvC,YAA6B,aAAuC;QAAvC,kBAAa,GAAb,aAAa,CAA0B;IAAG,CAAC;IAElE,OAAO,CAAC,KAAoC;;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvG,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;iBAC/D,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;qBAC3E;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AArBY,oEAA4B;uCAA5B,4BAA4B;IAFxC,IAAA,wBAAa,EAAC,EAAE,GAAG,EAAE,0EAAmC,CAAC,qBAAqB,EAAE,CAAC;IACjF,IAAA,mBAAU,GAAE;6CAIiC,sDAAwB;GAHzD,4BAA4B,CAqBxC;AAED,YAAY"}
@@ -0,0 +1,21 @@
1
+ import type { AXPCommand } from '@acorex-platform/framework-shared/runtime';
2
+ import type { AXPExecuteCommandResult } from '@acorex-platform/framework-shared/core';
3
+ import { type AXMSendPasswordResetEmailInput } from '@acorex-platform/module-security-management-contracts';
4
+ import { UserPasswordResetService } from './user-password-reset.service';
5
+ export declare class SendPasswordResetEmailCommand implements AXPCommand<AXMSendPasswordResetEmailInput & {
6
+ __context__?: {
7
+ data?: {
8
+ id?: string;
9
+ };
10
+ };
11
+ }, unknown> {
12
+ private readonly passwordReset;
13
+ constructor(passwordReset: UserPasswordResetService);
14
+ execute(input?: AXMSendPasswordResetEmailInput & {
15
+ __context__?: {
16
+ data?: {
17
+ id?: string;
18
+ };
19
+ };
20
+ }): Promise<AXPExecuteCommandResult>;
21
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SendPasswordResetEmailCommand = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const abstract_1 = require("@acorex-platform/framework-server/domain/abstract");
7
+ const module_security_management_contracts_1 = require("@acorex-platform/module-security-management-contracts");
8
+ const user_password_reset_service_1 = require("./user-password-reset.service");
9
+ //#region ---- Send password reset email command ----
10
+ let SendPasswordResetEmailCommand = class SendPasswordResetEmailCommand {
11
+ constructor(passwordReset) {
12
+ this.passwordReset = passwordReset;
13
+ }
14
+ execute() {
15
+ return tslib_1.__awaiter(this, arguments, void 0, function* (input = {}) {
16
+ var _a, _b, _c;
17
+ try {
18
+ const userId = (_a = input.userId) !== null && _a !== void 0 ? _a : (_c = (_b = input.__context__) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.id;
19
+ const result = yield this.passwordReset.sendPasswordResetEmail({
20
+ userId: userId ? String(userId) : undefined,
21
+ login: input.login,
22
+ webOrigin: input.webOrigin,
23
+ });
24
+ return {
25
+ success: result.success,
26
+ data: { sent: result.sent === true },
27
+ message: result.message ? { text: result.message } : undefined,
28
+ };
29
+ }
30
+ catch (error) {
31
+ return {
32
+ success: false,
33
+ message: {
34
+ text: error instanceof Error ? error.message : 'Failed to send password reset email.',
35
+ },
36
+ };
37
+ }
38
+ });
39
+ }
40
+ };
41
+ exports.SendPasswordResetEmailCommand = SendPasswordResetEmailCommand;
42
+ exports.SendPasswordResetEmailCommand = SendPasswordResetEmailCommand = tslib_1.__decorate([
43
+ (0, abstract_1.ServerHandler)({ key: module_security_management_contracts_1.AXMSecurityManagementServerCommands.SendPasswordResetEmail }),
44
+ (0, common_1.Injectable)(),
45
+ tslib_1.__metadata("design:paramtypes", [user_password_reset_service_1.UserPasswordResetService])
46
+ ], SendPasswordResetEmailCommand);
47
+ //#endregion
48
+ //# sourceMappingURL=send-password-reset-email.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-password-reset-email.command.js","sourceRoot":"","sources":["../../../../../../libs/modules/security-management/server/src/lib/password-reset/send-password-reset-email.command.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAG5C,gFAAkF;AAClF,gHAG+D;AAE/D,+EAAyE;AAEzE,qDAAqD;AAI9C,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IAGxC,YAA6B,aAAuC;QAAvC,kBAAa,GAAb,aAAa,CAA0B;IAAG,CAAC;IAElE,OAAO;qEACX,QAAuF,EAAE;;YAEzF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAA,KAAK,CAAC,MAAM,mCAAI,MAAA,MAAA,KAAK,CAAC,WAAW,0CAAE,IAAI,0CAAE,EAAE,CAAC;gBAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC;oBAC7D,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC3C,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;oBACpC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;iBAC/D,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC;qBACtF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AA9BY,sEAA6B;wCAA7B,6BAA6B;IAFzC,IAAA,wBAAa,EAAC,EAAE,GAAG,EAAE,0EAAmC,CAAC,sBAAsB,EAAE,CAAC;IAClF,IAAA,mBAAU,GAAE;6CAIiC,sDAAwB;GAHzD,6BAA6B,CA8BzC;AAED,YAAY"}
@@ -0,0 +1,31 @@
1
+ import { EntityStorageMiddlewareService } from '@acorex-platform/framework-server/core';
2
+ import { ServerCommandExecutorService } from '@acorex-platform/framework-server/domain/providers';
3
+ import { SettingsManagementStoreService } from '@acorex-platform/module-settings-management-server';
4
+ import { AXMCompletePasswordResetInput, AXMSendPasswordResetEmailInput } from '@acorex-platform/module-security-management-contracts';
5
+ export declare class UserPasswordResetService {
6
+ private readonly entityStorage;
7
+ private readonly commandExecutor;
8
+ private readonly settingsStore;
9
+ private readonly logger;
10
+ private readonly recentRequests;
11
+ constructor(entityStorage: EntityStorageMiddlewareService, commandExecutor: ServerCommandExecutorService, settingsStore: SettingsManagementStoreService);
12
+ /**
13
+ * Shared by admin Action and public forgot-password.
14
+ * Always returns a generic success for the forgot path (no user enumeration).
15
+ */
16
+ sendPasswordResetEmail(input: AXMSendPasswordResetEmailInput): Promise<{
17
+ success: boolean;
18
+ message?: string;
19
+ sent?: boolean;
20
+ }>;
21
+ completePasswordReset(input: AXMCompletePasswordResetInput): Promise<{
22
+ success: boolean;
23
+ message?: string;
24
+ }>;
25
+ private resolveUser;
26
+ private listUsers;
27
+ private resolveCompanyEmailMerge;
28
+ private loadTenantSnapshot;
29
+ private resolveScopedSettings;
30
+ private assertRateLimit;
31
+ }
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ var UserPasswordResetService_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.UserPasswordResetService = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const crypto_1 = require("crypto");
8
+ const lodash_1 = require("lodash");
9
+ const core_1 = require("@acorex-platform/framework-server/core");
10
+ const providers_1 = require("@acorex-platform/framework-server/domain/providers");
11
+ const abstract_1 = require("@acorex-platform/framework-server/jql/abstract");
12
+ const core_2 = require("@acorex-platform/framework-shared/core");
13
+ const module_communication_management_contracts_1 = require("@acorex-platform/module-communication-management-contracts");
14
+ const module_content_management_contracts_1 = require("@acorex-platform/module-content-management-contracts");
15
+ const module_organization_management_contracts_1 = require("@acorex-platform/module-organization-management-contracts");
16
+ const module_settings_management_server_1 = require("@acorex-platform/module-settings-management-server");
17
+ //#region ---- Constants ----
18
+ const USER_ENTITY = 'SecurityManagement.User';
19
+ const TENANT_ENTITY = 'TenantManagement.Tenant';
20
+ const TEMPLATE_NAME = 'password-reset';
21
+ const EMAIL_CHANNEL = 'email-smtp';
22
+ const EXPIRY_MINUTES = 60;
23
+ const RATE_LIMIT_WINDOW_MS = 60000;
24
+ const RATE_LIMIT_MAX = 5;
25
+ //#endregion
26
+ //#region ---- Helpers ----
27
+ function resolvePasswordResetApiOrigin() {
28
+ var _a, _b, _c;
29
+ const fromBase = ((_a = process.env['ACOREX_API_BASE_URL']) === null || _a === void 0 ? void 0 : _a.trim()) ||
30
+ ((_b = process.env['DEMO_API_BASE_URL']) === null || _b === void 0 ? void 0 : _b.trim()) ||
31
+ '';
32
+ if (fromBase) {
33
+ try {
34
+ const url = new URL(fromBase.includes('://') ? fromBase : `http://${fromBase}`);
35
+ return url.origin;
36
+ }
37
+ catch (_d) {
38
+ // fall through
39
+ }
40
+ }
41
+ const port = ((_c = process.env['PORT']) === null || _c === void 0 ? void 0 : _c.trim()) || '5500';
42
+ return `http://localhost:${port}`;
43
+ }
44
+ function hashToken(token) {
45
+ return (0, crypto_1.createHash)('sha256').update(token).digest('hex');
46
+ }
47
+ function resolveWebOrigin(explicit) {
48
+ var _a, _b, _c;
49
+ const fromInput = explicit === null || explicit === void 0 ? void 0 : explicit.trim();
50
+ if (fromInput) {
51
+ return fromInput.replace(/\/$/, '');
52
+ }
53
+ const fromEnv = ((_a = process.env['ACOREX_WEB_ORIGIN']) === null || _a === void 0 ? void 0 : _a.trim()) ||
54
+ ((_c = (_b = process.env['CORS_ORIGINS']) === null || _b === void 0 ? void 0 : _b.split(',')[0]) === null || _c === void 0 ? void 0 : _c.trim()) ||
55
+ 'http://localhost:4800';
56
+ return fromEnv.replace(/\/$/, '');
57
+ }
58
+ function tokensMatch(a, b) {
59
+ const left = Buffer.from(a);
60
+ const right = Buffer.from(b);
61
+ if (left.length !== right.length) {
62
+ return false;
63
+ }
64
+ return (0, crypto_1.timingSafeEqual)(left, right);
65
+ }
66
+ //#endregion
67
+ //#region ---- User password reset service ----
68
+ let UserPasswordResetService = UserPasswordResetService_1 = class UserPasswordResetService {
69
+ constructor(entityStorage, commandExecutor, settingsStore) {
70
+ this.entityStorage = entityStorage;
71
+ this.commandExecutor = commandExecutor;
72
+ this.settingsStore = settingsStore;
73
+ this.logger = new common_1.Logger(UserPasswordResetService_1.name);
74
+ this.recentRequests = new Map();
75
+ }
76
+ /**
77
+ * Shared by admin Action and public forgot-password.
78
+ * Always returns a generic success for the forgot path (no user enumeration).
79
+ */
80
+ sendPasswordResetEmail(input) {
81
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
82
+ var _a, _b, _c, _d, _e, _f, _g;
83
+ const loginKey = ((_b = (_a = input.login) !== null && _a !== void 0 ? _a : input.userId) !== null && _b !== void 0 ? _b : '').toString().trim().toLowerCase();
84
+ if (loginKey) {
85
+ this.assertRateLimit(loginKey);
86
+ }
87
+ const user = yield this.resolveUser(input);
88
+ if (!(user === null || user === void 0 ? void 0 : user.id)) {
89
+ // Opaque success for forgot; admin path still reports missing user.
90
+ if (input.userId) {
91
+ return { success: false, message: 'User not found.' };
92
+ }
93
+ return { success: true, sent: false };
94
+ }
95
+ const email = (_c = user.email) === null || _c === void 0 ? void 0 : _c.trim();
96
+ if (!email) {
97
+ if (input.userId) {
98
+ return { success: false, message: 'User does not have an email address.' };
99
+ }
100
+ return { success: true, sent: false };
101
+ }
102
+ const rawToken = (0, crypto_1.randomBytes)(32).toString('hex');
103
+ const now = new Date();
104
+ const expiresAt = new Date(now.getTime() + EXPIRY_MINUTES * 60000);
105
+ const passwordReset = {
106
+ tokenHash: hashToken(rawToken),
107
+ expiresAt: expiresAt.toISOString(),
108
+ sentAt: now.toISOString(),
109
+ };
110
+ yield this.entityStorage.updateOne(USER_ENTITY, user.id, { passwordReset });
111
+ const isAdminPath = Boolean(input.userId);
112
+ const webOrigin = resolveWebOrigin(input.webOrigin);
113
+ const resetLink = `${webOrigin}/auth/reset-password?token=${encodeURIComponent(rawToken)}`;
114
+ const tenantId = (_e = (_d = user.ownershipInfo) === null || _d === void 0 ? void 0 : _d.tenantId) === null || _e === void 0 ? void 0 : _e.trim();
115
+ if (!tenantId) {
116
+ this.logger.warn(`password-reset missing ownershipInfo.tenantId for user ${user.id}`);
117
+ if (isAdminPath) {
118
+ return { success: false, message: 'User tenant context is required to send email.' };
119
+ }
120
+ return { success: true, sent: false };
121
+ }
122
+ const companyMerge = yield this.resolveCompanyEmailMerge(tenantId, webOrigin);
123
+ const merge = Object.assign(Object.assign({}, companyMerge), { userName: user.displayName || user.username || email, resetLink, expiryMinutes: String(EXPIRY_MINUTES) });
124
+ const renderResult = yield this.commandExecutor.execute(module_content_management_contracts_1.AXM_TEXT_TEMPLATE_RENDER_COMMAND_KEY, {
125
+ textTemplateName: TEMPLATE_NAME,
126
+ channel: 'email',
127
+ merge,
128
+ });
129
+ const rendered = renderResult === null || renderResult === void 0 ? void 0 : renderResult.data;
130
+ if (!(renderResult === null || renderResult === void 0 ? void 0 : renderResult.success) || !(rendered === null || rendered === void 0 ? void 0 : rendered.body)) {
131
+ const text = typeof ((_f = renderResult === null || renderResult === void 0 ? void 0 : renderResult.message) === null || _f === void 0 ? void 0 : _f.text) === 'string'
132
+ ? renderResult.message.text
133
+ : 'Password reset template is not configured.';
134
+ this.logger.warn(`password-reset text template render failed: ${text}`);
135
+ if (isAdminPath) {
136
+ return { success: false, message: text };
137
+ }
138
+ return { success: true, sent: false };
139
+ }
140
+ const subject = rendered.subject;
141
+ const body = rendered.body;
142
+ const result = yield this.commandExecutor.execute(module_communication_management_contracts_1.AXMCommunicationManagementServerCommands.Send, {
143
+ title: subject || 'Password reset',
144
+ message: { subject, body },
145
+ channel: EMAIL_CHANNEL,
146
+ recipientAddress: email,
147
+ recipientUserId: user.id,
148
+ recipientName: user.displayName || user.username,
149
+ tenantId,
150
+ definitionKey: TEMPLATE_NAME,
151
+ correlationId: `password-reset:${user.id}:${passwordReset.sentAt}`,
152
+ idempotencyKey: `password-reset:${user.id}:${passwordReset.tokenHash}`,
153
+ });
154
+ if (!(result === null || result === void 0 ? void 0 : result.success)) {
155
+ const text = typeof ((_g = result === null || result === void 0 ? void 0 : result.message) === null || _g === void 0 ? void 0 : _g.text) === 'string'
156
+ ? result.message.text
157
+ : 'Failed to send password reset email.';
158
+ this.logger.warn(`password-reset send failed for user ${user.id}: ${text}`);
159
+ if (isAdminPath) {
160
+ return { success: false, message: text };
161
+ }
162
+ return { success: true, sent: false };
163
+ }
164
+ return { success: true, sent: true };
165
+ });
166
+ }
167
+ completePasswordReset(input) {
168
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
169
+ var _a, _b;
170
+ const token = (_a = input.token) === null || _a === void 0 ? void 0 : _a.trim();
171
+ const newPassword = (_b = input.newPassword) !== null && _b !== void 0 ? _b : '';
172
+ if (!token || !newPassword || newPassword.length < 6) {
173
+ return { success: false, message: 'A valid token and new password are required.' };
174
+ }
175
+ const tokenHash = hashToken(token);
176
+ const users = yield this.listUsers();
177
+ const user = users.find((u) => { var _a; return ((_a = u.passwordReset) === null || _a === void 0 ? void 0 : _a.tokenHash) && tokensMatch(u.passwordReset.tokenHash, tokenHash); });
178
+ if (!(user === null || user === void 0 ? void 0 : user.id) || !user.passwordReset) {
179
+ return { success: false, message: 'This password reset link is invalid or has expired.' };
180
+ }
181
+ const expiresAt = Date.parse(user.passwordReset.expiresAt);
182
+ if (!Number.isFinite(expiresAt) || expiresAt < Date.now()) {
183
+ yield this.entityStorage.updateOne(USER_ENTITY, user.id, { passwordReset: null });
184
+ return { success: false, message: 'This password reset link is invalid or has expired.' };
185
+ }
186
+ const password = yield (0, core_2.hashPassword)(newPassword);
187
+ yield this.entityStorage.updateOne(USER_ENTITY, user.id, {
188
+ password,
189
+ passwordChangedAt: new Date().toISOString(),
190
+ passwordReset: null,
191
+ });
192
+ return { success: true };
193
+ });
194
+ }
195
+ resolveUser(input) {
196
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
197
+ var _a, _b, _c, _d;
198
+ if ((_a = input.userId) === null || _a === void 0 ? void 0 : _a.trim()) {
199
+ const record = yield this.entityStorage.getOne(USER_ENTITY, input.userId.trim());
200
+ return (_b = record) !== null && _b !== void 0 ? _b : null;
201
+ }
202
+ const login = (_c = input.login) === null || _c === void 0 ? void 0 : _c.trim().toLowerCase();
203
+ if (!login) {
204
+ return null;
205
+ }
206
+ const users = yield this.listUsers();
207
+ return ((_d = users.find((u) => { var _a, _b; return ((_a = u.username) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()) === login || ((_b = u.email) === null || _b === void 0 ? void 0 : _b.trim().toLowerCase()) === login; })) !== null && _d !== void 0 ? _d : null);
208
+ });
209
+ }
210
+ listUsers() {
211
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
212
+ const result = yield this.entityStorage.query(USER_ENTITY, (0, abstract_1.bypassAllEntityVisibilityFilters)({ skip: 0, take: 5000 }));
213
+ const items = (0, lodash_1.get)(result, 'items', []);
214
+ return Array.isArray(items) ? items : [];
215
+ });
216
+ }
217
+ resolveCompanyEmailMerge(tenantId, webOrigin) {
218
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
219
+ const settingsValues = yield this.resolveScopedSettings(tenantId);
220
+ const tenant = yield this.loadTenantSnapshot(tenantId);
221
+ return (0, module_organization_management_contracts_1.buildCompanyEmailMergeFromOrganization)({
222
+ settingsValues,
223
+ tenant,
224
+ webOrigin,
225
+ apiOrigin: resolvePasswordResetApiOrigin(),
226
+ });
227
+ });
228
+ }
229
+ loadTenantSnapshot(tenantId) {
230
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
231
+ const id = tenantId.trim();
232
+ if (!id) {
233
+ return null;
234
+ }
235
+ try {
236
+ const row = (yield this.entityStorage.getOne(TENANT_ENTITY, id));
237
+ return row !== null && row !== void 0 ? row : null;
238
+ }
239
+ catch (_a) {
240
+ return null;
241
+ }
242
+ });
243
+ }
244
+ resolveScopedSettings(tenantId) {
245
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
246
+ var _a;
247
+ const platformDocument = yield this.settingsStore.findByPartition({ scope: 'P', documentId: 'P' });
248
+ let values = Object.assign({}, ((_a = platformDocument === null || platformDocument === void 0 ? void 0 : platformDocument.values) !== null && _a !== void 0 ? _a : {}));
249
+ if (tenantId.trim()) {
250
+ const tenantDocument = yield this.settingsStore.findByPartition({
251
+ scope: 'T',
252
+ documentId: `T:${tenantId}`,
253
+ tenantId,
254
+ });
255
+ if (tenantDocument === null || tenantDocument === void 0 ? void 0 : tenantDocument.values) {
256
+ values = Object.assign(Object.assign({}, values), tenantDocument.values);
257
+ }
258
+ }
259
+ return values;
260
+ });
261
+ }
262
+ assertRateLimit(key) {
263
+ var _a;
264
+ const now = Date.now();
265
+ const windowStart = now - RATE_LIMIT_WINDOW_MS;
266
+ const prior = ((_a = this.recentRequests.get(key)) !== null && _a !== void 0 ? _a : []).filter((t) => t >= windowStart);
267
+ if (prior.length >= RATE_LIMIT_MAX) {
268
+ throw new Error('Too many password reset requests. Please try again later.');
269
+ }
270
+ prior.push(now);
271
+ this.recentRequests.set(key, prior);
272
+ }
273
+ };
274
+ exports.UserPasswordResetService = UserPasswordResetService;
275
+ exports.UserPasswordResetService = UserPasswordResetService = UserPasswordResetService_1 = tslib_1.__decorate([
276
+ (0, common_1.Injectable)(),
277
+ tslib_1.__metadata("design:paramtypes", [core_1.EntityStorageMiddlewareService,
278
+ providers_1.ServerCommandExecutorService,
279
+ module_settings_management_server_1.SettingsManagementStoreService])
280
+ ], UserPasswordResetService);
281
+ //#endregion
282
+ //# sourceMappingURL=user-password-reset.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-password-reset.service.js","sourceRoot":"","sources":["../../../../../../libs/modules/security-management/server/src/lib/password-reset/user-password-reset.service.ts"],"names":[],"mappings":"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"}
@@ -3,21 +3,46 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SecurityManagementServerModule = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const common_1 = require("@nestjs/common");
6
+ const core_1 = require("@acorex-platform/framework-server/core");
7
+ const module_settings_management_server_1 = require("@acorex-platform/module-settings-management-server");
8
+ const user_effective_state_middleware_1 = require("./middlewares/user-effective-state.middleware");
9
+ const complete_password_reset_command_1 = require("./password-reset/complete-password-reset.command");
10
+ const send_password_reset_email_command_1 = require("./password-reset/send-password-reset-email.command");
11
+ const user_password_reset_service_1 = require("./password-reset/user-password-reset.service");
6
12
  const security_management_seed_catalog_1 = require("./seed/security-management.seed-catalog");
7
13
  const security_management_seed_tokens_1 = require("./seed/security-management-seed.tokens");
8
14
  const security_management_seed_provider_1 = require("./seed/security-management-seed.provider");
15
+ //#region ---- Security management backend module ----
9
16
  let SecurityManagementServerModule = class SecurityManagementServerModule {
10
17
  };
11
18
  exports.SecurityManagementServerModule = SecurityManagementServerModule;
12
19
  exports.SecurityManagementServerModule = SecurityManagementServerModule = tslib_1.__decorate([
13
20
  (0, common_1.Module)({
21
+ imports: [core_1.EntityStorageModule, module_settings_management_server_1.SettingsManagementServerModule],
14
22
  providers: [
15
23
  security_management_seed_provider_1.SecurityManagementSeedCatalogProvider,
16
24
  {
17
25
  provide: security_management_seed_tokens_1.SECURITY_MANAGEMENT_MODULE_SEED,
18
26
  useValue: security_management_seed_catalog_1.securitymanagementSeedCatalog,
19
27
  },
28
+ user_effective_state_middleware_1.UserEffectiveStateMiddleware,
29
+ {
30
+ provide: core_1.ENTITY_STORAGE_MIDDLEWARE,
31
+ useExisting: user_effective_state_middleware_1.UserEffectiveStateMiddleware,
32
+ multi: true,
33
+ },
34
+ user_password_reset_service_1.UserPasswordResetService,
35
+ send_password_reset_email_command_1.SendPasswordResetEmailCommand,
36
+ complete_password_reset_command_1.CompletePasswordResetCommand,
37
+ ],
38
+ exports: [
39
+ security_management_seed_tokens_1.SECURITY_MANAGEMENT_MODULE_SEED,
40
+ security_management_seed_provider_1.SecurityManagementSeedCatalogProvider,
41
+ user_effective_state_middleware_1.UserEffectiveStateMiddleware,
42
+ core_1.ENTITY_STORAGE_MIDDLEWARE,
43
+ user_password_reset_service_1.UserPasswordResetService,
20
44
  ],
21
45
  })
22
46
  ], SecurityManagementServerModule);
47
+ //#endregion
23
48
  //# sourceMappingURL=security-management-server.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-management-server.module.js","sourceRoot":"","sources":["../../../../../libs/modules/security-management/server/src/lib/security-management-server.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAwC;AACxC,8FAAwF;AACxF,4FAAyF;AACzF,gGAAiG;AAW1F,IAAM,8BAA8B,GAApC,MAAM,8BAA8B;CAAG,CAAA;AAAjC,wEAA8B;yCAA9B,8BAA8B;IAR1C,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,yEAAqC;YACrC;gBACE,OAAO,EAAE,iEAA+B;gBACxC,QAAQ,EAAE,gEAA6B;aACxC;SACF;KAAE,CAAC;GACO,8BAA8B,CAAG"}
1
+ {"version":3,"file":"security-management-server.module.js","sourceRoot":"","sources":["../../../../../libs/modules/security-management/server/src/lib/security-management-server.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAuD;AACvD,iEAAwG;AACxG,0GAAoG;AAEpG,mGAA6F;AAC7F,sGAAgG;AAChG,0GAAmG;AACnG,8FAAwF;AACxF,8FAAwF;AACxF,4FAAyF;AACzF,gGAAiG;AAEjG,sDAAsD;AA4B/C,IAAM,8BAA8B,GAApC,MAAM,8BAA8B;CAAG,CAAA;AAAjC,wEAA8B;yCAA9B,8BAA8B;IA1B1C,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,0BAAmB,EAAE,kEAA8B,CAAC;QAC9D,SAAS,EAAE;YACT,yEAAqC;YACrC;gBACE,OAAO,EAAE,iEAA+B;gBACxC,QAAQ,EAAE,gEAA6B;aACxC;YACD,8DAA4B;YAC5B;gBACE,OAAO,EAAE,gCAAyB;gBAClC,WAAW,EAAE,8DAA4B;gBACzC,KAAK,EAAE,IAAI;aACA;YACb,sDAAwB;YACxB,iEAA6B;YAC7B,8DAA4B;SAC7B;QACD,OAAO,EAAE;YACP,iEAA+B;YAC/B,yEAAqC;YACrC,8DAA4B;YAC5B,gCAAyB;YACzB,sDAAwB;SACzB;KACF,CAAC;GACW,8BAA8B,CAAG;AAE9C,YAAY"}