emilsoftware-utilities 1.8.0-dev.2 → 2.0.0-dev.10

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 (86) hide show
  1. package/README.MD +4 -0
  2. package/dist/DatabaseUpdater.d.ts +1 -1
  3. package/dist/DatabaseUpdater.js.map +1 -1
  4. package/dist/Orm.d.ts +5 -1
  5. package/dist/Orm.js +147 -78
  6. package/dist/Orm.js.map +1 -1
  7. package/dist/Utilities.d.ts +20 -2
  8. package/dist/Utilities.js +92 -1
  9. package/dist/Utilities.js.map +1 -1
  10. package/dist/accessi-module/AccessiModule.d.ts +16 -1
  11. package/dist/accessi-module/AccessiModule.js.map +1 -1
  12. package/dist/accessi-module/Controllers/AuthController.d.ts +4 -4
  13. package/dist/accessi-module/Controllers/AuthController.js +36 -21
  14. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  15. package/dist/accessi-module/Controllers/EmailController.d.ts +3 -3
  16. package/dist/accessi-module/Controllers/EmailController.js +15 -15
  17. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  18. package/dist/accessi-module/Controllers/FiltriController.d.ts +3 -3
  19. package/dist/accessi-module/Controllers/FiltriController.js +32 -15
  20. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  21. package/dist/accessi-module/Controllers/PermissionController.d.ts +12 -17
  22. package/dist/accessi-module/Controllers/PermissionController.js +140 -124
  23. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  24. package/dist/accessi-module/Controllers/UserController.d.ts +12 -11
  25. package/dist/accessi-module/Controllers/UserController.js +112 -79
  26. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  27. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js +6 -0
  28. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  29. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +6 -0
  30. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  31. package/dist/accessi-module/Dtos/Permission.js +5 -0
  32. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  33. package/dist/accessi-module/Dtos/RegisterRequest.js +37 -1
  34. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  35. package/dist/accessi-module/Dtos/Role.js +13 -2
  36. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  37. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js +6 -0
  38. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  39. package/dist/accessi-module/Dtos/UserDto.js +59 -1
  40. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  41. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -3
  42. package/dist/accessi-module/Services/AuthService/AuthService.js +159 -27
  43. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  44. package/dist/accessi-module/Services/EmailService/EmailService.js +33 -10
  45. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  46. package/dist/accessi-module/Services/UserService/UserService.d.ts +15 -6
  47. package/dist/accessi-module/Services/UserService/UserService.js +110 -84
  48. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  49. package/dist/accessi-module/Views/reset-password.html +39 -21
  50. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +9 -0
  51. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  52. package/dist/accessi-module/index.d.ts +1 -0
  53. package/dist/accessi-module/index.js +59 -9
  54. package/dist/accessi-module/index.js.map +1 -1
  55. package/dist/accessi-module/jwt/jwt.strategy.d.ts +4 -2
  56. package/dist/accessi-module/jwt/jwt.strategy.js +47 -19
  57. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  58. package/dist/accessi-module/middleware/authenticateGen.d.ts +3 -1
  59. package/dist/accessi-module/middleware/authenticateGen.js +17 -11
  60. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  61. package/dist/accessi-module/security/accessControl.d.ts +17 -0
  62. package/dist/accessi-module/security/accessControl.js +44 -0
  63. package/dist/accessi-module/security/accessControl.js.map +1 -0
  64. package/dist/accessi-module/security/authenticatedToken.d.ts +11 -0
  65. package/dist/accessi-module/security/authenticatedToken.js +39 -0
  66. package/dist/accessi-module/security/authenticatedToken.js.map +1 -0
  67. package/dist/accessi-module/security/passwordResetToken.d.ts +8 -0
  68. package/dist/accessi-module/security/passwordResetToken.js +73 -0
  69. package/dist/accessi-module/security/passwordResetToken.js.map +1 -0
  70. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +10 -0
  71. package/dist/accessi-module/security/publicAuthRateLimit.js +105 -0
  72. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -0
  73. package/dist/allegati-module/AllegatiModule.d.ts +1 -1
  74. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  75. package/dist/emilsoftware-utilities-2.0.0-dev.10.tgz +0 -0
  76. package/dist/firebird-compat.d.ts +24 -0
  77. package/dist/firebird-compat.js +218 -0
  78. package/dist/firebird-compat.js.map +1 -0
  79. package/dist/index.d.ts +5 -2
  80. package/dist/index.js +28 -2
  81. package/dist/index.js.map +1 -1
  82. package/dist/swagger/SwaggerConfig.d.ts +6 -1
  83. package/dist/swagger/SwaggerConfig.js +6 -6
  84. package/dist/swagger/SwaggerConfig.js.map +1 -1
  85. package/package.json +2 -2
  86. package/dist/emilsoftware-utilities-1.8.0-dev.2.tgz +0 -0
@@ -109,7 +109,7 @@
109
109
  <div class="form-group">
110
110
  <label for="password">Nuova Password:</label>
111
111
  <input type="password" id="password" required>
112
- <p class="error" id="passwordError">La password deve avere almeno 6 caratteri.</p>
112
+ <p class="error" id="passwordError">La password deve avere almeno 8 caratteri.</p>
113
113
  </div>
114
114
 
115
115
  <div class="form-group">
@@ -124,21 +124,46 @@
124
124
 
125
125
  <script>
