emilsoftware-utilities 1.8.0-dev.2 → 2.0.0-dev.2
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/README.MD +38 -34
- package/dist/ContractGenerator.js.map +1 -1
- package/dist/DatabaseUpdater.js +24 -24
- package/dist/DatabaseUpdater.js.map +1 -1
- package/dist/EmilsoftwareModule.js.map +1 -1
- package/dist/ExecutionTimeLogger.js.map +1 -1
- package/dist/Logger.js.map +1 -1
- package/dist/Orm.js.map +1 -1
- package/dist/RoutesLoggerMiddleware.js.map +1 -1
- package/dist/Utilities.d.ts +18 -0
- package/dist/Utilities.js +90 -1
- package/dist/Utilities.js.map +1 -1
- package/dist/accessi-module/AccessiModule.d.ts +15 -0
- package/dist/accessi-module/AccessiModule.js.map +1 -1
- package/dist/accessi-module/Controllers/AuthController.d.ts +4 -4
- package/dist/accessi-module/Controllers/AuthController.js +36 -21
- package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
- package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
- package/dist/accessi-module/Controllers/EmailController.d.ts +3 -3
- package/dist/accessi-module/Controllers/EmailController.js +15 -15
- package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
- package/dist/accessi-module/Controllers/FiltriController.d.ts +3 -3
- package/dist/accessi-module/Controllers/FiltriController.js +32 -15
- package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
- package/dist/accessi-module/Controllers/PermissionController.d.ts +12 -17
- package/dist/accessi-module/Controllers/PermissionController.js +140 -124
- package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
- package/dist/accessi-module/Controllers/UserController.d.ts +12 -11
- package/dist/accessi-module/Controllers/UserController.js +112 -79
- package/dist/accessi-module/Controllers/UserController.js.map +1 -1
- package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
- package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
- package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js +6 -0
- package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +6 -0
- package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
- package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/Permission.js +5 -0
- package/dist/accessi-module/Dtos/Permission.js.map +1 -1
- package/dist/accessi-module/Dtos/RegisterRequest.js +37 -1
- package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
- package/dist/accessi-module/Dtos/Role.js +13 -2
- package/dist/accessi-module/Dtos/Role.js.map +1 -1
- package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
- package/dist/accessi-module/Dtos/SetStatoRegistrazione.js +6 -0
- package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
- package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
- package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
- package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
- package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
- package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/UserDto.js +59 -1
- package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
- package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
- package/dist/accessi-module/Dtos/index.js.map +1 -1
- package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -3
- package/dist/accessi-module/Services/AuthService/AuthService.js +159 -27
- package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
- package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
- package/dist/accessi-module/Services/EmailService/EmailService.js +44 -21
- package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
- package/dist/accessi-module/Services/FiltriService/FiltriService.js +1 -1
- package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
- package/dist/accessi-module/Services/PermissionService/PermissionService.js +87 -87
- package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
- package/dist/accessi-module/Services/UserService/UserService.d.ts +15 -6
- package/dist/accessi-module/Services/UserService/UserService.js +165 -139
- package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
- package/dist/accessi-module/Views/reset-password.html +213 -195
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +25 -16
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
- package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
- package/dist/accessi-module/index.js +33 -4
- package/dist/accessi-module/index.js.map +1 -1
- package/dist/accessi-module/jwt/jwt.strategy.d.ts +4 -2
- package/dist/accessi-module/jwt/jwt.strategy.js +47 -19
- package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
- package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
- package/dist/accessi-module/middleware/authenticateGen.d.ts +3 -1
- package/dist/accessi-module/middleware/authenticateGen.js +17 -11
- package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
- package/dist/accessi-module/security/accessControl.d.ts +17 -0
- package/dist/accessi-module/security/accessControl.js +44 -0
- package/dist/accessi-module/security/accessControl.js.map +1 -0
- package/dist/accessi-module/security/authenticatedToken.d.ts +11 -0
- package/dist/accessi-module/security/authenticatedToken.js +39 -0
- package/dist/accessi-module/security/authenticatedToken.js.map +1 -0
- package/dist/accessi-module/security/passwordResetToken.d.ts +8 -0
- package/dist/accessi-module/security/passwordResetToken.js +73 -0
- package/dist/accessi-module/security/passwordResetToken.js.map +1 -0
- package/dist/accessi-module/security/publicAuthRateLimit.d.ts +10 -0
- package/dist/accessi-module/security/publicAuthRateLimit.js +105 -0
- package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -0
- package/dist/allegati-module/AllegatiModule.js.map +1 -1
- package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
- package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
- package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
- package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
- package/dist/allegati-module/Dtos/index.js.map +1 -1
- package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
- package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
- package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
- package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +49 -49
- package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
- package/dist/allegati-module/index.js.map +1 -1
- package/dist/autobind.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/initEmilsoftwareModule.js.map +1 -1
- package/dist/swagger/SwaggerConfig.js.map +1 -1
- package/package.json +83 -83
- package/dist/emilsoftware-utilities-1.8.0-dev.2.tgz +0 -0
|
@@ -11,6 +11,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.UserDto = void 0;
|
|
13
13
|
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const class_validator_1 = require("class-validator");
|
|
14
16
|
const StatoRegistrazione_1 = require("./StatoRegistrazione");
|
|
15
17
|
const Permission_1 = require("./Permission");
|
|
16
18
|
const TipoAbilitazione_1 = require("./TipoAbilitazione");
|
|
@@ -20,14 +22,23 @@ class UserDto extends (0, swagger_1.OmitType)(FiltriUtente_1.FiltriUtente, ['cod
|
|
|
20
22
|
exports.UserDto = UserDto;
|
|
21
23
|
__decorate([
|
|
22
24
|
(0, swagger_1.ApiProperty)({ description: "Codice identificativo univoco dell'utente.", example: 'USR123' }),
|
|
25
|
+
(0, class_validator_1.IsOptional)(),
|
|
26
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
27
|
+
(0, class_validator_1.IsInt)({ message: 'Il codice utente deve essere un intero.' }),
|
|
28
|
+
(0, class_validator_1.Min)(1, { message: 'Il codice utente deve essere maggiore di zero.' }),
|
|
23
29
|
__metadata("design:type", Number)
|
|
24
30
|
], UserDto.prototype, "codiceUtente", void 0);
|
|
25
31
|
__decorate([
|
|
26
32
|
(0, swagger_1.ApiProperty)({ description: "Email dell'utente.", example: 'mario.rossi@dev.it' }),
|
|
33
|
+
(0, class_validator_1.IsOptional)(),
|
|
34
|
+
(0, class_validator_1.IsString)({ message: "L'email deve essere una stringa." }),
|
|
35
|
+
(0, class_validator_1.Length)(3, 254, { message: "L'email deve essere compresa tra 3 e 254 caratteri." }),
|
|
27
36
|
__metadata("design:type", String)
|
|
28
37
|
], UserDto.prototype, "email", void 0);
|
|
29
38
|
__decorate([
|
|
30
39
|
(0, swagger_1.ApiPropertyOptional)({ description: "Flag per l'accettazione del GDPR.", example: true }),
|
|
40
|
+
(0, class_validator_1.IsOptional)(),
|
|
41
|
+
(0, class_validator_1.IsBoolean)({ message: 'Il flag GDPR deve essere booleano.' }),
|
|
31
42
|
__metadata("design:type", Boolean)
|
|
32
43
|
], UserDto.prototype, "flagGdpr", void 0);
|
|
33
44
|
__decorate([
|
|
@@ -36,6 +47,8 @@ __decorate([
|
|
|
36
47
|
format: 'date-time',
|
|
37
48
|
example: '2024-03-18T12:34:56Z',
|
|
38
49
|
}),
|
|
50
|
+
(0, class_validator_1.IsOptional)(),
|
|
51
|
+
(0, class_validator_1.IsString)({ message: 'La data GDPR deve essere una stringa.' }),
|
|
39
52
|
__metadata("design:type", String)
|
|
40
53
|
], UserDto.prototype, "dataGdpr", void 0);
|
|
41
54
|
__decorate([
|
|
@@ -44,6 +57,8 @@ __decorate([
|
|
|
44
57
|
format: 'date-time',
|
|
45
58
|
example: '2023-01-01T08:30:00Z',
|
|
46
59
|
}),
|
|
60
|
+
(0, class_validator_1.IsOptional)(),
|
|
61
|
+
(0, class_validator_1.IsString)({ message: 'La data di inserimento deve essere una stringa.' }),
|
|
47
62
|
__metadata("design:type", String)
|
|
48
63
|
], UserDto.prototype, "dataInserimento", void 0);
|
|
49
64
|
__decorate([
|
|
@@ -52,6 +67,8 @@ __decorate([
|
|
|
52
67
|
format: 'date-time',
|
|
53
68
|
example: '2025-06-01',
|
|
54
69
|
}),
|
|
70
|
+
(0, class_validator_1.IsOptional)(),
|
|
71
|
+
(0, class_validator_1.IsString)({ message: 'La data scadenza password deve essere una stringa.' }),
|
|
55
72
|
__metadata("design:type", String)
|
|
56
73
|
], UserDto.prototype, "dataScadenzaPassword", void 0);
|
|
57
74
|
__decorate([
|
|
@@ -60,6 +77,8 @@ __decorate([
|
|
|
60
77
|
format: 'date-time',
|
|
61
78
|
example: '2024-03-15T14:45:00Z',
|
|
62
79
|
}),
|
|
80
|
+
(0, class_validator_1.IsOptional)(),
|
|
81
|
+
(0, class_validator_1.IsString)({ message: 'La data ultimo accesso deve essere una stringa.' }),
|
|
63
82
|
__metadata("design:type", String)
|
|
64
83
|
], UserDto.prototype, "dataLastLogin", void 0);
|
|
65
84
|
__decorate([
|
|
@@ -68,6 +87,8 @@ __decorate([
|
|
|
68
87
|
enum: StatoRegistrazione_1.StatoRegistrazione,
|
|
69
88
|
example: StatoRegistrazione_1.StatoRegistrazione.CONF,
|
|
70
89
|
}),
|
|
90
|
+
(0, class_validator_1.IsOptional)(),
|
|
91
|
+
(0, class_validator_1.IsEnum)(StatoRegistrazione_1.StatoRegistrazione, { message: 'Lo stato di registrazione non e valido.' }),
|
|
71
92
|
__metadata("design:type", Number)
|
|
72
93
|
], UserDto.prototype, "statoRegistrazione", void 0);
|
|
73
94
|
__decorate([
|
|
@@ -75,14 +96,22 @@ __decorate([
|
|
|
75
96
|
description: "Chiave di registrazione dell'utente.",
|
|
76
97
|
example: 'abc123xyz',
|
|
77
98
|
}),
|
|
99
|
+
(0, class_validator_1.IsOptional)(),
|
|
100
|
+
(0, class_validator_1.IsString)({ message: 'La chiave registrazione deve essere una stringa.' }),
|
|
78
101
|
__metadata("design:type", String)
|
|
79
102
|
], UserDto.prototype, "keyRegistrazione", void 0);
|
|
80
103
|
__decorate([
|
|
81
104
|
(0, swagger_1.ApiPropertyOptional)({ description: "Cognome dell'utente.", example: 'Rossi' }),
|
|
105
|
+
(0, class_validator_1.IsOptional)(),
|
|
106
|
+
(0, class_validator_1.IsString)({ message: 'Il cognome deve essere una stringa.' }),
|
|
107
|
+
(0, class_validator_1.Length)(1, 255, { message: 'Il cognome deve essere compreso tra 1 e 255 caratteri.' }),
|
|
82
108
|
__metadata("design:type", String)
|
|
83
109
|
], UserDto.prototype, "cognome", void 0);
|
|
84
110
|
__decorate([
|
|
85
111
|
(0, swagger_1.ApiPropertyOptional)({ description: "Nome dell'utente.", example: 'Mario' }),
|
|
112
|
+
(0, class_validator_1.IsOptional)(),
|
|
113
|
+
(0, class_validator_1.IsString)({ message: 'Il nome deve essere una stringa.' }),
|
|
114
|
+
(0, class_validator_1.Length)(1, 255, { message: 'Il nome deve essere compreso tra 1 e 255 caratteri.' }),
|
|
86
115
|
__metadata("design:type", String)
|
|
87
116
|
], UserDto.prototype, "nome", void 0);
|
|
88
117
|
__decorate([
|
|
@@ -91,6 +120,8 @@ __decorate([
|
|
|
91
120
|
example: 'https://example.com/avatar.jpg',
|
|
92
121
|
nullable: true,
|
|
93
122
|
}),
|
|
123
|
+
(0, class_validator_1.IsOptional)(),
|
|
124
|
+
(0, class_validator_1.IsString)({ message: "L'avatar deve essere una stringa." }),
|
|
94
125
|
__metadata("design:type", String)
|
|
95
126
|
], UserDto.prototype, "avatar", void 0);
|
|
96
127
|
__decorate([
|
|
@@ -98,10 +129,15 @@ __decorate([
|
|
|
98
129
|
description: "Flag che indica se l'autenticazione a due fattori è attivata.",
|
|
99
130
|
example: true,
|
|
100
131
|
}),
|
|
132
|
+
(0, class_validator_1.IsOptional)(),
|
|
133
|
+
(0, class_validator_1.IsBoolean)({ message: 'Il flag due fattori deve essere booleano.' }),
|
|
101
134
|
__metadata("design:type", Boolean)
|
|
102
135
|
], UserDto.prototype, "flagDueFattori", void 0);
|
|
103
136
|
__decorate([
|
|
104
137
|
(0, swagger_1.ApiPropertyOptional)({ description: 'Codice lingua preferito.', example: 'it' }),
|
|
138
|
+
(0, class_validator_1.IsOptional)(),
|
|
139
|
+
(0, class_validator_1.IsString)({ message: 'Il codice lingua deve essere una stringa.' }),
|
|
140
|
+
(0, class_validator_1.Length)(1, 20, { message: 'Il codice lingua deve essere compreso tra 1 e 20 caratteri.' }),
|
|
105
141
|
__metadata("design:type", String)
|
|
106
142
|
], UserDto.prototype, "codiceLingua", void 0);
|
|
107
143
|
__decorate([
|
|
@@ -110,17 +146,24 @@ __decorate([
|
|
|
110
146
|
example: '+393401234567',
|
|
111
147
|
nullable: true,
|
|
112
148
|
}),
|
|
149
|
+
(0, class_validator_1.IsOptional)(),
|
|
150
|
+
(0, class_validator_1.IsString)({ message: 'Il cellulare deve essere una stringa.' }),
|
|
151
|
+
(0, class_validator_1.Length)(1, 50, { message: 'Il cellulare deve essere compreso tra 1 e 50 caratteri.' }),
|
|
113
152
|
__metadata("design:type", String)
|
|
114
153
|
], UserDto.prototype, "cellulare", void 0);
|
|
115
154
|
__decorate([
|
|
116
155
|
(0, swagger_1.ApiPropertyOptional)({ description: 'Flag superutente.', example: false }),
|
|
156
|
+
(0, class_validator_1.IsOptional)(),
|
|
157
|
+
(0, class_validator_1.IsBoolean)({ message: 'Il flag superutente deve essere booleano.' }),
|
|
117
158
|
__metadata("design:type", Boolean)
|
|
118
159
|
], UserDto.prototype, "flagSuper", void 0);
|
|
119
160
|
__decorate([
|
|
120
161
|
(0, swagger_1.ApiPropertyOptional)({
|
|
121
162
|
description: "Flag che indica se l'utente è configuratore",
|
|
122
|
-
example: false
|
|
163
|
+
example: false,
|
|
123
164
|
}),
|
|
165
|
+
(0, class_validator_1.IsOptional)(),
|
|
166
|
+
(0, class_validator_1.IsBoolean)({ message: 'Il flag configuratore deve essere booleano.' }),
|
|
124
167
|
__metadata("design:type", Boolean)
|
|
125
168
|
], UserDto.prototype, "flagAdminConfigurator", void 0);
|
|
126
169
|
__decorate([
|
|
@@ -128,6 +171,8 @@ __decorate([
|
|
|
128
171
|
description: "Pagina di default dell'utente all'accesso.",
|
|
129
172
|
example: '/dashboard',
|
|
130
173
|
}),
|
|
174
|
+
(0, class_validator_1.IsOptional)(),
|
|
175
|
+
(0, class_validator_1.IsString)({ message: 'La pagina di default deve essere una stringa.' }),
|
|
131
176
|
__metadata("design:type", String)
|
|
132
177
|
], UserDto.prototype, "paginaDefault", void 0);
|
|
133
178
|
__decorate([
|
|
@@ -142,14 +187,23 @@ __decorate([
|
|
|
142
187
|
description: 'Metadata JSON personalizzato.',
|
|
143
188
|
example: '{"theme": "dark"}',
|
|
144
189
|
}),
|
|
190
|
+
(0, class_validator_1.IsOptional)(),
|
|
191
|
+
(0, class_validator_1.IsString)({ message: 'I metadata JSON devono essere una stringa.' }),
|
|
145
192
|
__metadata("design:type", String)
|
|
146
193
|
], UserDto.prototype, "jsonMetadata", void 0);
|
|
147
194
|
__decorate([
|
|
148
195
|
(0, swagger_1.ApiPropertyOptional)({ description: 'Ragione sociale cliente.', example: 'ACME Corp SpA' }),
|
|
196
|
+
(0, class_validator_1.IsOptional)(),
|
|
197
|
+
(0, class_validator_1.IsString)({ message: 'La ragione sociale deve essere una stringa.' }),
|
|
149
198
|
__metadata("design:type", String)
|
|
150
199
|
], UserDto.prototype, "ragSocCli", void 0);
|
|
151
200
|
__decorate([
|
|
152
201
|
(0, swagger_1.ApiPropertyOptional)({ description: "Ruoli assegnati all'utente.", example: [1, 2] }),
|
|
202
|
+
(0, class_validator_1.IsOptional)(),
|
|
203
|
+
(0, class_validator_1.IsArray)({ message: 'I ruoli devono essere un array.' }),
|
|
204
|
+
(0, class_validator_1.ArrayUnique)({ message: 'I ruoli non possono contenere duplicati.' }),
|
|
205
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
206
|
+
(0, class_validator_1.IsInt)({ each: true, message: 'Ogni ruolo deve essere un intero.' }),
|
|
153
207
|
__metadata("design:type", Array)
|
|
154
208
|
], UserDto.prototype, "roles", void 0);
|
|
155
209
|
__decorate([
|
|
@@ -158,6 +212,10 @@ __decorate([
|
|
|
158
212
|
type: [Permission_1.Permission],
|
|
159
213
|
example: [{ codiceMenu: 'MNUOFFICINA', tipoAbilitazione: TipoAbilitazione_1.TipoAbilitazione.SCRITTURA }],
|
|
160
214
|
}),
|
|
215
|
+
(0, class_validator_1.IsOptional)(),
|
|
216
|
+
(0, class_validator_1.IsArray)({ message: 'I permessi devono essere un array.' }),
|
|
217
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
218
|
+
(0, class_transformer_1.Type)(() => Permission_1.Permission),
|
|
161
219
|
__metadata("design:type", Array)
|
|
162
220
|
], UserDto.prototype, "permissions", void 0);
|
|
163
221
|
//# sourceMappingURL=UserDto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDto.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/UserDto.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';\nimport { StatoRegistrazione } from './StatoRegistrazione';\nimport { Permission } from './Permission';\nimport { TipoAbilitazione } from './TipoAbilitazione';\nimport { FiltriUtente } from './FiltriUtente';\n\nexport class UserDto extends OmitType(FiltriUtente, ['codUte'] as const) {\n @ApiProperty({ description: \"Codice identificativo univoco dell'utente.\", example: 'USR123' })\n codiceUtente: number;\n\n @ApiProperty({ description: \"Email dell'utente.\", example: 'mario.rossi@dev.it' })\n email: string;\n\n @ApiPropertyOptional({ description: \"Flag per l'accettazione del GDPR.\", example: true })\n flagGdpr?: boolean;\n\n @ApiPropertyOptional({\n description: 'Data di accettazione del GDPR.',\n format: 'date-time',\n example: '2024-03-18T12:34:56Z',\n })\n dataGdpr?: string;\n\n @ApiPropertyOptional({\n description: \"Data di inserimento dell'utente nel sistema.\",\n format: 'date-time',\n example: '2023-01-01T08:30:00Z',\n })\n dataInserimento?: string;\n\n @ApiPropertyOptional({\n description: 'Data scadenza password.',\n format: 'date-time',\n example: '2025-06-01',\n })\n dataScadenzaPassword?: string;\n\n @ApiPropertyOptional({\n description: \"Ultima data di accesso dell'utente.\",\n format: 'date-time',\n example: '2024-03-15T14:45:00Z',\n })\n dataLastLogin?: string;\n\n @ApiPropertyOptional({\n description: \"Stato della registrazione dell'utente.\",\n enum: StatoRegistrazione,\n example: StatoRegistrazione.CONF,\n })\n statoRegistrazione?: StatoRegistrazione;\n\n @ApiPropertyOptional({\n description: \"Chiave di registrazione dell'utente.\",\n example: 'abc123xyz',\n })\n keyRegistrazione?: string;\n\n @ApiPropertyOptional({ description: \"Cognome dell'utente.\", example: 'Rossi' })\n cognome?: string;\n\n @ApiPropertyOptional({ description: \"Nome dell'utente.\", example: 'Mario' })\n nome?: string;\n\n @ApiPropertyOptional({\n description: 'Avatar (URL o base64).',\n example: 'https://example.com/avatar.jpg',\n nullable: true,\n })\n avatar?: string | null;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'autenticazione a due fattori è attivata.\",\n example: true,\n })\n flagDueFattori?: boolean;\n\n @ApiPropertyOptional({ description: 'Codice lingua preferito.', example: 'it' })\n codiceLingua?: string;\n\n @ApiPropertyOptional({\n description: 'Numero di cellulare.',\n example: '+393401234567',\n nullable: true,\n })\n cellulare?: string | null;\n\n @ApiPropertyOptional({ description: 'Flag superutente.', example: false })\n flagSuper?: boolean;\n\n @ApiPropertyOptional({\n description: \"Flag che indica se l'utente è configuratore\",\n example: false\n })\n flagAdminConfigurator?: boolean;\n\n @ApiPropertyOptional({\n description: \"Pagina di default dell'utente all'accesso.\",\n example: '/dashboard',\n })\n paginaDefault?: string;\n\n @ApiPropertyOptional({\n description: \"Numero MAC associato all'utente.\",\n example: 12,\n })\n nummac?: number;\n\n @ApiPropertyOptional({\n description: 'Metadata JSON personalizzato.',\n example: '{\"theme\": \"dark\"}',\n })\n jsonMetadata?: string;\n\n @ApiPropertyOptional({ description: 'Ragione sociale cliente.', example: 'ACME Corp SpA' })\n ragSocCli?: string;\n\n @ApiPropertyOptional({ description: \"Ruoli assegnati all'utente.\", example: [1,2] })\n roles?: number[];\n\n @ApiPropertyOptional({\n description: \"Permessi assegnati all'utente.\",\n type: [Permission],\n example: [{ codiceMenu: 'MNUOFFICINA', tipoAbilitazione: TipoAbilitazione.SCRITTURA }],\n })\n permissions?: Permission[];\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UserDto.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/UserDto.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';\r\nimport { Type } from 'class-transformer';\r\nimport {\r\n ArrayUnique,\r\n IsArray,\r\n IsBoolean,\r\n IsEnum,\r\n IsInt,\r\n IsOptional,\r\n IsString,\r\n Length,\r\n Min,\r\n ValidateNested,\r\n} from 'class-validator';\r\nimport { StatoRegistrazione } from './StatoRegistrazione';\r\nimport { Permission } from './Permission';\r\nimport { TipoAbilitazione } from './TipoAbilitazione';\r\nimport { FiltriUtente } from './FiltriUtente';\r\n\r\nexport class UserDto extends OmitType(FiltriUtente, ['codUte'] as const) {\r\n @ApiProperty({ description: \"Codice identificativo univoco dell'utente.\", example: 'USR123' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt({ message: 'Il codice utente deve essere un intero.' })\r\n @Min(1, { message: 'Il codice utente deve essere maggiore di zero.' })\r\n codiceUtente: number;\r\n\r\n @ApiProperty({ description: \"Email dell'utente.\", example: 'mario.rossi@dev.it' })\r\n @IsOptional()\r\n @IsString({ message: \"L'email deve essere una stringa.\" })\r\n @Length(3, 254, { message: \"L'email deve essere compresa tra 3 e 254 caratteri.\" })\r\n email: string;\r\n\r\n @ApiPropertyOptional({ description: \"Flag per l'accettazione del GDPR.\", example: true })\r\n @IsOptional()\r\n @IsBoolean({ message: 'Il flag GDPR deve essere booleano.' })\r\n flagGdpr?: boolean;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Data di accettazione del GDPR.',\r\n format: 'date-time',\r\n example: '2024-03-18T12:34:56Z',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'La data GDPR deve essere una stringa.' })\r\n dataGdpr?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Data di inserimento dell'utente nel sistema.\",\r\n format: 'date-time',\r\n example: '2023-01-01T08:30:00Z',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'La data di inserimento deve essere una stringa.' })\r\n dataInserimento?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Data scadenza password.',\r\n format: 'date-time',\r\n example: '2025-06-01',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'La data scadenza password deve essere una stringa.' })\r\n dataScadenzaPassword?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Ultima data di accesso dell'utente.\",\r\n format: 'date-time',\r\n example: '2024-03-15T14:45:00Z',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'La data ultimo accesso deve essere una stringa.' })\r\n dataLastLogin?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Stato della registrazione dell'utente.\",\r\n enum: StatoRegistrazione,\r\n example: StatoRegistrazione.CONF,\r\n })\r\n @IsOptional()\r\n @IsEnum(StatoRegistrazione, { message: 'Lo stato di registrazione non e valido.' })\r\n statoRegistrazione?: StatoRegistrazione;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Chiave di registrazione dell'utente.\",\r\n example: 'abc123xyz',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'La chiave registrazione deve essere una stringa.' })\r\n keyRegistrazione?: string;\r\n\r\n @ApiPropertyOptional({ description: \"Cognome dell'utente.\", example: 'Rossi' })\r\n @IsOptional()\r\n @IsString({ message: 'Il cognome deve essere una stringa.' })\r\n @Length(1, 255, { message: 'Il cognome deve essere compreso tra 1 e 255 caratteri.' })\r\n cognome?: string;\r\n\r\n @ApiPropertyOptional({ description: \"Nome dell'utente.\", example: 'Mario' })\r\n @IsOptional()\r\n @IsString({ message: 'Il nome deve essere una stringa.' })\r\n @Length(1, 255, { message: 'Il nome deve essere compreso tra 1 e 255 caratteri.' })\r\n nome?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Avatar (URL o base64).',\r\n example: 'https://example.com/avatar.jpg',\r\n nullable: true,\r\n })\r\n @IsOptional()\r\n @IsString({ message: \"L'avatar deve essere una stringa.\" })\r\n avatar?: string | null;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Flag che indica se l'autenticazione a due fattori è attivata.\",\r\n example: true,\r\n })\r\n @IsOptional()\r\n @IsBoolean({ message: 'Il flag due fattori deve essere booleano.' })\r\n flagDueFattori?: boolean;\r\n\r\n @ApiPropertyOptional({ description: 'Codice lingua preferito.', example: 'it' })\r\n @IsOptional()\r\n @IsString({ message: 'Il codice lingua deve essere una stringa.' })\r\n @Length(1, 20, { message: 'Il codice lingua deve essere compreso tra 1 e 20 caratteri.' })\r\n codiceLingua?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Numero di cellulare.',\r\n example: '+393401234567',\r\n nullable: true,\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'Il cellulare deve essere una stringa.' })\r\n @Length(1, 50, { message: 'Il cellulare deve essere compreso tra 1 e 50 caratteri.' })\r\n cellulare?: string | null;\r\n\r\n @ApiPropertyOptional({ description: 'Flag superutente.', example: false })\r\n @IsOptional()\r\n @IsBoolean({ message: 'Il flag superutente deve essere booleano.' })\r\n flagSuper?: boolean;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Flag che indica se l'utente è configuratore\",\r\n example: false,\r\n })\r\n @IsOptional()\r\n @IsBoolean({ message: 'Il flag configuratore deve essere booleano.' })\r\n flagAdminConfigurator?: boolean;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Pagina di default dell'utente all'accesso.\",\r\n example: '/dashboard',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'La pagina di default deve essere una stringa.' })\r\n paginaDefault?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: \"Numero MAC associato all'utente.\",\r\n example: 12,\r\n })\r\n nummac?: number;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Metadata JSON personalizzato.',\r\n example: '{\"theme\": \"dark\"}',\r\n })\r\n @IsOptional()\r\n @IsString({ message: 'I metadata JSON devono essere una stringa.' })\r\n jsonMetadata?: string;\r\n\r\n @ApiPropertyOptional({ description: 'Ragione sociale cliente.', example: 'ACME Corp SpA' })\r\n @IsOptional()\r\n @IsString({ message: 'La ragione sociale deve essere una stringa.' })\r\n ragSocCli?: string;\r\n\r\n @ApiPropertyOptional({ description: \"Ruoli assegnati all'utente.\", example: [1, 2] })\r\n @IsOptional()\r\n @IsArray({ message: 'I ruoli devono essere un array.' })\r\n @ArrayUnique({ message: 'I ruoli non possono contenere duplicati.' })\r\n @Type(() => Number)\r\n @IsInt({ each: true, message: 'Ogni ruolo deve essere un intero.' })\r\n roles?: number[];\r\n\r\n @ApiPropertyOptional({\r\n description: \"Permessi assegnati all'utente.\",\r\n type: [Permission],\r\n example: [{ codiceMenu: 'MNUOFFICINA', tipoAbilitazione: TipoAbilitazione.SCRITTURA }],\r\n })\r\n @IsOptional()\r\n @IsArray({ message: 'I permessi devono essere un array.' })\r\n @ValidateNested({ each: true })\r\n @Type(() => Permission)\r\n permissions?: Permission[];\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserGrantsDto.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/UserGrantsDto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,yDAAyC;AACzC,qDAAiD;AACjD,yDAAsD;AACtD,iCAA8B;AAE9B,MAAa,aAAa;CAevB;AAfH,sCAeG;AAXC;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,mCAAgB,CAAC,EAAE,CAAC;IACnF,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,mCAAgB,CAAC;;mDACI;AAKjC;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,WAAI,CAAC,EAAE,CAAC;IAChE,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,WAAI,CAAC;;4CACH;AAKd;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,mCAAgB,CAAC,EAAE,CAAC;IAC1E,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,mCAAgB,CAAC;;6CACF","sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\nimport { Type } from \"class-transformer\";\nimport { ValidateNested } from \"class-validator\";\nimport { AbilitazioneMenu } from \"./AbilitazioneMenu\";\nimport { Role } from \"./Role\";\n\nexport class UserGrantsDto {\n @ApiProperty({ description: 'Abilitazioni dell\\'utente', type: [AbilitazioneMenu] })\n @ValidateNested({ each: true })\n @Type(() => AbilitazioneMenu)\n abilitazioni: AbilitazioneMenu[];\n \n @ApiProperty({ description: 'Ruoli dell\\'utente', type: [Role] })\n @ValidateNested({ each: true })\n @Type(() => Role)\n ruoli: Role[];\n \n @ApiProperty({ description: 'Grants combinati', type: [AbilitazioneMenu] })\n @ValidateNested({ each: true })\n @Type(() => AbilitazioneMenu)\n grants: AbilitazioneMenu[];\n }"]}
|
|
1
|
+
{"version":3,"file":"UserGrantsDto.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/UserGrantsDto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,yDAAyC;AACzC,qDAAiD;AACjD,yDAAsD;AACtD,iCAA8B;AAE9B,MAAa,aAAa;CAevB;AAfH,sCAeG;AAXC;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,mCAAgB,CAAC,EAAE,CAAC;IACnF,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,mCAAgB,CAAC;;mDACI;AAKjC;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,WAAI,CAAC,EAAE,CAAC;IAChE,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,WAAI,CAAC;;4CACH;AAKd;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,mCAAgB,CAAC,EAAE,CAAC;IAC1E,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,mCAAgB,CAAC;;6CACF","sourcesContent":["import { ApiProperty } from \"@nestjs/swagger\";\r\nimport { Type } from \"class-transformer\";\r\nimport { ValidateNested } from \"class-validator\";\r\nimport { AbilitazioneMenu } from \"./AbilitazioneMenu\";\r\nimport { Role } from \"./Role\";\r\n\r\nexport class UserGrantsDto {\r\n @ApiProperty({ description: 'Abilitazioni dell\\'utente', type: [AbilitazioneMenu] })\r\n @ValidateNested({ each: true })\r\n @Type(() => AbilitazioneMenu)\r\n abilitazioni: AbilitazioneMenu[];\r\n \r\n @ApiProperty({ description: 'Ruoli dell\\'utente', type: [Role] })\r\n @ValidateNested({ each: true })\r\n @Type(() => Role)\r\n ruoli: Role[];\r\n \r\n @ApiProperty({ description: 'Grants combinati', type: [AbilitazioneMenu] })\r\n @ValidateNested({ each: true })\r\n @Type(() => AbilitazioneMenu)\r\n grants: AbilitazioneMenu[];\r\n }"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,qDAAmC;AACnC,mEAAiD;AACjD,6DAA2C;AAC3C,iDAA+B;AAC/B,+DAA4C;AAE5C,iDAA+B;AAC/B,iDAA+B;AAC/B,kDAAgC;AAChC,+CAA6B;AAC7B,yCAAuB;AACvB,uDAAqC;AACrC,qDAAmC;AACnC,gDAA8B;AAC9B,4CAA0B;AAE1B,8CAA2B","sourcesContent":["export * from \"./Abilitazione\";\nexport * from \"./AbilitazioneMenu\";\nexport * from \"./AssignPermissionsToUserRequest\";\nexport * from \"./AssignRolesToUserRequest\";\nexport * from \"./BaseResponse\";\nexport * from \"./UpdateEnabledStatusRequest\"\n\nexport * from \"./FiltriUtente\";\nexport * from \"./LoginRequest\";\nexport * from \"./LoginResponse\";\nexport * from \"./Permission\";\nexport * from \"./Role\";\nexport * from \"./StatoRegistrazione\";\nexport * from \"./TipoAbilitazione\";\nexport * from \"./TokenResult\";\nexport * from \"./UserDto\";\n\nexport * from \"./RuoliMenu\"\n\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/accessi-module/Dtos/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,qDAAmC;AACnC,mEAAiD;AACjD,6DAA2C;AAC3C,iDAA+B;AAC/B,+DAA4C;AAE5C,iDAA+B;AAC/B,iDAA+B;AAC/B,kDAAgC;AAChC,+CAA6B;AAC7B,yCAAuB;AACvB,uDAAqC;AACrC,qDAAmC;AACnC,gDAA8B;AAC9B,4CAA0B;AAE1B,8CAA2B","sourcesContent":["export * from \"./Abilitazione\";\r\nexport * from \"./AbilitazioneMenu\";\r\nexport * from \"./AssignPermissionsToUserRequest\";\r\nexport * from \"./AssignRolesToUserRequest\";\r\nexport * from \"./BaseResponse\";\r\nexport * from \"./UpdateEnabledStatusRequest\"\r\n\r\nexport * from \"./FiltriUtente\";\r\nexport * from \"./LoginRequest\";\r\nexport * from \"./LoginResponse\";\r\nexport * from \"./Permission\";\r\nexport * from \"./Role\";\r\nexport * from \"./StatoRegistrazione\";\r\nexport * from \"./TipoAbilitazione\";\r\nexport * from \"./TokenResult\";\r\nexport * from \"./UserDto\";\r\n\r\nexport * from \"./RuoliMenu\"\r\n\r\n"]}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { AccessiOptions } from "../../AccessiModule";
|
|
2
|
-
import { UserService } from "../UserService/UserService";
|
|
3
|
-
import { PermissionService } from "../PermissionService/PermissionService";
|
|
4
2
|
import { LoginRequest } from "../../Dtos/LoginRequest";
|
|
5
3
|
import { LoginResult } from "../../Dtos/LoginResponse";
|
|
4
|
+
import { UserService } from "../UserService/UserService";
|
|
5
|
+
import { PermissionService } from "../PermissionService/PermissionService";
|
|
6
6
|
import { FiltriService } from "../FiltriService/FiltriService";
|
|
7
7
|
export declare class AuthService {
|
|
8
8
|
private userService;
|
|
9
9
|
private permissionService;
|
|
10
10
|
private filtriService;
|
|
11
11
|
private readonly accessiOptions;
|
|
12
|
+
private readonly logger;
|
|
12
13
|
constructor(userService: UserService, permissionService: PermissionService, filtriService: FiltriService, accessiOptions: AccessiOptions);
|
|
14
|
+
private refreshPasswordExpiration;
|
|
15
|
+
private isMockDemoUserEnabled;
|
|
13
16
|
login(request: LoginRequest): Promise<LoginResult>;
|
|
17
|
+
getAuthenticatedTokenPayload(token: string): Promise<Record<string, unknown>>;
|
|
14
18
|
setPassword(codiceUtente: number, nuovaPassword: string): Promise<any>;
|
|
15
|
-
|
|
19
|
+
migrateLegacyEncryptedPasswords(): Promise<void>;
|
|
20
|
+
verifyPassword(codiceUtente: number, plainPassword: string): Promise<boolean>;
|
|
16
21
|
getAdminUser(): Promise<LoginResult>;
|
|
17
22
|
getDemoUser(): LoginResult;
|
|
18
23
|
confirmResetPassword(token: string, newPassword: string): Promise<void>;
|
|
@@ -1,10 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
2
18
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
19
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
20
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
21
|
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;
|
|
6
22
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
23
|
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
8
41
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
42
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
43
|
};
|
|
@@ -20,35 +53,63 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
20
53
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
54
|
});
|
|
22
55
|
};
|
|
56
|
+
var AuthService_1;
|
|
23
57
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
58
|
exports.AuthService = void 0;
|
|
59
|
+
const common_1 = require("@nestjs/common");
|
|
60
|
+
const jwt = __importStar(require("jsonwebtoken"));
|
|
25
61
|
const Orm_1 = require("../../../Orm");
|
|
26
62
|
const Utilities_1 = require("../../../Utilities");
|
|
27
63
|
const StatoRegistrazione_1 = require("../../Dtos/StatoRegistrazione");
|
|
28
|
-
const common_1 = require("@nestjs/common");
|
|
29
64
|
const UserService_1 = require("../UserService/UserService");
|
|
30
65
|
const PermissionService_1 = require("../PermissionService/PermissionService");
|
|
31
66
|
const FiltriService_1 = require("../FiltriService/FiltriService");
|
|
32
|
-
|
|
67
|
+
const authenticatedToken_1 = require("../../security/authenticatedToken");
|
|
68
|
+
const passwordResetToken_1 = require("../../security/passwordResetToken");
|
|
69
|
+
const Logger_1 = require("../../../Logger");
|
|
70
|
+
let AuthService = AuthService_1 = class AuthService {
|
|
33
71
|
constructor(userService, permissionService, filtriService, accessiOptions) {
|
|
34
72
|
this.userService = userService;
|
|
35
73
|
this.permissionService = permissionService;
|
|
36
74
|
this.filtriService = filtriService;
|
|
37
75
|
this.accessiOptions = accessiOptions;
|
|
76
|
+
this.logger = new Logger_1.Logger(AuthService_1.name);
|
|
77
|
+
}
|
|
78
|
+
refreshPasswordExpiration(codiceUtente) {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
if (!this.accessiOptions.passwordExpiration) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const configuredDays = Number(this.accessiOptions.passwordExpirationDays);
|
|
84
|
+
const expirationDays = Number.isFinite(configuredDays) && configuredDays > 0
|
|
85
|
+
? Math.trunc(configuredDays)
|
|
86
|
+
: 90;
|
|
87
|
+
const query = `UPDATE UTENTI SET DATSCAPWD = DATEADD(${expirationDays} DAY TO CURRENT_TIMESTAMP) WHERE CODUTE = ?`;
|
|
88
|
+
yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, query, [codiceUtente]);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
isMockDemoUserEnabled() {
|
|
92
|
+
var _a;
|
|
93
|
+
if (!this.accessiOptions.mockDemoUser) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
const nodeEnv = ((_a = process.env.NODE_ENV) !== null && _a !== void 0 ? _a : "production").toLowerCase();
|
|
97
|
+
return nodeEnv !== "production" || process.env.ACCESSI_ALLOW_MOCK_DEMO_USER === "true";
|
|
38
98
|
}
|
|
39
99
|
login(request) {
|
|
40
100
|
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
-
|
|
42
|
-
|
|
101
|
+
const mockDemoUserEnabled = this.isMockDemoUserEnabled();
|
|
102
|
+
if (mockDemoUserEnabled &&
|
|
103
|
+
request.email.toLowerCase() === "demo") {
|
|
43
104
|
return this.getDemoUser();
|
|
44
|
-
|
|
45
|
-
|
|
105
|
+
}
|
|
106
|
+
if (mockDemoUserEnabled &&
|
|
107
|
+
request.email.toLowerCase() === "admin") {
|
|
46
108
|
return this.getAdminUser();
|
|
47
|
-
|
|
109
|
+
}
|
|
48
110
|
const utente = yield this.userService.getUserByEmail(request.email.toLowerCase());
|
|
49
111
|
if (!utente)
|
|
50
112
|
throw new Error("Nome utente o password errata!");
|
|
51
|
-
// Verifica lo stato della registrazione
|
|
52
113
|
switch (utente.statoRegistrazione) {
|
|
53
114
|
case undefined:
|
|
54
115
|
throw new Error("Struttura dati compromessa: Stato Registrazione inesistente.");
|
|
@@ -61,8 +122,7 @@ let AuthService = class AuthService {
|
|
|
61
122
|
if (utente.statoRegistrazione !== StatoRegistrazione_1.StatoRegistrazione.CONF) {
|
|
62
123
|
throw new Error(`Errore generico. Stato di registrazione non valido: ${utente.statoRegistrazione}.`);
|
|
63
124
|
}
|
|
64
|
-
|
|
65
|
-
const isPasswordValid = yield this.verifyPassword(utente.codiceUtente, passwordCifrata);
|
|
125
|
+
const isPasswordValid = yield this.verifyPassword(utente.codiceUtente, request.password);
|
|
66
126
|
if (!isPasswordValid)
|
|
67
127
|
throw new Error("Nome utente o password errata!");
|
|
68
128
|
if (this.accessiOptions.passwordExpiration &&
|
|
@@ -73,13 +133,11 @@ let AuthService = class AuthService {
|
|
|
73
133
|
throw new Error("PASSWORD_EXPIRED");
|
|
74
134
|
}
|
|
75
135
|
}
|
|
76
|
-
// Recupera i grants
|
|
77
136
|
const userGrants = yield this.permissionService.getUserRolesAndGrants(utente.codiceUtente);
|
|
78
|
-
// Recupera i filtri
|
|
79
137
|
const filtri = yield this.filtriService.getFiltriUser(utente.codiceUtente);
|
|
80
138
|
const updateLastAccessDateQuery = "UPDATE UTENTI SET DATLASTLOGIN = CURRENT_TIMESTAMP WHERE CODUTE = ?";
|
|
81
139
|
yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, updateLastAccessDateQuery, [utente.codiceUtente]);
|
|
82
|
-
|
|
140
|
+
const extensionFields = {};
|
|
83
141
|
if (this.accessiOptions.extensionFieldsOptions &&
|
|
84
142
|
this.accessiOptions.extensionFieldsOptions.length > 0) {
|
|
85
143
|
for (const ext of this.accessiOptions.extensionFieldsOptions) {
|
|
@@ -90,31 +148,94 @@ let AuthService = class AuthService {
|
|
|
90
148
|
return { utente, filtri, userGrants, extensionFields };
|
|
91
149
|
});
|
|
92
150
|
}
|
|
151
|
+
getAuthenticatedTokenPayload(token) {
|
|
152
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
153
|
+
if (typeof token !== "string" || token.trim() === "") {
|
|
154
|
+
throw new Error("Token non fornito.");
|
|
155
|
+
}
|
|
156
|
+
const secret = (0, passwordResetToken_1.getAccessiJwtSecret)(this.accessiOptions);
|
|
157
|
+
const decoded = jwt.verify(token.trim(), secret);
|
|
158
|
+
const codiceUtente = (0, authenticatedToken_1.resolveCodiceUtenteFromTokenPayload)(decoded);
|
|
159
|
+
if (!codiceUtente) {
|
|
160
|
+
throw new Error("Token non valido.");
|
|
161
|
+
}
|
|
162
|
+
const currentUser = yield this.userService.getAuthenticatedUserSnapshot(codiceUtente);
|
|
163
|
+
if (!(0, authenticatedToken_1.isAuthenticatedUserEnabledForJwt)(currentUser)) {
|
|
164
|
+
throw new Error("Token non valido o utente non autorizzato.");
|
|
165
|
+
}
|
|
166
|
+
return (0, authenticatedToken_1.buildAuthenticatedTokenPayload)(decoded, currentUser);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
93
169
|
setPassword(codiceUtente, nuovaPassword) {
|
|
94
170
|
return __awaiter(this, void 0, void 0, function* () {
|
|
95
171
|
try {
|
|
96
172
|
const query = `UPDATE OR INSERT INTO UTENTI_PWD (CODUTE, PWD) VALUES (?, ?)`;
|
|
97
|
-
const hashedPassword = Utilities_1.
|
|
98
|
-
|
|
173
|
+
const hashedPassword = Utilities_1.PasswordUtilities.hashPassword(nuovaPassword);
|
|
174
|
+
const result = yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, query, [
|
|
99
175
|
codiceUtente,
|
|
100
176
|
hashedPassword,
|
|
101
177
|
]);
|
|
178
|
+
yield this.refreshPasswordExpiration(codiceUtente);
|
|
179
|
+
return result;
|
|
102
180
|
}
|
|
103
181
|
catch (error) {
|
|
104
182
|
throw error;
|
|
105
183
|
}
|
|
106
184
|
});
|
|
107
185
|
}
|
|
108
|
-
|
|
186
|
+
migrateLegacyEncryptedPasswords() {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
+
const startedAt = performance.now();
|
|
189
|
+
this.logger.info("Avvio migrazione password legacy accessi.");
|
|
190
|
+
const results = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, "SELECT CODUTE AS codice_utente, PWD AS password FROM UTENTI_PWD WHERE PWD IS NOT NULL", []);
|
|
191
|
+
const rows = results.map(Utilities_1.RestUtilities.convertKeysToCamelCase);
|
|
192
|
+
let migratedCount = 0;
|
|
193
|
+
let skippedCount = 0;
|
|
194
|
+
for (const row of rows) {
|
|
195
|
+
const codiceUtente = Number(row.codiceUtente);
|
|
196
|
+
const storedPassword = typeof row.password === "string" ? row.password : null;
|
|
197
|
+
if (!codiceUtente ||
|
|
198
|
+
!storedPassword ||
|
|
199
|
+
Utilities_1.PasswordUtilities.isPasswordHash(storedPassword) ||
|
|
200
|
+
Utilities_1.PasswordUtilities.isLegacyPasswordHash(storedPassword)) {
|
|
201
|
+
skippedCount += 1;
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const protectedLegacyPassword = Utilities_1.PasswordUtilities.hashLegacyEncryptedPassword(storedPassword);
|
|
205
|
+
yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, "UPDATE UTENTI_PWD SET PWD = ? WHERE CODUTE = ? AND PWD = ?", [protectedLegacyPassword, codiceUtente, storedPassword]);
|
|
206
|
+
migratedCount += 1;
|
|
207
|
+
}
|
|
208
|
+
this.logger.info(`Migrazione password legacy accessi completata. Letti=${rows.length}, migrati=${migratedCount}, ignorati=${skippedCount}, durataMs=${(performance.now() - startedAt).toFixed(2)}`);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
verifyPassword(codiceUtente, plainPassword) {
|
|
109
212
|
return __awaiter(this, void 0, void 0, function* () {
|
|
110
213
|
const query = `SELECT PWD AS password FROM UTENTI_PWD WHERE CODUTE = ?`;
|
|
111
214
|
const result = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, query, [codiceUtente]).then((results) => results.map(Utilities_1.RestUtilities.convertKeysToCamelCase)));
|
|
112
|
-
|
|
215
|
+
if (result.length === 0 || typeof result[0].password !== "string") {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const storedPassword = result[0].password;
|
|
219
|
+
if (Utilities_1.PasswordUtilities.isPasswordHash(storedPassword)) {
|
|
220
|
+
return Utilities_1.PasswordUtilities.verifyPassword(plainPassword, storedPassword);
|
|
221
|
+
}
|
|
222
|
+
const legacyEncryptedPassword = Utilities_1.CryptUtilities.encrypt(plainPassword, this.accessiOptions.encryptionKey);
|
|
223
|
+
if (Utilities_1.PasswordUtilities.isLegacyPasswordHash(storedPassword)) {
|
|
224
|
+
const isMigratedLegacyPasswordValid = Utilities_1.PasswordUtilities.verifyLegacyEncryptedPassword(legacyEncryptedPassword, storedPassword);
|
|
225
|
+
if (isMigratedLegacyPasswordValid) {
|
|
226
|
+
yield this.setPassword(codiceUtente, plainPassword);
|
|
227
|
+
}
|
|
228
|
+
return isMigratedLegacyPasswordValid;
|
|
229
|
+
}
|
|
230
|
+
const isLegacyPasswordValid = storedPassword === legacyEncryptedPassword;
|
|
231
|
+
if (isLegacyPasswordValid) {
|
|
232
|
+
yield this.setPassword(codiceUtente, plainPassword);
|
|
233
|
+
}
|
|
234
|
+
return isLegacyPasswordValid;
|
|
113
235
|
});
|
|
114
236
|
}
|
|
115
237
|
getAdminUser() {
|
|
116
238
|
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
-
///const filtri = await this.userService.getUserFilters(6789);
|
|
118
239
|
return {
|
|
119
240
|
utente: {
|
|
120
241
|
codiceUtente: 6789,
|
|
@@ -170,16 +291,27 @@ let AuthService = class AuthService {
|
|
|
170
291
|
confirmResetPassword(token, newPassword) {
|
|
171
292
|
return __awaiter(this, void 0, void 0, function* () {
|
|
172
293
|
try {
|
|
173
|
-
|
|
174
|
-
|
|
294
|
+
if (typeof token !== "string" || token.trim() === "") {
|
|
295
|
+
throw new Error("Token non valido.");
|
|
296
|
+
}
|
|
297
|
+
if (typeof newPassword !== "string" ||
|
|
298
|
+
newPassword.length < 8 ||
|
|
299
|
+
newPassword.length > 100) {
|
|
300
|
+
throw new Error("La nuova password deve essere compresa tra 8 e 100 caratteri.");
|
|
301
|
+
}
|
|
302
|
+
const secret = (0, passwordResetToken_1.getAccessiJwtSecret)(this.accessiOptions);
|
|
303
|
+
const { codiceUtente, nonce } = (0, passwordResetToken_1.verifyPasswordResetToken)(token.trim(), secret);
|
|
304
|
+
const result = (yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, "SELECT CODUTE AS codice_utente, STAREG AS stato_registrazione FROM UTENTI WHERE CODUTE = ? AND KEYREG = ?", [codiceUtente, nonce]).then((rows) => rows.map(Utilities_1.RestUtilities.convertKeysToCamelCase)));
|
|
175
305
|
if (result.length === 0) {
|
|
176
|
-
throw new Error("Token non valido o
|
|
306
|
+
throw new Error("Token non valido o gia usato.");
|
|
307
|
+
}
|
|
308
|
+
const currentState = Number(result[0].statoRegistrazione);
|
|
309
|
+
if (currentState === StatoRegistrazione_1.StatoRegistrazione.BLOCC ||
|
|
310
|
+
currentState === StatoRegistrazione_1.StatoRegistrazione.DELETE) {
|
|
311
|
+
throw new Error("Utente non autorizzato a completare il reset password.");
|
|
177
312
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
// Aggiorniamo la password e rimuoviamo il token di reset
|
|
181
|
-
yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, "UPDATE UTENTI SET KEYREG = NULL, STAREG = ? WHERE CODUTE = ?", [StatoRegistrazione_1.StatoRegistrazione.CONF, result[0].CODUTE]);
|
|
182
|
-
yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, "UPDATE OR INSERT INTO UTENTI_PWD (CODUTE, PWD) VALUES (?, ?)", [result[0].CODUTE, hashedPassword]);
|
|
313
|
+
yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, "UPDATE UTENTI SET KEYREG = NULL, STAREG = ? WHERE CODUTE = ?", [StatoRegistrazione_1.StatoRegistrazione.CONF, codiceUtente]);
|
|
314
|
+
yield this.setPassword(codiceUtente, newPassword);
|
|
183
315
|
}
|
|
184
316
|
catch (error) {
|
|
185
317
|
throw error;
|
|
@@ -188,7 +320,7 @@ let AuthService = class AuthService {
|
|
|
188
320
|
}
|
|
189
321
|
};
|
|
190
322
|
exports.AuthService = AuthService;
|
|
191
|
-
exports.AuthService = AuthService = __decorate([
|
|
323
|
+
exports.AuthService = AuthService = AuthService_1 = __decorate([
|
|
192
324
|
(0, common_1.Injectable)(),
|
|
193
325
|
__param(3, (0, common_1.Inject)("ACCESSI_OPTIONS")),
|
|
194
326
|
__metadata("design:paramtypes", [UserService_1.UserService,
|