emilsoftware-utilities 2.0.0-dev.41 → 2.0.0-dev.42

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 (41) hide show
  1. package/dist/accessi-module/Console/console.js +295 -24
  2. package/dist/accessi-module/Console/console.js.map +1 -1
  3. package/dist/accessi-module/Console/generated/accessiApi.d.ts +21 -1
  4. package/dist/accessi-module/Console/generated/accessiApi.js +18 -2
  5. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
  6. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.d.ts +1 -1
  7. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +1 -1
  8. package/dist/accessi-module/Console/generated/model/index.d.ts +1 -0
  9. package/dist/accessi-module/Console/generated/model/index.js +1 -0
  10. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  11. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.d.ts +14 -0
  12. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js +9 -0
  13. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js.map +1 -0
  14. package/dist/accessi-module/Console/help.js +115 -0
  15. package/dist/accessi-module/Console/help.js.map +1 -1
  16. package/dist/accessi-module/Console/wiki.js +8 -2
  17. package/dist/accessi-module/Console/wiki.js.map +1 -1
  18. package/dist/accessi-module/Controllers/UserController.d.ts +6 -1
  19. package/dist/accessi-module/Controllers/UserController.js +91 -3
  20. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  21. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js +1 -1
  22. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
  23. package/dist/accessi-module/Dtos/SetUserPasswordRequest.d.ts +4 -0
  24. package/dist/accessi-module/Dtos/SetUserPasswordRequest.js +32 -0
  25. package/dist/accessi-module/Dtos/SetUserPasswordRequest.js.map +1 -0
  26. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -2
  27. package/dist/accessi-module/Services/AuthService/AuthService.js +13 -9
  28. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  29. package/dist/accessi-module/Services/UserService/UserService.d.ts +5 -0
  30. package/dist/accessi-module/Services/UserService/UserService.js +71 -55
  31. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  32. package/dist/accessi-module/Views/reset-password.html +23 -7
  33. package/dist/accessi-module/security/accessControl.d.ts +9 -0
  34. package/dist/accessi-module/security/accessControl.js +14 -0
  35. package/dist/accessi-module/security/accessControl.js.map +1 -1
  36. package/dist/accessi-module/security/passwordPolicy.d.ts +21 -0
  37. package/dist/accessi-module/security/passwordPolicy.js +71 -0
  38. package/dist/accessi-module/security/passwordPolicy.js.map +1 -0
  39. package/dist/emilsoftware-utilities-2.0.0-dev.42.tgz +0 -0
  40. package/package.json +1 -1
  41. package/dist/emilsoftware-utilities-2.0.0-dev.41.tgz +0 -0
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WEAK_PASSWORD_CODE = exports.PASSWORD_MAX_LENGTH = exports.PASSWORD_MIN_LENGTH = void 0;
4
+ exports.collectPasswordPolicyViolations = collectPasswordPolicyViolations;
5
+ exports.assertStrongPassword = assertStrongPassword;
6
+ const common_1 = require("@nestjs/common");
7
+ /** Lunghezze canoniche della password Accessi. */
8
+ exports.PASSWORD_MIN_LENGTH = 8;
9
+ exports.PASSWORD_MAX_LENGTH = 100;
10
+ /** Codice errore stabile restituito quando la password non rispetta la policy. */
11
+ exports.WEAK_PASSWORD_CODE = 'ACCESSI_WEAK_PASSWORD';
12
+ /**
13
+ * Password comuni o banalmente prevedibili rifiutate anche se rispettano la
14
+ * complessita. Confronto case-insensitive; elenco volutamente piccolo e senza
15
+ * dipendenze esterne.
16
+ */
17
+ const COMMON_PASSWORDS = new Set([
18
+ 'password', 'password1', 'password123', 'passw0rd', 'p@ssw0rd', 'p@ssword',
19
+ '12345678', '123456789', '1234567890', 'qwerty', 'qwerty123', 'qwertyuiop',
20
+ 'admin', 'admin123', 'administrator', 'letmein', 'welcome', 'welcome1',
21
+ 'iloveyou', 'abc12345', 'a1b2c3d4', 'monkey123', 'dragon123', 'changeme',
22
+ 'accessi', 'emilsoftware',
23
+ ]);
24
+ /**
25
+ * Restituisce l'elenco leggibile delle violazioni della policy password.
26
+ * Policy: lunghezza, maiuscola, minuscola, cifra, carattere speciale, nessuno
27
+ * spazio, non comune.
28
+ */
29
+ function collectPasswordPolicyViolations(password, options = {}) {
30
+ var _a, _b;
31
+ if (typeof password !== 'string' || password.length === 0) {
32
+ return ['La password e obbligatoria.'];
33
+ }
34
+ const minLength = (_a = options.minLength) !== null && _a !== void 0 ? _a : exports.PASSWORD_MIN_LENGTH;
35
+ const maxLength = (_b = options.maxLength) !== null && _b !== void 0 ? _b : exports.PASSWORD_MAX_LENGTH;
36
+ const violations = [];
37
+ if (password.length < minLength)
38
+ violations.push(`almeno ${minLength} caratteri`);
39
+ if (password.length > maxLength)
40
+ violations.push(`al massimo ${maxLength} caratteri`);
41
+ if (/\s/.test(password))
42
+ violations.push('nessuno spazio');
43
+ if (!/[A-Z]/.test(password))
44
+ violations.push('almeno una lettera maiuscola');
45
+ if (!/[a-z]/.test(password))
46
+ violations.push('almeno una lettera minuscola');
47
+ if (!/\d/.test(password))
48
+ violations.push('almeno una cifra');
49
+ if (!/[^A-Za-z0-9]/.test(password))
50
+ violations.push('almeno un carattere speciale');
51
+ if (COMMON_PASSWORDS.has(password.toLowerCase()))
52
+ violations.push('una password non comune');
53
+ return violations;
54
+ }
55
+ /**
56
+ * Valida la password secondo la policy moderna e, se non conforme, solleva un
57
+ * `BadRequestException` con codice `ACCESSI_WEAK_PASSWORD` e l'elenco dei
58
+ * requisiti mancanti. Da usare solo quando si IMPOSTA una password, mai al login.
59
+ */
60
+ function assertStrongPassword(password, options) {
61
+ const violations = collectPasswordPolicyViolations(password, options);
62
+ if (violations.length === 0) {
63
+ return;
64
+ }
65
+ throw new common_1.BadRequestException({
66
+ code: exports.WEAK_PASSWORD_CODE,
67
+ message: `La password non rispetta i requisiti di sicurezza: richiede ${violations.join(', ')}.`,
68
+ details: violations,
69
+ });
70
+ }
71
+ //# sourceMappingURL=passwordPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passwordPolicy.js","sourceRoot":"","sources":["../../../src/accessi-module/security/passwordPolicy.ts"],"names":[],"mappings":";;;AAgCA,0EAsBC;AAOD,oDAWC;AAxED,2CAAqD;AAErD,kDAAkD;AACrC,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC,kFAAkF;AACrE,QAAA,kBAAkB,GAAG,uBAAuB,CAAC;AAO1D;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IAC1E,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY;IAC1E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU;IACxE,SAAS,EAAE,cAAc;CAC1B,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAgB,+BAA+B,CAC7C,QAAiB,EACjB,UAAiC,EAAE;;IAEnC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,2BAAmB,CAAC;IAC3D,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,2BAAmB,CAAC;IAC3D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,UAAU,SAAS,YAAY,CAAC,CAAC;IAClF,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,cAAc,SAAS,YAAY,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACpF,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAE7F,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,QAAiB,EAAE,OAA+B;IACrF,MAAM,UAAU,GAAG,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,4BAAmB,CAAC;QAC5B,IAAI,EAAE,0BAAkB;QACxB,OAAO,EAAE,+DAA+D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAChG,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { BadRequestException } from '@nestjs/common';\n\n/** Lunghezze canoniche della password Accessi. */\nexport const PASSWORD_MIN_LENGTH = 8;\nexport const PASSWORD_MAX_LENGTH = 100;\n\n/** Codice errore stabile restituito quando la password non rispetta la policy. */\nexport const WEAK_PASSWORD_CODE = 'ACCESSI_WEAK_PASSWORD';\n\nexport interface PasswordPolicyOptions {\n minLength?: number;\n maxLength?: number;\n}\n\n/**\n * Password comuni o banalmente prevedibili rifiutate anche se rispettano la\n * complessita. Confronto case-insensitive; elenco volutamente piccolo e senza\n * dipendenze esterne.\n */\nconst COMMON_PASSWORDS = new Set([\n 'password', 'password1', 'password123', 'passw0rd', 'p@ssw0rd', 'p@ssword',\n '12345678', '123456789', '1234567890', 'qwerty', 'qwerty123', 'qwertyuiop',\n 'admin', 'admin123', 'administrator', 'letmein', 'welcome', 'welcome1',\n 'iloveyou', 'abc12345', 'a1b2c3d4', 'monkey123', 'dragon123', 'changeme',\n 'accessi', 'emilsoftware',\n]);\n\n/**\n * Restituisce l'elenco leggibile delle violazioni della policy password.\n * Policy: lunghezza, maiuscola, minuscola, cifra, carattere speciale, nessuno\n * spazio, non comune.\n */\nexport function collectPasswordPolicyViolations(\n password: unknown,\n options: PasswordPolicyOptions = {},\n): string[] {\n if (typeof password !== 'string' || password.length === 0) {\n return ['La password e obbligatoria.'];\n }\n\n const minLength = options.minLength ?? PASSWORD_MIN_LENGTH;\n const maxLength = options.maxLength ?? PASSWORD_MAX_LENGTH;\n const violations: string[] = [];\n\n if (password.length < minLength) violations.push(`almeno ${minLength} caratteri`);\n if (password.length > maxLength) violations.push(`al massimo ${maxLength} caratteri`);\n if (/\\s/.test(password)) violations.push('nessuno spazio');\n if (!/[A-Z]/.test(password)) violations.push('almeno una lettera maiuscola');\n if (!/[a-z]/.test(password)) violations.push('almeno una lettera minuscola');\n if (!/\\d/.test(password)) violations.push('almeno una cifra');\n if (!/[^A-Za-z0-9]/.test(password)) violations.push('almeno un carattere speciale');\n if (COMMON_PASSWORDS.has(password.toLowerCase())) violations.push('una password non comune');\n\n return violations;\n}\n\n/**\n * Valida la password secondo la policy moderna e, se non conforme, solleva un\n * `BadRequestException` con codice `ACCESSI_WEAK_PASSWORD` e l'elenco dei\n * requisiti mancanti. Da usare solo quando si IMPOSTA una password, mai al login.\n */\nexport function assertStrongPassword(password: unknown, options?: PasswordPolicyOptions): void {\n const violations = collectPasswordPolicyViolations(password, options);\n if (violations.length === 0) {\n return;\n }\n\n throw new BadRequestException({\n code: WEAK_PASSWORD_CODE,\n message: `La password non rispetta i requisiti di sicurezza: richiede ${violations.join(', ')}.`,\n details: violations,\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emilsoftware-utilities",
3
- "version": "2.0.0-dev.41",
3
+ "version": "2.0.0-dev.42",
4
4
  "description": "Utilities for EmilSoftware",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",