126
126
  document.addEventListener("DOMContentLoaded", function () {
127
- const urlParams = new URLSearchParams(window.location.search);
128
- const token = window.location.pathname.split("/").pop();
129
- const returnUrl = urlParams.get("returnUrl") || "/";
130
- let prefix = urlParams.get("prefix") || "";
127
+ function resolveSafeReturnUrl(rawReturnUrl) {
128
+ if (!rawReturnUrl) {
129
+ return "/";
130
+ }
131
+
132
+ if (rawReturnUrl.startsWith("/")) {
133
+ return rawReturnUrl;
134
+ }
135
+
136
+ try {
137
+ const parsed = new URL(rawReturnUrl, window.location.origin);
138
+ if (parsed.origin === window.location.origin) {
139
+ return `${parsed.pathname}${parsed.search}${parsed.hash}`;
140
+ }
141
+ } catch (error) {}
131
142
 
132
- if (prefix !== "") {
133
- if (!prefix.startsWith("/")) {
134
- prefix = "/" + prefix;
143
+ return "/";
144
+ }
145
+
146
+ function resolveSafePrefix(rawPrefix) {
147
+ if (!rawPrefix) {
148
+ return "";
149
+ }
150
+
151
+ let normalizedPrefix = rawPrefix.trim();
152
+ if (!normalizedPrefix.startsWith("/")) {
153
+ normalizedPrefix = "/" + normalizedPrefix;
135
154
  }
136
155
 
137
- if(prefix.endsWith("/")) {
138
- prefix = prefix.slice(0, -1);
156
+ if (normalizedPrefix.endsWith("/")) {
157
+ normalizedPrefix = normalizedPrefix.slice(0, -1);
139
158
  }
159
+
160
+ return /^\/[A-Za-z0-9/_-]*$/.test(normalizedPrefix) ? normalizedPrefix : "";
140
161
  }
141
162
 
163
+ const urlParams = new URLSearchParams(window.location.search);
164
+ const token = window.location.pathname.split("/").pop();
165
+ const returnUrl = resolveSafeReturnUrl(urlParams.get("returnUrl"));
166
+ const prefix = resolveSafePrefix(urlParams.get("prefix"));
142
167
 
143
168
  document.getElementById("token").value = token;
144
169
  document.getElementById("returnUrl").value = returnUrl;
@@ -151,12 +176,10 @@
151
176
  const passwordError = document.getElementById("passwordError");
152
177
  const confirmError = document.getElementById("confirmError");
153
178
 
154
- // Reset messaggi di errore
155
179
  passwordError.style.display = "none";
156
180
  confirmError.style.display = "none";
157
181
 
158
- // Validazioni
159
- if (password.length < 6) {
182
+ if (password.length < 8) {
160
183
  passwordError.style.display = "block";
161
184
  return;
162
185
  }
@@ -166,7 +189,6 @@
166
189
  return;
167
190
  }
168
191
 
169
- // Effettua la richiesta API
170
192
  try {
171
193
  const response = await fetch(`${prefix}/api/accessi/auth/confirm-reset-password/${token}`, {
172
194
  method: "POST",
@@ -177,14 +199,10 @@
177
199
  const data = await response.json();
178
200
  alert(data.message || "Password aggiornata con successo!");
179
201
  } catch (error) {
180
- alert("Errore nel reset della password. Riprova più tardi.");
202
+ alert("Errore nel reset della password. Riprova piu tardi.");
181
203
  } finally {
182
204
  setTimeout(() => {
183
- if (returnUrl.startsWith("https://") || returnUrl.startsWith("http://")) {
184
- window.location.href = returnUrl;
185
- } else {
186
- window.location.href = "https://" + returnUrl;
187
- }
205
+ window.location.href = returnUrl;
188
206
  }, 500);
189
207
  }
190
208
  });
@@ -192,4 +210,4 @@
192
210
  </script>
193
211
  </body>
194
212
 
195
- </html>
213
+ </html>
@@ -38,12 +38,18 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
38
38
  AccessiDatabaseUpdater_1.logger.info("Aggiornamento automatico database accessi disabilitato da configurazione.");
39
39
  return;
40
40
  }
41
+ AccessiDatabaseUpdater_1.logger.info("Avvio updater database accessi.");
41
42
  yield AccessiDatabaseUpdater_1.run(this.accessiOptions);
43
+ AccessiDatabaseUpdater_1.logger.info("Updater database accessi completato.");
42
44
  });
43
45
  }
44
46
  static run(options) {
45
47
  return __awaiter(this, void 0, void 0, function* () {
48
+ var _a, _b, _c;
49
+ const startedAt = performance.now();
50
+ this.logger.info(`Verifica schema accessi su ${(_a = options.databaseOptions.host) !== null && _a !== void 0 ? _a : "?"}:${(_b = options.databaseOptions.port) !== null && _b !== void 0 ? _b : "?"} -> ${(_c = options.databaseOptions.database) !== null && _c !== void 0 ? _c : "?"}`);
46
51
  yield this.createParametersTable(options.databaseOptions);
52
+ this.logger.info("Tabella PARAMETRI verificata.");
47
53
  const currentVersion = yield this.getDatabaseVersion(options.databaseOptions);
48
54
  const currentIndex = this.updates.findIndex((update) => update.toVersion === currentVersion);
49
55
  const startIndex = currentIndex >= 0 ? currentIndex + 1 : 0;
@@ -61,10 +67,13 @@ let AccessiDatabaseUpdater = AccessiDatabaseUpdater_1 = class AccessiDatabaseUpd
61
67
  }
62
68
  for (let index = startIndex; index < this.updates.length; index++) {
63
69
  const update = this.updates[index];
70
+ const stepStartedAt = performance.now();
64
71
  this.logger.info(`Applico aggiornamento accessi ${update.fromVersion} -> ${update.toVersion}: ${update.description}`);
65
72
  yield update.apply(options);
66
73
  yield this.setDatabaseVersion(options.databaseOptions, update.toVersion);
74
+ this.logger.info(`Aggiornamento accessi ${update.toVersion} completato in ${(performance.now() - stepStartedAt).toFixed(2)} ms`);
67
75
  }
76
+ this.logger.info(`Verifica/aggiornamento database accessi completato in ${(performance.now() - startedAt).toFixed(2)} ms`);
68
77
  });
69
78
  }
