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.
- package/dist/accessi-module/Console/console.js +295 -24
- package/dist/accessi-module/Console/console.js.map +1 -1
- package/dist/accessi-module/Console/generated/accessiApi.d.ts +21 -1
- package/dist/accessi-module/Console/generated/accessiApi.js +18 -2
- package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
- package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.d.ts +1 -1
- package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +1 -1
- package/dist/accessi-module/Console/generated/model/index.d.ts +1 -0
- package/dist/accessi-module/Console/generated/model/index.js +1 -0
- package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.d.ts +14 -0
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js +9 -0
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js.map +1 -0
- package/dist/accessi-module/Console/help.js +115 -0
- package/dist/accessi-module/Console/help.js.map +1 -1
- package/dist/accessi-module/Console/wiki.js +8 -2
- package/dist/accessi-module/Console/wiki.js.map +1 -1
- package/dist/accessi-module/Controllers/UserController.d.ts +6 -1
- package/dist/accessi-module/Controllers/UserController.js +91 -3
- package/dist/accessi-module/Controllers/UserController.js.map +1 -1
- package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js +1 -1
- package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.d.ts +4 -0
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.js +32 -0
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.js.map +1 -0
- package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -2
- package/dist/accessi-module/Services/AuthService/AuthService.js +13 -9
- package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
- package/dist/accessi-module/Services/UserService/UserService.d.ts +5 -0
- package/dist/accessi-module/Services/UserService/UserService.js +71 -55
- package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
- package/dist/accessi-module/Views/reset-password.html +23 -7
- package/dist/accessi-module/security/accessControl.d.ts +9 -0
- package/dist/accessi-module/security/accessControl.js +14 -0
- package/dist/accessi-module/security/accessControl.js.map +1 -1
- package/dist/accessi-module/security/passwordPolicy.d.ts +21 -0
- package/dist/accessi-module/security/passwordPolicy.js +71 -0
- package/dist/accessi-module/security/passwordPolicy.js.map +1 -0
- package/dist/emilsoftware-utilities-2.0.0-dev.42.tgz +0 -0
- package/package.json +1 -1
- 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"]}
|
|
Binary file
|
package/package.json
CHANGED
|
Binary file
|