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.
Files changed (119) hide show
  1. package/README.MD +38 -34
  2. package/dist/ContractGenerator.js.map +1 -1
  3. package/dist/DatabaseUpdater.js +24 -24
  4. package/dist/DatabaseUpdater.js.map +1 -1
  5. package/dist/EmilsoftwareModule.js.map +1 -1
  6. package/dist/ExecutionTimeLogger.js.map +1 -1
  7. package/dist/Logger.js.map +1 -1
  8. package/dist/Orm.js.map +1 -1
  9. package/dist/RoutesLoggerMiddleware.js.map +1 -1
  10. package/dist/Utilities.d.ts +18 -0
  11. package/dist/Utilities.js +90 -1
  12. package/dist/Utilities.js.map +1 -1
  13. package/dist/accessi-module/AccessiModule.d.ts +15 -0
  14. package/dist/accessi-module/AccessiModule.js.map +1 -1
  15. package/dist/accessi-module/Controllers/AuthController.d.ts +4 -4
  16. package/dist/accessi-module/Controllers/AuthController.js +36 -21
  17. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  18. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  19. package/dist/accessi-module/Controllers/EmailController.d.ts +3 -3
  20. package/dist/accessi-module/Controllers/EmailController.js +15 -15
  21. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  22. package/dist/accessi-module/Controllers/FiltriController.d.ts +3 -3
  23. package/dist/accessi-module/Controllers/FiltriController.js +32 -15
  24. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  25. package/dist/accessi-module/Controllers/PermissionController.d.ts +12 -17
  26. package/dist/accessi-module/Controllers/PermissionController.js +140 -124
  27. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  28. package/dist/accessi-module/Controllers/UserController.d.ts +12 -11
  29. package/dist/accessi-module/Controllers/UserController.js +112 -79
  30. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  31. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  32. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  33. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js +6 -0
  34. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  35. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +6 -0
  36. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  37. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  38. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  39. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  40. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  41. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  42. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  43. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  44. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  45. package/dist/accessi-module/Dtos/Permission.js +5 -0
  46. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  47. package/dist/accessi-module/Dtos/RegisterRequest.js +37 -1
  48. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  49. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  50. package/dist/accessi-module/Dtos/Role.js +13 -2
  51. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  52. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  53. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js +6 -0
  54. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  55. package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
  56. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
  57. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  58. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  59. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  60. package/dist/accessi-module/Dtos/UserDto.js +59 -1
  61. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  62. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  63. package/dist/accessi-module/Dtos/index.js.map +1 -1
  64. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -3
  65. package/dist/accessi-module/Services/AuthService/AuthService.js +159 -27
  66. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  67. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
  68. package/dist/accessi-module/Services/EmailService/EmailService.js +44 -21
  69. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  70. package/dist/accessi-module/Services/FiltriService/FiltriService.js +1 -1
  71. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  72. package/dist/accessi-module/Services/PermissionService/PermissionService.js +87 -87
  73. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  74. package/dist/accessi-module/Services/UserService/UserService.d.ts +15 -6
  75. package/dist/accessi-module/Services/UserService/UserService.js +165 -139
  76. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  77. package/dist/accessi-module/Views/reset-password.html +213 -195
  78. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +25 -16
  79. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  80. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  81. package/dist/accessi-module/index.js +33 -4
  82. package/dist/accessi-module/index.js.map +1 -1
  83. package/dist/accessi-module/jwt/jwt.strategy.d.ts +4 -2
  84. package/dist/accessi-module/jwt/jwt.strategy.js +47 -19
  85. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  86. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  87. package/dist/accessi-module/middleware/authenticateGen.d.ts +3 -1
  88. package/dist/accessi-module/middleware/authenticateGen.js +17 -11
  89. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  90. package/dist/accessi-module/security/accessControl.d.ts +17 -0
  91. package/dist/accessi-module/security/accessControl.js +44 -0
  92. package/dist/accessi-module/security/accessControl.js.map +1 -0
  93. package/dist/accessi-module/security/authenticatedToken.d.ts +11 -0
  94. package/dist/accessi-module/security/authenticatedToken.js +39 -0
  95. package/dist/accessi-module/security/authenticatedToken.js.map +1 -0
  96. package/dist/accessi-module/security/passwordResetToken.d.ts +8 -0
  97. package/dist/accessi-module/security/passwordResetToken.js +73 -0
  98. package/dist/accessi-module/security/passwordResetToken.js.map +1 -0
  99. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +10 -0
  100. package/dist/accessi-module/security/publicAuthRateLimit.js +105 -0
  101. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -0
  102. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  103. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  104. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  105. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  106. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  107. package/dist/allegati-module/Dtos/index.js.map +1 -1
  108. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  109. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  110. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  111. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +49 -49
  112. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  113. package/dist/allegati-module/index.js.map +1 -1
  114. package/dist/autobind.js.map +1 -1
  115. package/dist/index.js.map +1 -1
  116. package/dist/initEmilsoftwareModule.js.map +1 -1
  117. package/dist/swagger/SwaggerConfig.js.map +1 -1
  118. package/package.json +83 -83
  119. 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
- verifyPassword(codiceUtente: number, passwordCifrata: string): Promise<boolean>;
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
- let AuthService = class AuthService {
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
- if (this.accessiOptions.mockDemoUser &&
42
- request.email.toLowerCase() === "demo")
101
+ const mockDemoUserEnabled = this.isMockDemoUserEnabled();
102
+ if (mockDemoUserEnabled &&
103
+ request.email.toLowerCase() === "demo") {
43
104
  return this.getDemoUser();
44
- if (this.accessiOptions.mockDemoUser &&
45
- request.email.toLowerCase() === "admin")
105
+ }
106
+ if (mockDemoUserEnabled &&
107
+ request.email.toLowerCase() === "admin") {
46
108
  return this.getAdminUser();
47
- const passwordCifrata = Utilities_1.CryptUtilities.encrypt(request.password, this.accessiOptions.encryptionKey);
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
- // Verifica la password
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
- let extensionFields = {};
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.CryptUtilities.encrypt(nuovaPassword, this.accessiOptions.encryptionKey);
98
- return yield Orm_1.Orm.execute(this.accessiOptions.databaseOptions, query, [
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
- verifyPassword(codiceUtente, passwordCifrata) {
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
- return result.length > 0 && result[0].password === passwordCifrata;
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
- // Controlliamo se il token esiste
174
- const result = yield Orm_1.Orm.query(this.accessiOptions.databaseOptions, "SELECT CODUTE FROM UTENTI WHERE KEYREG = ?", [token]);
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 già usato.");
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
- // Hashiamo la nuova password
179
- const hashedPassword = Utilities_1.CryptUtilities.encrypt(newPassword, this.accessiOptions.encryptionKey);
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,