70
79
  static getCurrentVersion(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"AccessiDatabaseUpdater.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/AccessiDatabaseUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Inject, OnModuleInit } from \"@nestjs/common\";\nimport { DatabaseUpdater } from \"../../DatabaseUpdater\";\nimport { AccessiOptions } from \"../AccessiModule\";\nimport { Orm } from \"../../Orm\";\nimport { Logger } from \"../../Logger\";\n\ntype AccessiUpdateStep = {\n fromVersion: string;\n toVersion: string;\n description: string;\n apply: (options: AccessiOptions) => Promise<void>;\n};\n\n@Injectable()\nexport class AccessiDatabaseUpdater extends DatabaseUpdater implements OnModuleInit {\n protected static override logger: Logger = new Logger(AccessiDatabaseUpdater.name);\n\n private static readonly updates: AccessiUpdateStep[] = [\n {\n fromVersion: \"1.0.0\",\n toVersion: \"1.1.0\",\n description: \"Aggiunge filtro postazione, colonna IDXPOS e menu verifica RFID\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 20, \"POSTAZIONE\", \"IDXPOS\", undefined);\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI\",\n \"IDXPOS SMALLINT\",\n \"IDXPOS\",\n \"idx della postazione nella tabella ANTENNE_POS di PROLAV\"\n );\n await AccessiDatabaseUpdater.upsertMenu(options, {\n CODMNU: \"MNUVERRFID\",\n DESMNU: \"Verifica RFID\",\n CODGRP: \"F\",\n FLGENABLED: 1,\n ICON: \"hardware-chip-outline\",\n ORDINE: 10,\n CODTIP: \"M\",\n PAGINA: \"/verifica-rfid\",\n RIFMENU: null,\n });\n },\n },\n {\n fromVersion: \"1.1.0\",\n toVersion: \"1.1.1\",\n description: \"Aggiunge FLGENABLED su FILTRI_TIPO\",\n apply: async (options) => {\n const columnCreated = await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI_TIPO\",\n \"FLGENABLED SMALLINT DEFAULT 1 NOT NULL\",\n \"FLGENABLED\"\n );\n\n if (!columnCreated) {\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET FLGENABLED = 1 WHERE FLGENABLED IS NULL\"\n );\n }\n },\n },\n {\n fromVersion: \"1.1.1\",\n toVersion: \"1.1.2\",\n description: \"Aggiunge filtro vettore e colonna CODVET\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 30, \"VETTORE\", \"CODVET\", 1);\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI\",\n \"CODVET INTEGER\",\n \"CODVET\",\n \"CODICE DEL VETTORE DA INSERIRE SE COME FILTRO HA 30\"\n );\n },\n },\n {\n fromVersion: \"1.1.2\",\n toVersion: \"1.1.3\",\n description: \"Aggiunge FLGADMINCONFIG e inizializza PARAMETRI\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"UTENTI_CONFIG\",\n \"FLGADMINCONFIG SMALLINT DEFAULT 0\",\n \"FLGADMINCONFIG\",\n \"flag utente configuratore dei menu amministratore\"\n );\n await AccessiDatabaseUpdater.createParametersTable(options.databaseOptions);\n },\n },\n {\n fromVersion: \"1.1.3\",\n toVersion: \"1.1.4\",\n description: \"Aggiunge sequence e trigger per RUOLI\",\n apply: async (options) => {\n if (!(await AccessiDatabaseUpdater.generatorExists(options.databaseOptions, \"GEN_RUOLI_ID\"))) {\n await Orm.execute(options.databaseOptions, \"CREATE SEQUENCE GEN_RUOLI_ID\");\n }\n\n if (!(await AccessiDatabaseUpdater.triggerExists(options.databaseOptions, \"RUOLI_BI\"))) {\n await Orm.execute(\n options.databaseOptions,\n `CREATE TRIGGER RUOLI_BI FOR RUOLI\nACTIVE BEFORE INSERT POSITION 0\nAS\nBEGIN\n IF (NEW.CODRUO IS NULL) THEN\n NEW.CODRUO = GEN_ID(GEN_RUOLI_ID,1);\nEND`\n );\n }\n },\n },\n {\n fromVersion: \"1.1.4\",\n toVersion: \"1.1.5\",\n description: \"Aggiunge NOTE su MENU\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"MENU\",\n \"NOTE VARCHAR(1000)\",\n \"NOTE\"\n );\n },\n },\n {\n fromVersion: \"1.1.5\",\n toVersion: \"1.1.6\",\n description: \"Aggiunge NUMMAC su UTENTI_CONFIG\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"UTENTI_CONFIG\",\n \"NUMMAC INTEGER\",\n \"NUMMAC\",\n 'Numero macchina DESPOST PROLAV'\n );\n },\n },\n ];\n\n constructor(\n @Inject(\"ACCESSI_OPTIONS\") private readonly accessiOptions: AccessiOptions\n ) {\n super();\n }\n\n async onModuleInit(): Promise<void> {\n if (this.accessiOptions.autoUpdateDatabase === false) {\n AccessiDatabaseUpdater.logger.info(\"Aggiornamento automatico database accessi disabilitato da configurazione.\");\n return;\n }\n\n await AccessiDatabaseUpdater.run(this.accessiOptions);\n }\n\n static async run(options: AccessiOptions): Promise<void> {\n await this.createParametersTable(options.databaseOptions);\n\n const currentVersion = await this.getDatabaseVersion(options.databaseOptions);\n const currentIndex = this.updates.findIndex(\n (update) => update.toVersion === currentVersion\n );\n const startIndex = currentIndex >= 0 ? currentIndex + 1 : 0;\n\n if (currentVersion && currentIndex === this.updates.length - 1) {\n this.logger.info(`Database accessi gia' all'ultima versione disponibile (${currentVersion}).`);\n } else if (currentVersion && currentIndex >= 0) {\n this.logger.info(`Database accessi rilevato alla versione ${currentVersion}.`);\n } else if (currentVersion) {\n this.logger.warning(\n `Versione database accessi non riconosciuta (${currentVersion}). Verifico tutti gli update idempotenti.`\n );\n } else {\n this.logger.warning(\n \"Versione database accessi assente. Verifico tutti gli update idempotenti.\"\n );\n }\n\n for (let index = startIndex; index < this.updates.length; index++) {\n const update = this.updates[index];\n this.logger.info(\n `Applico aggiornamento accessi ${update.fromVersion} -> ${update.toVersion}: ${update.description}`\n );\n await update.apply(options);\n await this.setDatabaseVersion(options.databaseOptions, update.toVersion);\n }\n }\n\n static async getCurrentVersion(options: AccessiOptions): Promise<string | null> {\n return await this.getDatabaseVersion(options.databaseOptions);\n }\n\n static getLatestVersion(): string {\n return this.updates[this.updates.length - 1]?.toVersion ?? \"0.0.0\";\n }\n\n private static async ensureColumn(\n options: AccessiOptions,\n tableName: string,\n columnDefinition: string,\n columnName: string,\n comment?: string\n ): Promise<boolean> {\n const exists = await this.columnExists(\n options.databaseOptions,\n tableName,\n columnName\n );\n\n if (!exists) {\n await Orm.execute(\n options.databaseOptions,\n `ALTER TABLE ${tableName} ADD ${columnDefinition}`\n );\n }\n\n if (comment) {\n await Orm.execute(\n options.databaseOptions,\n `COMMENT ON COLUMN ${tableName}.${columnName} IS '${comment.replace(/'/g, \"''\")}'`\n );\n }\n\n return !exists;\n }\n\n private static async upsertFiltroTipo(\n options: AccessiOptions,\n tipfil: number,\n desfil: string,\n fldfil: string,\n flgEnabled?: number\n ): Promise<void> {\n const hasEnabledColumn = await this.columnExists(\n options.databaseOptions,\n \"FILTRI_TIPO\",\n \"FLGENABLED\"\n );\n\n const existing = await Orm.query(\n options.databaseOptions,\n \"SELECT TIPFIL FROM FILTRI_TIPO WHERE TIPFIL = ?\",\n [tipfil]\n );\n\n if (existing.length === 0) {\n if (hasEnabledColumn && flgEnabled !== undefined) {\n await Orm.execute(\n options.databaseOptions,\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL, FLGENABLED) VALUES (?, ?, ?, ?)\",\n [tipfil, desfil, fldfil, flgEnabled]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL) VALUES (?, ?, ?)\",\n [tipfil, desfil, fldfil]\n );\n return;\n }\n\n if (hasEnabledColumn && flgEnabled !== undefined) {\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ?, FLGENABLED = COALESCE(FLGENABLED, ?) WHERE TIPFIL = ?\",\n [desfil, fldfil, flgEnabled, tipfil]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ? WHERE TIPFIL = ?\",\n [desfil, fldfil, tipfil]\n );\n }\n\n private static async upsertMenu(\n options: AccessiOptions,\n menu: {\n CODMNU: string;\n DESMNU: string;\n CODGRP: string;\n FLGENABLED: number;\n ICON: string;\n ORDINE: number;\n CODTIP: string;\n PAGINA: string;\n RIFMENU: string | null;\n }\n ): Promise<void> {\n const existing = await Orm.query(\n options.databaseOptions,\n \"SELECT CODMNU FROM MENU WHERE CODMNU = ?\",\n [menu.CODMNU]\n );\n\n if (existing.length === 0) {\n await Orm.execute(\n options.databaseOptions,\n `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n menu.CODMNU,\n menu.DESMNU,\n menu.CODGRP,\n menu.FLGENABLED,\n menu.ICON,\n menu.ORDINE,\n menu.CODTIP,\n menu.PAGINA,\n menu.RIFMENU,\n ]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n `UPDATE MENU\n SET DESMNU = ?,\n CODGRP = ?,\n FLGENABLED = COALESCE(FLGENABLED, ?),\n ICON = ?,\n ORDINE = ?,\n CODTIP = ?,\n PAGINA = ?,\n RIFMENU = ?\n WHERE CODMNU = ?`,\n [\n menu.DESMNU,\n menu.CODGRP,\n menu.FLGENABLED,\n menu.ICON,\n menu.ORDINE,\n menu.CODTIP,\n menu.PAGINA,\n menu.RIFMENU,\n menu.CODMNU,\n ]\n );\n }\n}\n"]}
1
+ {"version":3,"file":"AccessiDatabaseUpdater.js","sourceRoot":"","sources":["../../../src/accessi-module/database-updates/AccessiDatabaseUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Inject, OnModuleInit } from \"@nestjs/common\";\nimport { DatabaseUpdater } from \"../../DatabaseUpdater\";\nimport { AccessiOptions } from \"../AccessiModule\";\nimport { Orm } from \"../../Orm\";\nimport { Logger } from \"../../Logger\";\n\ntype AccessiUpdateStep = {\n fromVersion: string;\n toVersion: string;\n description: string;\n apply: (options: AccessiOptions) => Promise<void>;\n};\n\n@Injectable()\nexport class AccessiDatabaseUpdater extends DatabaseUpdater implements OnModuleInit {\n protected static override logger: Logger = new Logger(AccessiDatabaseUpdater.name);\n\n private static readonly updates: AccessiUpdateStep[] = [\n {\n fromVersion: \"1.0.0\",\n toVersion: \"1.1.0\",\n description: \"Aggiunge filtro postazione, colonna IDXPOS e menu verifica RFID\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 20, \"POSTAZIONE\", \"IDXPOS\", undefined);\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI\",\n \"IDXPOS SMALLINT\",\n \"IDXPOS\",\n \"idx della postazione nella tabella ANTENNE_POS di PROLAV\"\n );\n await AccessiDatabaseUpdater.upsertMenu(options, {\n CODMNU: \"MNUVERRFID\",\n DESMNU: \"Verifica RFID\",\n CODGRP: \"F\",\n FLGENABLED: 1,\n ICON: \"hardware-chip-outline\",\n ORDINE: 10,\n CODTIP: \"M\",\n PAGINA: \"/verifica-rfid\",\n RIFMENU: null,\n });\n },\n },\n {\n fromVersion: \"1.1.0\",\n toVersion: \"1.1.1\",\n description: \"Aggiunge FLGENABLED su FILTRI_TIPO\",\n apply: async (options) => {\n const columnCreated = await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI_TIPO\",\n \"FLGENABLED SMALLINT DEFAULT 1 NOT NULL\",\n \"FLGENABLED\"\n );\n\n if (!columnCreated) {\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET FLGENABLED = 1 WHERE FLGENABLED IS NULL\"\n );\n }\n },\n },\n {\n fromVersion: \"1.1.1\",\n toVersion: \"1.1.2\",\n description: \"Aggiunge filtro vettore e colonna CODVET\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.upsertFiltroTipo(options, 30, \"VETTORE\", \"CODVET\", 1);\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"FILTRI\",\n \"CODVET INTEGER\",\n \"CODVET\",\n \"CODICE DEL VETTORE DA INSERIRE SE COME FILTRO HA 30\"\n );\n },\n },\n {\n fromVersion: \"1.1.2\",\n toVersion: \"1.1.3\",\n description: \"Aggiunge FLGADMINCONFIG e inizializza PARAMETRI\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"UTENTI_CONFIG\",\n \"FLGADMINCONFIG SMALLINT DEFAULT 0\",\n \"FLGADMINCONFIG\",\n \"flag utente configuratore dei menu amministratore\"\n );\n await AccessiDatabaseUpdater.createParametersTable(options.databaseOptions);\n },\n },\n {\n fromVersion: \"1.1.3\",\n toVersion: \"1.1.4\",\n description: \"Aggiunge sequence e trigger per RUOLI\",\n apply: async (options) => {\n if (!(await AccessiDatabaseUpdater.generatorExists(options.databaseOptions, \"GEN_RUOLI_ID\"))) {\n await Orm.execute(options.databaseOptions, \"CREATE SEQUENCE GEN_RUOLI_ID\");\n }\n\n if (!(await AccessiDatabaseUpdater.triggerExists(options.databaseOptions, \"RUOLI_BI\"))) {\n await Orm.execute(\n options.databaseOptions,\n `CREATE TRIGGER RUOLI_BI FOR RUOLI\nACTIVE BEFORE INSERT POSITION 0\nAS\nBEGIN\n IF (NEW.CODRUO IS NULL) THEN\n NEW.CODRUO = GEN_ID(GEN_RUOLI_ID,1);\nEND`\n );\n }\n },\n },\n {\n fromVersion: \"1.1.4\",\n toVersion: \"1.1.5\",\n description: \"Aggiunge NOTE su MENU\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"MENU\",\n \"NOTE VARCHAR(1000)\",\n \"NOTE\"\n );\n },\n },\n {\n fromVersion: \"1.1.5\",\n toVersion: \"1.1.6\",\n description: \"Aggiunge NUMMAC su UTENTI_CONFIG\",\n apply: async (options) => {\n await AccessiDatabaseUpdater.ensureColumn(\n options,\n \"UTENTI_CONFIG\",\n \"NUMMAC INTEGER\",\n \"NUMMAC\",\n 'Numero macchina DESPOST PROLAV'\n );\n },\n },\n ];\n\n constructor(\n @Inject(\"ACCESSI_OPTIONS\") private readonly accessiOptions: AccessiOptions\n ) {\n super();\n }\n\n async onModuleInit(): Promise<void> {\n if (this.accessiOptions.autoUpdateDatabase === false) {\n AccessiDatabaseUpdater.logger.info(\"Aggiornamento automatico database accessi disabilitato da configurazione.\");\n return;\n }\n\n AccessiDatabaseUpdater.logger.info(\"Avvio updater database accessi.\");\n await AccessiDatabaseUpdater.run(this.accessiOptions);\n AccessiDatabaseUpdater.logger.info(\"Updater database accessi completato.\");\n }\n\n static async run(options: AccessiOptions): Promise<void> {\n const startedAt = performance.now();\n this.logger.info(\n `Verifica schema accessi su ${options.databaseOptions.host ?? \"?\"}:${options.databaseOptions.port ?? \"?\"} -> ${options.databaseOptions.database ?? \"?\"}`\n );\n await this.createParametersTable(options.databaseOptions);\n this.logger.info(\"Tabella PARAMETRI verificata.\");\n\n const currentVersion = await this.getDatabaseVersion(options.databaseOptions);\n const currentIndex = this.updates.findIndex(\n (update) => update.toVersion === currentVersion\n );\n const startIndex = currentIndex >= 0 ? currentIndex + 1 : 0;\n\n if (currentVersion && currentIndex === this.updates.length - 1) {\n this.logger.info(`Database accessi gia' all'ultima versione disponibile (${currentVersion}).`);\n } else if (currentVersion && currentIndex >= 0) {\n this.logger.info(`Database accessi rilevato alla versione ${currentVersion}.`);\n } else if (currentVersion) {\n this.logger.warning(\n `Versione database accessi non riconosciuta (${currentVersion}). Verifico tutti gli update idempotenti.`\n );\n } else {\n this.logger.warning(\n \"Versione database accessi assente. Verifico tutti gli update idempotenti.\"\n );\n }\n\n for (let index = startIndex; index < this.updates.length; index++) {\n const update = this.updates[index];\n const stepStartedAt = performance.now();\n this.logger.info(\n `Applico aggiornamento accessi ${update.fromVersion} -> ${update.toVersion}: ${update.description}`\n );\n await update.apply(options);\n await this.setDatabaseVersion(options.databaseOptions, update.toVersion);\n this.logger.info(\n `Aggiornamento accessi ${update.toVersion} completato in ${(performance.now() - stepStartedAt).toFixed(2)} ms`\n );\n }\n\n this.logger.info(\n `Verifica/aggiornamento database accessi completato in ${(performance.now() - startedAt).toFixed(2)} ms`\n );\n }\n\n static async getCurrentVersion(options: AccessiOptions): Promise<string | null> {\n return await this.getDatabaseVersion(options.databaseOptions);\n }\n\n static getLatestVersion(): string {\n return this.updates[this.updates.length - 1]?.toVersion ?? \"0.0.0\";\n }\n\n private static async ensureColumn(\n options: AccessiOptions,\n tableName: string,\n columnDefinition: string,\n columnName: string,\n comment?: string\n ): Promise<boolean> {\n const exists = await this.columnExists(\n options.databaseOptions,\n tableName,\n columnName\n );\n\n if (!exists) {\n await Orm.execute(\n options.databaseOptions,\n `ALTER TABLE ${tableName} ADD ${columnDefinition}`\n );\n }\n\n if (comment) {\n await Orm.execute(\n options.databaseOptions,\n `COMMENT ON COLUMN ${tableName}.${columnName} IS '${comment.replace(/'/g, \"''\")}'`\n );\n }\n\n return !exists;\n }\n\n private static async upsertFiltroTipo(\n options: AccessiOptions,\n tipfil: number,\n desfil: string,\n fldfil: string,\n flgEnabled?: number\n ): Promise<void> {\n const hasEnabledColumn = await this.columnExists(\n options.databaseOptions,\n \"FILTRI_TIPO\",\n \"FLGENABLED\"\n );\n\n const existing = await Orm.query(\n options.databaseOptions,\n \"SELECT TIPFIL FROM FILTRI_TIPO WHERE TIPFIL = ?\",\n [tipfil]\n );\n\n if (existing.length === 0) {\n if (hasEnabledColumn && flgEnabled !== undefined) {\n await Orm.execute(\n options.databaseOptions,\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL, FLGENABLED) VALUES (?, ?, ?, ?)\",\n [tipfil, desfil, fldfil, flgEnabled]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n \"INSERT INTO FILTRI_TIPO (TIPFIL, DESFIL, FLDFIL) VALUES (?, ?, ?)\",\n [tipfil, desfil, fldfil]\n );\n return;\n }\n\n if (hasEnabledColumn && flgEnabled !== undefined) {\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ?, FLGENABLED = COALESCE(FLGENABLED, ?) WHERE TIPFIL = ?\",\n [desfil, fldfil, flgEnabled, tipfil]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n \"UPDATE FILTRI_TIPO SET DESFIL = ?, FLDFIL = ? WHERE TIPFIL = ?\",\n [desfil, fldfil, tipfil]\n );\n }\n\n private static async upsertMenu(\n options: AccessiOptions,\n menu: {\n CODMNU: string;\n DESMNU: string;\n CODGRP: string;\n FLGENABLED: number;\n ICON: string;\n ORDINE: number;\n CODTIP: string;\n PAGINA: string;\n RIFMENU: string | null;\n }\n ): Promise<void> {\n const existing = await Orm.query(\n options.databaseOptions,\n \"SELECT CODMNU FROM MENU WHERE CODMNU = ?\",\n [menu.CODMNU]\n );\n\n if (existing.length === 0) {\n await Orm.execute(\n options.databaseOptions,\n `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n menu.CODMNU,\n menu.DESMNU,\n menu.CODGRP,\n menu.FLGENABLED,\n menu.ICON,\n menu.ORDINE,\n menu.CODTIP,\n menu.PAGINA,\n menu.RIFMENU,\n ]\n );\n return;\n }\n\n await Orm.execute(\n options.databaseOptions,\n `UPDATE MENU\n SET DESMNU = ?,\n CODGRP = ?,\n FLGENABLED = COALESCE(FLGENABLED, ?),\n ICON = ?,\n ORDINE = ?,\n CODTIP = ?,\n PAGINA = ?,\n RIFMENU = ?\n WHERE CODMNU = ?`,\n [\n menu.DESMNU,\n menu.CODGRP,\n menu.FLGENABLED,\n menu.ICON,\n menu.ORDINE,\n menu.CODTIP,\n menu.PAGINA,\n menu.RIFMENU,\n menu.CODMNU,\n ]\n );\n }\n}\n"]}
@@ -3,6 +3,7 @@ import { AccessiOptions } from "./AccessiModule";
3
3
  export declare function initializeAccessiModule(app: Application, options: AccessiOptions): Promise<void>;
4
4
  export { AccessiModule } from "./AccessiModule";
5
5
  export { AccessiDatabaseUpdater } from "./database-updates/AccessiDatabaseUpdater";
6
+ export type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from "./AccessiModule";
6
7
  export * from "./Dtos";
7
8
  export { authorizeAccessi, authenticateGen } from "./middleware/authenticateGen";
8
9
  export { accessiRequirement } from "./middleware/accessiRequirements";
@@ -22,39 +22,89 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
22
22
  step((generator = generator.apply(thisArg, _arguments || [])).next());
23
23
  });
24
24
  };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
25
28
  Object.defineProperty(exports, "__esModule", { value: true });
26
29
  exports.accessiRequirement = exports.authenticateGen = exports.authorizeAccessi = exports.AccessiDatabaseUpdater = exports.AccessiModule = void 0;
27
30
  exports.initializeAccessiModule = initializeAccessiModule;
31
+ const express_1 = __importDefault(require("express"));
32
+ const common_1 = require("@nestjs/common");
28
33
  const core_1 = require("@nestjs/core");
29
34
  const platform_express_1 = require("@nestjs/platform-express");
30
35
  const AccessiModule_1 = require("./AccessiModule");
31
36
  const Logger_1 = require("../Logger");
37
+ const AuthService_1 = require("./Services/AuthService/AuthService");
38
+ const SwaggerConfig_1 = require("../swagger/SwaggerConfig");
32
39
  const authenticateGen_1 = require("./middleware/authenticateGen");
40
+ function describeDatabaseTarget(options) {
41
+ var _a, _b, _c, _d;
42
+ const dbOptions = options.databaseOptions;
43
+ return `${(_a = dbOptions.host) !== null && _a !== void 0 ? _a : "?"}:${(_b = dbOptions.port) !== null && _b !== void 0 ? _b : "?"} -> ${(_c = dbOptions.database) !== null && _c !== void 0 ? _c : "?"} as ${(_d = dbOptions.user) !== null && _d !== void 0 ? _d : "?"}`;
44
+ }
33
45
  function initializeAccessiModule(app, options) {
34
46
  return __awaiter(this, void 0, void 0, function* () {
35
47
  const logger = new Logger_1.Logger("initializeAccessiModule");
36
48
  (0, authenticateGen_1.beginAccessiAuthInitialization)();
37
- console.log("Accessi initialized");
49
+ const startedAt = performance.now();
38
50
  try {
39
- // Creiamo un'istanza Express separata per NestJS
40
- const nestExpressInstance = new platform_express_1.ExpressAdapter(app);
41
- // Creiamo l'app NestJS attaccata a Express
51
+ logger.info("Inizializzazione modulo accessi avviata.");
52
+ logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);
53
+ logger.info(`Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`);
54
+ const nestHostApp = (0, express_1.default)();
55
+ const isNestRoute = (path) => path === "/api/accessi" ||
56
+ path.startsWith("/api/accessi/") ||
57
+ path === "/accessi/swagger" ||
58
+ path.startsWith("/accessi/swagger/") ||
59
+ path === "/accessi/swagger-json";
60
+ app.use((req, res, next) => {
61
+ if (!isNestRoute(req.path)) {
62
+ return next();
63
+ }
64
+ return nestHostApp(req, res, next);
65
+ });
66
+ const nestExpressInstance = new platform_express_1.ExpressAdapter(nestHostApp);
42
67
  const nestApp = yield core_1.NestFactory.create(AccessiModule_1.AccessiModule.forRoot(options), nestExpressInstance, {
43
68
  bufferLogs: true
44
69
  });
70
+ logger.info("Applicazione Nest accessi creata.");
45
71
  nestApp.enableCors();
72
+ nestApp.useGlobalPipes(new common_1.ValidationPipe({
73
+ whitelist: true,
74
+ forbidNonWhitelisted: true,
75
+ transform: true,
76
+ transformOptions: {
77
+ enableImplicitConversion: true,
78
+ },
79
+ }));
46
80
  nestApp.setGlobalPrefix('api', {
47
81
  exclude: ['/swagger', '/swagger/(.*)']
48
82
  });
49
- // Note: Swagger setup is now handled by the unified module
83
+ (0, SwaggerConfig_1.setupSwagger)(nestApp, {
84
+ swaggerPath: "accessi/swagger",
85
+ title: "Accessi API Documentation",
86
+ description: "API del modulo accessi",
87
+ });
88
+ logger.info("Avvio init del modulo accessi.");
50
89
  yield nestApp.init();
51
- const authService = nestApp.get(authenticateGen_1.AuthenticateGenService);
52
- app.locals.accessiAuthService = authService;
53
- (0, authenticateGen_1.setAccessiAuthService)(authService);
90
+ logger.info("Init del modulo accessi completata.");
91
+ if (options.legacyPasswordMigrationOnStartup !== false) {
92
+ logger.info("Avvio migrazione password legacy accessi.");
93
+ const passwordMigrationService = nestApp.get(AuthService_1.AuthService);
94
+ yield passwordMigrationService.migrateLegacyEncryptedPasswords();
95
+ logger.info("Migrazione password legacy accessi completata.");
96
+ }
97
+ const accessiAuthService = nestApp.get(authenticateGen_1.AuthenticateGenService);
98
+ app.locals.accessiAuthService = accessiAuthService;
99
+ (0, authenticateGen_1.setAccessiAuthService)(accessiAuthService);
100
+ const elapsedMs = performance.now() - startedAt;
101
+ logger.info(`Accessi initialized. Tempo totale bootstrap: ${elapsedMs.toFixed(2)} ms`);
54
102
  }
55
103
  catch (error) {
56
104
  (0, authenticateGen_1.failAccessiAuthInitialization)(error);
57
- logger.error("Errore in initialize AccessiModule:", error);
105
+ logger.error("Errore in initialize AccessiModule:", error instanceof Error
106
+ ? { name: error.name, message: error.message, stack: error.stack }
107
+ : { error: String(error) });
58
108
  throw error;
59
109
  }
60
110
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessi-module/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,0DA+BC;AA1CD,uCAA2C;AAC3C,+DAA0D;AAC1D,mDAAgE;AAChE,sCAAmC;AACnC,kEAKsC;AAEtC,SAAsB,uBAAuB,CAAC,GAAgB,EAAE,OAAuB;;QACnF,MAAM,MAAM,GAAW,IAAI,eAAM,CAAC,yBAAyB,CAAC,CAAC;QAC7D,IAAA,gDAA8B,GAAE,CAAC;QAEjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,IAAI,CAAC;YACD,iDAAiD;YACjD,MAAM,mBAAmB,GAAG,IAAI,iCAAc,CAAC,GAAG,CAAC,CAAC;YAEpD,2CAA2C;YAC3C,MAAM,OAAO,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,6BAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE;gBAC1F,UAAU,EAAE,IAAI;aACnB,CAAC,CAAC;YAEH,OAAO,CAAC,UAAU,EAAE,CAAC;YAErB,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE;gBAC3B,OAAO,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC;aACzC,CAAC,CAAC;YAEH,2DAA2D;YAC3D,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,wCAAsB,CAAC,CAAC;YACxD,GAAG,CAAC,MAAM,CAAC,kBAAkB,GAAG,WAAW,CAAC;YAC5C,IAAA,uCAAqB,EAAC,WAAW,CAAC,CAAC;QAEvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAA,+CAA6B,EAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CAAA;AAED,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,oFAAmF;AAA1E,gIAAA,sBAAsB,OAAA;AAC/B,yCAAuB;AACvB,gEAGsC;AAFlC,mHAAA,gBAAgB,OAAA;AAChB,kHAAA,eAAe,OAAA;AAEnB,wEAAsE;AAA7D,yHAAA,kBAAkB,OAAA","sourcesContent":["import { Application } from \"express\";\nimport { NestFactory } from \"@nestjs/core\";\nimport { ExpressAdapter } from \"@nestjs/platform-express\";\nimport { AccessiModule, AccessiOptions } from \"./AccessiModule\";\nimport { Logger } from \"../Logger\";\nimport {\n beginAccessiAuthInitialization,\n failAccessiAuthInitialization,\n AuthenticateGenService,\n setAccessiAuthService\n} from \"./middleware/authenticateGen\";\n\nexport async function initializeAccessiModule(app: Application, options: AccessiOptions) {\n const logger: Logger = new Logger(\"initializeAccessiModule\");\n beginAccessiAuthInitialization();\n\n console.log(\"Accessi initialized\");\n try {\n // Creiamo un'istanza Express separata per NestJS\n const nestExpressInstance = new ExpressAdapter(app);\n\n // Creiamo l'app NestJS attaccata a Express\n const nestApp = await NestFactory.create(AccessiModule.forRoot(options), nestExpressInstance, {\n bufferLogs: true\n });\n\n nestApp.enableCors();\n\n nestApp.setGlobalPrefix('api', {\n exclude: ['/swagger', '/swagger/(.*)']\n });\n\n // Note: Swagger setup is now handled by the unified module\n await nestApp.init();\n const authService = nestApp.get(AuthenticateGenService);\n app.locals.accessiAuthService = authService;\n setAccessiAuthService(authService);\n\n } catch (error) {\n failAccessiAuthInitialization(error);\n logger.error(\"Errore in initialize AccessiModule:\", error);\n throw error;\n }\n}\n\nexport { AccessiModule } from \"./AccessiModule\";\nexport { AccessiDatabaseUpdater } from \"./database-updates/AccessiDatabaseUpdater\";\nexport * from \"./Dtos\";\nexport {\n authorizeAccessi,\n authenticateGen\n} from \"./middleware/authenticateGen\";\nexport { accessiRequirement } from \"./middleware/accessiRequirements\";\nexport type {\n AccessiAuthorizationOptions,\n AccessiRequirementNode,\n AccessiCustomRequirementContext,\n AccessiCustomRequirementHandler\n} from \"./middleware/accessiRequirements\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accessi-module/index.ts"],"names":[],"mappings":"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","sourcesContent":["import express, { Application, Request } from \"express\";\nimport { ValidationPipe } from \"@nestjs/common\";\nimport { NestFactory } from \"@nestjs/core\";\nimport { ExpressAdapter } from \"@nestjs/platform-express\";\nimport { AccessiModule, AccessiOptions } from \"./AccessiModule\";\nimport { Logger } from \"../Logger\";\nimport { AuthService } from \"./Services/AuthService/AuthService\";\nimport { setupSwagger } from \"../swagger/SwaggerConfig\";\nimport {\n beginAccessiAuthInitialization,\n failAccessiAuthInitialization,\n AuthenticateGenService,\n setAccessiAuthService\n} from \"./middleware/authenticateGen\";\n\nfunction describeDatabaseTarget(options: AccessiOptions): string {\n const dbOptions = options.databaseOptions as {\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n };\n\n return `${dbOptions.host ?? \"?\"}:${dbOptions.port ?? \"?\"} -> ${dbOptions.database ?? \"?\"} as ${dbOptions.user ?? \"?\"}`;\n}\n\nexport async function initializeAccessiModule(app: Application, options: AccessiOptions) {\n const logger: Logger = new Logger(\"initializeAccessiModule\");\n beginAccessiAuthInitialization();\n const startedAt = performance.now();\n\n try {\n logger.info(\"Inizializzazione modulo accessi avviata.\");\n logger.info(`Target database accessi: ${describeDatabaseTarget(options)}`);\n logger.info(\n `Configurazione accessi: autoUpdateDatabase=${options.autoUpdateDatabase !== false}, legacyPasswordMigrationOnStartup=${options.legacyPasswordMigrationOnStartup !== false}`\n );\n const nestHostApp = express();\n const isNestRoute = (path: string) =>\n path === \"/api/accessi\" ||\n path.startsWith(\"/api/accessi/\") ||\n path === \"/accessi/swagger\" ||\n path.startsWith(\"/accessi/swagger/\") ||\n path === \"/accessi/swagger-json\";\n\n app.use((req: Request, res, next) => {\n if (!isNestRoute(req.path)) {\n return next();\n }\n\n return nestHostApp(req, res, next);\n });\n\n const nestExpressInstance = new ExpressAdapter(nestHostApp);\n\n const nestApp = await NestFactory.create(AccessiModule.forRoot(options), nestExpressInstance, {\n bufferLogs: true\n });\n logger.info(\"Applicazione Nest accessi creata.\");\n\n nestApp.enableCors();\n nestApp.useGlobalPipes(\n new ValidationPipe({\n whitelist: true,\n forbidNonWhitelisted: true,\n transform: true,\n transformOptions: {\n enableImplicitConversion: true,\n },\n }),\n );\n\n nestApp.setGlobalPrefix('api', {\n exclude: ['/swagger', '/swagger/(.*)']\n });\n\n setupSwagger(nestApp, {\n swaggerPath: \"accessi/swagger\",\n title: \"Accessi API Documentation\",\n description: \"API del modulo accessi\",\n });\n logger.info(\"Avvio init del modulo accessi.\");\n await nestApp.init();\n logger.info(\"Init del modulo accessi completata.\");\n if (options.legacyPasswordMigrationOnStartup !== false) {\n logger.info(\"Avvio migrazione password legacy accessi.\");\n const passwordMigrationService = nestApp.get(AuthService);\n await passwordMigrationService.migrateLegacyEncryptedPasswords();\n logger.info(\"Migrazione password legacy accessi completata.\");\n }\n\n const accessiAuthService = nestApp.get(AuthenticateGenService);\n app.locals.accessiAuthService = accessiAuthService;\n setAccessiAuthService(accessiAuthService);\n const elapsedMs = performance.now() - startedAt;\n logger.info(`Accessi initialized. Tempo totale bootstrap: ${elapsedMs.toFixed(2)} ms`);\n\n } catch (error) {\n failAccessiAuthInitialization(error);\n logger.error(\n \"Errore in initialize AccessiModule:\",\n error instanceof Error\n ? { name: error.name, message: error.message, stack: error.stack }\n : { error: String(error) }\n );\n throw error;\n }\n}\n\nexport { AccessiModule } from \"./AccessiModule\";\nexport { AccessiDatabaseUpdater } from \"./database-updates/AccessiDatabaseUpdater\";\nexport type { AccessiOptions, EmailOptions, JwtOptions, ExtensionFieldsOptions, PublicAuthRateLimitOptions, PublicAuthRateLimitRuleOptions } from \"./AccessiModule\";\nexport * from \"./Dtos\";\nexport {\n authorizeAccessi,\n authenticateGen\n} from \"./middleware/authenticateGen\";\nexport { accessiRequirement } from \"./middleware/accessiRequirements\";\nexport type {\n AccessiAuthorizationOptions,\n AccessiRequirementNode,\n AccessiCustomRequirementContext,\n AccessiCustomRequirementHandler\n} from \"./middleware/accessiRequirements\";\n"]}
@@ -1,7 +1,9 @@
1
1
  import { CanActivate, ExecutionContext } from '@nestjs/common';
2
2
  import { AccessiOptions } from '../AccessiModule';
3
+ import { UserService } from '../Services/UserService/UserService';
3
4
  export declare class JwtSimpleGuard implements CanActivate {
4
5
  private readonly accessiOptions;
5
- constructor(accessiOptions: AccessiOptions);
6
- canActivate(context: ExecutionContext): boolean;
6
+ private readonly userService;
7
+ constructor(accessiOptions: AccessiOptions, userService: UserService);
8
+ canActivate(context: ExecutionContext): Promise<boolean>;
7
9
  }
@@ -44,38 +44,66 @@ var __metadata = (this && this.__metadata) || function (k, v) {
44
44
  var __param = (this && this.__param) || function (paramIndex, decorator) {
45
45
  return function (target, key) { decorator(target, key, paramIndex); }
46
46
  };
47
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
48
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
49
+ return new (P || (P = Promise))(function (resolve, reject) {
50
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
51
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
52
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
53
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
54
+ });
55
+ };
47
56
  Object.defineProperty(exports, "__esModule", { value: true });
48
57
  exports.JwtSimpleGuard = void 0;
49
58
  const common_1 = require("@nestjs/common");
50
59
  const jwt = __importStar(require("jsonwebtoken"));
60
+ const UserService_1 = require("../Services/UserService/UserService");
61
+ const authenticatedToken_1 = require("../security/authenticatedToken");
51
62
  let JwtSimpleGuard = class JwtSimpleGuard {
52
- constructor(accessiOptions) {
63
+ constructor(accessiOptions, userService) {
53
64
  this.accessiOptions = accessiOptions;
65
+ this.userService = userService;
54
66
  }
55
67
  canActivate(context) {
56
- var _a, _b;
57
- const request = context.switchToHttp().getRequest();
58
- const authHeader = request.headers['authorization'];
59
- if (!authHeader)
60
- throw new common_1.UnauthorizedException('Token mancante.');
61
- const token = authHeader.split(' ')[1];
62
- if (!token)
63
- throw new common_1.UnauthorizedException('Formato token non valido.');
64
- try {
65
- const secret = ((_b = (_a = this.accessiOptions) === null || _a === void 0 ? void 0 : _a.jwtOptions) === null || _b === void 0 ? void 0 : _b.secret) || process.env.ACC_JWT_SECRET || 'super-secret';
66
- const payload = jwt.verify(token, secret);
67
- request.user = payload;
68
- return true;
69
- }
70
- catch (error) {
71
- throw new common_1.UnauthorizedException('Token non valido o scaduto.');
72
- }
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ var _a, _b;
70
+ const request = context.switchToHttp().getRequest();
71
+ const authHeader = request.headers['authorization'];
72
+ if (!authHeader)
73
+ throw new common_1.UnauthorizedException('Token mancante.');
74
+ const token = authHeader.split(' ')[1];
75
+ if (!token)
76
+ throw new common_1.UnauthorizedException('Formato token non valido.');
77
+ try {
78
+ const secret = ((_b = (_a = this.accessiOptions) === null || _a === void 0 ? void 0 : _a.jwtOptions) === null || _b === void 0 ? void 0 : _b.secret) || process.env.ACC_JWT_SECRET;
79
+ if (!secret) {
80
+ throw new common_1.InternalServerErrorException('JWT secret non configurato.');
81
+ }
82
+ const payload = jwt.verify(token, secret);
83
+ const codiceUtente = (0, authenticatedToken_1.resolveCodiceUtenteFromTokenPayload)(payload);
84
+ if (!codiceUtente) {
85
+ throw new common_1.UnauthorizedException('Token privo di un utente valido.');
86
+ }
87
+ const currentUser = yield this.userService.getAuthenticatedUserSnapshot(codiceUtente);
88
+ if (!(0, authenticatedToken_1.isAuthenticatedUserEnabledForJwt)(currentUser)) {
89
+ throw new common_1.UnauthorizedException('Utente non piu autorizzato.');
90
+ }
91
+ request.user = (0, authenticatedToken_1.buildAuthenticatedTokenPayload)(payload, currentUser);
92
+ return true;
93
+ }
94
+ catch (error) {
95
+ if (error instanceof common_1.InternalServerErrorException || error instanceof common_1.UnauthorizedException) {
96
+ throw error;
97
+ }
98
+ throw new common_1.UnauthorizedException('Token non valido o scaduto.');
99
+ }
100
+ });
73
101
  }
74
102
  };
75
103
  exports.JwtSimpleGuard = JwtSimpleGuard;
76
104
  exports.JwtSimpleGuard = JwtSimpleGuard = __decorate([
77
105
  (0, common_1.Injectable)(),
78
106
  __param(0, (0, common_1.Inject)('ACCESSI_OPTIONS')),
79
- __metadata("design:paramtypes", [Object])
107
+ __metadata("design:paramtypes", [Object, UserService_1.UserService])
80
108
  ], JwtSimpleGuard);
81
109
  //# sourceMappingURL=jwt.strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/accessi-module/jwt/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA0G;AAC1G,kDAAoC;AAI7B,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAAwD,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE1F,WAAW,CAAC,OAAyB;;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;QAEzE,IAAI,CAAC;YACH,MAAM,MAAM,GACV,CAAA,MAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,UAAU,0CAAE,MAAM,KAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,cAAc,CAAC;YAC1F,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF,CAAA;AAtBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;;GAD3B,cAAc,CAsB1B","sourcesContent":["import { CanActivate, ExecutionContext, Inject, Injectable, UnauthorizedException } from '@nestjs/common';\nimport * as jwt from 'jsonwebtoken';\nimport { AccessiOptions } from '../AccessiModule';\n\n@Injectable()\nexport class JwtSimpleGuard implements CanActivate {\n constructor(@Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions) {}\n\n canActivate(context: ExecutionContext): boolean {\n const request = context.switchToHttp().getRequest();\n\n const authHeader = request.headers['authorization'];\n if (!authHeader) throw new UnauthorizedException('Token mancante.');\n\n const token = authHeader.split(' ')[1];\n if (!token) throw new UnauthorizedException('Formato token non valido.');\n\n try {\n const secret =\n this.accessiOptions?.jwtOptions?.secret || process.env.ACC_JWT_SECRET || 'super-secret';\n const payload = jwt.verify(token, secret);\n request.user = payload;\n return true;\n } catch (error) {\n throw new UnauthorizedException('Token non valido o scaduto.');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../../src/accessi-module/jwt/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,kDAAoC;AAEpC,qEAAkE;AAClE,uEAIwC;AAGjC,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAC8C,cAA8B,EACzD,WAAwB;QADG,mBAAc,GAAd,cAAc,CAAgB;QACzD,gBAAW,GAAX,WAAW,CAAa;IACxC,CAAC;IAEE,WAAW,CAAC,OAAyB;;;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,8BAAqB,CAAC,iBAAiB,CAAC,CAAC;YAEpE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;YAEzE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,CAAA,MAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,UAAU,0CAAE,MAAM,KAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;gBACrF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,qCAA4B,CAAC,6BAA6B,CAAC,CAAC;gBACxE,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,YAAY,GAAG,IAAA,wDAAmC,EAAC,OAAO,CAAC,CAAC;gBAClE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,8BAAqB,CAAC,kCAAkC,CAAC,CAAC;gBACtE,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;gBACtF,IAAI,CAAC,IAAA,qDAAgC,EAAC,WAAW,CAAC,EAAE,CAAC;oBACnD,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;gBACjE,CAAC;gBAED,OAAO,CAAC,IAAI,GAAG,IAAA,mDAA8B,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,qCAA4B,IAAI,KAAK,YAAY,8BAAqB,EAAE,CAAC;oBAC5F,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;KAAA;CACF,CAAA;AAxCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;6CACI,yBAAW;GAHhC,cAAc,CAwC1B","sourcesContent":["import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n InternalServerErrorException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport * as jwt from 'jsonwebtoken';\nimport { AccessiOptions } from '../AccessiModule';\nimport { UserService } from '../Services/UserService/UserService';\nimport {\n buildAuthenticatedTokenPayload,\n isAuthenticatedUserEnabledForJwt,\n resolveCodiceUtenteFromTokenPayload,\n} from '../security/authenticatedToken';\n\n@Injectable()\nexport class JwtSimpleGuard implements CanActivate {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n private readonly userService: UserService,\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request = context.switchToHttp().getRequest();\n\n const authHeader = request.headers['authorization'];\n if (!authHeader) throw new UnauthorizedException('Token mancante.');\n\n const token = authHeader.split(' ')[1];\n if (!token) throw new UnauthorizedException('Formato token non valido.');\n\n try {\n const secret = this.accessiOptions?.jwtOptions?.secret || process.env.ACC_JWT_SECRET;\n if (!secret) {\n throw new InternalServerErrorException('JWT secret non configurato.');\n }\n const payload = jwt.verify(token, secret);\n const codiceUtente = resolveCodiceUtenteFromTokenPayload(payload);\n if (!codiceUtente) {\n throw new UnauthorizedException('Token privo di un utente valido.');\n }\n\n const currentUser = await this.userService.getAuthenticatedUserSnapshot(codiceUtente);\n if (!isAuthenticatedUserEnabledForJwt(currentUser)) {\n throw new UnauthorizedException('Utente non piu autorizzato.');\n }\n\n request.user = buildAuthenticatedTokenPayload(payload, currentUser);\n return true;\n } catch (error) {\n if (error instanceof InternalServerErrorException || error instanceof UnauthorizedException) {\n throw error;\n }\n throw new UnauthorizedException('Token non valido o scaduto.');\n }\n }\n}\n"]}
@@ -1,11 +1,13 @@
1
1
  import { NextFunction, Request, Response } from "express";
2
2
  import { AccessiOptions } from "../AccessiModule";
3
3
  import { PermissionService } from "../Services/PermissionService/PermissionService";
4
+ import { UserService } from "../Services/UserService/UserService";
4
5
  import { AccessiAuthorizationOptions } from "./accessiRequirements";
5
6
  export declare class AuthenticateGenService {
6
7
  private readonly accessiOptions;
7
8
  private readonly permissionService;
8
- constructor(accessiOptions: AccessiOptions, permissionService: PermissionService);
9
+ private readonly userService;
10
+ constructor(accessiOptions: AccessiOptions, permissionService: PermissionService, userService: UserService);
9
11
  authorize(req: Request, res: Response, next: NextFunction, options?: AccessiAuthorizationOptions): Promise<void | Response<any, Record<string, any>>>;
10
12
  }
11
13
  export declare function beginAccessiAuthInitialization(): void;
@@ -62,8 +62,10 @@ exports.authorizeAccessi = authorizeAccessi;
62
62
  const jwt = __importStar(require("jsonwebtoken"));
63
63
  const common_1 = require("@nestjs/common");
64
64
  const PermissionService_1 = require("../Services/PermissionService/PermissionService");
65
+ const UserService_1 = require("../Services/UserService/UserService");
65
66
  const Logger_1 = require("../../Logger");
66
67
  const accessiRequirements_1 = require("./accessiRequirements");
68
+ const authenticatedToken_1 = require("../security/authenticatedToken");
67
69
  const logger = new Logger_1.Logger("AuthenticateGen");
68
70
  const ACCESSI_AUTH_SERVICE_LOCALS_KEY = "accessiAuthService";
69
71
  const ACCESSI_AUTH_SERVICE_GLOBAL_KEY = Symbol.for("emilsoftware.accessiAuthService");
@@ -77,10 +79,6 @@ class AuthMiddlewareError extends Error {
77
79
  this.name = "AuthMiddlewareError";
78
80
  }
79
81
  }
80
- function resolveCodiceUtente(decoded) {
81
- var _a, _b, _c, _d, _e;
82
- return ((_e = (_c = (_b = (_a = decoded === null || decoded === void 0 ? void 0 : decoded.userData) === null || _a === void 0 ? void 0 : _a.utente) === null || _b === void 0 ? void 0 : _b.codiceUtente) !== null && _c !== void 0 ? _c : (_d = decoded === null || decoded === void 0 ? void 0 : decoded.utente) === null || _d === void 0 ? void 0 : _d.codiceUtente) !== null && _e !== void 0 ? _e : decoded === null || decoded === void 0 ? void 0 : decoded.codiceUtente);
83
- }
84
82
  function authError(status, code, message, details) {
85
83
  return new AuthMiddlewareError(status, code, message, details);
86
84
  }
@@ -114,7 +112,7 @@ function logAuthFailure(req, authErr) {
114
112
  else
115
113
  logger.warning(message);
116
114
  }
117
- function authorizeWithDependencies(req, res, next, options, accessiOptions, permissionService) {
115
+ function authorizeWithDependencies(req, res, next, options, accessiOptions, permissionService, userService) {
118
116
  return __awaiter(this, void 0, void 0, function* () {
119
117
  var _a, _b;
120
118
  try {
@@ -137,10 +135,15 @@ function authorizeWithDependencies(req, res, next, options, accessiOptions, perm
137
135
  catch (_c) {
138
136
  throw authError(401, "AUTH_TOKEN_INVALID", "Invalid JWT token");
139
137
  }
140
- const codiceUtente = resolveCodiceUtente(decoded);
138
+ const codiceUtente = (0, authenticatedToken_1.resolveCodiceUtenteFromTokenPayload)(decoded);
141
139
  if (!codiceUtente) {
142
140
  throw authError(401, "AUTH_USER_CODE_MISSING", "codiceUtente not found in token payload");
143
141
  }
142
+ const currentUser = yield userService.getAuthenticatedUserSnapshot(codiceUtente);
143
+ if (!(0, authenticatedToken_1.isAuthenticatedUserEnabledForJwt)(currentUser)) {
144
+ throw authError(401, "AUTH_USER_DISABLED", "User is no longer authorized");
145
+ }
146
+ const authenticatedPayload = (0, authenticatedToken_1.buildAuthenticatedTokenPayload)(decoded, currentUser);
144
147
  const requirementTree = (0, accessiRequirements_1.buildRequirementTree)(options);
145
148
  if (requirementTree) {
146
149
  if (!(accessiOptions === null || accessiOptions === void 0 ? void 0 : accessiOptions.databaseOptions)) {
@@ -155,7 +158,7 @@ function authorizeWithDependencies(req, res, next, options, accessiOptions, perm
155
158
  });
156
159
  const requirementContext = {
157
160
  req,
158
- decodedToken: decoded,
161
+ decodedToken: authenticatedPayload,
159
162
  userCode: codiceUtente,
160
163
  getGrantsResult,
161
164
  };
@@ -165,7 +168,8 @@ function authorizeWithDependencies(req, res, next, options, accessiOptions, perm
165
168
  }
166
169
  req.userGrants = yield getGrantsResult();
167
170
  }
168
- req.data = decoded;
171
+ req.user = authenticatedPayload;
172
+ req.data = authenticatedPayload;
169
173
  return next();
170
174
  }
171
175
  catch (error) {
@@ -183,13 +187,14 @@ function authorizeWithDependencies(req, res, next, options, accessiOptions, perm
183
187
  });
184
188
  }
185
189
  let AuthenticateGenService = class AuthenticateGenService {
186
- constructor(accessiOptions, permissionService) {
190
+ constructor(accessiOptions, permissionService, userService) {
187
191
  this.accessiOptions = accessiOptions;
188
192
  this.permissionService = permissionService;
193
+ this.userService = userService;
189
194
  }
190
195
  authorize(req, res, next, options) {
191
196
  return __awaiter(this, void 0, void 0, function* () {
192
- return authorizeWithDependencies(req, res, next, options, this.accessiOptions, this.permissionService);
197
+ return authorizeWithDependencies(req, res, next, options, this.accessiOptions, this.permissionService, this.userService);
193
198
  });
194
199
  }
195
200
  };
@@ -197,7 +202,8 @@ exports.AuthenticateGenService = AuthenticateGenService;
197
202
  exports.AuthenticateGenService = AuthenticateGenService = __decorate([
198
203
  (0, common_1.Injectable)(),
199
204
  __param(0, (0, common_1.Inject)("ACCESSI_OPTIONS")),
200
- __metadata("design:paramtypes", [Object, PermissionService_1.PermissionService])
205
+ __metadata("design:paramtypes", [Object, PermissionService_1.PermissionService,
206
+ UserService_1.UserService])
201
207
  ], AuthenticateGenService);
202
208
  let authenticateGenServiceRef = null;
203
209
  let authServiceBootstrapDeferred = null;