emilsoftware-utilities 2.0.0-dev.83 → 2.0.0-dev.85

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 (1234) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +373 -0
  3. package/SECURITY.md +66 -0
  4. package/dist/EmilsoftwareModule.d.ts +1 -1
  5. package/dist/EmilsoftwareModule.js +1 -1
  6. package/dist/EmilsoftwareModule.js.map +1 -1
  7. package/dist/Orm.js +19 -19
  8. package/dist/Orm.js.map +1 -1
  9. package/dist/Utilities.d.ts +1 -1
  10. package/dist/Utilities.js.map +1 -1
  11. package/dist/accessi/client/admin/index.d.ts +4 -4
  12. package/dist/accessi/client/admin/index.js +2 -2
  13. package/dist/accessi/client/admin/index.js.map +1 -1
  14. package/dist/accessi/client/createAccessiClient.d.ts +1 -1
  15. package/dist/accessi/client/createAccessiClient.js +1 -1
  16. package/dist/accessi/client/createAccessiClient.js.map +1 -1
  17. package/dist/accessi/client/generated/admin.d.ts +1 -1
  18. package/dist/accessi/client/generated/admin.js +1 -1
  19. package/dist/accessi/client/generated/admin.js.map +1 -1
  20. package/dist/accessi/client/generated/public.d.ts +1 -1
  21. package/dist/accessi/client/generated/public.js +1 -1
  22. package/dist/accessi/client/generated/public.js.map +1 -1
  23. package/dist/accessi/client/generated/service.d.ts +1 -1
  24. package/dist/accessi/client/generated/service.js +1 -1
  25. package/dist/accessi/client/generated/service.js.map +1 -1
  26. package/dist/accessi/client/index.d.ts +7 -7
  27. package/dist/accessi/client/index.js +6 -6
  28. package/dist/accessi/client/index.js.map +1 -1
  29. package/dist/accessi/client/public/index.d.ts +4 -4
  30. package/dist/accessi/client/public/index.js +2 -2
  31. package/dist/accessi/client/public/index.js.map +1 -1
  32. package/dist/accessi/client/service/index.d.ts +4 -4
  33. package/dist/accessi/client/service/index.js +2 -2
  34. package/dist/accessi/client/service/index.js.map +1 -1
  35. package/dist/accessi/contracts/dtos.d.ts +1 -1
  36. package/dist/accessi/contracts/dtos.js +1 -1
  37. package/dist/accessi/contracts/dtos.js.map +1 -1
  38. package/dist/accessi/contracts/index.d.ts +6 -6
  39. package/dist/accessi/contracts/index.js +4 -4
  40. package/dist/accessi/contracts/index.js.map +1 -1
  41. package/dist/accessi/resource-server/core.d.ts +13 -0
  42. package/dist/accessi/resource-server/core.js +17 -0
  43. package/dist/accessi/resource-server/core.js.map +1 -1
  44. package/dist/accessi/resource-server/express.js +1 -1
  45. package/dist/accessi/resource-server/express.js.map +1 -1
  46. package/dist/accessi/resource-server/nest.js +1 -1
  47. package/dist/accessi/resource-server/nest.js.map +1 -1
  48. package/dist/accessi/resource-server/token.js +1 -1
  49. package/dist/accessi/resource-server/token.js.map +1 -1
  50. package/dist/accessi/resource-server/types.d.ts +3 -3
  51. package/dist/accessi/resource-server/types.js.map +1 -1
  52. package/dist/accessi/server/index.d.ts +6 -3
  53. package/dist/accessi/server/index.js +8 -3
  54. package/dist/accessi/server/index.js.map +1 -1
  55. package/dist/accessi/server/standalone.d.ts +4 -4
  56. package/dist/accessi/server/standalone.js +6 -6
  57. package/dist/accessi/server/standalone.js.map +1 -1
  58. package/dist/accessi/server/tenantRouter.d.ts +35 -0
  59. package/dist/accessi/server/tenantRouter.js +71 -0
  60. package/dist/accessi/server/tenantRouter.js.map +1 -0
  61. package/dist/accessi/server/tenantStores.d.ts +6 -6
  62. package/dist/accessi/server/tenantStores.js +5 -5
  63. package/dist/accessi/server/tenantStores.js.map +1 -1
  64. package/dist/accessi/server/tenants.d.ts +8 -8
  65. package/dist/accessi/server/tenants.js +1 -1
  66. package/dist/accessi/server/tenants.js.map +1 -1
  67. package/dist/accessi-service/AccessiModule.js +120 -0
  68. package/dist/accessi-service/AccessiModule.js.map +1 -0
  69. package/dist/accessi-service/accessiRuntime.d.ts +45 -0
  70. package/dist/accessi-service/accessiRuntime.js +39 -0
  71. package/dist/accessi-service/accessiRuntime.js.map +1 -0
  72. package/dist/accessi-service/console/accessiFetch.js.map +1 -0
  73. package/dist/accessi-service/console/console.js +4875 -0
  74. package/dist/accessi-service/console/console.js.map +1 -0
  75. package/dist/accessi-service/console/generated/emilsoftware-utilities.js.map +1 -0
  76. package/dist/accessi-service/console/generated/model/abilitazioneMenu.js.map +1 -0
  77. package/dist/accessi-service/console/generated/model/abilitazioneMenuTipoAbilitazione.js.map +1 -0
  78. package/dist/accessi-service/console/generated/model/accessiIntrospectionResultDto.js.map +1 -0
  79. package/dist/accessi-service/console/generated/model/actionResponse.js.map +1 -0
  80. package/dist/accessi-service/console/generated/model/adminBootstrapStatusResponse.js.map +1 -0
  81. package/dist/accessi-service/console/generated/model/adminBootstrapStatusResult.js.map +1 -0
  82. package/dist/accessi-service/console/generated/model/assignPermissionsToUserRequest.js.map +1 -0
  83. package/dist/accessi-service/console/generated/model/assignRolesToUserRequest.js.map +1 -0
  84. package/dist/accessi-service/console/generated/model/authenticatedTokenPayloadDto.js.map +1 -0
  85. package/dist/accessi-service/console/generated/model/authenticatedUserPayloadDto.js.map +1 -0
  86. package/dist/accessi-service/console/generated/model/bootstrapAdminRequest.js.map +1 -0
  87. package/dist/accessi-service/console/generated/model/bootstrapAdminResponse.js.map +1 -0
  88. package/dist/accessi-service/console/generated/model/bootstrapAdminResultDto.js.map +1 -0
  89. package/dist/accessi-service/console/generated/model/confirmResetPasswordRequest.js.map +1 -0
  90. package/dist/accessi-service/console/generated/model/consoleEntryExchangeRequest.js.map +1 -0
  91. package/dist/accessi-service/console/generated/model/consoleEntrySessionResponse.js.map +1 -0
  92. package/dist/accessi-service/console/generated/model/consoleEntrySessionResult.js.map +1 -0
  93. package/dist/accessi-service/console/generated/model/consoleEntryTicketResponse.js.map +1 -0
  94. package/dist/accessi-service/console/generated/model/consoleEntryTicketResult.js.map +1 -0
  95. package/dist/accessi-service/console/generated/model/consoleEntryTokenResult.js.map +1 -0
  96. package/dist/accessi-service/console/generated/model/createFederatedIdentityRequest.js.map +1 -0
  97. package/dist/accessi-service/console/generated/model/createFederatedProviderRequest.js.map +1 -0
  98. package/dist/accessi-service/console/generated/model/createFederatedUserRequest.js.map +1 -0
  99. package/dist/accessi-service/console/generated/model/createFilterTypeRequest.js.map +1 -0
  100. package/dist/accessi-service/console/generated/model/createFilterTypeRequestFlgEnabled.js.map +1 -0
  101. package/dist/accessi-service/console/generated/model/createMenuGroupRequest.js.map +1 -0
  102. package/dist/accessi-service/console/generated/model/createMenuRequest.js.map +1 -0
  103. package/dist/accessi-service/console/generated/model/createMenuTypeRequest.js.map +1 -0
  104. package/dist/accessi-service/console/generated/model/createScopeRequest.js.map +1 -0
  105. package/dist/accessi-service/console/generated/model/createServiceTokenRequest.js.map +1 -0
  106. package/dist/accessi-service/console/generated/model/createServiceTokenResponse.js.map +1 -0
  107. package/dist/accessi-service/console/generated/model/errorResponse.js.map +1 -0
  108. package/dist/accessi-service/console/generated/model/exchangeFederatedIdentityRequest.js.map +1 -0
  109. package/dist/accessi-service/console/generated/model/exportAuditOrder.js.map +1 -0
  110. package/dist/accessi-service/console/generated/model/exportAuditParams.js.map +1 -0
  111. package/dist/accessi-service/console/generated/model/federatedAuthenticationResultDto.js.map +1 -0
  112. package/dist/accessi-service/console/generated/model/federatedExchangeResponse.js.map +1 -0
  113. package/dist/accessi-service/console/generated/model/federatedIdentityListResponse.js.map +1 -0
  114. package/dist/accessi-service/console/generated/model/federatedIdentityResponse.js.map +1 -0
  115. package/dist/accessi-service/console/generated/model/federatedIdentityResponseDto.js.map +1 -0
  116. package/dist/accessi-service/console/generated/model/federatedProviderListResponse.js.map +1 -0
  117. package/dist/accessi-service/console/generated/model/federatedProviderResponse.js.map +1 -0
  118. package/dist/accessi-service/console/generated/model/federatedProviderResponseDto.js.map +1 -0
  119. package/dist/accessi-service/console/generated/model/filtriUtente.js.map +1 -0
  120. package/dist/accessi-service/console/generated/model/getFiltriResponse.js.map +1 -0
  121. package/dist/accessi-service/console/generated/model/getFiltriUtenteParams.js.map +1 -0
  122. package/dist/accessi-service/console/generated/model/getFiltriUtenteResponse.js.map +1 -0
  123. package/dist/accessi-service/console/generated/model/getGroupsWithMenusParams.js.map +1 -0
  124. package/dist/accessi-service/console/generated/model/getGroupsWithMenusResponse.js.map +1 -0
  125. package/dist/accessi-service/console/generated/model/getMenuScopesResponse.js.map +1 -0
  126. package/dist/accessi-service/console/generated/model/getMenuTypesResponse.js.map +1 -0
  127. package/dist/accessi-service/console/generated/model/getMenusParams.js.map +1 -0
  128. package/dist/accessi-service/console/generated/model/getMenusResponse.js.map +1 -0
  129. package/dist/accessi-service/console/generated/model/getRolesResponse.js.map +1 -0
  130. package/dist/accessi-service/console/generated/model/getSchemaResponse.js.map +1 -0
  131. package/dist/accessi-service/console/generated/model/getScopesResponse.js.map +1 -0
  132. package/dist/accessi-service/console/generated/model/getServiceTokensParams.js.map +1 -0
  133. package/dist/accessi-service/console/generated/model/getServiceTokensResponse.js.map +1 -0
  134. package/dist/accessi-service/console/generated/model/getUserByTokenRequest.js.map +1 -0
  135. package/dist/accessi-service/console/generated/model/getUserByTokenResponse.js.map +1 -0
  136. package/dist/accessi-service/console/generated/model/getUserRolesAndGrantsParams.js.map +1 -0
  137. package/dist/accessi-service/console/generated/model/getUsersParams.js.map +1 -0
  138. package/dist/accessi-service/console/generated/model/getUsersResponse.js.map +1 -0
  139. package/dist/accessi-service/console/generated/model/getUsersResult.js.map +1 -0
  140. package/dist/accessi-service/console/generated/model/getUsersResultExtensionFields.js.map +1 -0
  141. package/dist/accessi-service/console/generated/model/groupWithMenusEntity.js.map +1 -0
  142. package/dist/accessi-service/console/generated/model/index.js.map +1 -0
  143. package/dist/accessi-service/console/generated/model/introspectAccessiTokenRequest.js.map +1 -0
  144. package/dist/accessi-service/console/generated/model/introspectAccessiTokenResponse.js.map +1 -0
  145. package/dist/accessi-service/console/generated/model/issuedServiceTokenDto.js.map +1 -0
  146. package/dist/accessi-service/console/generated/model/loginAsRequest.js.map +1 -0
  147. package/dist/accessi-service/console/generated/model/loginAsResponse.js.map +1 -0
  148. package/dist/accessi-service/console/generated/model/loginAsResult.js.map +1 -0
  149. package/dist/accessi-service/console/generated/model/loginRequest.js.map +1 -0
  150. package/dist/accessi-service/console/generated/model/loginResponse.js.map +1 -0
  151. package/dist/accessi-service/console/generated/model/loginResult.js.map +1 -0
  152. package/dist/accessi-service/console/generated/model/loginResultExtensionFields.js.map +1 -0
  153. package/dist/accessi-service/console/generated/model/loginResultPasswordRequired.js.map +1 -0
  154. package/dist/accessi-service/console/generated/model/menuEntity.js.map +1 -0
  155. package/dist/accessi-service/console/generated/model/menuTypeEntity.js.map +1 -0
  156. package/dist/accessi-service/console/generated/model/passwordExpiredResponse.js.map +1 -0
  157. package/dist/accessi-service/console/generated/model/permission.js.map +1 -0
  158. package/dist/accessi-service/console/generated/model/publicRegisterRequest.js.map +1 -0
  159. package/dist/accessi-service/console/generated/model/queryAuditOrder.js.map +1 -0
  160. package/dist/accessi-service/console/generated/model/queryAuditParams.js.map +1 -0
  161. package/dist/accessi-service/console/generated/model/refreshTokenRequest.js.map +1 -0
  162. package/dist/accessi-service/console/generated/model/refreshTokenResponse.js.map +1 -0
  163. package/dist/accessi-service/console/generated/model/refreshTokenResult.js.map +1 -0
  164. package/dist/accessi-service/console/generated/model/registerRequest.js.map +1 -0
  165. package/dist/accessi-service/console/generated/model/registerResponse.js.map +1 -0
  166. package/dist/accessi-service/console/generated/model/resendTwoFactorRequest.js.map +1 -0
  167. package/dist/accessi-service/console/generated/model/revokeTokenRequest.js.map +1 -0
  168. package/dist/accessi-service/console/generated/model/role.js.map +1 -0
  169. package/dist/accessi-service/console/generated/model/ruoliMenu.js.map +1 -0
  170. package/dist/accessi-service/console/generated/model/ruoliMenuTipoAbilitazione.js.map +1 -0
  171. package/dist/accessi-service/console/generated/model/schemaDdlResult.js.map +1 -0
  172. package/dist/accessi-service/console/generated/model/schemaDdlSection.js.map +1 -0
  173. package/dist/accessi-service/console/generated/model/scopeEntity.js.map +1 -0
  174. package/dist/accessi-service/console/generated/model/sendResetPasswordEmailRequest.js.map +1 -0
  175. package/dist/accessi-service/console/generated/model/serveResetPasswordPageParams.js.map +1 -0
  176. package/dist/accessi-service/console/generated/model/serviceTokenDto.js.map +1 -0
  177. package/dist/accessi-service/console/generated/model/setMenuScopesRequest.js.map +1 -0
  178. package/dist/accessi-service/console/generated/model/setPasswordLoginPolicyRequest.js.map +1 -0
  179. package/dist/accessi-service/console/generated/model/setScopeMenusRequest.js.map +1 -0
  180. package/dist/accessi-service/console/generated/model/setStatoRegistrazioneDto.js.map +1 -0
  181. package/dist/accessi-service/console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js.map +1 -0
  182. package/dist/accessi-service/console/generated/model/setUserPasswordRequest.js.map +1 -0
  183. package/dist/accessi-service/console/generated/model/status.js.map +1 -0
  184. package/dist/accessi-service/console/generated/model/tipoFiltro.js.map +1 -0
  185. package/dist/accessi-service/console/generated/model/tipoFiltroFlgEnabled.js.map +1 -0
  186. package/dist/accessi-service/console/generated/model/tokenResult.js.map +1 -0
  187. package/dist/accessi-service/console/generated/model/tokenResultType.js.map +1 -0
  188. package/dist/accessi-service/console/generated/model/twoFactorChallengeDto.js.map +1 -0
  189. package/dist/accessi-service/console/generated/model/twoFactorChallengeDtoMethod.js.map +1 -0
  190. package/dist/accessi-service/console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js.map +1 -0
  191. package/dist/accessi-service/console/generated/model/updateEnabledStatusRequest.js.map +1 -0
  192. package/dist/accessi-service/console/generated/model/updateFederatedIdentityRequest.js.map +1 -0
  193. package/dist/accessi-service/console/generated/model/updateFederatedProviderRequest.js.map +1 -0
  194. package/dist/accessi-service/console/generated/model/updateFilterTypeRequest.js.map +1 -0
  195. package/dist/accessi-service/console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +1 -0
  196. package/dist/accessi-service/console/generated/model/updateMenuGroupRequest.js.map +1 -0
  197. package/dist/accessi-service/console/generated/model/updateMenuRequest.js.map +1 -0
  198. package/dist/accessi-service/console/generated/model/updateMenuTypeRequest.js.map +1 -0
  199. package/dist/accessi-service/console/generated/model/updateScopeRequest.js.map +1 -0
  200. package/dist/accessi-service/console/generated/model/userDto.js.map +1 -0
  201. package/dist/accessi-service/console/generated/model/userDtoStatoRegistrazione.js.map +1 -0
  202. package/dist/accessi-service/console/generated/model/userGrantsDto.js.map +1 -0
  203. package/dist/accessi-service/console/generated/model/userGrantsResponse.js.map +1 -0
  204. package/dist/accessi-service/console/generated/model/verifyTwoFactorRequest.js.map +1 -0
  205. package/dist/accessi-service/console/help.js.map +1 -0
  206. package/dist/accessi-service/console/wiki.js +1533 -0
  207. package/dist/accessi-service/console/wiki.js.map +1 -0
  208. package/dist/accessi-service/controllers/AccessiAuditController.d.ts +16 -0
  209. package/dist/accessi-service/controllers/AccessiAuditController.js +155 -0
  210. package/dist/accessi-service/controllers/AccessiAuditController.js.map +1 -0
  211. package/dist/accessi-service/controllers/AccessiConsoleController.js +169 -0
  212. package/dist/accessi-service/controllers/AccessiConsoleController.js.map +1 -0
  213. package/dist/accessi-service/controllers/AccessiIntrospectionController.d.ts +17 -0
  214. package/dist/accessi-service/controllers/AccessiIntrospectionController.js +102 -0
  215. package/dist/accessi-service/controllers/AccessiIntrospectionController.js.map +1 -0
  216. package/dist/accessi-service/controllers/AuthController.d.ts +24 -0
  217. package/dist/accessi-service/controllers/AuthController.js +564 -0
  218. package/dist/accessi-service/controllers/AuthController.js.map +1 -0
  219. package/dist/accessi-service/controllers/ConfiguratorController.d.ts +9 -0
  220. package/dist/accessi-service/controllers/ConfiguratorController.js +136 -0
  221. package/dist/accessi-service/controllers/ConfiguratorController.js.map +1 -0
  222. package/dist/accessi-service/controllers/ConsoleEntryController.d.ts +16 -0
  223. package/dist/accessi-service/controllers/ConsoleEntryController.js +159 -0
  224. package/dist/accessi-service/controllers/ConsoleEntryController.js.map +1 -0
  225. package/dist/accessi-service/controllers/EmailController.d.ts +11 -0
  226. package/dist/accessi-service/controllers/EmailController.js +112 -0
  227. package/dist/accessi-service/controllers/EmailController.js.map +1 -0
  228. package/dist/accessi-service/controllers/FiltriController.d.ts +20 -0
  229. package/dist/accessi-service/controllers/FiltriController.js +303 -0
  230. package/dist/accessi-service/controllers/FiltriController.js.map +1 -0
  231. package/dist/accessi-service/controllers/PermissionController.d.ts +45 -0
  232. package/dist/accessi-service/controllers/PermissionController.js +862 -0
  233. package/dist/accessi-service/controllers/PermissionController.js.map +1 -0
  234. package/dist/accessi-service/controllers/SchemaController.d.ts +9 -0
  235. package/dist/accessi-service/controllers/SchemaController.js +79 -0
  236. package/dist/accessi-service/controllers/SchemaController.js.map +1 -0
  237. package/dist/accessi-service/controllers/ServiceTokenController.d.ts +23 -0
  238. package/dist/accessi-service/controllers/ServiceTokenController.js +176 -0
  239. package/dist/accessi-service/controllers/ServiceTokenController.js.map +1 -0
  240. package/dist/accessi-service/controllers/UserController.d.ts +39 -0
  241. package/dist/accessi-service/controllers/UserController.js +724 -0
  242. package/dist/accessi-service/controllers/UserController.js.map +1 -0
  243. package/dist/accessi-service/database-updates/AccessiCatalogMigrator.js.map +1 -0
  244. package/dist/accessi-service/database-updates/AccessiDatabaseUpdater.js.map +1 -0
  245. package/dist/accessi-service/database-updates/accessiOptionsFromEnv.js +347 -0
  246. package/dist/accessi-service/database-updates/accessiOptionsFromEnv.js.map +1 -0
  247. package/dist/accessi-service/database-updates/accessiSchema.js.map +1 -0
  248. package/dist/accessi-service/database-updates/menuScopeSeed.js.map +1 -0
  249. package/dist/accessi-service/database-updates/menuScopeSeeder.js.map +1 -0
  250. package/dist/accessi-service/database-updates/optionalColumns.js.map +1 -0
  251. package/dist/accessi-service/database-updates/runAccessiCatalogMigrations.js.map +1 -0
  252. package/dist/accessi-service/database-updates/runAccessiDbUpdate.js.map +1 -0
  253. package/dist/accessi-service/dtos/Abilitazione.js.map +1 -0
  254. package/dist/accessi-service/dtos/AbilitazioneMenu.js.map +1 -0
  255. package/dist/accessi-service/dtos/AdminBootstrapDtos.js.map +1 -0
  256. package/dist/accessi-service/dtos/AssignPermissionsToUserRequest.js.map +1 -0
  257. package/dist/accessi-service/dtos/AssignRolesToUserRequest.js.map +1 -0
  258. package/dist/accessi-service/dtos/AuditDtos.js.map +1 -0
  259. package/dist/accessi-service/dtos/AuthenticatedUserPayloadDto.js.map +1 -0
  260. package/dist/accessi-service/dtos/BaseResponse.js.map +1 -0
  261. package/dist/accessi-service/dtos/CatalogDtos.js.map +1 -0
  262. package/dist/accessi-service/dtos/ConfirmResetPasswordRequest.js.map +1 -0
  263. package/dist/accessi-service/dtos/ConsoleEntryDtos.js.map +1 -0
  264. package/dist/accessi-service/dtos/FederatedExchangeDtos.js.map +1 -0
  265. package/dist/accessi-service/dtos/FederatedIdentityDtos.js.map +1 -0
  266. package/dist/accessi-service/dtos/FiltriUtente.js.map +1 -0
  267. package/dist/accessi-service/dtos/GetGroupsWithMenusResponse.js.map +1 -0
  268. package/dist/accessi-service/dtos/GetMenusResponse.js.map +1 -0
  269. package/dist/accessi-service/dtos/GetRolesResponse.js.map +1 -0
  270. package/dist/accessi-service/dtos/GetUserByTokenRequest.js.map +1 -0
  271. package/dist/accessi-service/dtos/GetUserByTokenResponse.js.map +1 -0
  272. package/dist/accessi-service/dtos/GetUsersResponse.js.map +1 -0
  273. package/dist/accessi-service/dtos/IntrospectionDtos.js.map +1 -0
  274. package/dist/accessi-service/dtos/LoginAsDtos.js.map +1 -0
  275. package/dist/accessi-service/dtos/LoginRequest.js.map +1 -0
  276. package/dist/accessi-service/dtos/LoginResponse.js.map +1 -0
  277. package/dist/accessi-service/dtos/MenuItem.js.map +1 -0
  278. package/dist/accessi-service/dtos/Permission.js.map +1 -0
  279. package/dist/accessi-service/dtos/PublicRegisterRequest.js.map +1 -0
  280. package/dist/accessi-service/dtos/RefreshTokenDtos.js.map +1 -0
  281. package/dist/accessi-service/dtos/RegisterRequest.js.map +1 -0
  282. package/dist/accessi-service/dtos/RegisterResponse.js.map +1 -0
  283. package/dist/accessi-service/dtos/RevokeTokenRequest.js.map +1 -0
  284. package/dist/accessi-service/dtos/Role.js.map +1 -0
  285. package/dist/accessi-service/dtos/RuoliMenu.js.map +1 -0
  286. package/dist/accessi-service/dtos/SchemaDtos.js.map +1 -0
  287. package/dist/accessi-service/dtos/ScopeDtos.js.map +1 -0
  288. package/dist/accessi-service/dtos/SendResetPasswordEmailRequest.js.map +1 -0
  289. package/dist/accessi-service/dtos/ServiceToken.js.map +1 -0
  290. package/dist/accessi-service/dtos/SetStatoRegistrazione.js.map +1 -0
  291. package/dist/accessi-service/dtos/SetUserPasswordRequest.js.map +1 -0
  292. package/dist/accessi-service/dtos/StatoRegistrazione.js.map +1 -0
  293. package/dist/accessi-service/dtos/TipoAbilitazione.js.map +1 -0
  294. package/dist/accessi-service/dtos/TipoFiltro.js.map +1 -0
  295. package/dist/accessi-service/dtos/TokenResult.js.map +1 -0
  296. package/dist/accessi-service/dtos/TwoFactorDtos.js.map +1 -0
  297. package/dist/accessi-service/dtos/UpdateEnabledStatusRequest.js.map +1 -0
  298. package/dist/accessi-service/dtos/UserDto.js.map +1 -0
  299. package/dist/accessi-service/dtos/UserGrantsDto.js.map +1 -0
  300. package/dist/accessi-service/dtos/UserGrantsResponse.js.map +1 -0
  301. package/dist/accessi-service/dtos/index.js.map +1 -0
  302. package/dist/accessi-service/federated-auth/FederatedAuthController.d.ts +33 -0
  303. package/dist/accessi-service/federated-auth/FederatedAuthController.js +373 -0
  304. package/dist/accessi-service/federated-auth/FederatedAuthController.js.map +1 -0
  305. package/dist/accessi-service/federated-auth/FederatedAuthExchangeController.d.ts +15 -0
  306. package/dist/accessi-service/federated-auth/FederatedAuthExchangeController.js +85 -0
  307. package/dist/accessi-service/federated-auth/FederatedAuthExchangeController.js.map +1 -0
  308. package/dist/accessi-service/federated-auth/FederatedAuthService.d.ts +102 -0
  309. package/dist/accessi-service/federated-auth/FederatedAuthService.js +472 -0
  310. package/dist/accessi-service/federated-auth/FederatedAuthService.js.map +1 -0
  311. package/dist/accessi-service/federated-auth/FederatedAuthTypes.d.ts +53 -0
  312. package/dist/accessi-service/federated-auth/FederatedAuthTypes.js.map +1 -0
  313. package/dist/accessi-service/health/nest.js.map +1 -0
  314. package/dist/accessi-service/health/readiness.js.map +1 -0
  315. package/dist/accessi-service/index.d.ts +88 -0
  316. package/dist/accessi-service/index.js +304 -0
  317. package/dist/accessi-service/index.js.map +1 -0
  318. package/dist/accessi-service/jwt/JwtSimpleGuard.d.ts +9 -0
  319. package/dist/accessi-service/jwt/JwtSimpleGuard.js +88 -0
  320. package/dist/accessi-service/jwt/JwtSimpleGuard.js.map +1 -0
  321. package/dist/accessi-service/middleware/accessiRequirements.js.map +1 -0
  322. package/dist/accessi-service/middleware/authenticateGen.d.ts +32 -0
  323. package/dist/accessi-service/middleware/authenticateGen.js +315 -0
  324. package/dist/accessi-service/middleware/authenticateGen.js.map +1 -0
  325. package/dist/accessi-service/observability/metrics.js +229 -0
  326. package/dist/accessi-service/observability/metrics.js.map +1 -0
  327. package/dist/accessi-service/observability/redisMetrics.js.map +1 -0
  328. package/dist/accessi-service/security/AccessiHttpExceptionFilter.js.map +1 -0
  329. package/dist/accessi-service/security/accessControl.js.map +1 -0
  330. package/dist/accessi-service/security/accessTokenRevocation.js.map +1 -0
  331. package/dist/accessi-service/security/accessiValidation.js.map +1 -0
  332. package/dist/accessi-service/security/adminBootstrap.js.map +1 -0
  333. package/dist/accessi-service/security/audit.d.ts +84 -0
  334. package/dist/accessi-service/security/audit.js +214 -0
  335. package/dist/accessi-service/security/audit.js.map +1 -0
  336. package/dist/accessi-service/security/auditSinks.js.map +1 -0
  337. package/dist/accessi-service/security/authCookies.js.map +1 -0
  338. package/dist/accessi-service/security/authenticatedToken.d.ts +31 -0
  339. package/dist/accessi-service/security/authenticatedToken.js +79 -0
  340. package/dist/accessi-service/security/authenticatedToken.js.map +1 -0
  341. package/dist/accessi-service/security/consoleEntry.js.map +1 -0
  342. package/dist/accessi-service/security/edgeRateLimit.js.map +1 -0
  343. package/dist/accessi-service/security/emailConfiguration.js.map +1 -0
  344. package/dist/accessi-service/security/jwks.js.map +1 -0
  345. package/dist/accessi-service/security/jwksBootstrap.js.map +1 -0
  346. package/dist/accessi-service/security/jwtTokenOptions.js.map +1 -0
  347. package/dist/accessi-service/security/loginAs.js.map +1 -0
  348. package/dist/accessi-service/security/passwordPolicy.js.map +1 -0
  349. package/dist/accessi-service/security/passwordResetToken.js.map +1 -0
  350. package/dist/accessi-service/security/publicAuthRateLimit.js.map +1 -0
  351. package/dist/accessi-service/security/rateLimitStore.js.map +1 -0
  352. package/dist/accessi-service/security/refreshTokenRotation.js.map +1 -0
  353. package/dist/accessi-service/security/securityHeaders.js.map +1 -0
  354. package/dist/accessi-service/security/serviceTokenGuard.d.ts +27 -0
  355. package/dist/accessi-service/security/serviceTokenGuard.js +90 -0
  356. package/dist/accessi-service/security/serviceTokenGuard.js.map +1 -0
  357. package/dist/accessi-service/security/serviceTokenRateLimit.js.map +1 -0
  358. package/dist/accessi-service/security/sessionRevocation.js.map +1 -0
  359. package/dist/accessi-service/security/validateOptions.js.map +1 -0
  360. package/dist/accessi-service/services/admin-bootstrap-service/AdminBootstrapService.d.ts +33 -0
  361. package/dist/accessi-service/services/admin-bootstrap-service/AdminBootstrapService.js +106 -0
  362. package/dist/accessi-service/services/admin-bootstrap-service/AdminBootstrapService.js.map +1 -0
  363. package/dist/accessi-service/services/auth-service/AuthService.d.ts +127 -0
  364. package/dist/accessi-service/services/auth-service/AuthService.js +734 -0
  365. package/dist/accessi-service/services/auth-service/AuthService.js.map +1 -0
  366. package/dist/accessi-service/services/configurator-service/ConfiguratorService.js.map +1 -0
  367. package/dist/accessi-service/services/email-service/EmailService.js +439 -0
  368. package/dist/accessi-service/services/email-service/EmailService.js.map +1 -0
  369. package/dist/accessi-service/services/filtri-service/FiltriService.d.ts +26 -0
  370. package/dist/accessi-service/services/filtri-service/FiltriService.js +203 -0
  371. package/dist/accessi-service/services/filtri-service/FiltriService.js.map +1 -0
  372. package/dist/accessi-service/services/permission-service/PermissionService.d.ts +126 -0
  373. package/dist/accessi-service/services/permission-service/PermissionService.js +944 -0
  374. package/dist/accessi-service/services/permission-service/PermissionService.js.map +1 -0
  375. package/dist/accessi-service/services/schema-export-service/SchemaExportService.js.map +1 -0
  376. package/dist/accessi-service/services/service-token-service/ServiceTokenService.js.map +1 -0
  377. package/dist/accessi-service/services/two-factor-service/TwoFactorService.d.ts +27 -0
  378. package/dist/accessi-service/services/two-factor-service/TwoFactorService.js +175 -0
  379. package/dist/accessi-service/services/two-factor-service/TwoFactorService.js.map +1 -0
  380. package/dist/accessi-service/services/user-service/UserService.d.ts +112 -0
  381. package/dist/accessi-service/services/user-service/UserService.js +837 -0
  382. package/dist/accessi-service/services/user-service/UserService.js.map +1 -0
  383. package/dist/accessi-service/startupLog.js.map +1 -0
  384. package/dist/accessi-service/tenancy/tenantContext.d.ts +15 -0
  385. package/dist/accessi-service/tenancy/tenantContext.js +26 -0
  386. package/dist/accessi-service/tenancy/tenantContext.js.map +1 -0
  387. package/dist/allegati-module/AllegatiModule.js +2 -2
  388. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  389. package/dist/allegati-module/controllers/AllegatiController.d.ts +36 -0
  390. package/dist/allegati-module/controllers/AllegatiController.js +230 -0
  391. package/dist/allegati-module/controllers/AllegatiController.js.map +1 -0
  392. package/dist/allegati-module/dtos/AllegatoDto.js.map +1 -0
  393. package/dist/allegati-module/dtos/BaseResponse.js.map +1 -0
  394. package/dist/allegati-module/dtos/UploadSingleFileRequest.js.map +1 -0
  395. package/dist/allegati-module/dtos/index.js.map +1 -0
  396. package/dist/allegati-module/dtos/responses/DownloadAllegatoResponseDto.js.map +1 -0
  397. package/dist/allegati-module/dtos/responses/GetListResponse.js.map +1 -0
  398. package/dist/allegati-module/dtos/responses/UploadAllegatoResponseDto.js.map +1 -0
  399. package/dist/allegati-module/index.d.ts +1 -1
  400. package/dist/allegati-module/index.js +1 -1
  401. package/dist/allegati-module/index.js.map +1 -1
  402. package/dist/allegati-module/services/allegati-service/AllegatiService.d.ts +61 -0
  403. package/dist/allegati-module/services/allegati-service/AllegatiService.js.map +1 -0
  404. package/dist/emilsoftware-utilities-2.0.0-dev.85.tgz +0 -0
  405. package/dist/firebirdCompat.js +269 -0
  406. package/dist/firebirdCompat.js.map +1 -0
  407. package/dist/index.d.ts +3 -3
  408. package/dist/index.js +3 -3
  409. package/dist/index.js.map +1 -1
  410. package/dist/initEmilsoftwareModule.js +9 -9
  411. package/dist/initEmilsoftwareModule.js.map +1 -1
  412. package/dist/scripts/generateAccessiOpenApi.js +2 -2
  413. package/dist/scripts/generateAccessiOpenApi.js.map +1 -1
  414. package/dist/scripts/generateAccessiWiki.js +6 -4
  415. package/dist/scripts/generateAccessiWiki.js.map +1 -1
  416. package/docs/README.md +116 -0
  417. package/docs/adr/0002-multi-tenancy.md +5 -3
  418. package/docs/audit.md +4 -0
  419. package/docs/auth-cookies.md +4 -0
  420. package/docs/conventions.md +86 -0
  421. package/docs/gateway-rate-limit.md +3 -0
  422. package/docs/import-migration.md +12 -6
  423. package/docs/jwt-key-rotation.md +3 -0
  424. package/docs/metrics.md +3 -0
  425. package/docs/multi-tenancy.md +54 -0
  426. package/docs/proxy-ip.md +8 -0
  427. package/docs/quickstart-frontend.md +217 -0
  428. package/docs/quickstart-resource-server.md +177 -0
  429. package/docs/quickstart-service.md +214 -0
  430. package/docs/redis-load-testing.md +4 -0
  431. package/docs/security-headers.md +3 -0
  432. package/docs/standalone-service.md +180 -54
  433. package/integration-prompt.md +38 -14
  434. package/package.json +24 -19
  435. package/README.MD +0 -323
  436. package/dist/accessi-module/AccessiModule.js +0 -120
  437. package/dist/accessi-module/AccessiModule.js.map +0 -1
  438. package/dist/accessi-module/Console/accessiFetch.js.map +0 -1
  439. package/dist/accessi-module/Console/console.js +0 -4173
  440. package/dist/accessi-module/Console/console.js.map +0 -1
  441. package/dist/accessi-module/Console/generated/emilsoftware-utilities.js.map +0 -1
  442. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +0 -1
  443. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.js.map +0 -1
  444. package/dist/accessi-module/Console/generated/model/accessiIntrospectionResultDto.js.map +0 -1
  445. package/dist/accessi-module/Console/generated/model/actionResponse.js.map +0 -1
  446. package/dist/accessi-module/Console/generated/model/adminBootstrapStatusResponse.js.map +0 -1
  447. package/dist/accessi-module/Console/generated/model/adminBootstrapStatusResult.js.map +0 -1
  448. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.js.map +0 -1
  449. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.js.map +0 -1
  450. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.js.map +0 -1
  451. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.js.map +0 -1
  452. package/dist/accessi-module/Console/generated/model/bootstrapAdminRequest.js.map +0 -1
  453. package/dist/accessi-module/Console/generated/model/bootstrapAdminResponse.js.map +0 -1
  454. package/dist/accessi-module/Console/generated/model/bootstrapAdminResultDto.js.map +0 -1
  455. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +0 -1
  456. package/dist/accessi-module/Console/generated/model/consoleEntryExchangeRequest.js.map +0 -1
  457. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResponse.js.map +0 -1
  458. package/dist/accessi-module/Console/generated/model/consoleEntrySessionResult.js.map +0 -1
  459. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResponse.js.map +0 -1
  460. package/dist/accessi-module/Console/generated/model/consoleEntryTicketResult.js.map +0 -1
  461. package/dist/accessi-module/Console/generated/model/consoleEntryTokenResult.js.map +0 -1
  462. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.js.map +0 -1
  463. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.js.map +0 -1
  464. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.js.map +0 -1
  465. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js.map +0 -1
  466. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js.map +0 -1
  467. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js.map +0 -1
  468. package/dist/accessi-module/Console/generated/model/createMenuRequest.js.map +0 -1
  469. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js.map +0 -1
  470. package/dist/accessi-module/Console/generated/model/createScopeRequest.js.map +0 -1
  471. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js.map +0 -1
  472. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js.map +0 -1
  473. package/dist/accessi-module/Console/generated/model/errorResponse.js.map +0 -1
  474. package/dist/accessi-module/Console/generated/model/exchangeFederatedIdentityRequest.js.map +0 -1
  475. package/dist/accessi-module/Console/generated/model/exportAuditOrder.js.map +0 -1
  476. package/dist/accessi-module/Console/generated/model/exportAuditParams.js.map +0 -1
  477. package/dist/accessi-module/Console/generated/model/federatedAuthenticationResultDto.js.map +0 -1
  478. package/dist/accessi-module/Console/generated/model/federatedExchangeResponse.js.map +0 -1
  479. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.js.map +0 -1
  480. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.js.map +0 -1
  481. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.js.map +0 -1
  482. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.js.map +0 -1
  483. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.js.map +0 -1
  484. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.js.map +0 -1
  485. package/dist/accessi-module/Console/generated/model/filtriUtente.js.map +0 -1
  486. package/dist/accessi-module/Console/generated/model/getFiltriResponse.js.map +0 -1
  487. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.js.map +0 -1
  488. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.js.map +0 -1
  489. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js.map +0 -1
  490. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.js.map +0 -1
  491. package/dist/accessi-module/Console/generated/model/getMenuScopesResponse.js.map +0 -1
  492. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js.map +0 -1
  493. package/dist/accessi-module/Console/generated/model/getMenusParams.js.map +0 -1
  494. package/dist/accessi-module/Console/generated/model/getMenusResponse.js.map +0 -1
  495. package/dist/accessi-module/Console/generated/model/getRolesResponse.js.map +0 -1
  496. package/dist/accessi-module/Console/generated/model/getSchemaResponse.js.map +0 -1
  497. package/dist/accessi-module/Console/generated/model/getScopesResponse.js.map +0 -1
  498. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js.map +0 -1
  499. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js.map +0 -1
  500. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.js.map +0 -1
  501. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.js.map +0 -1
  502. package/dist/accessi-module/Console/generated/model/getUserRolesAndGrantsParams.js.map +0 -1
  503. package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +0 -1
  504. package/dist/accessi-module/Console/generated/model/getUsersResponse.js.map +0 -1
  505. package/dist/accessi-module/Console/generated/model/getUsersResult.js.map +0 -1
  506. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.js.map +0 -1
  507. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.js.map +0 -1
  508. package/dist/accessi-module/Console/generated/model/index.js.map +0 -1
  509. package/dist/accessi-module/Console/generated/model/introspectAccessiTokenRequest.js.map +0 -1
  510. package/dist/accessi-module/Console/generated/model/introspectAccessiTokenResponse.js.map +0 -1
  511. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js.map +0 -1
  512. package/dist/accessi-module/Console/generated/model/loginAsRequest.js.map +0 -1
  513. package/dist/accessi-module/Console/generated/model/loginAsResponse.js.map +0 -1
  514. package/dist/accessi-module/Console/generated/model/loginAsResult.js.map +0 -1
  515. package/dist/accessi-module/Console/generated/model/loginRequest.js.map +0 -1
  516. package/dist/accessi-module/Console/generated/model/loginResponse.js.map +0 -1
  517. package/dist/accessi-module/Console/generated/model/loginResult.js.map +0 -1
  518. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.js.map +0 -1
  519. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.js.map +0 -1
  520. package/dist/accessi-module/Console/generated/model/menuEntity.js.map +0 -1
  521. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js.map +0 -1
  522. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.js.map +0 -1
  523. package/dist/accessi-module/Console/generated/model/permission.js.map +0 -1
  524. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js.map +0 -1
  525. package/dist/accessi-module/Console/generated/model/queryAuditOrder.js.map +0 -1
  526. package/dist/accessi-module/Console/generated/model/queryAuditParams.js.map +0 -1
  527. package/dist/accessi-module/Console/generated/model/refreshTokenRequest.js.map +0 -1
  528. package/dist/accessi-module/Console/generated/model/refreshTokenResponse.js.map +0 -1
  529. package/dist/accessi-module/Console/generated/model/refreshTokenResult.js.map +0 -1
  530. package/dist/accessi-module/Console/generated/model/registerRequest.js.map +0 -1
  531. package/dist/accessi-module/Console/generated/model/registerResponse.js.map +0 -1
  532. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.js.map +0 -1
  533. package/dist/accessi-module/Console/generated/model/revokeTokenRequest.js.map +0 -1
  534. package/dist/accessi-module/Console/generated/model/role.js.map +0 -1
  535. package/dist/accessi-module/Console/generated/model/ruoliMenu.js.map +0 -1
  536. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.js.map +0 -1
  537. package/dist/accessi-module/Console/generated/model/schemaDdlResult.js.map +0 -1
  538. package/dist/accessi-module/Console/generated/model/schemaDdlSection.js.map +0 -1
  539. package/dist/accessi-module/Console/generated/model/scopeEntity.js.map +0 -1
  540. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.js.map +0 -1
  541. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.js.map +0 -1
  542. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js.map +0 -1
  543. package/dist/accessi-module/Console/generated/model/setMenuScopesRequest.js.map +0 -1
  544. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.js.map +0 -1
  545. package/dist/accessi-module/Console/generated/model/setScopeMenusRequest.js.map +0 -1
  546. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.js.map +0 -1
  547. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js.map +0 -1
  548. package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js.map +0 -1
  549. package/dist/accessi-module/Console/generated/model/status.js.map +0 -1
  550. package/dist/accessi-module/Console/generated/model/tipoFiltro.js.map +0 -1
  551. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.js.map +0 -1
  552. package/dist/accessi-module/Console/generated/model/tokenResult.js.map +0 -1
  553. package/dist/accessi-module/Console/generated/model/tokenResultType.js.map +0 -1
  554. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.js.map +0 -1
  555. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.js.map +0 -1
  556. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js.map +0 -1
  557. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.js.map +0 -1
  558. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.js.map +0 -1
  559. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.js.map +0 -1
  560. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js.map +0 -1
  561. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +0 -1
  562. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js.map +0 -1
  563. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js.map +0 -1
  564. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js.map +0 -1
  565. package/dist/accessi-module/Console/generated/model/updateScopeRequest.js.map +0 -1
  566. package/dist/accessi-module/Console/generated/model/userDto.js.map +0 -1
  567. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.js.map +0 -1
  568. package/dist/accessi-module/Console/generated/model/userGrantsDto.js.map +0 -1
  569. package/dist/accessi-module/Console/generated/model/userGrantsResponse.js.map +0 -1
  570. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.js.map +0 -1
  571. package/dist/accessi-module/Console/help.js.map +0 -1
  572. package/dist/accessi-module/Console/wiki.js +0 -867
  573. package/dist/accessi-module/Console/wiki.js.map +0 -1
  574. package/dist/accessi-module/Controllers/AccessiAuditController.d.ts +0 -16
  575. package/dist/accessi-module/Controllers/AccessiAuditController.js +0 -155
  576. package/dist/accessi-module/Controllers/AccessiAuditController.js.map +0 -1
  577. package/dist/accessi-module/Controllers/AccessiConsoleController.js +0 -169
  578. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +0 -1
  579. package/dist/accessi-module/Controllers/AccessiIntrospectionController.d.ts +0 -17
  580. package/dist/accessi-module/Controllers/AccessiIntrospectionController.js +0 -102
  581. package/dist/accessi-module/Controllers/AccessiIntrospectionController.js.map +0 -1
  582. package/dist/accessi-module/Controllers/AuthController.d.ts +0 -24
  583. package/dist/accessi-module/Controllers/AuthController.js +0 -564
  584. package/dist/accessi-module/Controllers/AuthController.js.map +0 -1
  585. package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +0 -9
  586. package/dist/accessi-module/Controllers/ConfiguratorController.js +0 -136
  587. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +0 -1
  588. package/dist/accessi-module/Controllers/ConsoleEntryController.d.ts +0 -16
  589. package/dist/accessi-module/Controllers/ConsoleEntryController.js +0 -159
  590. package/dist/accessi-module/Controllers/ConsoleEntryController.js.map +0 -1
  591. package/dist/accessi-module/Controllers/EmailController.d.ts +0 -11
  592. package/dist/accessi-module/Controllers/EmailController.js +0 -112
  593. package/dist/accessi-module/Controllers/EmailController.js.map +0 -1
  594. package/dist/accessi-module/Controllers/FiltriController.d.ts +0 -20
  595. package/dist/accessi-module/Controllers/FiltriController.js +0 -303
  596. package/dist/accessi-module/Controllers/FiltriController.js.map +0 -1
  597. package/dist/accessi-module/Controllers/PermissionController.d.ts +0 -45
  598. package/dist/accessi-module/Controllers/PermissionController.js +0 -862
  599. package/dist/accessi-module/Controllers/PermissionController.js.map +0 -1
  600. package/dist/accessi-module/Controllers/SchemaController.d.ts +0 -9
  601. package/dist/accessi-module/Controllers/SchemaController.js +0 -79
  602. package/dist/accessi-module/Controllers/SchemaController.js.map +0 -1
  603. package/dist/accessi-module/Controllers/ServiceTokenController.d.ts +0 -23
  604. package/dist/accessi-module/Controllers/ServiceTokenController.js +0 -176
  605. package/dist/accessi-module/Controllers/ServiceTokenController.js.map +0 -1
  606. package/dist/accessi-module/Controllers/UserController.d.ts +0 -39
  607. package/dist/accessi-module/Controllers/UserController.js +0 -724
  608. package/dist/accessi-module/Controllers/UserController.js.map +0 -1
  609. package/dist/accessi-module/Dtos/Abilitazione.js.map +0 -1
  610. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +0 -1
  611. package/dist/accessi-module/Dtos/AdminBootstrapDtos.js.map +0 -1
  612. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +0 -1
  613. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +0 -1
  614. package/dist/accessi-module/Dtos/AuditDtos.js.map +0 -1
  615. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +0 -1
  616. package/dist/accessi-module/Dtos/BaseResponse.js.map +0 -1
  617. package/dist/accessi-module/Dtos/CatalogDtos.js.map +0 -1
  618. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +0 -1
  619. package/dist/accessi-module/Dtos/ConsoleEntryDtos.js.map +0 -1
  620. package/dist/accessi-module/Dtos/FederatedExchangeDtos.js.map +0 -1
  621. package/dist/accessi-module/Dtos/FederatedIdentityDtos.js.map +0 -1
  622. package/dist/accessi-module/Dtos/FiltriUtente.js.map +0 -1
  623. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +0 -1
  624. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +0 -1
  625. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +0 -1
  626. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +0 -1
  627. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +0 -1
  628. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +0 -1
  629. package/dist/accessi-module/Dtos/IntrospectionDtos.js.map +0 -1
  630. package/dist/accessi-module/Dtos/LoginAsDtos.js.map +0 -1
  631. package/dist/accessi-module/Dtos/LoginRequest.js.map +0 -1
  632. package/dist/accessi-module/Dtos/LoginResponse.js.map +0 -1
  633. package/dist/accessi-module/Dtos/MenuItem.js.map +0 -1
  634. package/dist/accessi-module/Dtos/Permission.js.map +0 -1
  635. package/dist/accessi-module/Dtos/PublicRegisterRequest.js.map +0 -1
  636. package/dist/accessi-module/Dtos/RefreshTokenDtos.js.map +0 -1
  637. package/dist/accessi-module/Dtos/RegisterRequest.js.map +0 -1
  638. package/dist/accessi-module/Dtos/RegisterResponse.js.map +0 -1
  639. package/dist/accessi-module/Dtos/RevokeTokenRequest.js.map +0 -1
  640. package/dist/accessi-module/Dtos/Role.js.map +0 -1
  641. package/dist/accessi-module/Dtos/RuoliMenu.js.map +0 -1
  642. package/dist/accessi-module/Dtos/SchemaDtos.js.map +0 -1
  643. package/dist/accessi-module/Dtos/ScopeDtos.js.map +0 -1
  644. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +0 -1
  645. package/dist/accessi-module/Dtos/ServiceToken.js.map +0 -1
  646. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +0 -1
  647. package/dist/accessi-module/Dtos/SetUserPasswordRequest.js.map +0 -1
  648. package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +0 -1
  649. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +0 -1
  650. package/dist/accessi-module/Dtos/TipoFiltro.js.map +0 -1
  651. package/dist/accessi-module/Dtos/TokenResult.js.map +0 -1
  652. package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +0 -1
  653. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +0 -1
  654. package/dist/accessi-module/Dtos/UserDto.js.map +0 -1
  655. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +0 -1
  656. package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +0 -1
  657. package/dist/accessi-module/Dtos/index.js.map +0 -1
  658. package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.d.ts +0 -33
  659. package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.js +0 -106
  660. package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.js.map +0 -1
  661. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +0 -127
  662. package/dist/accessi-module/Services/AuthService/AuthService.js +0 -734
  663. package/dist/accessi-module/Services/AuthService/AuthService.js.map +0 -1
  664. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +0 -1
  665. package/dist/accessi-module/Services/EmailService/EmailService.js +0 -439
  666. package/dist/accessi-module/Services/EmailService/EmailService.js.map +0 -1
  667. package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +0 -26
  668. package/dist/accessi-module/Services/FiltriService/FiltriService.js +0 -203
  669. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +0 -1
  670. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +0 -126
  671. package/dist/accessi-module/Services/PermissionService/PermissionService.js +0 -944
  672. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +0 -1
  673. package/dist/accessi-module/Services/SchemaExportService/SchemaExportService.js.map +0 -1
  674. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +0 -1
  675. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.d.ts +0 -27
  676. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +0 -175
  677. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +0 -1
  678. package/dist/accessi-module/Services/UserService/UserService.d.ts +0 -112
  679. package/dist/accessi-module/Services/UserService/UserService.js +0 -837
  680. package/dist/accessi-module/Services/UserService/UserService.js.map +0 -1
  681. package/dist/accessi-module/accessiRuntime.d.ts +0 -45
  682. package/dist/accessi-module/accessiRuntime.js +0 -39
  683. package/dist/accessi-module/accessiRuntime.js.map +0 -1
  684. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.js.map +0 -1
  685. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +0 -1
  686. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js +0 -134
  687. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js.map +0 -1
  688. package/dist/accessi-module/database-updates/accessiSchema.js.map +0 -1
  689. package/dist/accessi-module/database-updates/menuScopeSeed.js.map +0 -1
  690. package/dist/accessi-module/database-updates/menuScopeSeeder.js.map +0 -1
  691. package/dist/accessi-module/database-updates/optionalColumns.js.map +0 -1
  692. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.js.map +0 -1
  693. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +0 -1
  694. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +0 -33
  695. package/dist/accessi-module/federated-auth/FederatedAuthController.js +0 -373
  696. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +0 -1
  697. package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.d.ts +0 -15
  698. package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.js +0 -85
  699. package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.js.map +0 -1
  700. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +0 -102
  701. package/dist/accessi-module/federated-auth/FederatedAuthService.js +0 -472
  702. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +0 -1
  703. package/dist/accessi-module/federated-auth/FederatedAuthTypes.d.ts +0 -53
  704. package/dist/accessi-module/federated-auth/FederatedAuthTypes.js.map +0 -1
  705. package/dist/accessi-module/health/nest.js.map +0 -1
  706. package/dist/accessi-module/health/readiness.js.map +0 -1
  707. package/dist/accessi-module/index.d.ts +0 -88
  708. package/dist/accessi-module/index.js +0 -303
  709. package/dist/accessi-module/index.js.map +0 -1
  710. package/dist/accessi-module/jwt/jwt.strategy.d.ts +0 -9
  711. package/dist/accessi-module/jwt/jwt.strategy.js +0 -88
  712. package/dist/accessi-module/jwt/jwt.strategy.js.map +0 -1
  713. package/dist/accessi-module/middleware/accessiRequirements.js.map +0 -1
  714. package/dist/accessi-module/middleware/authenticateGen.d.ts +0 -32
  715. package/dist/accessi-module/middleware/authenticateGen.js +0 -315
  716. package/dist/accessi-module/middleware/authenticateGen.js.map +0 -1
  717. package/dist/accessi-module/observability/metrics.js +0 -220
  718. package/dist/accessi-module/observability/metrics.js.map +0 -1
  719. package/dist/accessi-module/observability/redisMetrics.js.map +0 -1
  720. package/dist/accessi-module/security/AccessiHttpExceptionFilter.js.map +0 -1
  721. package/dist/accessi-module/security/accessControl.js.map +0 -1
  722. package/dist/accessi-module/security/accessTokenRevocation.js.map +0 -1
  723. package/dist/accessi-module/security/accessiValidation.js.map +0 -1
  724. package/dist/accessi-module/security/adminBootstrap.js.map +0 -1
  725. package/dist/accessi-module/security/audit.d.ts +0 -74
  726. package/dist/accessi-module/security/audit.js +0 -189
  727. package/dist/accessi-module/security/audit.js.map +0 -1
  728. package/dist/accessi-module/security/auditSinks.js.map +0 -1
  729. package/dist/accessi-module/security/authCookies.js.map +0 -1
  730. package/dist/accessi-module/security/authenticatedToken.d.ts +0 -31
  731. package/dist/accessi-module/security/authenticatedToken.js +0 -79
  732. package/dist/accessi-module/security/authenticatedToken.js.map +0 -1
  733. package/dist/accessi-module/security/consoleEntry.js.map +0 -1
  734. package/dist/accessi-module/security/edgeRateLimit.js.map +0 -1
  735. package/dist/accessi-module/security/emailConfiguration.js.map +0 -1
  736. package/dist/accessi-module/security/jwks.js.map +0 -1
  737. package/dist/accessi-module/security/jwksBootstrap.js.map +0 -1
  738. package/dist/accessi-module/security/jwtTokenOptions.js.map +0 -1
  739. package/dist/accessi-module/security/loginAs.js.map +0 -1
  740. package/dist/accessi-module/security/passwordPolicy.js.map +0 -1
  741. package/dist/accessi-module/security/passwordResetToken.js.map +0 -1
  742. package/dist/accessi-module/security/publicAuthRateLimit.js.map +0 -1
  743. package/dist/accessi-module/security/rateLimitStore.js.map +0 -1
  744. package/dist/accessi-module/security/refreshTokenRotation.js.map +0 -1
  745. package/dist/accessi-module/security/securityHeaders.js.map +0 -1
  746. package/dist/accessi-module/security/serviceTokenGuard.d.ts +0 -27
  747. package/dist/accessi-module/security/serviceTokenGuard.js +0 -90
  748. package/dist/accessi-module/security/serviceTokenGuard.js.map +0 -1
  749. package/dist/accessi-module/security/serviceTokenRateLimit.js.map +0 -1
  750. package/dist/accessi-module/security/sessionRevocation.js.map +0 -1
  751. package/dist/accessi-module/security/validateOptions.js.map +0 -1
  752. package/dist/accessi-module/startupLog.js.map +0 -1
  753. package/dist/allegati-module/Controllers/AllegatiController.d.ts +0 -36
  754. package/dist/allegati-module/Controllers/AllegatiController.js +0 -230
  755. package/dist/allegati-module/Controllers/AllegatiController.js.map +0 -1
  756. package/dist/allegati-module/Dtos/AllegatoDto.js.map +0 -1
  757. package/dist/allegati-module/Dtos/BaseResponse.js.map +0 -1
  758. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +0 -1
  759. package/dist/allegati-module/Dtos/index.js.map +0 -1
  760. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +0 -1
  761. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +0 -1
  762. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +0 -1
  763. package/dist/allegati-module/Services/AllegatiService/AllegatiService.d.ts +0 -61
  764. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +0 -1
  765. package/dist/emilsoftware-utilities-2.0.0-dev.83.tgz +0 -0
  766. package/dist/firebird-compat.js +0 -269
  767. package/dist/firebird-compat.js.map +0 -1
  768. /package/dist/{accessi-module → accessi-service}/AccessiModule.d.ts +0 -0
  769. /package/dist/{accessi-module/Console → accessi-service/console}/accessiFetch.d.ts +0 -0
  770. /package/dist/{accessi-module/Console → accessi-service/console}/accessiFetch.js +0 -0
  771. /package/dist/{accessi-module/Console → accessi-service/console}/console.css +0 -0
  772. /package/dist/{accessi-module/Console → accessi-service/console}/console.d.ts +0 -0
  773. /package/dist/{accessi-module/Console → accessi-service/console}/generated/emilsoftware-utilities.d.ts +0 -0
  774. /package/dist/{accessi-module/Console → accessi-service/console}/generated/emilsoftware-utilities.js +0 -0
  775. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenu.d.ts +0 -0
  776. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenu.js +0 -0
  777. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenuTipoAbilitazione.d.ts +0 -0
  778. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenuTipoAbilitazione.js +0 -0
  779. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/accessiIntrospectionResultDto.d.ts +0 -0
  780. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/accessiIntrospectionResultDto.js +0 -0
  781. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/actionResponse.d.ts +0 -0
  782. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/actionResponse.js +0 -0
  783. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResponse.d.ts +0 -0
  784. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResponse.js +0 -0
  785. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResult.d.ts +0 -0
  786. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResult.js +0 -0
  787. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignPermissionsToUserRequest.d.ts +0 -0
  788. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignPermissionsToUserRequest.js +0 -0
  789. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignRolesToUserRequest.d.ts +0 -0
  790. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignRolesToUserRequest.js +0 -0
  791. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedTokenPayloadDto.d.ts +0 -0
  792. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedTokenPayloadDto.js +0 -0
  793. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedUserPayloadDto.d.ts +0 -0
  794. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedUserPayloadDto.js +0 -0
  795. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminRequest.d.ts +0 -0
  796. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminRequest.js +0 -0
  797. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResponse.d.ts +0 -0
  798. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResponse.js +0 -0
  799. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResultDto.d.ts +0 -0
  800. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResultDto.js +0 -0
  801. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/confirmResetPasswordRequest.d.ts +0 -0
  802. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/confirmResetPasswordRequest.js +0 -0
  803. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryExchangeRequest.d.ts +0 -0
  804. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryExchangeRequest.js +0 -0
  805. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResponse.d.ts +0 -0
  806. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResponse.js +0 -0
  807. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResult.d.ts +0 -0
  808. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResult.js +0 -0
  809. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResponse.d.ts +0 -0
  810. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResponse.js +0 -0
  811. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResult.d.ts +0 -0
  812. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResult.js +0 -0
  813. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTokenResult.d.ts +0 -0
  814. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTokenResult.js +0 -0
  815. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedIdentityRequest.d.ts +0 -0
  816. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedIdentityRequest.js +0 -0
  817. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedProviderRequest.d.ts +0 -0
  818. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedProviderRequest.js +0 -0
  819. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedUserRequest.d.ts +0 -0
  820. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedUserRequest.js +0 -0
  821. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequest.d.ts +0 -0
  822. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequest.js +0 -0
  823. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequestFlgEnabled.d.ts +0 -0
  824. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequestFlgEnabled.js +0 -0
  825. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuGroupRequest.d.ts +0 -0
  826. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuGroupRequest.js +0 -0
  827. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuRequest.d.ts +0 -0
  828. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuRequest.js +0 -0
  829. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuTypeRequest.d.ts +0 -0
  830. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuTypeRequest.js +0 -0
  831. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createScopeRequest.d.ts +0 -0
  832. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createScopeRequest.js +0 -0
  833. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenRequest.d.ts +0 -0
  834. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenRequest.js +0 -0
  835. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenResponse.d.ts +0 -0
  836. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenResponse.js +0 -0
  837. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/errorResponse.d.ts +0 -0
  838. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/errorResponse.js +0 -0
  839. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exchangeFederatedIdentityRequest.d.ts +0 -0
  840. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exchangeFederatedIdentityRequest.js +0 -0
  841. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditOrder.d.ts +0 -0
  842. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditOrder.js +0 -0
  843. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditParams.d.ts +0 -0
  844. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditParams.js +0 -0
  845. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedAuthenticationResultDto.d.ts +0 -0
  846. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedAuthenticationResultDto.js +0 -0
  847. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedExchangeResponse.d.ts +0 -0
  848. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedExchangeResponse.js +0 -0
  849. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityListResponse.d.ts +0 -0
  850. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityListResponse.js +0 -0
  851. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponse.d.ts +0 -0
  852. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponse.js +0 -0
  853. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponseDto.d.ts +0 -0
  854. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponseDto.js +0 -0
  855. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderListResponse.d.ts +0 -0
  856. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderListResponse.js +0 -0
  857. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponse.d.ts +0 -0
  858. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponse.js +0 -0
  859. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponseDto.d.ts +0 -0
  860. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponseDto.js +0 -0
  861. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/filtriUtente.d.ts +0 -0
  862. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/filtriUtente.js +0 -0
  863. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriResponse.d.ts +0 -0
  864. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriResponse.js +0 -0
  865. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteParams.d.ts +0 -0
  866. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteParams.js +0 -0
  867. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteResponse.d.ts +0 -0
  868. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteResponse.js +0 -0
  869. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusParams.d.ts +0 -0
  870. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusParams.js +0 -0
  871. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusResponse.d.ts +0 -0
  872. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusResponse.js +0 -0
  873. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuScopesResponse.d.ts +0 -0
  874. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuScopesResponse.js +0 -0
  875. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuTypesResponse.d.ts +0 -0
  876. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuTypesResponse.js +0 -0
  877. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusParams.d.ts +0 -0
  878. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusParams.js +0 -0
  879. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusResponse.d.ts +0 -0
  880. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusResponse.js +0 -0
  881. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getRolesResponse.d.ts +0 -0
  882. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getRolesResponse.js +0 -0
  883. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getSchemaResponse.d.ts +0 -0
  884. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getSchemaResponse.js +0 -0
  885. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getScopesResponse.d.ts +0 -0
  886. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getScopesResponse.js +0 -0
  887. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensParams.d.ts +0 -0
  888. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensParams.js +0 -0
  889. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensResponse.d.ts +0 -0
  890. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensResponse.js +0 -0
  891. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenRequest.d.ts +0 -0
  892. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenRequest.js +0 -0
  893. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenResponse.d.ts +0 -0
  894. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenResponse.js +0 -0
  895. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserRolesAndGrantsParams.d.ts +0 -0
  896. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserRolesAndGrantsParams.js +0 -0
  897. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersParams.d.ts +0 -0
  898. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersParams.js +0 -0
  899. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResponse.d.ts +0 -0
  900. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResponse.js +0 -0
  901. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResult.d.ts +0 -0
  902. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResult.js +0 -0
  903. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResultExtensionFields.d.ts +0 -0
  904. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResultExtensionFields.js +0 -0
  905. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/groupWithMenusEntity.d.ts +0 -0
  906. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/groupWithMenusEntity.js +0 -0
  907. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/index.d.ts +0 -0
  908. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/index.js +0 -0
  909. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenRequest.d.ts +0 -0
  910. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenRequest.js +0 -0
  911. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenResponse.d.ts +0 -0
  912. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenResponse.js +0 -0
  913. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/issuedServiceTokenDto.d.ts +0 -0
  914. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/issuedServiceTokenDto.js +0 -0
  915. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsRequest.d.ts +0 -0
  916. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsRequest.js +0 -0
  917. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResponse.d.ts +0 -0
  918. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResponse.js +0 -0
  919. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResult.d.ts +0 -0
  920. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResult.js +0 -0
  921. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginRequest.d.ts +0 -0
  922. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginRequest.js +0 -0
  923. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResponse.d.ts +0 -0
  924. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResponse.js +0 -0
  925. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResult.d.ts +0 -0
  926. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResult.js +0 -0
  927. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultExtensionFields.d.ts +0 -0
  928. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultExtensionFields.js +0 -0
  929. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultPasswordRequired.d.ts +0 -0
  930. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultPasswordRequired.js +0 -0
  931. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuEntity.d.ts +0 -0
  932. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuEntity.js +0 -0
  933. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuTypeEntity.d.ts +0 -0
  934. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuTypeEntity.js +0 -0
  935. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/passwordExpiredResponse.d.ts +0 -0
  936. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/passwordExpiredResponse.js +0 -0
  937. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/permission.d.ts +0 -0
  938. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/permission.js +0 -0
  939. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/publicRegisterRequest.d.ts +0 -0
  940. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/publicRegisterRequest.js +0 -0
  941. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditOrder.d.ts +0 -0
  942. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditOrder.js +0 -0
  943. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditParams.d.ts +0 -0
  944. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditParams.js +0 -0
  945. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenRequest.d.ts +0 -0
  946. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenRequest.js +0 -0
  947. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResponse.d.ts +0 -0
  948. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResponse.js +0 -0
  949. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResult.d.ts +0 -0
  950. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResult.js +0 -0
  951. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerRequest.d.ts +0 -0
  952. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerRequest.js +0 -0
  953. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerResponse.d.ts +0 -0
  954. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerResponse.js +0 -0
  955. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/resendTwoFactorRequest.d.ts +0 -0
  956. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/resendTwoFactorRequest.js +0 -0
  957. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/revokeTokenRequest.d.ts +0 -0
  958. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/revokeTokenRequest.js +0 -0
  959. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/role.d.ts +0 -0
  960. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/role.js +0 -0
  961. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenu.d.ts +0 -0
  962. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenu.js +0 -0
  963. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenuTipoAbilitazione.d.ts +0 -0
  964. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenuTipoAbilitazione.js +0 -0
  965. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlResult.d.ts +0 -0
  966. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlResult.js +0 -0
  967. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlSection.d.ts +0 -0
  968. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlSection.js +0 -0
  969. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/scopeEntity.d.ts +0 -0
  970. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/scopeEntity.js +0 -0
  971. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/sendResetPasswordEmailRequest.d.ts +0 -0
  972. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/sendResetPasswordEmailRequest.js +0 -0
  973. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serveResetPasswordPageParams.d.ts +0 -0
  974. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serveResetPasswordPageParams.js +0 -0
  975. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serviceTokenDto.d.ts +0 -0
  976. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serviceTokenDto.js +0 -0
  977. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setMenuScopesRequest.d.ts +0 -0
  978. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setMenuScopesRequest.js +0 -0
  979. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setPasswordLoginPolicyRequest.d.ts +0 -0
  980. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setPasswordLoginPolicyRequest.js +0 -0
  981. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setScopeMenusRequest.d.ts +0 -0
  982. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setScopeMenusRequest.js +0 -0
  983. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDto.d.ts +0 -0
  984. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDto.js +0 -0
  985. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.d.ts +0 -0
  986. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js +0 -0
  987. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setUserPasswordRequest.d.ts +0 -0
  988. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setUserPasswordRequest.js +0 -0
  989. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/status.d.ts +0 -0
  990. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/status.js +0 -0
  991. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltro.d.ts +0 -0
  992. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltro.js +0 -0
  993. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltroFlgEnabled.d.ts +0 -0
  994. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltroFlgEnabled.js +0 -0
  995. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResult.d.ts +0 -0
  996. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResult.js +0 -0
  997. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResultType.d.ts +0 -0
  998. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResultType.js +0 -0
  999. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDto.d.ts +0 -0
  1000. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDto.js +0 -0
  1001. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoMethod.d.ts +0 -0
  1002. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoMethod.js +0 -0
  1003. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoTwoFactorRequired.d.ts +0 -0
  1004. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoTwoFactorRequired.js +0 -0
  1005. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateEnabledStatusRequest.d.ts +0 -0
  1006. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateEnabledStatusRequest.js +0 -0
  1007. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedIdentityRequest.d.ts +0 -0
  1008. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedIdentityRequest.js +0 -0
  1009. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedProviderRequest.d.ts +0 -0
  1010. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedProviderRequest.js +0 -0
  1011. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequest.d.ts +0 -0
  1012. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequest.js +0 -0
  1013. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequestFlgEnabled.d.ts +0 -0
  1014. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequestFlgEnabled.js +0 -0
  1015. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuGroupRequest.d.ts +0 -0
  1016. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuGroupRequest.js +0 -0
  1017. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuRequest.d.ts +0 -0
  1018. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuRequest.js +0 -0
  1019. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuTypeRequest.d.ts +0 -0
  1020. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuTypeRequest.js +0 -0
  1021. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateScopeRequest.d.ts +0 -0
  1022. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateScopeRequest.js +0 -0
  1023. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDto.d.ts +0 -0
  1024. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDto.js +0 -0
  1025. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDtoStatoRegistrazione.d.ts +0 -0
  1026. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDtoStatoRegistrazione.js +0 -0
  1027. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsDto.d.ts +0 -0
  1028. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsDto.js +0 -0
  1029. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsResponse.d.ts +0 -0
  1030. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsResponse.js +0 -0
  1031. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/verifyTwoFactorRequest.d.ts +0 -0
  1032. /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/verifyTwoFactorRequest.js +0 -0
  1033. /package/dist/{accessi-module/Console → accessi-service/console}/help.d.ts +0 -0
  1034. /package/dist/{accessi-module/Console → accessi-service/console}/help.js +0 -0
  1035. /package/dist/{accessi-module/Console → accessi-service/console}/index.html +0 -0
  1036. /package/dist/{accessi-module/Console → accessi-service/console}/wiki.d.ts +0 -0
  1037. /package/dist/{accessi-module/Controllers → accessi-service/controllers}/AccessiConsoleController.d.ts +0 -0
  1038. /package/dist/{accessi-module → accessi-service}/database-updates/AccessiCatalogMigrator.d.ts +0 -0
  1039. /package/dist/{accessi-module → accessi-service}/database-updates/AccessiCatalogMigrator.js +0 -0
  1040. /package/dist/{accessi-module → accessi-service}/database-updates/AccessiDatabaseUpdater.d.ts +0 -0
  1041. /package/dist/{accessi-module → accessi-service}/database-updates/AccessiDatabaseUpdater.js +0 -0
  1042. /package/dist/{accessi-module → accessi-service}/database-updates/accessiOptionsFromEnv.d.ts +0 -0
  1043. /package/dist/{accessi-module → accessi-service}/database-updates/accessiSchema.d.ts +0 -0
  1044. /package/dist/{accessi-module → accessi-service}/database-updates/accessiSchema.js +0 -0
  1045. /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeed.d.ts +0 -0
  1046. /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeed.js +0 -0
  1047. /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeeder.d.ts +0 -0
  1048. /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeeder.js +0 -0
  1049. /package/dist/{accessi-module → accessi-service}/database-updates/optionalColumns.d.ts +0 -0
  1050. /package/dist/{accessi-module → accessi-service}/database-updates/optionalColumns.js +0 -0
  1051. /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiCatalogMigrations.d.ts +0 -0
  1052. /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiCatalogMigrations.js +0 -0
  1053. /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiDbUpdate.d.ts +0 -0
  1054. /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiDbUpdate.js +0 -0
  1055. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Abilitazione.d.ts +0 -0
  1056. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Abilitazione.js +0 -0
  1057. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AbilitazioneMenu.d.ts +0 -0
  1058. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AbilitazioneMenu.js +0 -0
  1059. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AdminBootstrapDtos.d.ts +0 -0
  1060. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AdminBootstrapDtos.js +0 -0
  1061. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignPermissionsToUserRequest.d.ts +0 -0
  1062. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignPermissionsToUserRequest.js +0 -0
  1063. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignRolesToUserRequest.d.ts +0 -0
  1064. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignRolesToUserRequest.js +0 -0
  1065. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuditDtos.d.ts +0 -0
  1066. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuditDtos.js +0 -0
  1067. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuthenticatedUserPayloadDto.d.ts +0 -0
  1068. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuthenticatedUserPayloadDto.js +0 -0
  1069. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/BaseResponse.d.ts +0 -0
  1070. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/BaseResponse.js +0 -0
  1071. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/CatalogDtos.d.ts +0 -0
  1072. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/CatalogDtos.js +0 -0
  1073. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConfirmResetPasswordRequest.d.ts +0 -0
  1074. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConfirmResetPasswordRequest.js +0 -0
  1075. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConsoleEntryDtos.d.ts +0 -0
  1076. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConsoleEntryDtos.js +0 -0
  1077. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedExchangeDtos.d.ts +0 -0
  1078. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedExchangeDtos.js +0 -0
  1079. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedIdentityDtos.d.ts +0 -0
  1080. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedIdentityDtos.js +0 -0
  1081. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FiltriUtente.d.ts +0 -0
  1082. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FiltriUtente.js +0 -0
  1083. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetGroupsWithMenusResponse.d.ts +0 -0
  1084. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetGroupsWithMenusResponse.js +0 -0
  1085. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetMenusResponse.d.ts +0 -0
  1086. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetMenusResponse.js +0 -0
  1087. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetRolesResponse.d.ts +0 -0
  1088. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetRolesResponse.js +0 -0
  1089. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenRequest.d.ts +0 -0
  1090. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenRequest.js +0 -0
  1091. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenResponse.d.ts +0 -0
  1092. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenResponse.js +0 -0
  1093. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUsersResponse.d.ts +0 -0
  1094. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUsersResponse.js +0 -0
  1095. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/IntrospectionDtos.d.ts +0 -0
  1096. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/IntrospectionDtos.js +0 -0
  1097. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginAsDtos.d.ts +0 -0
  1098. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginAsDtos.js +0 -0
  1099. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginRequest.d.ts +0 -0
  1100. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginRequest.js +0 -0
  1101. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginResponse.d.ts +0 -0
  1102. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginResponse.js +0 -0
  1103. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/MenuItem.d.ts +0 -0
  1104. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/MenuItem.js +0 -0
  1105. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Permission.d.ts +0 -0
  1106. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Permission.js +0 -0
  1107. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/PublicRegisterRequest.d.ts +0 -0
  1108. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/PublicRegisterRequest.js +0 -0
  1109. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RefreshTokenDtos.d.ts +0 -0
  1110. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RefreshTokenDtos.js +0 -0
  1111. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterRequest.d.ts +0 -0
  1112. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterRequest.js +0 -0
  1113. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterResponse.d.ts +0 -0
  1114. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterResponse.js +0 -0
  1115. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RevokeTokenRequest.d.ts +0 -0
  1116. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RevokeTokenRequest.js +0 -0
  1117. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Role.d.ts +0 -0
  1118. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Role.js +0 -0
  1119. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RuoliMenu.d.ts +0 -0
  1120. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RuoliMenu.js +0 -0
  1121. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SchemaDtos.d.ts +0 -0
  1122. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SchemaDtos.js +0 -0
  1123. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ScopeDtos.d.ts +0 -0
  1124. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ScopeDtos.js +0 -0
  1125. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SendResetPasswordEmailRequest.d.ts +0 -0
  1126. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SendResetPasswordEmailRequest.js +0 -0
  1127. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ServiceToken.d.ts +0 -0
  1128. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ServiceToken.js +0 -0
  1129. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetStatoRegistrazione.d.ts +0 -0
  1130. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetStatoRegistrazione.js +0 -0
  1131. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetUserPasswordRequest.d.ts +0 -0
  1132. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetUserPasswordRequest.js +0 -0
  1133. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/StatoRegistrazione.d.ts +0 -0
  1134. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/StatoRegistrazione.js +0 -0
  1135. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoAbilitazione.d.ts +0 -0
  1136. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoAbilitazione.js +0 -0
  1137. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoFiltro.d.ts +0 -0
  1138. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoFiltro.js +0 -0
  1139. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TokenResult.d.ts +0 -0
  1140. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TokenResult.js +0 -0
  1141. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TwoFactorDtos.d.ts +0 -0
  1142. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TwoFactorDtos.js +0 -0
  1143. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UpdateEnabledStatusRequest.d.ts +0 -0
  1144. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UpdateEnabledStatusRequest.js +0 -0
  1145. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserDto.d.ts +0 -0
  1146. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserDto.js +0 -0
  1147. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsDto.d.ts +0 -0
  1148. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsDto.js +0 -0
  1149. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsResponse.d.ts +0 -0
  1150. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsResponse.js +0 -0
  1151. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/index.d.ts +0 -0
  1152. /package/dist/{accessi-module/Dtos → accessi-service/dtos}/index.js +0 -0
  1153. /package/dist/{accessi-module → accessi-service}/federated-auth/FederatedAuthTypes.js +0 -0
  1154. /package/dist/{accessi-module → accessi-service}/health/nest.d.ts +0 -0
  1155. /package/dist/{accessi-module → accessi-service}/health/nest.js +0 -0
  1156. /package/dist/{accessi-module → accessi-service}/health/readiness.d.ts +0 -0
  1157. /package/dist/{accessi-module → accessi-service}/health/readiness.js +0 -0
  1158. /package/dist/{accessi-module → accessi-service}/middleware/accessiRequirements.d.ts +0 -0
  1159. /package/dist/{accessi-module → accessi-service}/middleware/accessiRequirements.js +0 -0
  1160. /package/dist/{accessi-module → accessi-service}/observability/metrics.d.ts +0 -0
  1161. /package/dist/{accessi-module → accessi-service}/observability/redisMetrics.d.ts +0 -0
  1162. /package/dist/{accessi-module → accessi-service}/observability/redisMetrics.js +0 -0
  1163. /package/dist/{accessi-module → accessi-service}/security/AccessiHttpExceptionFilter.d.ts +0 -0
  1164. /package/dist/{accessi-module → accessi-service}/security/AccessiHttpExceptionFilter.js +0 -0
  1165. /package/dist/{accessi-module → accessi-service}/security/accessControl.d.ts +0 -0
  1166. /package/dist/{accessi-module → accessi-service}/security/accessControl.js +0 -0
  1167. /package/dist/{accessi-module → accessi-service}/security/accessTokenRevocation.d.ts +0 -0
  1168. /package/dist/{accessi-module → accessi-service}/security/accessTokenRevocation.js +0 -0
  1169. /package/dist/{accessi-module → accessi-service}/security/accessiValidation.d.ts +0 -0
  1170. /package/dist/{accessi-module → accessi-service}/security/accessiValidation.js +0 -0
  1171. /package/dist/{accessi-module → accessi-service}/security/adminBootstrap.d.ts +0 -0
  1172. /package/dist/{accessi-module → accessi-service}/security/adminBootstrap.js +0 -0
  1173. /package/dist/{accessi-module → accessi-service}/security/auditSinks.d.ts +0 -0
  1174. /package/dist/{accessi-module → accessi-service}/security/auditSinks.js +0 -0
  1175. /package/dist/{accessi-module → accessi-service}/security/authCookies.d.ts +0 -0
  1176. /package/dist/{accessi-module → accessi-service}/security/authCookies.js +0 -0
  1177. /package/dist/{accessi-module → accessi-service}/security/consoleEntry.d.ts +0 -0
  1178. /package/dist/{accessi-module → accessi-service}/security/consoleEntry.js +0 -0
  1179. /package/dist/{accessi-module → accessi-service}/security/edgeRateLimit.d.ts +0 -0
  1180. /package/dist/{accessi-module → accessi-service}/security/edgeRateLimit.js +0 -0
  1181. /package/dist/{accessi-module → accessi-service}/security/emailConfiguration.d.ts +0 -0
  1182. /package/dist/{accessi-module → accessi-service}/security/emailConfiguration.js +0 -0
  1183. /package/dist/{accessi-module → accessi-service}/security/jwks.d.ts +0 -0
  1184. /package/dist/{accessi-module → accessi-service}/security/jwks.js +0 -0
  1185. /package/dist/{accessi-module → accessi-service}/security/jwksBootstrap.d.ts +0 -0
  1186. /package/dist/{accessi-module → accessi-service}/security/jwksBootstrap.js +0 -0
  1187. /package/dist/{accessi-module → accessi-service}/security/jwtTokenOptions.d.ts +0 -0
  1188. /package/dist/{accessi-module → accessi-service}/security/jwtTokenOptions.js +0 -0
  1189. /package/dist/{accessi-module → accessi-service}/security/loginAs.d.ts +0 -0
  1190. /package/dist/{accessi-module → accessi-service}/security/loginAs.js +0 -0
  1191. /package/dist/{accessi-module → accessi-service}/security/passwordPolicy.d.ts +0 -0
  1192. /package/dist/{accessi-module → accessi-service}/security/passwordPolicy.js +0 -0
  1193. /package/dist/{accessi-module → accessi-service}/security/passwordResetToken.d.ts +0 -0
  1194. /package/dist/{accessi-module → accessi-service}/security/passwordResetToken.js +0 -0
  1195. /package/dist/{accessi-module → accessi-service}/security/publicAuthRateLimit.d.ts +0 -0
  1196. /package/dist/{accessi-module → accessi-service}/security/publicAuthRateLimit.js +0 -0
  1197. /package/dist/{accessi-module → accessi-service}/security/rateLimitStore.d.ts +0 -0
  1198. /package/dist/{accessi-module → accessi-service}/security/rateLimitStore.js +0 -0
  1199. /package/dist/{accessi-module → accessi-service}/security/refreshTokenRotation.d.ts +0 -0
  1200. /package/dist/{accessi-module → accessi-service}/security/refreshTokenRotation.js +0 -0
  1201. /package/dist/{accessi-module → accessi-service}/security/securityHeaders.d.ts +0 -0
  1202. /package/dist/{accessi-module → accessi-service}/security/securityHeaders.js +0 -0
  1203. /package/dist/{accessi-module → accessi-service}/security/serviceTokenRateLimit.d.ts +0 -0
  1204. /package/dist/{accessi-module → accessi-service}/security/serviceTokenRateLimit.js +0 -0
  1205. /package/dist/{accessi-module → accessi-service}/security/sessionRevocation.d.ts +0 -0
  1206. /package/dist/{accessi-module → accessi-service}/security/sessionRevocation.js +0 -0
  1207. /package/dist/{accessi-module → accessi-service}/security/validateOptions.d.ts +0 -0
  1208. /package/dist/{accessi-module → accessi-service}/security/validateOptions.js +0 -0
  1209. /package/dist/{accessi-module/Services/ConfiguratorService → accessi-service/services/configurator-service}/ConfiguratorService.d.ts +0 -0
  1210. /package/dist/{accessi-module/Services/ConfiguratorService → accessi-service/services/configurator-service}/ConfiguratorService.js +0 -0
  1211. /package/dist/{accessi-module/Services/EmailService → accessi-service/services/email-service}/EmailService.d.ts +0 -0
  1212. /package/dist/{accessi-module/Services/SchemaExportService → accessi-service/services/schema-export-service}/SchemaExportService.d.ts +0 -0
  1213. /package/dist/{accessi-module/Services/SchemaExportService → accessi-service/services/schema-export-service}/SchemaExportService.js +0 -0
  1214. /package/dist/{accessi-module/Services/ServiceTokenService → accessi-service/services/service-token-service}/ServiceTokenService.d.ts +0 -0
  1215. /package/dist/{accessi-module/Services/ServiceTokenService → accessi-service/services/service-token-service}/ServiceTokenService.js +0 -0
  1216. /package/dist/{accessi-module → accessi-service}/startupLog.d.ts +0 -0
  1217. /package/dist/{accessi-module → accessi-service}/startupLog.js +0 -0
  1218. /package/dist/{accessi-module/Views → accessi-service/views}/reset-password.html +0 -0
  1219. /package/dist/allegati-module/{Dtos → dtos}/AllegatoDto.d.ts +0 -0
  1220. /package/dist/allegati-module/{Dtos → dtos}/AllegatoDto.js +0 -0
  1221. /package/dist/allegati-module/{Dtos → dtos}/BaseResponse.d.ts +0 -0
  1222. /package/dist/allegati-module/{Dtos → dtos}/BaseResponse.js +0 -0
  1223. /package/dist/allegati-module/{Dtos → dtos}/UploadSingleFileRequest.d.ts +0 -0
  1224. /package/dist/allegati-module/{Dtos → dtos}/UploadSingleFileRequest.js +0 -0
  1225. /package/dist/allegati-module/{Dtos → dtos}/index.d.ts +0 -0
  1226. /package/dist/allegati-module/{Dtos → dtos}/index.js +0 -0
  1227. /package/dist/allegati-module/{Dtos → dtos}/responses/DownloadAllegatoResponseDto.d.ts +0 -0
  1228. /package/dist/allegati-module/{Dtos → dtos}/responses/DownloadAllegatoResponseDto.js +0 -0
  1229. /package/dist/allegati-module/{Dtos → dtos}/responses/GetListResponse.d.ts +0 -0
  1230. /package/dist/allegati-module/{Dtos → dtos}/responses/GetListResponse.js +0 -0
  1231. /package/dist/allegati-module/{Dtos → dtos}/responses/UploadAllegatoResponseDto.d.ts +0 -0
  1232. /package/dist/allegati-module/{Dtos → dtos}/responses/UploadAllegatoResponseDto.js +0 -0
  1233. /package/dist/allegati-module/{Services/AllegatiService → services/allegati-service}/AllegatiService.js +0 -0
  1234. /package/dist/{firebird-compat.d.ts → firebirdCompat.d.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"consoleEntry.js","sourceRoot":"","sources":["../../../src/accessi-module/security/consoleEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'crypto';\nimport { instrumentAccessiRedisClient } from '../observability/redisMetrics';\n\n/**\n * Ticket di ingresso alla console, monouso e a breve scadenza.\n *\n * Serve a passare una sessione gia autenticata (frontend che possiede un JWT Accessi)\n * alla console amministrativa senza reinserire le credenziali e senza mettere il JWT\n * nell'URL: il frontend scambia il proprio JWT con un ticket opaco, apre la console\n * con `#entry=<ticket>` e la console lo scambia con il token originale.\n *\n * Il ticket e valido una sola volta, per pochi secondi, ed e legato all'utente che\n * lo ha richiesto (che deve avere accesso alla console). Lo store di default e in\n * memoria; in multi-istanza usare `createRedisConsoleEntryStore`.\n */\n\nexport interface ConsoleEntryRecord {\n token: string;\n codiceUtente: number;\n}\n\nexport interface ConsoleEntryTicket {\n ticket: string;\n expiresInSeconds: number;\n}\n\n/** Store pluggable: memoria per single instance, Redis per multi-istanza. */\nexport interface ConsoleEntryStore {\n issue(record: ConsoleEntryRecord, ttlMs: number): Promise<ConsoleEntryTicket>;\n consume(ticket: string): Promise<ConsoleEntryRecord | null>;\n /** Health check opzionale per readiness del servizio. */\n healthCheck?(): Promise<boolean>;\n}\n\nconst DEFAULT_TTL_MS = 60_000;\nconst DEFAULT_MAX_ENTRIES = 5000;\nconst TICKET_PATTERN = /^[a-f0-9]{64}$/i;\n\ninterface StoredEntry extends ConsoleEntryRecord {\n expiresAt: number;\n}\n\n/** Store in memoria con API sincrona per retrocompatibilita e API async per l'interfaccia. */\nexport interface MemoryConsoleEntryStore extends ConsoleEntryStore {\n issueSync(record: ConsoleEntryRecord, ttlMs?: number): ConsoleEntryTicket;\n consumeSync(ticket: string): ConsoleEntryRecord | null;\n clear(): void;\n}\n\nfunction createTicket(): string {\n return randomBytes(32).toString('hex');\n}\n\nfunction normalizeTtl(ttlMs: number): number {\n return Math.max(1, Math.trunc(ttlMs));\n}\n\n/** Store in memoria: adatto a sviluppo e a una singola istanza. */\nexport function createMemoryConsoleEntryStore(\n maxEntries: number = DEFAULT_MAX_ENTRIES,\n): MemoryConsoleEntryStore {\n const entries = new Map<string, StoredEntry>();\n\n const sweep = (now: number): void => {\n for (const [ticket, record] of entries) {\n if (record.expiresAt <= now) entries.delete(ticket);\n }\n };\n\n const issueSync = (record: ConsoleEntryRecord, ttlMs: number = DEFAULT_TTL_MS): ConsoleEntryTicket => {\n // Il TTL negativo resta supportato per test e per il comportamento storico:\n // il ticket e immediatamente scaduto.\n const ttl = Math.trunc(ttlMs);\n const now = Date.now();\n sweep(now);\n\n while (entries.size >= maxEntries) {\n const oldest = entries.keys().next().value;\n if (oldest === undefined) break;\n entries.delete(oldest);\n }\n\n const ticket = createTicket();\n entries.set(ticket, { ...record, expiresAt: now + ttl });\n return { ticket, expiresInSeconds: Math.max(0, Math.ceil(ttl / 1000)) };\n };\n\n const consumeSync = (ticket: string): ConsoleEntryRecord | null => {\n if (typeof ticket !== 'string' || !TICKET_PATTERN.test(ticket)) {\n return null;\n }\n const record = entries.get(ticket);\n if (!record) return null;\n entries.delete(ticket);\n if (record.expiresAt <= Date.now()) return null;\n return { token: record.token, codiceUtente: record.codiceUtente };\n };\n\n return {\n issueSync,\n consumeSync,\n clear: () => entries.clear(),\n async issue(record, ttlMs) {\n return issueSync(record, ttlMs);\n },\n async consume(ticket) {\n return consumeSync(ticket);\n },\n async healthCheck() {\n return true;\n },\n };\n}\n\nconst defaultStore = createMemoryConsoleEntryStore();\n\n/** Store di default in memoria, usato quando `AccessiOptions.consoleEntry.store` non e configurato. */\nexport function getDefaultConsoleEntryStore(): ConsoleEntryStore {\n return defaultStore;\n}\n\n// Funzioni storiche sincrone: mantengono il comportamento per test e consumer esistenti.\nexport function issueConsoleEntryTicket(\n record: ConsoleEntryRecord,\n ttlMs: number = DEFAULT_TTL_MS,\n): ConsoleEntryTicket {\n return defaultStore.issueSync(record, ttlMs);\n}\n\nexport function consumeConsoleEntryTicket(ticket: unknown): ConsoleEntryRecord | null {\n return typeof ticket === 'string' ? defaultStore.consumeSync(ticket) : null;\n}\n\n/** Solo per i test: azzera lo store in memoria di default. */\nexport function clearConsoleEntryTickets(): void {\n defaultStore.clear();\n}\n\n/** Client Redis minimale: compatibile con ioredis (`redis.eval(script, numKeys, ...args)`). */\nexport interface ConsoleEntryRedisClient {\n eval(script: string, numKeys: number, ...args: Array<string | number>): Promise<unknown>;\n}\n\nexport interface RedisConsoleEntryStoreOptions {\n client: ConsoleEntryRedisClient;\n /** Segreto per cifrare il JWT nel Redis. Non usare il JWT in chiaro. */\n encryptionKey: string | Buffer;\n /** Default: `accessi:console-entry:`. */\n keyPrefix?: string;\n /** Tentativi in caso di collisione del ticket. Default: 5. */\n maxIssueAttempts?: number;\n}\n\nconst SET_SCRIPT = \"return redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2], 'NX')\";\nconst CONSUME_SCRIPT =\n \"local value = redis.call('GET', KEYS[1]) if value then redis.call('DEL', KEYS[1]) end return value\";\n\nfunction deriveEncryptionKey(secret: string | Buffer): Buffer {\n const source = Buffer.isBuffer(secret) ? secret : Buffer.from(secret, 'utf8');\n if (source.length === 0) {\n throw new Error('Redis console entry encryptionKey non configurata.');\n }\n return source.length === 32 ? source : createHash('sha256').update(source).digest();\n}\n\nfunction encryptRecord(record: ConsoleEntryRecord, key: Buffer): string {\n const iv = randomBytes(12);\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(JSON.stringify(record), 'utf8'),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n return [iv, tag, ciphertext].map((part) => part.toString('base64url')).join('.');\n}\n\nfunction decryptRecord(value: string, key: Buffer): ConsoleEntryRecord | null {\n const [ivPart, tagPart, ciphertextPart] = value.split('.');\n if (!ivPart || !tagPart || !ciphertextPart) return null;\n try {\n const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(ivPart, 'base64url'));\n decipher.setAuthTag(Buffer.from(tagPart, 'base64url'));\n const plaintext = Buffer.concat([\n decipher.update(Buffer.from(ciphertextPart, 'base64url')),\n decipher.final(),\n ]).toString('utf8');\n const parsed: unknown = JSON.parse(plaintext);\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n typeof (parsed as ConsoleEntryRecord).token !== 'string' ||\n typeof (parsed as ConsoleEntryRecord).codiceUtente !== 'number'\n ) {\n return null;\n }\n return parsed as ConsoleEntryRecord;\n } catch {\n return null;\n }\n}\n\n/**\n * Store Redis per ticket console.\n *\n * - il JWT viene cifrato con AES-256-GCM prima di essere scritto;\n * - `SET ... PX ... NX` evita collisioni;\n * - il consume usa `GET` + `DEL` atomici in Lua, quindi il ticket e monouso\n * anche con piu istanze.\n */\nexport function createRedisConsoleEntryStore(\n options: RedisConsoleEntryStoreOptions,\n): ConsoleEntryStore {\n if (!options?.client || typeof options.client.eval !== 'function') {\n throw new Error('Redis console entry store: client.eval non configurato.');\n }\n\n const key = deriveEncryptionKey(options.encryptionKey);\n const keyPrefix = (options.keyPrefix ?? 'accessi:console-entry:').replace(/:+$/, ':');\n const maxAttempts = Math.max(1, options.maxIssueAttempts ?? 5);\n const client = instrumentAccessiRedisClient('console_entry', options.client);\n\n return {\n async issue(record, ttlMs) {\n const safeTtl = normalizeTtl(ttlMs);\n const value = encryptRecord(record, key);\n\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n const ticket = createTicket();\n const result = await client.eval(\n SET_SCRIPT,\n 1,\n `${keyPrefix}${ticket}`,\n value,\n safeTtl,\n );\n if (result) {\n return { ticket, expiresInSeconds: Math.ceil(safeTtl / 1000) };\n }\n }\n\n throw new Error('Impossibile emettere un ticket console univoco.');\n },\n\n async consume(ticket) {\n if (typeof ticket !== 'string' || !TICKET_PATTERN.test(ticket)) {\n return null;\n }\n const value = await client.eval(\n CONSUME_SCRIPT,\n 1,\n `${keyPrefix}${ticket}`,\n );\n if (typeof value !== 'string') return null;\n return decryptRecord(value, key);\n },\n\n async healthCheck() {\n try {\n const result = await client.eval(\"return redis.call('PING')\", 0);\n return String(result).toUpperCase() === 'PONG';\n } catch {\n return false;\n }\n },\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"edgeRateLimit.js","sourceRoot":"","sources":["../../../src/accessi-module/security/edgeRateLimit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NextFunction, Request, Response } from 'express';\nimport { auditAccessi } from './audit';\nimport { getDefaultRateLimitStore } from './rateLimitStore';\nimport type { RateLimitStore } from './rateLimitStore';\nimport { recordAccessiMetric } from '../observability/metrics';\n\n/** Opzioni del limite grossolano per IP applicato davanti alle rotte Accessi. */\nexport interface AccessiEdgeRateLimitOptions {\n /** Default: true quando l'oggetto viene configurato. */\n enabled?: boolean;\n /** Finestra del limite. Default: 60000 ms. */\n windowMs?: number;\n /** Richieste consentite per IP nella finestra. Default: 300. */\n maxAttempts?: number;\n /** Store condiviso. Default: memoria. */\n store?: RateLimitStore;\n /** Prefisso delle chiavi. Default: `edge`. */\n keyPrefix?: string;\n /** Audit strutturato degli eventi di blocco. Default: true. */\n audit?: boolean;\n /**\n * Decide se applicare il limite alla richiesta.\n *\n * Default: `/api` e `/api/*`. Il bootstrap Accessi passa un matcher che include\n * anche OpenAPI e JWKS.\n */\n match?: (path: string, req: Request) => boolean;\n}\n\nexport type AccessiEdgeRateLimitMiddleware = (\n req: Request,\n res: Response,\n next: NextFunction,\n) => Promise<void>;\n\nconst DEFAULT_WINDOW_MS = 60_000;\nconst DEFAULT_MAX_ATTEMPTS = 300;\n\nfunction defaultMatch(path: string): boolean {\n return path === '/api' || path.startsWith('/api/');\n}\n\n/**\n * Middleware edge per Accessi Service.\n *\n * Non sostituisce il rate limit applicativo per account: aggiunge una soglia\n * grossolana per IP, utile contro bot e floods prima che la richiesta raggiunga\n * controller, database o introspection.\n */\nexport function createAccessiEdgeRateLimitMiddleware(\n options: AccessiEdgeRateLimitOptions = {},\n): AccessiEdgeRateLimitMiddleware | undefined {\n if (options.enabled === false) return undefined;\n\n const windowMs = Math.max(1, Math.trunc(options.windowMs ?? DEFAULT_WINDOW_MS));\n const maxAttempts = Math.max(1, Math.trunc(options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS));\n const store = options.store ?? getDefaultRateLimitStore();\n const keyPrefix = (options.keyPrefix ?? 'edge').replace(/\\|+$/, '');\n const match = options.match ?? defaultMatch;\n\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n if (!match(req.path, req)) {\n next();\n return;\n }\n\n const ip = req.ip ?? req.socket?.remoteAddress ?? 'unknown';\n try {\n const decision = await store.consume(\n `${keyPrefix}|ip|${ip}`,\n windowMs,\n maxAttempts,\n );\n if (!decision.allowed) {\n recordAccessiMetric('accessi_rate_limit_blocked_total', 1, { layer: 'edge' });\n if (options.audit !== false) {\n auditAccessi('edge_rate_limited', {\n ip,\n path: req.path,\n retryAfterSeconds: decision.retryAfterSeconds,\n });\n }\n res.setHeader('Retry-After', String(decision.retryAfterSeconds));\n res.status(429).json({\n severity: 'error',\n status: 429,\n statusCode: 2,\n code: 'ACCESSI_EDGE_RATE_LIMITED',\n error: 'ACCESSI_EDGE_RATE_LIMITED',\n message: 'Troppe richieste. Riprova piu tardi.',\n });\n return;\n }\n next();\n } catch {\n recordAccessiMetric('accessi_store_errors_total', 1, { store: 'edge_rate_limit' });\n if (options.audit !== false) {\n auditAccessi('rate_limit_unavailable', { ip, path: req.path });\n }\n res.status(503).json({\n severity: 'error',\n status: 503,\n statusCode: 2,\n code: 'ACCESSI_RATE_LIMIT_UNAVAILABLE',\n error: 'ACCESSI_RATE_LIMIT_UNAVAILABLE',\n message: 'Rate limit non disponibile. Riprova piu tardi.',\n });\n }\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"emailConfiguration.js","sourceRoot":"","sources":["../../../src/accessi-module/security/emailConfiguration.ts"],"names":[],"mappings":";;;AA0BA,8CAKC;AAGD,sDAIC;AAtCD,2CAAqD;AAGrD,sFAAsF;AACzE,QAAA,4BAA4B,GAAG,8BAA8B,CAAC;AAE3E;;;;GAIG;AACH,MAAa,8BAA+B,SAAQ,4BAAmB;IACrE,IAAW,IAAI;QACb,OAAO,oCAA4B,CAAC;IACtC,CAAC;IAED,YAAY,OAAO,GAAG,qHAAqH;QACzI,KAAK,CAAC,EAAE,IAAI,EAAE,oCAA4B,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AATD,wEASC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,OAAuB;IACvD,MAAM,KAAK,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAA8D,CAAC;IACtF,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;WAC5D,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAClE,CAAC;AAED,uFAAuF;AACvF,SAAgB,qBAAqB,CAAC,OAAuB;IAC3D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,8BAA8B,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC","sourcesContent":["import { BadRequestException } from '@nestjs/common';\nimport type { AccessiOptions } from '../AccessiModule';\n\n/** Codice stabile usato nel contratto errore quando manca la configurazione email. */\nexport const ACCESSI_EMAIL_NOT_CONFIGURED = 'ACCESSI_EMAIL_NOT_CONFIGURED';\n\n/**\n * Errore sollevato quando un'operazione richiede l'invio di email (reset password, 2FA,\n * creazione utente) ma `AccessiOptions.emailOptions` non e configurato. E' una BadRequestException\n * con un `code` stabile, cosi il contratto HTTP risponde 400 con ACCESSI_EMAIL_NOT_CONFIGURED.\n */\nexport class AccessiEmailNotConfiguredError extends BadRequestException {\n public get code(): string {\n return ACCESSI_EMAIL_NOT_CONFIGURED;\n }\n\n constructor(message = 'Nessun servizio email configurato (AccessiOptions.emailOptions): impossibile inviare email di reset password o 2FA.') {\n super({ code: ACCESSI_EMAIL_NOT_CONFIGURED, message });\n this.name = 'AccessiEmailNotConfiguredError';\n }\n}\n\n/**\n * True se `emailOptions` contiene i campi minimi per inviare posta (host SMTP e mittente).\n * Non verifica la raggiungibilita del server: quella si scopre all'invio.\n */\nexport function isEmailConfigured(options: AccessiOptions): boolean {\n const email = options?.emailOptions as { host?: unknown; from?: unknown } | undefined;\n if (!email) return false;\n return typeof email.host === 'string' && email.host.trim() !== ''\n && typeof email.from === 'string' && email.from.trim() !== '';\n}\n\n/** Fail-fast utilizzato dal bootstrap e dalle operazioni che dipendono dalla posta. */\nexport function assertEmailConfigured(options: AccessiOptions): void {\n if (!isEmailConfigured(options)) {\n throw new AccessiEmailNotConfiguredError();\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwks.js","sourceRoot":"","sources":["../../../src/accessi-module/security/jwks.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, createPublicKey } from \"crypto\";\nimport type { JsonWebKey } from \"crypto\";\nimport type { Request, Response } from \"express\";\nimport type { AccessiOptions } from \"../AccessiModule\";\nimport { recordAccessiMetric } from '../observability/metrics';\n\n/** Chiave pubblica in formato JWK, pronta per una risposta JWKS. */\nexport type AccessiJwksKey = JsonWebKey & {\n kid: string;\n alg: string;\n use: \"sig\";\n};\n\nexport interface AccessiJwksDocument {\n keys: AccessiJwksKey[];\n}\n\nconst DEFAULT_JWKS_PATH = \"accessi/.well-known/jwks.json\";\n\nfunction normalizePath(value: string): string {\n return `/${value.replace(/^\\/+|\\/+$/g, \"\")}`;\n}\n\nfunction fingerprintPublicKey(publicKey: string | Buffer): string {\n const der = createPublicKey(publicKey).export({ type: \"spki\", format: \"der\" });\n return createHash(\"sha256\").update(der).digest(\"base64url\").slice(0, 16);\n}\n\nfunction toJwksKey(\n publicKey: string | Buffer,\n keyId: string | undefined,\n algorithm: string,\n): AccessiJwksKey {\n const jwk = createPublicKey(publicKey).export({ format: \"jwk\" }) as JsonWebKey;\n return {\n ...jwk,\n kid: keyId ?? fingerprintPublicKey(publicKey),\n alg: algorithm,\n use: \"sig\",\n };\n}\n\n/** Path pubblico della JWKS, oppure `undefined` quando si usa HS256. */\nexport function getAccessiJwksPath(options: AccessiOptions): string | undefined {\n const algorithm = options.jwtOptions.algorithm ?? \"HS256\";\n if (algorithm.startsWith(\"HS\")) return undefined;\n return normalizePath(options.jwtOptions.jwksPath ?? DEFAULT_JWKS_PATH);\n}\n\n/**\n * Costruisce la JWKS pubblica con chiave corrente e chiavi precedenti.\n *\n * Restituisce `null` per HS256 o quando non e configurata una chiave\n * pubblica/privata asimmetrica.\n */\nexport function buildAccessiJwks(options: AccessiOptions): AccessiJwksDocument | null {\n const algorithm = options.jwtOptions.algorithm ?? \"HS256\";\n if (algorithm.startsWith(\"HS\")) return null;\n\n const currentPublicKey = options.jwtOptions.publicKey ?? options.jwtOptions.privateKey;\n if (!currentPublicKey) return null;\n\n const keys: AccessiJwksKey[] = [\n toJwksKey(currentPublicKey, options.jwtOptions.keyId, algorithm),\n ];\n\n for (const previous of options.jwtOptions.previousPublicKeys ?? []) {\n const previousAlgorithm = previous.algorithm ?? algorithm;\n keys.push(toJwksKey(previous.publicKey, previous.keyId, previousAlgorithm));\n }\n\n // Deduplica per kid: la chiave corrente vince sulle precedenti.\n const unique = new Map<string, AccessiJwksKey>();\n for (const key of keys) {\n if (!unique.has(key.kid)) unique.set(key.kid, key);\n }\n\n return { keys: [...unique.values()] };\n}\n\n/** Handler Express per la JWKS. Risponde 404 se la configurazione e HS256. */\nexport function createAccessiJwksHandler(\n options: AccessiOptions,\n): (req: Request, res: Response) => Response | void {\n return (_req: Request, res: Response): Response | void => {\n const document = buildAccessiJwks(options);\n if (!document) {\n recordAccessiMetric('accessi_jwks_requests_total', 1, { result: 'unavailable' });\n return res.status(404).json({\n severity: \"error\",\n status: 404,\n statusCode: 2,\n code: \"ACCESSI_JWKS_NOT_AVAILABLE\",\n error: \"ACCESSI_JWKS_NOT_AVAILABLE\",\n message: \"JWKS non disponibile: Accessi usa HS256 o non ha una chiave asimmetrica.\",\n });\n }\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Cache-Control\", \"public, max-age=300\");\n recordAccessiMetric('accessi_jwks_requests_total', 1, { result: 'ok' });\n return res.status(200).send(document);\n };\n}\n\n/**\n * Monta la route JWKS sull'Express host.\n *\n * Per un'app Nest esistente passare `app.getHttpAdapter().getInstance()`.\n * Restituisce il path montato, oppure `undefined` se HS256.\n */\nexport interface AccessiJwksExpressApp {\n get(path: string, handler: (req: Request, res: Response) => unknown): unknown;\n}\n\nexport function setupAccessiJwks(\n app: AccessiJwksExpressApp,\n options: AccessiOptions,\n): string | undefined {\n const path = getAccessiJwksPath(options);\n if (!path) return undefined;\n app.get(path, createAccessiJwksHandler(options));\n return path;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwksBootstrap.js","sourceRoot":"","sources":["../../../src/accessi-module/security/jwksBootstrap.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkE;AAClE,uCAA+C;AAE/C,iCAA0C;AAG1C;;;;;GAKG;AAEI,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACtC,YAC8C,OAAuB,EAClD,WAA4B;QADD,YAAO,GAAP,OAAO,CAAgB;QAClD,gBAAW,GAAX,WAAW,CAAiB;IAC5C,CAAC;IAEJ,YAAY;;QACV,MAAM,QAAQ,GAAY,MAAA,MAAA,IAAI,CAAC,WAAW,CAAC,WAAW,0CAAE,WAAW,kDAAI,CAAC;QACxE,IAAI,QAAQ,IAAI,OAAQ,QAAkC,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9E,IAAA,uBAAgB,EAAC,QAAiC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAA;AAZY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;6CACI,sBAAe;GAHpC,2BAA2B,CAYvC","sourcesContent":["import { Inject, Injectable, OnModuleInit } from '@nestjs/common';\nimport { HttpAdapterHost } from '@nestjs/core';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { setupAccessiJwks } from './jwks';\nimport type { AccessiJwksExpressApp } from './jwks';\n\n/**\n * Monta automaticamente la JWKS sull'Express adapter di Nest.\n *\n * Serve sia ai bootstrap standalone sia a `AccessiModule.forRoot` in un'app\n * Nest ospitante, senza richiedere una chiamata manuale a `setupAccessiJwks`.\n */\n@Injectable()\nexport class AccessiJwksBootstrapService implements OnModuleInit {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly options: AccessiOptions,\n private readonly adapterHost: HttpAdapterHost,\n ) {}\n\n onModuleInit(): void {\n const instance: unknown = this.adapterHost.httpAdapter?.getInstance?.();\n if (instance && typeof (instance as AccessiJwksExpressApp).get === 'function') {\n setupAccessiJwks(instance as AccessiJwksExpressApp, this.options);\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwtTokenOptions.js","sourceRoot":"","sources":["../../../src/accessi-module/security/jwtTokenOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jwt from \"jsonwebtoken\";\nimport type { AccessiOptions } from \"../AccessiModule\";\nimport { getAccessiJwtSecret } from \"./passwordResetToken\";\nimport type { AccessiJwtPurpose } from \"./passwordResetToken\";\nimport { recordAccessiMetric } from \"../observability/metrics\";\nimport { auditAccessi } from \"./audit\";\n\n/** Algoritmi supportati per gli access token Accessi. */\nexport type AccessiAccessTokenAlgorithm =\n | \"HS256\"\n | \"HS384\"\n | \"HS512\"\n | \"RS256\"\n | \"RS384\"\n | \"RS512\"\n | \"ES256\"\n | \"ES384\"\n | \"ES512\";\n\n/**\n * Evento emesso quando un token presenta un `kid` che non appartiene né alla\n * chiave corrente né alle chiavi precedenti configurate.\n *\n * Serve per collegare un alert operativo (log, metrica, webhook) senza\n * accoppiare il modulo a uno specifico sistema di monitoraggio.\n */\nexport interface AccessiUnknownKeyIdEvent {\n keyId: string;\n algorithm?: string;\n /** `access` o `refresh`, per distinguere i token coinvolti. */\n purpose: AccessiJwtPurpose;\n}\n\n/** Configurazione di verifica con chiave corrente, chiavi precedenti e alert. */\nexport interface AccessiJwtVerificationConfig {\n /** Chiave corrente. Resta il campo principale per i consumer esistenti. */\n key: jwt.Secret;\n verifyOptions: jwt.VerifyOptions;\n /** Chiavi indicizzate per `kid`: la corrente vince sulle precedenti. */\n keysByKeyId: ReadonlyMap<string, jwt.Secret>;\n /** Chiavi provate per i token legacy privi di `kid`, corrente per prima. */\n fallbackKeys: readonly jwt.Secret[];\n purpose: AccessiJwtPurpose;\n onUnknownKeyId?: (event: AccessiUnknownKeyIdEvent) => void;\n}\n\nfunction resolveAlgorithm(options: AccessiOptions): AccessiAccessTokenAlgorithm {\n return options.jwtOptions.algorithm ?? \"HS256\";\n}\n\n/** Configurazione di firma: chiave, algoritmo e claim standard. */\nfunction getTokenSigningConfig(\n options: AccessiOptions,\n purpose: AccessiJwtPurpose,\n): {\n key: jwt.Secret;\n algorithm: AccessiAccessTokenAlgorithm;\n signOptions: Pick<jwt.SignOptions, \"issuer\" | \"audience\" | \"keyid\">;\n} {\n const algorithm = resolveAlgorithm(options);\n const key = algorithm.startsWith(\"HS\")\n ? getAccessiJwtSecret(options, purpose)\n : options.jwtOptions.privateKey;\n\n if (!key) {\n throw new Error(`jwtOptions.privateKey e obbligatoria per l'algoritmo ${algorithm}.`);\n }\n\n return {\n key,\n algorithm,\n signOptions: {\n ...(options.jwtOptions.issuer ? { issuer: options.jwtOptions.issuer } : {}),\n ...(options.jwtOptions.audience\n ? { audience: options.jwtOptions.audience as jwt.SignOptions[\"audience\"] }\n : {}),\n ...(options.jwtOptions.keyId ? { keyid: options.jwtOptions.keyId } : {}),\n },\n };\n}\n\n/**\n * Configurazione di verifica.\n *\n * Con algoritmi asimmetrici accetta anche le chiavi precedenti: un token\n * firmato prima di una rotazione resta valido finché la sua chiave pubblica\n * compare in `previousPublicKeys`. I token legacy senza `kid` vengono provati\n * su tutte le chiavi candidate, la corrente per prima.\n */\nfunction getTokenVerificationConfig(\n options: AccessiOptions,\n purpose: AccessiJwtPurpose,\n): AccessiJwtVerificationConfig {\n const algorithm = resolveAlgorithm(options);\n const key = algorithm.startsWith(\"HS\")\n ? getAccessiJwtSecret(options, purpose)\n : (options.jwtOptions.publicKey ?? options.jwtOptions.privateKey);\n\n if (!key) {\n throw new Error(\n `jwtOptions.publicKey e obbligatoria per verificare token ${algorithm}.`,\n );\n }\n\n const algorithms = new Set<string>([algorithm]);\n const keysByKeyId = new Map<string, jwt.Secret>();\n const fallbackKeys: jwt.Secret[] = [key];\n\n if (options.jwtOptions.keyId) {\n keysByKeyId.set(options.jwtOptions.keyId, key);\n }\n\n if (!algorithm.startsWith(\"HS\")) {\n for (const previous of options.jwtOptions.previousPublicKeys ?? []) {\n const previousAlgorithm = previous.algorithm ?? algorithm;\n algorithms.add(previousAlgorithm);\n fallbackKeys.push(previous.publicKey);\n if (previous.keyId && !keysByKeyId.has(previous.keyId)) {\n keysByKeyId.set(previous.keyId, previous.publicKey);\n }\n }\n }\n\n return {\n key,\n verifyOptions: {\n algorithms: [...algorithms] as jwt.Algorithm[],\n ...(options.jwtOptions.issuer ? { issuer: options.jwtOptions.issuer } : {}),\n ...(options.jwtOptions.audience\n ? { audience: options.jwtOptions.audience as jwt.VerifyOptions[\"audience\"] }\n : {}),\n },\n keysByKeyId,\n fallbackKeys,\n purpose,\n ...(options.jwtOptions.onUnknownKeyId\n ? { onUnknownKeyId: options.jwtOptions.onUnknownKeyId }\n : {}),\n };\n}\n\nfunction readTokenHeader(token: string): { keyId?: string; algorithm?: string } {\n const decoded = jwt.decode(token, { complete: true });\n if (!decoded || typeof decoded === \"string\" || !decoded.header) return {};\n const header = decoded.header as { kid?: unknown; alg?: unknown };\n return {\n ...(typeof header.kid === \"string\" && header.kid !== \"\" ? { keyId: header.kid } : {}),\n ...(typeof header.alg === \"string\" ? { algorithm: header.alg } : {}),\n };\n}\n\n/**\n * Chiavi da provare per un token.\n *\n * Un `kid` noto seleziona una sola chiave: non si ricade sulle altre, così un\n * token con intestazione manomessa non viene verificato per tentativi.\n */\nexport function resolveAccessiVerificationKeys(\n config: AccessiJwtVerificationConfig,\n token: string,\n): readonly jwt.Secret[] {\n const header = readTokenHeader(token);\n // Con HMAC il kid non partecipa alla crittografia: un kid cambiato non deve\n // invalidare token firmati con lo stesso segreto.\n const hmacOnly = (config.verifyOptions.algorithms ?? []).every((algorithm) =>\n String(algorithm).startsWith(\"HS\"),\n );\n if (!header.keyId || hmacOnly) return config.fallbackKeys;\n\n const key = config.keysByKeyId.get(header.keyId);\n if (key) return [key];\n\n config.onUnknownKeyId?.({\n keyId: header.keyId,\n ...(header.algorithm ? { algorithm: header.algorithm } : {}),\n purpose: config.purpose,\n });\n recordAccessiMetric('accessi_jwt_unknown_key_id_total', 1, {\n purpose: config.purpose,\n ...(header.algorithm ? { algorithm: header.algorithm } : {}),\n });\n auditAccessi('jwt_unknown_key_id', {\n kid: header.keyId,\n purpose: config.purpose,\n ...(header.algorithm ? { algorithm: header.algorithm } : {}),\n });\n return [];\n}\n\n/**\n * Verifica un JWT Accessi con la chiave corretta (corrente o precedente).\n *\n * Lancia l'errore di `jsonwebtoken` quando nessuna chiave candidata verifica il\n * token; per un `kid` sconosciuto lancia un errore dedicato dopo aver emesso\n * l'evento di alert.\n */\nexport function verifyAccessiJwt(token: string, config: AccessiJwtVerificationConfig): unknown {\n const keys = resolveAccessiVerificationKeys(config, token);\n if (keys.length === 0) {\n const { keyId } = readTokenHeader(token);\n throw new Error(`Chiave JWT sconosciuta per kid \"${keyId ?? \"assente\"}\".`);\n }\n\n let lastError: unknown;\n for (const key of keys) {\n try {\n return jwt.verify(token, key, config.verifyOptions);\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(\"Token JWT non valido.\");\n}\n\nexport function getAccessiAccessTokenSigningConfig(options: AccessiOptions) {\n return getTokenSigningConfig(options, \"access\");\n}\n\nexport function getAccessiAccessTokenVerificationConfig(options: AccessiOptions) {\n return getTokenVerificationConfig(options, \"access\");\n}\n\nexport function getAccessiRefreshTokenSigningConfig(options: AccessiOptions) {\n return getTokenSigningConfig(options, \"refresh\");\n}\n\nexport function getAccessiRefreshTokenVerificationConfig(options: AccessiOptions) {\n return getTokenVerificationConfig(options, \"refresh\");\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loginAs.js","sourceRoot":"","sources":["../../../src/accessi-module/security/loginAs.ts"],"names":[],"mappings":";;;AAUA,0CAiCC;AA3CD,2CAAqD;AAErD,gFAAgF;AACnE,QAAA,oBAAoB,GAAG,cAAc,CAAC;AAEnD;;;;GAIG;AACH,SAAgB,eAAe,CAAC,SAAiB,EAAE,KAAa;IAC9D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,4BAAmB,CAAC;YAC5B,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,gDAAgD;SAC1D,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,4BAAmB,CAAC;YAC5B,IAAI,EAAE,gCAAgC;YACtC,OAAO,EAAE,yCAAyC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,WAAM,CAAC;QACP,MAAM,IAAI,4BAAmB,CAAC;YAC5B,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,2EAA2E;SACrF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,4BAAmB,CAAC;YAC5B,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,gCAAgC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,4BAAoB,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["import { BadRequestException } from '@nestjs/common';\n\n/** Nome del query parameter usato dalle applicazioni per consumare il token. */\nexport const LOGIN_AS_QUERY_PARAM = 'loginAsToken';\n\n/**\n * Combina l'URL dell'applicazione con il token di accesso temporaneo.\n * Accetta solo URL assoluti http/https: evita schemi come javascript: o data:\n * che verrebbero restituiti alla console come link cliccabile.\n */\nexport function buildLoginAsUrl(targetUrl: string, token: string): string {\n if (typeof targetUrl !== 'string' || targetUrl.trim() === '') {\n throw new BadRequestException({\n code: 'ACCESSI_LOGIN_AS_INVALID_URL',\n message: 'Indica l URL dell applicazione a cui accedere.',\n });\n }\n if (typeof token !== 'string' || token.trim() === '') {\n throw new BadRequestException({\n code: 'ACCESSI_LOGIN_AS_INVALID_TOKEN',\n message: 'Token di accesso temporaneo non valido.',\n });\n }\n\n let parsed: URL;\n try {\n parsed = new URL(targetUrl.trim());\n } catch {\n throw new BadRequestException({\n code: 'ACCESSI_LOGIN_AS_INVALID_URL',\n message: 'L URL deve essere assoluto e valido, per esempio https://app.example.com.',\n });\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new BadRequestException({\n code: 'ACCESSI_LOGIN_AS_INVALID_URL',\n message: 'L URL deve usare http o https.',\n });\n }\n\n parsed.searchParams.set(LOGIN_AS_QUERY_PARAM, token);\n return parsed.toString();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"passwordPolicy.js","sourceRoot":"","sources":["../../../src/accessi-module/security/passwordPolicy.ts"],"names":[],"mappings":";;;AAgCA,0EAsBC;AAOD,oDAWC;AAxED,2CAAqD;AAErD,kDAAkD;AACrC,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC,kFAAkF;AACrE,QAAA,kBAAkB,GAAG,uBAAuB,CAAC;AAO1D;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IAC1E,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY;IAC1E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU;IACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU;IACxE,SAAS,EAAE,cAAc;CAC1B,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAgB,+BAA+B,CAC7C,QAAiB,EACjB,UAAiC,EAAE;;IAEnC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,2BAAmB,CAAC;IAC3D,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,2BAAmB,CAAC;IAC3D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,UAAU,SAAS,YAAY,CAAC,CAAC;IAClF,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS;QAAE,UAAU,CAAC,IAAI,CAAC,cAAc,SAAS,YAAY,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACpF,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAE7F,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,QAAiB,EAAE,OAA+B;IACrF,MAAM,UAAU,GAAG,+BAA+B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,4BAAmB,CAAC;QAC5B,IAAI,EAAE,0BAAkB;QACxB,OAAO,EAAE,+DAA+D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAChG,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { BadRequestException } from '@nestjs/common';\n\n/** Lunghezze canoniche della password Accessi. */\nexport const PASSWORD_MIN_LENGTH = 8;\nexport const PASSWORD_MAX_LENGTH = 100;\n\n/** Codice errore stabile restituito quando la password non rispetta la policy. */\nexport const WEAK_PASSWORD_CODE = 'ACCESSI_WEAK_PASSWORD';\n\nexport interface PasswordPolicyOptions {\n minLength?: number;\n maxLength?: number;\n}\n\n/**\n * Password comuni o banalmente prevedibili rifiutate anche se rispettano la\n * complessita. Confronto case-insensitive; elenco volutamente piccolo e senza\n * dipendenze esterne.\n */\nconst COMMON_PASSWORDS = new Set([\n 'password', 'password1', 'password123', 'passw0rd', 'p@ssw0rd', 'p@ssword',\n '12345678', '123456789', '1234567890', 'qwerty', 'qwerty123', 'qwertyuiop',\n 'admin', 'admin123', 'administrator', 'letmein', 'welcome', 'welcome1',\n 'iloveyou', 'abc12345', 'a1b2c3d4', 'monkey123', 'dragon123', 'changeme',\n 'accessi', 'emilsoftware',\n]);\n\n/**\n * Restituisce l'elenco leggibile delle violazioni della policy password.\n * Policy: lunghezza, maiuscola, minuscola, cifra, carattere speciale, nessuno\n * spazio, non comune.\n */\nexport function collectPasswordPolicyViolations(\n password: unknown,\n options: PasswordPolicyOptions = {},\n): string[] {\n if (typeof password !== 'string' || password.length === 0) {\n return ['La password e obbligatoria.'];\n }\n\n const minLength = options.minLength ?? PASSWORD_MIN_LENGTH;\n const maxLength = options.maxLength ?? PASSWORD_MAX_LENGTH;\n const violations: string[] = [];\n\n if (password.length < minLength) violations.push(`almeno ${minLength} caratteri`);\n if (password.length > maxLength) violations.push(`al massimo ${maxLength} caratteri`);\n if (/\\s/.test(password)) violations.push('nessuno spazio');\n if (!/[A-Z]/.test(password)) violations.push('almeno una lettera maiuscola');\n if (!/[a-z]/.test(password)) violations.push('almeno una lettera minuscola');\n if (!/\\d/.test(password)) violations.push('almeno una cifra');\n if (!/[^A-Za-z0-9]/.test(password)) violations.push('almeno un carattere speciale');\n if (COMMON_PASSWORDS.has(password.toLowerCase())) violations.push('una password non comune');\n\n return violations;\n}\n\n/**\n * Valida la password secondo la policy moderna e, se non conforme, solleva un\n * `BadRequestException` con codice `ACCESSI_WEAK_PASSWORD` e l'elenco dei\n * requisiti mancanti. Da usare solo quando si IMPOSTA una password, mai al login.\n */\nexport function assertStrongPassword(password: unknown, options?: PasswordPolicyOptions): void {\n const violations = collectPasswordPolicyViolations(password, options);\n if (violations.length === 0) {\n return;\n }\n\n throw new BadRequestException({\n code: WEAK_PASSWORD_CODE,\n message: `La password non rispetta i requisiti di sicurezza: richiede ${violations.join(', ')}.`,\n details: violations,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"passwordResetToken.js","sourceRoot":"","sources":["../../../src/accessi-module/security/passwordResetToken.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,kDAOC;AAGD,4DAqBC;AAGD,4DAeC;AApED,kDAAoC;AACpC,mCAAoC;AAGpC,mHAAmH;AACtG,QAAA,iCAAiC,GAAG,IAAI,CAAC;AAUtD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,OAAuB,EAAE,UAA6B,QAAQ;;IAChG,MAAM,MAAM,GAAG,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,0CAAE,MAAM,KAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,eAAe,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxF,CAAC;AAED,oHAAoH;AACpH,SAAgB,wBAAwB,CACtC,YAAoB,EACpB,KAAa,EACb,MAAc,EACd,YAA0C,yCAAiC;IAE3E,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CACb;QACE,KAAK;QACL,GAAG,EAAE,gBAAgB;KACtB,EACD,MAAM,EACN;QACE,OAAO,EAAE,GAAG,YAAY,EAAE;QAC1B,SAAS;KACV,CACF,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAgB,wBAAwB,CACtC,KAAa,EACb,MAAc;IAEd,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAA8B,CAAC;IAClG,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAC,CAAC;IAE1C,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,MAAK,gBAAgB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,CAAA,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1J,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,YAAY;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC;AACJ,CAAC","sourcesContent":["import * as jwt from 'jsonwebtoken';\nimport { createHmac } from 'crypto';\nimport type { AccessiOptions } from '../AccessiModule';\n\n/** Durata predefinita del token di reset. La monouso e garantita anche dal nonce persistito in `UTENTI.KEYREG`. */\nexport const DEFAULT_PASSWORD_RESET_EXPIRES_IN = '1h';\n\ninterface PasswordResetTokenPayload extends jwt.JwtPayload {\n nonce: string;\n typ: 'password-reset';\n}\n\n/** Scopo della chiave derivata: separa le chiavi di access token, reset password e 2FA. */\nexport type AccessiJwtPurpose = 'access' | 'refresh' | 'reset' | '2fa';\n\n/**\n * Deriva una chiave JWT per scopo dal segreto configurato (key separation senza nuova configurazione).\n * Un leak della chiave di reset non compromette gli access token e viceversa.\n */\nexport function getAccessiJwtSecret(options: AccessiOptions, purpose: AccessiJwtPurpose = 'access'): string {\n const secret = options?.jwtOptions?.secret || process.env.ACC_JWT_SECRET;\n if (!secret) {\n throw new Error('JWT secret non configurato.');\n }\n\n return createHmac('sha256', secret).update(`accessi:jwt:${purpose}:v1`).digest('hex');\n}\n\n/** Crea un token firmato contenente solo codice utente e nonce; non inserire email o dati personali nelle claim. */\nexport function createPasswordResetToken(\n codiceUtente: number,\n nonce: string,\n secret: string,\n expiresIn: jwt.SignOptions['expiresIn'] = DEFAULT_PASSWORD_RESET_EXPIRES_IN,\n): string {\n if (!codiceUtente || !nonce) {\n throw new Error('Dati insufficienti per generare il reset token.');\n }\n\n return jwt.sign(\n {\n nonce,\n typ: 'password-reset',\n },\n secret,\n {\n subject: `${codiceUtente}`,\n expiresIn,\n },\n );\n}\n\n/** Verifica firma e scadenza, quindi restituisce i dati minimi necessari al reset. */\nexport function verifyPasswordResetToken(\n token: string,\n secret: string,\n): { codiceUtente: number; nonce: string } {\n const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] }) as PasswordResetTokenPayload;\n const codiceUtente = Number(decoded?.sub);\n\n if (decoded?.typ !== 'password-reset' || !Number.isSafeInteger(codiceUtente) || codiceUtente <= 0 || typeof decoded?.nonce !== 'string' || !decoded.nonce) {\n throw new Error('Token di reset non valido.');\n }\n\n return {\n codiceUtente,\n nonce: decoded.nonce,\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"publicAuthRateLimit.js","sourceRoot":"","sources":["../../../src/accessi-module/security/publicAuthRateLimit.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpException, HttpStatus } from '@nestjs/common';\nimport { Request, Response } from 'express';\nimport { RestUtilities } from '../../Utilities';\nimport type { AccessiOptions, PublicAuthRateLimitRuleOptions } from '../AccessiModule';\nimport { getDefaultRateLimitStore } from './rateLimitStore';\nimport type { RateLimitDecision, RateLimitStore } from './rateLimitStore';\nimport { countAccessiMetric } from '../observability/metrics';\nimport { auditAccessi } from './audit';\n\nexport type PublicAuthRateLimitScope =\n | 'login'\n | 'twoFactorVerify'\n | 'twoFactorResend'\n | 'register'\n | 'passwordResetEmail'\n | 'passwordResetConfirm'\n | 'refresh'\n | 'getUserByToken'\n | 'adminBootstrap'\n | 'consoleEntry';\n\nconst DEFAULT_PUBLIC_AUTH_RATE_LIMITS: Record<\n PublicAuthRateLimitScope,\n PublicAuthRateLimitRuleOptions\n> = {\n login: { windowMs: 15 * 60 * 1000, maxAttempts: 10 },\n twoFactorVerify: { windowMs: 15 * 60 * 1000, maxAttempts: 20 },\n twoFactorResend: { windowMs: 15 * 60 * 1000, maxAttempts: 5 },\n register: { windowMs: 60 * 60 * 1000, maxAttempts: 5 },\n passwordResetEmail: { windowMs: 60 * 60 * 1000, maxAttempts: 5 },\n passwordResetConfirm: { windowMs: 15 * 60 * 1000, maxAttempts: 10 },\n refresh: { windowMs: 5 * 60 * 1000, maxAttempts: 60 },\n getUserByToken: { windowMs: 5 * 60 * 1000, maxAttempts: 30 },\n adminBootstrap: { windowMs: 15 * 60 * 1000, maxAttempts: 10 },\n consoleEntry: { windowMs: 5 * 60 * 1000, maxAttempts: 30 },\n};\n\nfunction getRule(\n options: AccessiOptions,\n scope: PublicAuthRateLimitScope,\n): PublicAuthRateLimitRuleOptions {\n const configuredRule = options.publicAuthRateLimit?.[scope];\n\n if (\n configuredRule &&\n Number.isFinite(configuredRule.windowMs) &&\n configuredRule.windowMs > 0 &&\n Number.isFinite(configuredRule.maxAttempts) &&\n configuredRule.maxAttempts > 0\n ) {\n return {\n windowMs: Math.trunc(configuredRule.windowMs),\n maxAttempts: Math.trunc(configuredRule.maxAttempts),\n };\n }\n\n return DEFAULT_PUBLIC_AUTH_RATE_LIMITS[scope];\n}\n\nasync function consumeRateLimit(\n store: RateLimitStore,\n key: string,\n rule: PublicAuthRateLimitRuleOptions,\n): Promise<RateLimitDecision> {\n try {\n return await store.consume(key, rule.windowMs, rule.maxAttempts);\n } catch {\n throw new HttpException(\n {\n code: 'ACCESSI_RATE_LIMIT_UNAVAILABLE',\n message: 'Rate limit non disponibile. Riprova piu tardi.',\n },\n HttpStatus.SERVICE_UNAVAILABLE,\n );\n }\n}\n\nfunction normalizeIdentifier(identifier: string): string | null {\n if (typeof identifier !== 'string') {\n return null;\n }\n\n const normalized = identifier.trim().toLowerCase();\n return normalized === '' ? null : normalized;\n}\n\n/**\n * Applica il rate limit per IP e, opzionalmente, per soggetto.\n *\n * Con `publicAuthRateLimit.store` e possibile usare uno store Redis condiviso;\n * senza store usa la memoria del processo.\n */\nexport async function checkPublicAuthRateLimit(\n options: AccessiOptions,\n scope: PublicAuthRateLimitScope,\n req: Request,\n identifiers: string[] = [],\n): Promise<RateLimitDecision> {\n if (options.publicAuthRateLimit?.enabled === false) {\n return { allowed: true, retryAfterSeconds: 0 };\n }\n\n const rule = getRule(options, scope);\n const store = options.publicAuthRateLimit?.store ?? getDefaultRateLimitStore();\n const ipAddress =\n normalizeIdentifier(req.ip ?? req.socket?.remoteAddress ?? 'unknown') ?? 'unknown';\n\n // Consuma prima il bucket per IP: se gia bloccato non crea bucket per soggetto,\n // evitando crescita di memoria con identificatori sempre diversi.\n const ipDecision = await consumeRateLimit(store, `${scope}|ip|${ipAddress}`, rule);\n if (!ipDecision.allowed) {\n countAccessiMetric(options, 'rate_limit_blocked_total', { scope, layer: 'public' });\n auditAccessi('public_rate_limited', {\n scope,\n ip: ipAddress,\n retryAfterSeconds: ipDecision.retryAfterSeconds,\n });\n return ipDecision;\n }\n\n let retryAfterSeconds = 0;\n for (const identifier of identifiers) {\n const normalizedIdentifier = normalizeIdentifier(identifier);\n if (!normalizedIdentifier) {\n continue;\n }\n\n const subjectDecision = await consumeRateLimit(\n store,\n `${scope}|ip-subject|${ipAddress}|${normalizedIdentifier}`,\n rule,\n );\n if (!subjectDecision.allowed) {\n retryAfterSeconds = Math.max(retryAfterSeconds, subjectDecision.retryAfterSeconds);\n }\n }\n\n if (retryAfterSeconds > 0) {\n countAccessiMetric(options, 'rate_limit_blocked_total', { scope, layer: 'public' });\n auditAccessi('public_rate_limited', { scope, ip: ipAddress, retryAfterSeconds });\n return { allowed: false, retryAfterSeconds };\n }\n\n return { allowed: true, retryAfterSeconds: 0 };\n}\n\nexport function sendPublicAuthRateLimitExceeded(\n res: Response,\n retryAfterSeconds: number,\n): Response {\n res.setHeader('Retry-After', String(retryAfterSeconds));\n return RestUtilities.sendErrorMessage(\n res,\n 'Troppi tentativi. Riprova piu tardi.',\n 'PublicAuthRateLimit',\n HttpStatus.TOO_MANY_REQUESTS,\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rateLimitStore.js","sourceRoot":"","sources":["../../../src/accessi-module/security/rateLimitStore.ts"],"names":[],"mappings":"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","sourcesContent":["/** Esito di un controllo di rate limit. */\nexport interface RateLimitDecision {\n allowed: boolean;\n retryAfterSeconds: number;\n}\n\n/** Store pluggable per rate limit: memoria per singola istanza, Redis per cluster. */\nexport interface RateLimitStore {\n consume(key: string, windowMs: number, maxAttempts: number): Promise<RateLimitDecision>;\n /** Health check opzionale per readiness del servizio. */\n healthCheck?(): Promise<boolean>;\n}\n\nexport interface MemoryRateLimitStore extends RateLimitStore {\n reset(): void;\n}\n\ninterface RateLimitBucket {\n count: number;\n resetAt: number;\n lastSeenAt: number;\n}\n\nconst DEFAULT_MAX_BUCKETS = 20_000;\n\nfunction normalizeLimits(windowMs: number, maxAttempts: number): { windowMs: number; maxAttempts: number } {\n return {\n windowMs: Math.max(1, Math.trunc(windowMs)),\n maxAttempts: Math.max(1, Math.trunc(maxAttempts)),\n };\n}\n\n/** Store in memoria con finestra fissa e limite di bucket. */\nexport function createMemoryRateLimitStore(\n maxBuckets: number = DEFAULT_MAX_BUCKETS,\n): MemoryRateLimitStore {\n const buckets = new Map<string, RateLimitBucket>();\n const safeMaxBuckets = Math.max(1, Math.trunc(maxBuckets));\n\n const prune = (now: number): void => {\n if (buckets.size < safeMaxBuckets) return;\n for (const [key, bucket] of buckets) {\n if (bucket.resetAt <= now) buckets.delete(key);\n }\n };\n\n const enforceCap = (): void => {\n while (buckets.size >= safeMaxBuckets) {\n let oldestKey: string | undefined;\n let oldestSeen = Number.POSITIVE_INFINITY;\n for (const [key, bucket] of buckets) {\n if (bucket.lastSeenAt < oldestSeen) {\n oldestSeen = bucket.lastSeenAt;\n oldestKey = key;\n }\n }\n if (oldestKey === undefined) return;\n buckets.delete(oldestKey);\n }\n };\n\n return {\n async consume(key: string, windowMs: number, maxAttempts: number): Promise<RateLimitDecision> {\n const limits = normalizeLimits(windowMs, maxAttempts);\n const now = Date.now();\n prune(now);\n\n const existing = buckets.get(key);\n if (!existing || existing.resetAt <= now) {\n enforceCap();\n buckets.set(key, {\n count: 1,\n resetAt: now + limits.windowMs,\n lastSeenAt: now,\n });\n return { allowed: true, retryAfterSeconds: 0 };\n }\n\n existing.lastSeenAt = now;\n if (existing.count >= limits.maxAttempts) {\n return {\n allowed: false,\n retryAfterSeconds: Math.max(1, Math.ceil((existing.resetAt - now) / 1000)),\n };\n }\n\n existing.count += 1;\n return { allowed: true, retryAfterSeconds: 0 };\n },\n reset() {\n buckets.clear();\n },\n async healthCheck() {\n return true;\n },\n };\n}\n\nconst defaultStore = createMemoryRateLimitStore();\n\n/** Store di default in memoria, usato quando non viene configurato uno store condiviso. */\nexport function getDefaultRateLimitStore(): MemoryRateLimitStore {\n return defaultStore;\n}\n\nimport { instrumentAccessiRedisClient } from '../observability/redisMetrics';\n\n/** Client Redis minimale: compatibile con ioredis (`redis.eval(script, numKeys, ...args)`). */\nexport interface RateLimitRedisClient {\n eval(script: string, numKeys: number, ...args: Array<string | number>): Promise<unknown>;\n}\n\nexport interface RedisRateLimitStoreOptions {\n client: RateLimitRedisClient;\n /** Default: `accessi:rate:`. */\n keyPrefix?: string;\n}\n\nconst REDIS_SCRIPT = `\nlocal current = redis.call('INCR', KEYS[1])\nif current == 1 then\n redis.call('PEXPIRE', KEYS[1], ARGV[1])\nend\nlocal ttl = redis.call('PTTL', KEYS[1])\nif current > tonumber(ARGV[2]) then\n return {0, ttl}\nend\nreturn {1, ttl}\n`;\n\n/**\n * Store Redis per rate limit distribuito.\n *\n * Usa `INCR` + `PEXPIRE` atomici. Adatto a login, reset password, 2FA,\n * console entry e service token in deployment multi-istanza.\n */\nexport function createRedisRateLimitStore(\n options: RedisRateLimitStoreOptions,\n): RateLimitStore {\n if (!options?.client || typeof options.client.eval !== 'function') {\n throw new Error('Redis rate limit store: client.eval non configurato.');\n }\n\n const keyPrefix = (options.keyPrefix ?? 'accessi:rate:').replace(/:+$/, ':');\n const client = instrumentAccessiRedisClient('rate_limit', options.client);\n\n return {\n async consume(key, windowMs, maxAttempts) {\n const limits = normalizeLimits(windowMs, maxAttempts);\n const raw = await client.eval(\n REDIS_SCRIPT,\n 1,\n `${keyPrefix}${key}`,\n limits.windowMs,\n limits.maxAttempts,\n );\n\n if (!Array.isArray(raw) || raw.length < 2) {\n throw new Error('Redis rate limit store: risposta non valida.');\n }\n\n const allowed = Number(raw[0]) === 1;\n const ttlMs = Number(raw[1]);\n return {\n allowed,\n retryAfterSeconds: allowed\n ? 0\n : Math.max(1, Number.isFinite(ttlMs) && ttlMs > 0 ? Math.ceil(ttlMs / 1000) : 1),\n };\n },\n async healthCheck() {\n try {\n const result = await client.eval(\"return redis.call('PING')\", 0);\n return String(result).toUpperCase() === 'PONG';\n } catch {\n return false;\n }\n },\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"refreshTokenRotation.js","sourceRoot":"","sources":["../../../src/accessi-module/security/refreshTokenRotation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccessiOptions } from '../AccessiModule';\nimport { instrumentAccessiRedisClient } from '../observability/redisMetrics';\n\n/**\n * Store di rotazione refresh token.\n *\n * `consume` e atomico: restituisce true una sola volta per `jti`, poi il token\n * e considerato usato fino alla sua scadenza. In multi-istanza usare Redis.\n */\nexport interface RefreshTokenRotationStore {\n consume(jti: string, expiresAtMs: number): Promise<boolean>;\n /**\n * Come `consume`, ma restituisce anche quando il token era gia stato\n * consumato: serve a distinguere un retry concorrente da un possibile furto.\n */\n consumeWithMetadata?(jti: string, expiresAtMs: number): Promise<RefreshTokenConsumeResult>;\n /** Revoca l'intera famiglia di refresh token (stesso login). */\n revokeFamily?(familyId: string, expiresAtMs: number): Promise<void>;\n /** True se la famiglia e stata revocata per riuso sospetto. */\n isFamilyRevoked?(familyId: string): Promise<boolean>;\n /** Health check opzionale per readiness del servizio. */\n healthCheck?(): Promise<boolean>;\n}\n\n/** Esito del consumo atomico di un refresh token. */\nexport interface RefreshTokenConsumeResult {\n consumed: boolean;\n /** Quando il token era gia stato consumato, il timestamp del primo consumo. */\n consumedAtMs?: number;\n}\n\nexport interface RefreshTokenRotationOptions {\n /** Default: disabilitata se non viene fornito uno store. */\n enabled?: boolean;\n /** Store condiviso (es. Redis) per il monouso tra istanze. */\n store?: RefreshTokenRotationStore;\n /**\n * Finestra entro cui il riuso di un token appena consumato e trattato come\n * retry concorrente (nessuna revoca famiglia). Default: 10000 ms.\n */\n reuseGraceMs?: number;\n /**\n * Se true, dopo un riuso rilevato revoca anche tutte le sessioni utente.\n * Default: false, per non disconnettere dispositivi legittimi.\n */\n revokeUserSessionsOnReuse?: boolean;\n}\n\nexport interface MemoryRefreshTokenRotationStore extends RefreshTokenRotationStore {\n clear(): void;\n}\n\nconst CONSUME_SCRIPT = `\nlocal ttl = tonumber(ARGV[2])\nif not ttl or ttl <= 0 then return nil end\nlocal stored = redis.call('GET', KEYS[1])\nif not stored then\n redis.call('SET', KEYS[1], ARGV[1], 'PX', ttl)\n return {1, 0}\nend\nreturn {0, tonumber(stored) or 0}\n`;\nconst REVOKE_FAMILY_SCRIPT =\n \"if tonumber(ARGV[1]) > 0 then return redis.call('SET', KEYS[1], '1', 'PX', ARGV[1]) else return redis.call('SET', KEYS[1], '1') end\";\nconst IS_FAMILY_REVOKED_SCRIPT = \"return redis.call('EXISTS', KEYS[1])\";\n\nfunction parseConsumeResult(result: unknown): RefreshTokenConsumeResult {\n if (Array.isArray(result)) {\n const consumed = Number(result[0]) === 1 || result[0] === true;\n const consumedAtMs = Number(result[1]);\n return {\n consumed,\n ...(Number.isFinite(consumedAtMs) && consumedAtMs > 0 ? { consumedAtMs } : {}),\n };\n }\n // Client minimali (o store precedenti) rispondono 'OK' / null.\n return { consumed: result !== null && result !== undefined && result !== false };\n}\n\nexport function createMemoryRefreshTokenRotationStore(): MemoryRefreshTokenRotationStore {\n const used = new Map<string, { expiresAtMs: number; consumedAtMs: number }>();\n const revokedFamilies = new Map<string, number>();\n\n const prune = (now: number) => {\n for (const [jti, entry] of used) {\n if (entry.expiresAtMs <= now) used.delete(jti);\n }\n for (const [familyId, expiresAt] of revokedFamilies) {\n if (expiresAt <= now) revokedFamilies.delete(familyId);\n }\n };\n\n const consumeWithMetadata = async (\n jti: string,\n expiresAtMs: number,\n ): Promise<RefreshTokenConsumeResult> => {\n const now = Date.now();\n prune(now);\n const existing = used.get(jti);\n if (existing && existing.expiresAtMs > now) {\n return { consumed: false, consumedAtMs: existing.consumedAtMs };\n }\n used.set(jti, { expiresAtMs, consumedAtMs: now });\n return { consumed: true };\n };\n\n return {\n async consume(jti, expiresAtMs) {\n return (await consumeWithMetadata(jti, expiresAtMs)).consumed;\n },\n consumeWithMetadata,\n async revokeFamily(familyId, expiresAtMs) {\n revokedFamilies.set(familyId, Math.max(expiresAtMs, Date.now() + 1));\n },\n async isFamilyRevoked(familyId) {\n const expiresAt = revokedFamilies.get(familyId);\n if (expiresAt === undefined) return false;\n if (expiresAt <= Date.now()) {\n revokedFamilies.delete(familyId);\n return false;\n }\n return true;\n },\n async healthCheck() {\n return true;\n },\n clear() {\n used.clear();\n revokedFamilies.clear();\n },\n };\n}\n\nexport interface RefreshTokenRotationRedisClient {\n eval(script: string, numKeys: number, ...args: Array<string | number>): Promise<unknown>;\n}\n\nexport interface RedisRefreshTokenRotationStoreOptions {\n client: RefreshTokenRotationRedisClient;\n /** Default: `accessi:refresh-used:`. */\n keyPrefix?: string;\n /** Default: `accessi:refresh-family-revoked:`. */\n familyKeyPrefix?: string;\n}\n\n/**\n * Store Redis per refresh token monouso.\n *\n * Il consumo e atomico: due refresh concorrenti dello stesso token producono\n * un solo successo. La famiglia viene revocata con una chiave separata che\n * scade insieme ai token che ne fanno parte.\n */\nexport function createRedisRefreshTokenRotationStore(\n options: RedisRefreshTokenRotationStoreOptions,\n): RefreshTokenRotationStore {\n if (!options?.client || typeof options.client.eval !== 'function') {\n throw new Error('Redis refresh rotation store: client.eval non configurato.');\n }\n\n const keyPrefix = (options.keyPrefix ?? 'accessi:refresh-used:').replace(/:+$/, ':');\n const familyKeyPrefix = (options.familyKeyPrefix ?? 'accessi:refresh-family-revoked:').replace(/:+$/, ':');\n const client = instrumentAccessiRedisClient('refresh_token_rotation', options.client);\n\n return {\n async consume(jti, expiresAtMs) {\n const ttlMs = Math.max(1, Math.trunc(expiresAtMs - Date.now()));\n const result = await client.eval(\n CONSUME_SCRIPT,\n 1,\n `${keyPrefix}${jti}`,\n Date.now(),\n ttlMs,\n );\n return parseConsumeResult(result).consumed;\n },\n\n async consumeWithMetadata(jti, expiresAtMs) {\n const ttlMs = Math.max(1, Math.trunc(expiresAtMs - Date.now()));\n const result = await client.eval(\n CONSUME_SCRIPT,\n 1,\n `${keyPrefix}${jti}`,\n Date.now(),\n ttlMs,\n );\n return parseConsumeResult(result);\n },\n\n async revokeFamily(familyId, expiresAtMs) {\n const ttlMs = Math.max(0, Math.trunc(expiresAtMs - Date.now()));\n await client.eval(REVOKE_FAMILY_SCRIPT, 1, `${familyKeyPrefix}${familyId}`, ttlMs);\n },\n\n async isFamilyRevoked(familyId) {\n const result = await client.eval(IS_FAMILY_REVOKED_SCRIPT, 1, `${familyKeyPrefix}${familyId}`);\n return Number(result) > 0;\n },\n\n async healthCheck() {\n try {\n const result = await client.eval(\"return redis.call('PING')\", 0);\n return String(result).toUpperCase() === 'PONG';\n } catch {\n return false;\n }\n },\n };\n}\n\nconst defaultMemoryStore = createMemoryRefreshTokenRotationStore();\n\nexport function getRefreshTokenRotationStore(\n options: AccessiOptions,\n): RefreshTokenRotationStore | undefined {\n if (options.refreshTokenRotation?.enabled === false) return undefined;\n if (options.refreshTokenRotation?.store) return options.refreshTokenRotation.store;\n return options.refreshTokenRotation?.enabled === true ? defaultMemoryStore : undefined;\n}\n\n/**\n * True se la famiglia di refresh token e stata revocata. Ritorna false se lo\n * store non supporta le famiglie (implementazioni legacy).\n */\nexport async function isRefreshTokenFamilyRevoked(\n options: AccessiOptions,\n familyId: unknown,\n): Promise<boolean> {\n if (typeof familyId !== 'string' || familyId.trim() === '') return false;\n const store = getRefreshTokenRotationStore(options);\n if (!store?.isFamilyRevoked) return false;\n return store.isFamilyRevoked(familyId);\n}\n\n/**\n * Revoca la famiglia di refresh token fino alla scadenza indicata. Ritorna\n * false se lo store non supporta le famiglie.\n */\nexport async function revokeRefreshTokenFamily(\n options: AccessiOptions,\n familyId: string,\n expiresAtMs: number,\n): Promise<boolean> {\n const store = getRefreshTokenRotationStore(options);\n if (!store?.revokeFamily) return false;\n await store.revokeFamily(familyId, expiresAtMs);\n return true;\n}\n\n/** Consumo atomico con metadati, se lo store li supporta. */\nexport async function consumeRefreshToken(\n options: AccessiOptions,\n jti: string,\n expiresAtMs: number,\n): Promise<RefreshTokenConsumeResult | undefined> {\n const store = getRefreshTokenRotationStore(options);\n if (!store) return undefined;\n if (store.consumeWithMetadata) {\n return store.consumeWithMetadata(jti, expiresAtMs);\n }\n return { consumed: await store.consume(jti, expiresAtMs) };\n}\n\n/** Solo per test: azzera lo store in memoria di default. */\nexport function clearDefaultRefreshTokenRotations(): void {\n defaultMemoryStore.clear();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"securityHeaders.js","sourceRoot":"","sources":["../../../src/accessi-module/security/securityHeaders.ts"],"names":[],"mappings":";;AA2EA,sEAyBC;AAoCD,8EAsCC;AAGD,8EAeC;AAGD,0EAQC;AASD,wFAwBC;AA5KD,MAAM,QAAQ,GAAG;IACf,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,aAAa;IAC7B,iBAAiB,EAAE,0CAA0C;IAC7D,YAAY,EAAE,qBAAqB;CAC3B,CAAC;AAEX;;;GAGG;AACH,SAAgB,6BAA6B,CAC3C,OAAkD;;IAElD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,OAAO,GAAkC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACxG,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAEhD,MAAM,GAAG,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC1C,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,YAAY,mCAAI,QAAQ,CAAC,YAAY,CAAC;QACnG,cAAc,EAAE,OAAO,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,cAAc,mCAAI,QAAQ,CAAC,cAAc,CAAC;QAC3G,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,KAAK,KAAK;YACpD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,iBAAiB,mCAAI,QAAQ,CAAC,iBAAiB,CAAC;QAC7D,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,YAAY,mCAAI,QAAQ,CAAC,YAAY,CAAC;QACnG,qBAAqB,EAAE,GAAG,KAAK,KAAK,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,MAAK,KAAK;YAC5D,CAAC,CAAC,KAAK;YACP,CAAC,+BACG,UAAU,EAAE,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,MAAK,IAAI,IACjC,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,SAAS,EAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACvD,UAAU,EAAE,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,mCAAI,EAAE,EACjC,UAAU,EAAE,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,mCAAI,EAAE,EACjC,mBAAmB,EAAE,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,mBAAmB,MAAK,KAAK,GACxD;KACN,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB;IAC1C,QAAQ,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,YAAY,CAAC;QAClB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAyB;IAC5C,aAAa,EAAE,CAAC,QAAQ,CAAC;IACzB,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,aAAa,EAAE,CAAC,QAAQ,CAAC;IACzB,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,WAAW,EAAE,CAAC,QAAQ,CAAC;IACvB,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,aAAa,EAAE,CAAC,QAAQ,CAAC;CAC1B,CAAC;AAEF,SAAS,MAAM,CAAC,UAAgC,EAAE,IAAY;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iCAAiC,CAC/C,QAAwC,EACxC,OAA0B,EAC1B,UAAqD,EAAE;;IAEvD,MAAM,GAAG,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5D,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC1B,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAA,OAAO,CAAC,UAAU,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrH,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;IAE5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,UAAU,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC5D,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACpF,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;;YACxC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,GAAG,CAAC,SAAS;QAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAE9D,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAK,KAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;SAClE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,uEAAuE;AACvE,SAAgB,iCAAiC,CAC/C,GAAgC,EAChC,QAAwC,EACxC,OAA0B,EAC1B,UAAqD,EAAE;IAEvD,MAAM,GAAG,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,MAAM,GAAG,iCAAiC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,GAAG,CAAC,SAAS,CACX,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,yBAAyB,EAClF,MAAM,CACP,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8DAA8D;AAC9D,SAAgB,+BAA+B,CAC7C,GAAgC,EAChC,QAAwC;IAExC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,YAAY;QAAE,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnF,IAAI,QAAQ,CAAC,cAAc;QAAE,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvF,IAAI,QAAQ,CAAC,iBAAiB;QAAE,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAClG,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sCAAsC,CACpD,OAAkD,EAClD,cAAyC,EACzC,UAAuD,EAAE;IAEzD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;;QAC/D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,+BAA+B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAsB,CAAA,MAAA,OAAO,CAAC,WAAW,wDAAG,GAAG,CAAC,IAAI,CAAC;gBAChE,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;oBAC3C,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,KAAK,CAAC;YACZ,iCAAiC,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { NextFunction, Request, Response } from 'express';\n\n/** Direttive CSP personalizzabili; `false` rimuove la direttiva. */\nexport type AccessiCspDirectives = Record<string, string[] | false>;\n\n/** Opzioni della Content Security Policy di Accessi. */\nexport interface AccessiCspOptions {\n /** `false` disabilita solo la CSP, lasciando gli altri header. Default: abilitata. */\n enabled?: boolean;\n /** Invia `Content-Security-Policy-Report-Only` invece dell'header bloccante. */\n reportOnly?: boolean;\n /** Endpoint `report-uri` per la raccolta delle violazioni. */\n reportUri?: string;\n /** Origini aggiuntive per `connect-src`, es. API su un dominio diverso. */\n connectSrc?: string[];\n /**\n * Override delle direttive (vincono sui default). Per esempio\n * `{ \"img-src\": [\"'self'\", \"data:\", \"https:\"] }`.\n */\n directives?: AccessiCspDirectives;\n /**\n * La UI Swagger usa script e stili inline generati a runtime.\n * Default `true`: la CSP di OpenAPI include `'unsafe-inline'` solo lì.\n */\n swaggerUnsafeInline?: boolean;\n}\n\n/** Header di sicurezza applicati alle rotte Accessi. */\nexport interface AccessiSecurityHeadersOptions {\n /** `false` disabilita tutti gli header gestiti da Accessi. */\n enabled?: boolean;\n /** `X-Frame-Options`; `false` non lo invia. Default: `SAMEORIGIN`. */\n frameOptions?: string | false;\n /** `Referrer-Policy`; `false` non la invia. Default: `no-referrer`. */\n referrerPolicy?: string | false;\n /** `Permissions-Policy`; `false` non la invia. */\n permissionsPolicy?: string | false;\n /** `Cache-Control` della shell console. Default: `no-store, max-age=0`. */\n cacheControl?: string | false;\n /** CSP; `false` la disabilita. Default: abilitata. */\n contentSecurityPolicy?: false | AccessiCspOptions;\n}\n\nexport type AccessiSecurityHeadersSetting = boolean | AccessiSecurityHeadersOptions;\n\nexport interface ResolvedAccessiCsp {\n reportOnly: boolean;\n reportUri?: string;\n connectSrc: string[];\n directives: AccessiCspDirectives;\n swaggerUnsafeInline: boolean;\n}\n\nexport interface ResolvedAccessiSecurityHeaders {\n frameOptions: string;\n referrerPolicy: string;\n permissionsPolicy: string;\n cacheControl: string;\n contentSecurityPolicy: false | ResolvedAccessiCsp;\n}\n\n/** Superficie della risposta: cambia solo la CSP, non gli altri header. */\nexport type AccessiCspSurface = 'console' | 'openapi' | 'api';\n\nconst DEFAULTS = {\n frameOptions: 'SAMEORIGIN',\n referrerPolicy: 'no-referrer',\n permissionsPolicy: 'camera=(), microphone=(), geolocation=()',\n cacheControl: 'no-store, max-age=0',\n} as const;\n\n/**\n * Risolve la configurazione degli header. `undefined` e `true` equivalgono ai\n * default; `false` disabilita tutto. La forma booleana storica resta valida.\n */\nexport function resolveAccessiSecurityHeaders(\n setting: AccessiSecurityHeadersSetting | undefined,\n): ResolvedAccessiSecurityHeaders | undefined {\n if (setting === false) return undefined;\n const options: AccessiSecurityHeadersOptions = setting === true || setting === undefined ? {} : setting;\n if (options.enabled === false) return undefined;\n\n const csp = options.contentSecurityPolicy;\n return {\n frameOptions: options.frameOptions === false ? '' : (options.frameOptions ?? DEFAULTS.frameOptions),\n referrerPolicy: options.referrerPolicy === false ? '' : (options.referrerPolicy ?? DEFAULTS.referrerPolicy),\n permissionsPolicy: options.permissionsPolicy === false\n ? ''\n : (options.permissionsPolicy ?? DEFAULTS.permissionsPolicy),\n cacheControl: options.cacheControl === false ? '' : (options.cacheControl ?? DEFAULTS.cacheControl),\n contentSecurityPolicy: csp === false || csp?.enabled === false\n ? false\n : {\n reportOnly: csp?.reportOnly === true,\n ...(csp?.reportUri ? { reportUri: csp.reportUri } : {}),\n connectSrc: csp?.connectSrc ?? [],\n directives: csp?.directives ?? {},\n swaggerUnsafeInline: csp?.swaggerUnsafeInline !== false,\n },\n };\n}\n\nfunction frameAncestors(frameOptions: string): string {\n switch (frameOptions.toUpperCase()) {\n case 'DENY':\n return \"'none'\";\n case 'SAMEORIGIN':\n default:\n return \"'self'\";\n }\n}\n\nconst BASE_DIRECTIVES: AccessiCspDirectives = {\n 'default-src': [\"'self'\"],\n 'base-uri': [\"'none'\"],\n 'object-src': [\"'none'\"],\n 'form-action': [\"'self'\"],\n 'img-src': [\"'self'\", 'data:'],\n 'font-src': [\"'self'\"],\n 'style-src': [\"'self'\"],\n 'script-src': [\"'self'\"],\n 'connect-src': [\"'self'\"],\n};\n\nfunction listOf(directives: AccessiCspDirectives, name: string): string[] {\n const value = directives[name];\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Costruisce la CSP per la superficie richiesta.\n *\n * La console usa un nonce per i due script inline della shell; la UI Swagger\n * richiede `'unsafe-inline'` (documentato in `docs/security-headers.md`) e non\n * riceve mai il nonce della console.\n */\nexport function buildAccessiContentSecurityPolicy(\n resolved: ResolvedAccessiSecurityHeaders,\n surface: AccessiCspSurface,\n options: { nonce?: string; connectSrc?: string[] } = {},\n): string | undefined {\n const csp = resolved.contentSecurityPolicy;\n if (!csp) return undefined;\n\n const directives: AccessiCspDirectives = {};\n for (const [name, value] of Object.entries(BASE_DIRECTIVES)) {\n directives[name] = Array.isArray(value) ? [...value] : value;\n }\n if (resolved.frameOptions) {\n directives['frame-ancestors'] = [frameAncestors(resolved.frameOptions)];\n }\n\n const connectSrc = new Set([...listOf(directives, 'connect-src'), ...csp.connectSrc, ...(options.connectSrc ?? [])]);\n directives['connect-src'] = [...connectSrc];\n\n if (surface === 'console') {\n if (options.nonce) {\n directives['script-src'] = [...listOf(directives, 'script-src'), `'nonce-${options.nonce}'`];\n }\n } else if (surface === 'openapi' && csp.swaggerUnsafeInline) {\n directives['script-src'] = [...listOf(directives, 'script-src'), \"'unsafe-inline'\"];\n directives['style-src'] = [...listOf(directives, 'style-src'), \"'unsafe-inline'\"];\n }\n\n for (const [name, value] of Object.entries(csp.directives)) {\n if (value === false) delete directives[name];\n else directives[name] = [...value];\n }\n if (csp.reportUri) directives['report-uri'] = [csp.reportUri];\n\n return Object.entries(directives)\n .filter(([, value]) => value !== false && value.length > 0)\n .map(([name, value]) => `${name} ${(value as string[]).join(' ')}`)\n .join('; ');\n}\n\n/** Applica l'header CSP corretto per la superficie, se configurata. */\nexport function applyAccessiContentSecurityPolicy(\n res: Pick<Response, 'setHeader'>,\n resolved: ResolvedAccessiSecurityHeaders,\n surface: AccessiCspSurface,\n options: { nonce?: string; connectSrc?: string[] } = {},\n): string | undefined {\n const csp = resolved.contentSecurityPolicy;\n if (!csp) return undefined;\n const policy = buildAccessiContentSecurityPolicy(resolved, surface, options);\n if (!policy) return undefined;\n res.setHeader(\n csp.reportOnly ? 'Content-Security-Policy-Report-Only' : 'Content-Security-Policy',\n policy,\n );\n return policy;\n}\n\n/** Header comuni (frame, referrer, permessi) senza la CSP. */\nexport function applyAccessiBaseSecurityHeaders(\n res: Pick<Response, 'setHeader'>,\n resolved: ResolvedAccessiSecurityHeaders,\n): void {\n res.setHeader('X-Content-Type-Options', 'nosniff');\n if (resolved.frameOptions) res.setHeader('X-Frame-Options', resolved.frameOptions);\n if (resolved.referrerPolicy) res.setHeader('Referrer-Policy', resolved.referrerPolicy);\n if (resolved.permissionsPolicy) res.setHeader('Permissions-Policy', resolved.permissionsPolicy);\n}\n\n/**\n * Middleware per host Express/Nest.\n *\n * Applica gli header solo alle rotte Accessi. La CSP della console viene\n * sovrascritta dal controller con il nonce della richiesta; per la UI OpenAPI\n * vale la variante Swagger.\n */\nexport function createAccessiSecurityHeadersMiddleware(\n setting: AccessiSecurityHeadersSetting | undefined,\n isAccessiRoute: (path: string) => boolean,\n options: { isOpenApiUi?: (path: string) => boolean } = {},\n): ((req: Request, res: Response, next: NextFunction) => void) | undefined {\n const resolved = resolveAccessiSecurityHeaders(setting);\n if (!resolved) return undefined;\n\n return (req: Request, res: Response, next: NextFunction): void => {\n if (!isAccessiRoute(req.path)) {\n next();\n return;\n }\n applyAccessiBaseSecurityHeaders(res, resolved);\n if (resolved.contentSecurityPolicy) {\n const surface: AccessiCspSurface = options.isOpenApiUi?.(req.path)\n ? 'openapi'\n : req.path.startsWith('/api/accessi/console')\n ? 'console'\n : 'api';\n applyAccessiContentSecurityPolicy(res, resolved, surface);\n }\n next();\n };\n}\n"]}
@@ -1,27 +0,0 @@
1
- import { CanActivate, ExecutionContext } from '@nestjs/common';
2
- import { Reflector } from '@nestjs/core';
3
- import type { Request } from 'express';
4
- import type { AccessiOptions } from '../AccessiModule';
5
- import { ServiceTokenService, VerifiedServiceToken } from '../Services/ServiceTokenService/ServiceTokenService';
6
- /** Chiave dei metadata usata da `@RequireServiceTokenScopes`. */
7
- export declare const SERVICE_TOKEN_SCOPES_METADATA = "accessi:service-token-scopes";
8
- /** Richiede che il token di servizio presenti tutti gli scope indicati. */
9
- export declare const RequireServiceTokenScopes: (...scopes: string[]) => import("@nestjs/common").CustomDecorator<string>;
10
- export type AccessiServiceTokenRequest = Request & {
11
- accessiServiceToken?: VerifiedServiceToken;
12
- };
13
- /** Restituisce il token di servizio verificato da `ServiceTokenGuard`; lancia 401 se assente. */
14
- export declare function getAccessiServiceToken(req: Request): VerifiedServiceToken;
15
- /**
16
- * Autentica le chiamate tecniche macchina-a-macchina tramite `Authorization: Bearer <token>`.
17
- *
18
- * Il token e per installazione/servizio, non legato a un utente. Gli scope richiesti si dichiarano
19
- * con `@RequireServiceTokenScopes('ia')`.
20
- */
21
- export declare class ServiceTokenGuard implements CanActivate {
22
- private readonly serviceTokenService;
23
- private readonly reflector;
24
- private readonly accessiOptions;
25
- constructor(serviceTokenService: ServiceTokenService, reflector: Reflector, accessiOptions: AccessiOptions);
26
- canActivate(context: ExecutionContext): Promise<boolean>;
27
- }
@@ -1,90 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
- return new (P || (P = Promise))(function (resolve, reject) {
17
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
- step((generator = generator.apply(thisArg, _arguments || [])).next());
21
- });
22
- };
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.ServiceTokenGuard = exports.RequireServiceTokenScopes = exports.SERVICE_TOKEN_SCOPES_METADATA = void 0;
25
- exports.getAccessiServiceToken = getAccessiServiceToken;
26
- const common_1 = require("@nestjs/common");
27
- const core_1 = require("@nestjs/core");
28
- const ServiceTokenService_1 = require("../Services/ServiceTokenService/ServiceTokenService");
29
- const authenticatedToken_1 = require("./authenticatedToken");
30
- const serviceTokenRateLimit_1 = require("./serviceTokenRateLimit");
31
- /** Chiave dei metadata usata da `@RequireServiceTokenScopes`. */
32
- exports.SERVICE_TOKEN_SCOPES_METADATA = 'accessi:service-token-scopes';
33
- /** Richiede che il token di servizio presenti tutti gli scope indicati. */
34
- const RequireServiceTokenScopes = (...scopes) => (0, common_1.SetMetadata)(exports.SERVICE_TOKEN_SCOPES_METADATA, scopes);
35
- exports.RequireServiceTokenScopes = RequireServiceTokenScopes;
36
- /** Restituisce il token di servizio verificato da `ServiceTokenGuard`; lancia 401 se assente. */
37
- function getAccessiServiceToken(req) {
38
- const verified = req.accessiServiceToken;
39
- if (!verified) {
40
- throw new common_1.UnauthorizedException('Token di servizio non verificato.');
41
- }
42
- return verified;
43
- }
44
- /**
45
- * Autentica le chiamate tecniche macchina-a-macchina tramite `Authorization: Bearer <token>`.
46
- *
47
- * Il token e per installazione/servizio, non legato a un utente. Gli scope richiesti si dichiarano
48
- * con `@RequireServiceTokenScopes('ia')`.
49
- */
50
- let ServiceTokenGuard = class ServiceTokenGuard {
51
- constructor(serviceTokenService, reflector, accessiOptions) {
52
- this.serviceTokenService = serviceTokenService;
53
- this.reflector = reflector;
54
- this.accessiOptions = accessiOptions;
55
- }
56
- canActivate(context) {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- var _a, _b, _c, _d, _e;
59
- const request = context.switchToHttp().getRequest();
60
- const ip = (_c = (_a = request.ip) !== null && _a !== void 0 ? _a : (_b = request.socket) === null || _b === void 0 ? void 0 : _b.remoteAddress) !== null && _c !== void 0 ? _c : 'unknown';
61
- yield (0, serviceTokenRateLimit_1.assertServiceTokenRateLimit)(ip, (_d = this.accessiOptions.serviceTokens) === null || _d === void 0 ? void 0 : _d.rateLimitStore);
62
- const token = (0, authenticatedToken_1.extractAccessiBearerToken)(request.headers['authorization']);
63
- if (!token) {
64
- throw new common_1.UnauthorizedException('Token di servizio mancante.');
65
- }
66
- const verified = yield this.serviceTokenService.verify(token, { ip });
67
- if (!verified) {
68
- throw new common_1.UnauthorizedException('Token di servizio non valido, scaduto o revocato.');
69
- }
70
- request.accessiServiceToken = verified;
71
- const requiredScopes = (_e = this.reflector.getAllAndOverride(exports.SERVICE_TOKEN_SCOPES_METADATA, [
72
- context.getHandler(),
73
- context.getClass(),
74
- ])) !== null && _e !== void 0 ? _e : [];
75
- const missingScope = requiredScopes.find((scope) => !(0, ServiceTokenService_1.serviceTokenHasScope)(verified.scopes, scope));
76
- if (missingScope) {
77
- throw new common_1.ForbiddenException(`Scope '${missingScope}' non autorizzato per questo token.`);
78
- }
79
- return true;
80
- });
81
- }
82
- };
83
- exports.ServiceTokenGuard = ServiceTokenGuard;
84
- exports.ServiceTokenGuard = ServiceTokenGuard = __decorate([
85
- (0, common_1.Injectable)(),
86
- __param(2, (0, common_1.Inject)('ACCESSI_OPTIONS')),
87
- __metadata("design:paramtypes", [ServiceTokenService_1.ServiceTokenService,
88
- core_1.Reflector, Object])
89
- ], ServiceTokenGuard);
90
- //# sourceMappingURL=serviceTokenGuard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serviceTokenGuard.js","sourceRoot":"","sources":["../../../src/accessi-module/security/serviceTokenGuard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,wDAMC;AA/BD,2CAQwB;AACxB,uCAAyC;AAGzC,6FAAsI;AACtI,6DAAiE;AACjE,mEAAsE;AAEtE,iEAAiE;AACpD,QAAA,6BAA6B,GAAG,8BAA8B,CAAC;AAE5E,2EAA2E;AACpE,MAAM,yBAAyB,GAAG,CAAC,GAAG,MAAgB,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,qCAA6B,EAAE,MAAM,CAAC,CAAC;AAAxG,QAAA,yBAAyB,6BAA+E;AAIrH,iGAAiG;AACjG,SAAgB,sBAAsB,CAAC,GAAY;IACjD,MAAM,QAAQ,GAAI,GAAkC,CAAC,mBAAmB,CAAC;IACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,8BAAqB,CAAC,mCAAmC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YACmB,mBAAwC,EACxC,SAAoB,EACO,cAA8B;QAFzD,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,cAAS,GAAT,SAAS,CAAW;QACO,mBAAc,GAAd,cAAc,CAAgB;IACzE,CAAC;IAEE,WAAW,CAAC,OAAyB;;;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;YAC7D,MAAM,EAAE,GAAG,MAAA,MAAA,OAAO,CAAC,EAAE,mCAAI,MAAA,OAAO,CAAC,MAAM,0CAAE,aAAa,mCAAI,SAAS,CAAC;YACpE,MAAM,IAAA,mDAA2B,EAAC,EAAE,EAAE,MAAA,IAAI,CAAC,cAAc,CAAC,aAAa,0CAAE,cAAc,CAAC,CAAC;YAEzF,MAAM,KAAK,GAAG,IAAA,8CAAyB,EAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,8BAAqB,CAAC,6BAA6B,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,8BAAqB,CAAC,mDAAmD,CAAC,CAAC;YACvF,CAAC;YAEA,OAAsC,CAAC,mBAAmB,GAAG,QAAQ,CAAC;YAEvE,MAAM,cAAc,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAW,qCAA6B,EAAE;gBAC/F,OAAO,CAAC,UAAU,EAAE;gBACpB,OAAO,CAAC,QAAQ,EAAE;aACnB,CAAC,mCAAI,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAA,0CAAoB,EAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YACnG,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,2BAAkB,CAAC,UAAU,YAAY,qCAAqC,CAAC,CAAC;YAC5F,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;CACF,CAAA;AAnCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;qCAFY,yCAAmB;QAC7B,gBAAS;GAH5B,iBAAiB,CAmC7B","sourcesContent":["import {\n CanActivate,\n ExecutionContext,\n ForbiddenException,\n Inject,\n Injectable,\n SetMetadata,\n UnauthorizedException,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport type { Request } from 'express';\nimport type { AccessiOptions } from '../AccessiModule';\nimport { ServiceTokenService, serviceTokenHasScope, VerifiedServiceToken } from '../Services/ServiceTokenService/ServiceTokenService';\nimport { extractAccessiBearerToken } from './authenticatedToken';\nimport { assertServiceTokenRateLimit } from './serviceTokenRateLimit';\n\n/** Chiave dei metadata usata da `@RequireServiceTokenScopes`. */\nexport const SERVICE_TOKEN_SCOPES_METADATA = 'accessi:service-token-scopes';\n\n/** Richiede che il token di servizio presenti tutti gli scope indicati. */\nexport const RequireServiceTokenScopes = (...scopes: string[]) => SetMetadata(SERVICE_TOKEN_SCOPES_METADATA, scopes);\n\nexport type AccessiServiceTokenRequest = Request & { accessiServiceToken?: VerifiedServiceToken };\n\n/** Restituisce il token di servizio verificato da `ServiceTokenGuard`; lancia 401 se assente. */\nexport function getAccessiServiceToken(req: Request): VerifiedServiceToken {\n const verified = (req as AccessiServiceTokenRequest).accessiServiceToken;\n if (!verified) {\n throw new UnauthorizedException('Token di servizio non verificato.');\n }\n return verified;\n}\n\n/**\n * Autentica le chiamate tecniche macchina-a-macchina tramite `Authorization: Bearer <token>`.\n *\n * Il token e per installazione/servizio, non legato a un utente. Gli scope richiesti si dichiarano\n * con `@RequireServiceTokenScopes('ia')`.\n */\n@Injectable()\nexport class ServiceTokenGuard implements CanActivate {\n constructor(\n private readonly serviceTokenService: ServiceTokenService,\n private readonly reflector: Reflector,\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions,\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request = context.switchToHttp().getRequest<Request>();\n const ip = request.ip ?? request.socket?.remoteAddress ?? 'unknown';\n await assertServiceTokenRateLimit(ip, this.accessiOptions.serviceTokens?.rateLimitStore);\n\n const token = extractAccessiBearerToken(request.headers['authorization']);\n if (!token) {\n throw new UnauthorizedException('Token di servizio mancante.');\n }\n\n const verified = await this.serviceTokenService.verify(token, { ip });\n if (!verified) {\n throw new UnauthorizedException('Token di servizio non valido, scaduto o revocato.');\n }\n\n (request as AccessiServiceTokenRequest).accessiServiceToken = verified;\n\n const requiredScopes = this.reflector.getAllAndOverride<string[]>(SERVICE_TOKEN_SCOPES_METADATA, [\n context.getHandler(),\n context.getClass(),\n ]) ?? [];\n const missingScope = requiredScopes.find((scope) => !serviceTokenHasScope(verified.scopes, scope));\n if (missingScope) {\n throw new ForbiddenException(`Scope '${missingScope}' non autorizzato per questo token.`);\n }\n\n return true;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"serviceTokenRateLimit.js","sourceRoot":"","sources":["../../../src/accessi-module/security/serviceTokenRateLimit.ts"],"names":[],"mappings":";;;;;;;;;;;AAeA,gEAiBC;AAGD,gEAEC;AAGD,kEAYC;AApDD,2CAA2D;AAC3D,qDAA4D;AAE5D,sDAA+D;AAE/D;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,KAAM,CAAC;AACzB,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,SAAsB,0BAA0B;yDAC9C,UAAkB,EAClB,QAAwB,IAAA,yCAAwB,GAAE;QAElD,MAAM,GAAG,GAAG,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,iBAAiB,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9E,CAAC;QAAC,WAAM,CAAC;YACP,IAAA,6BAAmB,EAAC,4BAA4B,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC5F,MAAM,IAAI,sBAAa,CACrB;gBACE,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,gDAAgD;aAC1D,EACD,mBAAU,CAAC,mBAAmB,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC;CAAA;AAED,+DAA+D;AAC/D,SAAgB,0BAA0B;IACxC,IAAA,yCAAwB,GAAE,CAAC,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,gEAAgE;AAChE,SAAsB,2BAA2B,CAC/C,UAAkB,EAClB,KAAsB;;QAEtB,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,IAAA,6BAAmB,EAAC,kCAAkC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACvF,MAAM,IAAI,sBAAa,CACrB,EAAE,IAAI,EAAE,oCAAoC,EAAE,OAAO,EAAE,sCAAsC,EAAE,EAC/F,mBAAU,CAAC,iBAAiB,CAC7B,CAAC;QACJ,CAAC;IACH,CAAC;CAAA","sourcesContent":["import { HttpException, HttpStatus } from '@nestjs/common';\nimport { getDefaultRateLimitStore } from './rateLimitStore';\nimport type { RateLimitStore } from './rateLimitStore';\nimport { recordAccessiMetric } from '../observability/metrics';\n\n/**\n * Limite anti-abuso per la verifica dei token di servizio.\n *\n * Il segreto ha 256 bit di entropia (brute force non praticabile), ma il limite evita\n * che un client difettoso o malevolo martelli l'endpoint. Con `serviceTokens.rateLimitStore`\n * e possibile usare uno store condiviso in cluster.\n */\nconst WINDOW_MS = 60_000;\nconst MAX_ATTEMPTS = 120;\n\nexport async function checkServiceTokenRateLimit(\n identifier: string,\n store: RateLimitStore = getDefaultRateLimitStore(),\n): Promise<{ allowed: boolean; retryAfterSeconds: number }> {\n const key = identifier && identifier.trim() !== '' ? identifier.trim() : 'unknown';\n try {\n return await store.consume(`service-token|${key}`, WINDOW_MS, MAX_ATTEMPTS);\n } catch {\n recordAccessiMetric('accessi_store_errors_total', 1, { store: 'service_token_rate_limit' });\n throw new HttpException(\n {\n code: 'ACCESSI_RATE_LIMIT_UNAVAILABLE',\n message: 'Rate limit non disponibile. Riprova piu tardi.',\n },\n HttpStatus.SERVICE_UNAVAILABLE,\n );\n }\n}\n\n/** Svuota i bucket dello store di default (usato nei test). */\nexport function resetServiceTokenRateLimit(): void {\n getDefaultRateLimitStore().reset();\n}\n\n/** Lancia 429 con `Retry-After` quando il limite e superato. */\nexport async function assertServiceTokenRateLimit(\n identifier: string,\n store?: RateLimitStore,\n): Promise<void> {\n const decision = await checkServiceTokenRateLimit(identifier, store);\n if (!decision.allowed) {\n recordAccessiMetric('accessi_rate_limit_blocked_total', 1, { layer: 'service_token' });\n throw new HttpException(\n { code: 'ACCESSI_SERVICE_TOKEN_RATE_LIMITED', message: 'Troppi tentativi. Riprova piu tardi.' },\n HttpStatus.TOO_MANY_REQUESTS,\n );\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionRevocation.js","sourceRoot":"","sources":["../../../src/accessi-module/security/sessionRevocation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccessiOptions } from '../AccessiModule';\nimport { instrumentAccessiRedisClient } from '../observability/redisMetrics';\nimport { auditAccessi } from './audit';\nimport { countAccessiMetric } from '../observability/metrics';import { isAccessiAccessTokenRevoked } from './accessTokenRevocation';\nimport { isRefreshTokenFamilyRevoked } from './refreshTokenRotation';\n\n/**\n * Revoca delle sessioni per utente.\n *\n * La revoca e un timestamp: un token emesso prima del cutoff viene rifiutato.\n * I token emessi dopo il cutoff restano validi. I token includono `iatMs`\n * (millisecondi) per rendere la revoca deterministica anche quando il cambio\n * password e il login avvengono nello stesso secondo; per i token legacy senza\n * `iatMs` si usa `iat` in secondi.\n */\nexport interface SessionRevocationStore {\n revokeUser(codiceUtente: number, revokedAtMs: number): Promise<void>;\n getUserRevocation(codiceUtente: number): Promise<number | null>;\n /** Health check opzionale per readiness del servizio. */\n healthCheck?(): Promise<boolean>;\n}\n\nexport interface SessionRevocationOptions {\n /** Default: disabilitata se non viene fornito uno store. */\n enabled?: boolean;\n /** Store condiviso (es. Redis) per invalidare le sessioni tra istanze. */\n store?: SessionRevocationStore;\n /** TTL delle chiavi Redis. Default: 365 giorni. */\n ttlMs?: number;\n}\n\nexport interface MemorySessionRevocationStore extends SessionRevocationStore {\n clear(): void;\n}\n\nconst REVOKE_USER_SCRIPT =\n \"if tonumber(ARGV[2]) > 0 then return redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2]) else return redis.call('SET', KEYS[1], ARGV[1]) end\";\nconst GET_USER_SCRIPT = \"return redis.call('GET', KEYS[1])\";\n\nexport function createMemorySessionRevocationStore(): MemorySessionRevocationStore {\n const revokedAt = new Map<number, number>();\n return {\n async revokeUser(codiceUtente, timestamp) {\n revokedAt.set(codiceUtente, timestamp);\n },\n async getUserRevocation(codiceUtente) {\n return revokedAt.get(codiceUtente) ?? null;\n },\n async healthCheck() {\n return true;\n },\n clear() {\n revokedAt.clear();\n },\n };\n}\n\nexport interface SessionRevocationRedisClient {\n eval(script: string, numKeys: number, ...args: Array<string | number>): Promise<unknown>;\n}\n\nexport interface RedisSessionRevocationStoreOptions {\n client: SessionRevocationRedisClient;\n /** Default: `accessi:revoked-user:`. */\n keyPrefix?: string;\n /** Default: 365 giorni. */\n ttlMs?: number;\n}\n\n/**\n * Store Redis per la revoca sessioni.\n *\n * `revokeUser` scrive un timestamp con TTL; `getUserRevocation` lo legge.\n * Il TTL deve essere maggiore della durata massima dei token.\n */\nexport function createRedisSessionRevocationStore(\n options: RedisSessionRevocationStoreOptions,\n): SessionRevocationStore {\n if (!options?.client || typeof options.client.eval !== 'function') {\n throw new Error('Redis session revocation store: client.eval non configurato.');\n }\n\n const keyPrefix = (options.keyPrefix ?? 'accessi:revoked-user:').replace(/:+$/, ':');\n const ttlMs = Math.max(0, Math.trunc(options.ttlMs ?? 365 * 24 * 60 * 60 * 1000));\n const client = instrumentAccessiRedisClient('session_revocation', options.client);\n\n return {\n async revokeUser(codiceUtente, revokedAtMs) {\n await client.eval(\n REVOKE_USER_SCRIPT,\n 1,\n `${keyPrefix}${codiceUtente}`,\n String(revokedAtMs),\n ttlMs,\n );\n },\n\n async getUserRevocation(codiceUtente) {\n const value = await client.eval(\n GET_USER_SCRIPT,\n 1,\n `${keyPrefix}${codiceUtente}`,\n );\n if (typeof value !== 'string' && typeof value !== 'number') return null;\n const timestamp = Number(value);\n return Number.isFinite(timestamp) ? timestamp : null;\n },\n\n async healthCheck() {\n try {\n const result = await client.eval(\"return redis.call('PING')\", 0);\n return String(result).toUpperCase() === 'PONG';\n } catch {\n return false;\n }\n },\n };\n}\n\nconst defaultMemoryStore = createMemorySessionRevocationStore();\n\n/** Store di default in memoria, usato quando `sessionRevocation.store` non e configurato ma la revoca e abilitata. */\nexport function getSessionRevocationStore(options: AccessiOptions): SessionRevocationStore | undefined {\n if (options.sessionRevocation?.enabled === false) return undefined;\n if (options.sessionRevocation?.store) return options.sessionRevocation.store;\n return options.sessionRevocation?.enabled === true ? defaultMemoryStore : undefined;\n}\n\n/**\n * Issued-at in millisecondi. I token emessi da questa versione includono `iatMs`;\n * per quelli legacy si ricade su `iat` (secondi) per restare compatibili.\n */\nexport function resolveAccessiTokenIssuedAtMs(payload: Record<string, unknown>): number | null {\n const issuedAtMs = Number(payload.iatMs);\n if (Number.isFinite(issuedAtMs) && issuedAtMs > 0) return issuedAtMs;\n\n const issuedAt = Number(payload.iat);\n if (!Number.isFinite(issuedAt)) return null;\n return issuedAt * 1000;\n}\n\n/**\n * True se il token e stato revocato: famiglia refresh revocata, `jti` revocato\n * oppure sessione utente revocata prima dell'emissione del token.\n */\nexport async function isAccessiTokenRevoked(\n options: AccessiOptions,\n payload: Record<string, unknown>,\n codiceUtente: number,\n): Promise<boolean> {\n if (await isRefreshTokenFamilyRevoked(options, payload.fid)) return true;\n if (await isAccessiAccessTokenRevoked(options, payload)) return true;\n\n const store = getSessionRevocationStore(options);\n if (!store) return false;\n\n const issuedAtMs = resolveAccessiTokenIssuedAtMs(payload);\n if (issuedAtMs === null) return true;\n\n const revokedAt = await store.getUserRevocation(codiceUtente);\n if (revokedAt === null) return false;\n\n // I token emessi da questa versione hanno `iatMs`: un token emesso nello\n // stesso millisecondo della revoca e considerato revocato. Per i token\n // legacy (solo `iat`, secondi) si mantiene il confronto per secondo.\n const preciseIssuedAtMs = Number(payload.iatMs);\n if (Number.isFinite(preciseIssuedAtMs) && preciseIssuedAtMs > 0) {\n return issuedAtMs <= revokedAt;\n }\n return issuedAtMs < Math.floor(revokedAt / 1000) * 1000;\n}\n\n/** Revoca tutte le sessioni dell'utente. Richiede uno store configurato. */\nexport async function revokeAccessiUserSessions(\n options: AccessiOptions,\n codiceUtente: number,\n revokedAtMs: number = Date.now(),\n reason: string = 'manual',\n): Promise<void> {\n const store = getSessionRevocationStore(options);\n if (!store) {\n throw new Error('Session revocation store non configurato.');\n }\n await store.revokeUser(codiceUtente, revokedAtMs);\n auditAccessi('accessi_sessions_revoked', { codiceUtente, revokedAtMs, reason });\n countAccessiMetric(options, 'sessions_revoked_total', { reason });\n}\n\n/**\n * Variante per i flussi applicativi (cambio password, blocco, cancellazione):\n * se la revoca non e configurata non fallisce, perche quei flussi devono\n * continuare a funzionare anche senza store condiviso.\n */\nexport async function revokeAccessiUserSessionsIfConfigured(\n options: AccessiOptions,\n codiceUtente: number,\n reason: string = 'manual',\n revokedAtMs: number = Date.now(),\n): Promise<boolean> {\n if (!getSessionRevocationStore(options)) return false;\n await revokeAccessiUserSessions(options, codiceUtente, revokedAtMs, reason);\n return true;\n}\n\n/** Solo per test: azzera lo store in memoria di default. */\nexport function clearDefaultSessionRevocations(): void {\n defaultMemoryStore.clear();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateOptions.js","sourceRoot":"","sources":["../../../src/accessi-module/security/validateOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import { createPublicKey } from 'crypto';\nimport type { AccessiOptions } from '../AccessiModule';\nimport {\n accessiCookieNames,\n isValidAccessiCookieName,\n resolveAccessiAuthCookieOptions,\n} from './authCookies';\n\nexport interface AccessiOptionsValidationIssue {\n code: string;\n message: string;\n}\n\nexport interface AccessiOptionsValidationResult {\n errors: AccessiOptionsValidationIssue[];\n warnings: AccessiOptionsValidationIssue[];\n}\n\nfunction isHttpUrl(value: string | undefined): boolean {\n if (!value) return false;\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction positive(value: number | undefined): boolean {\n return typeof value === 'number' && Number.isFinite(value) && value > 0;\n}\n\n/**\n * Validazione fail-fast della configurazione Accessi.\n *\n * `createAccessiService` usa `assertValidAccessiOptions`; i bootstrap esistenti\n * possono usare `validateAccessiOptions` per loggare warning senza rompere il\n * comportamento storico.\n */\nexport function validateAccessiOptions(options: AccessiOptions): AccessiOptionsValidationResult {\n const errors: AccessiOptionsValidationIssue[] = [];\n const warnings: AccessiOptionsValidationIssue[] = [];\n\n const addError = (code: string, message: string) => errors.push({ code, message });\n const addWarning = (code: string, message: string) => warnings.push({ code, message });\n\n if (!options?.databaseOptions) {\n addError('ACCESSI_DB_OPTIONS_MISSING', 'databaseOptions e obbligatorio.');\n }\n\n const jwt = options?.jwtOptions;\n const secret = jwt?.secret || process.env.ACC_JWT_SECRET;\n if (!secret) {\n addError('ACCESSI_JWT_SECRET_MISSING', 'jwtOptions.secret e obbligatorio.');\n } else if (secret.length < 32) {\n addWarning('ACCESSI_JWT_SECRET_WEAK', 'jwtOptions.secret dovrebbe avere almeno 32 caratteri.');\n }\n\n if (!jwt?.expiresIn) {\n addError('ACCESSI_JWT_EXPIRES_MISSING', 'jwtOptions.expiresIn e obbligatorio.');\n }\n\n const algorithm = jwt?.algorithm ?? 'HS256';\n if (algorithm.startsWith('HS')) {\n if (jwt?.privateKey || jwt?.publicKey) {\n addWarning(\n 'ACCESSI_JWT_ASYMMETRIC_KEYS_WITH_HMAC',\n 'Sono configurate chiavi asimmetriche ma algorithm e HS256: verranno ignorate.',\n );\n }\n } else {\n if (!jwt?.privateKey) {\n addError('ACCESSI_JWT_PRIVATE_KEY_MISSING', `jwtOptions.privateKey e obbligatoria per ${algorithm}.`);\n }\n if (!jwt?.publicKey && !jwt?.privateKey) {\n addError('ACCESSI_JWT_PUBLIC_KEY_MISSING', `jwtOptions.publicKey e obbligatoria per ${algorithm}.`);\n }\n if (!jwt?.keyId) {\n addWarning('ACCESSI_JWT_KEY_ID_MISSING', 'jwtOptions.keyId e consigliato per la rotazione JWKS.');\n }\n if (!jwt?.jwksPath) {\n addWarning(\n 'ACCESSI_JWKS_PATH_DEFAULT',\n 'jwksPath non configurato: verra usato accessi/.well-known/jwks.json.',\n );\n }\n }\n\n const previousKeys = jwt?.previousPublicKeys ?? [];\n if (previousKeys.length > 0 && algorithm.startsWith('HS')) {\n addWarning(\n 'ACCESSI_JWT_PREVIOUS_KEYS_WITH_HMAC',\n 'previousPublicKeys e configurato ma algorithm e HS*: le chiavi verranno ignorate.',\n );\n }\n if (!algorithm.startsWith('HS') && previousKeys.length > 0) {\n const knownKeyIds = new Set<string>();\n if (jwt?.keyId) knownKeyIds.add(jwt.keyId);\n previousKeys.forEach((previous, index) => {\n try {\n createPublicKey(previous.publicKey);\n } catch {\n addError(\n 'ACCESSI_JWT_PREVIOUS_KEY_INVALID',\n `previousPublicKeys[${index}] non e una chiave pubblica PEM valida.`,\n );\n }\n if (!previous.keyId) {\n addWarning(\n 'ACCESSI_JWT_PREVIOUS_KEY_ID_MISSING',\n `previousPublicKeys[${index}] non ha keyId: verra usato il fingerprint della chiave.`,\n );\n return;\n }\n if (knownKeyIds.has(previous.keyId)) {\n addWarning(\n 'ACCESSI_JWT_PREVIOUS_KEY_DUPLICATE_KID',\n `previousPublicKeys[${index}].keyId \"${previous.keyId}\" e duplicato: vince la chiave corrente.`,\n );\n return;\n }\n knownKeyIds.add(previous.keyId);\n });\n }\n\n if (!jwt?.issuer) {\n addWarning('ACCESSI_JWT_ISSUER_MISSING', 'jwtOptions.issuer e consigliato in multi-servizio.');\n }\n if (!jwt?.audience) {\n addWarning('ACCESSI_JWT_AUDIENCE_MISSING', 'jwtOptions.audience e consigliato in multi-servizio.');\n }\n\n if (!options?.encryptionKey) {\n addError('ACCESSI_ENCRYPTION_KEY_MISSING', 'encryptionKey e obbligatoria.');\n } else if (options.encryptionKey.length < 16) {\n addWarning('ACCESSI_ENCRYPTION_KEY_WEAK', 'encryptionKey dovrebbe avere almeno 16 caratteri.');\n }\n\n if (!isHttpUrl(options?.confirmationEmailUrl)) {\n addWarning('ACCESSI_CONFIRMATION_URL_INVALID', 'confirmationEmailUrl dovrebbe essere un URL http/https.');\n }\n if (!isHttpUrl(options?.confirmationEmailReturnUrl)) {\n addWarning('ACCESSI_CONFIRMATION_RETURN_URL_INVALID', 'confirmationEmailReturnUrl dovrebbe essere un URL http/https.');\n }\n if (options?.publicBaseUrl && !isHttpUrl(options.publicBaseUrl)) {\n addWarning('ACCESSI_PUBLIC_BASE_URL_INVALID', 'publicBaseUrl dovrebbe essere un URL http/https.');\n }\n\n if (options?.publicAuthRateLimit?.login && !positive(options.publicAuthRateLimit.login.windowMs)) {\n addError('ACCESSI_RATE_LIMIT_WINDOW_INVALID', 'publicAuthRateLimit.login.windowMs deve essere positivo.');\n }\n if (options?.publicAuthRateLimit?.login && !positive(options.publicAuthRateLimit.login.maxAttempts)) {\n addError('ACCESSI_RATE_LIMIT_ATTEMPTS_INVALID', 'publicAuthRateLimit.login.maxAttempts deve essere positivo.');\n }\n if (options?.edgeRateLimit) {\n if (options.edgeRateLimit.windowMs !== undefined && !positive(options.edgeRateLimit.windowMs)) {\n addError('ACCESSI_EDGE_RATE_LIMIT_WINDOW_INVALID', 'edgeRateLimit.windowMs deve essere positivo.');\n }\n if (options.edgeRateLimit.maxAttempts !== undefined && !positive(options.edgeRateLimit.maxAttempts)) {\n addError('ACCESSI_EDGE_RATE_LIMIT_ATTEMPTS_INVALID', 'edgeRateLimit.maxAttempts deve essere positivo.');\n }\n }\n if (options?.consoleEntry?.ttlMs !== undefined && !positive(options.consoleEntry.ttlMs)) {\n addError('ACCESSI_CONSOLE_ENTRY_TTL_INVALID', 'consoleEntry.ttlMs deve essere positivo.');\n }\n\n const authCookie = resolveAccessiAuthCookieOptions(options ?? {});\n if (authCookie) {\n const names = accessiCookieNames(authCookie);\n names.forEach((name, index) => {\n if (!isValidAccessiCookieName(name)) {\n addError(\n 'ACCESSI_AUTH_COOKIE_NAME_INVALID',\n `Il nome cookie \"${names[index]}\" non e valido.`,\n );\n }\n });\n if (new Set(names).size !== names.length) {\n addError(\n 'ACCESSI_AUTH_COOKIE_NAME_DUPLICATE',\n 'I nomi dei cookie access, refresh e CSRF devono essere diversi.',\n );\n }\n if (authCookie.sameSite === 'none' && !authCookie.secure) {\n addError(\n 'ACCESSI_AUTH_COOKIE_SAMESITE_NONE_INSECURE',\n 'SameSite=None richiede secure: true.',\n );\n }\n if (!authCookie.accessPath.startsWith('/')) {\n addError('ACCESSI_AUTH_COOKIE_PATH_INVALID', 'accessPath deve iniziare con \"/\".');\n }\n if (!authCookie.refreshPath.startsWith('/')) {\n addError('ACCESSI_AUTH_COOKIE_PATH_INVALID', 'refreshPath deve iniziare con \"/\".');\n }\n if (!authCookie.csrfPath.startsWith('/')) {\n addError('ACCESSI_AUTH_COOKIE_PATH_INVALID', 'csrfPath deve iniziare con \"/\".');\n }\n if (authCookie.csrf === 'off') {\n addWarning(\n 'ACCESSI_AUTH_COOKIE_CSRF_DISABLED',\n 'CSRF disattivato in modalita cookie: l host deve applicare una propria protezione.',\n );\n }\n if (authCookie.exposeTokens) {\n addWarning(\n 'ACCESSI_AUTH_COOKIE_TOKENS_EXPOSED',\n 'exposeTokens restituisce i token nel body: riduce il beneficio di httpOnly.',\n );\n }\n if (!jwt?.refreshExpiresIn && authCookie.refreshFromCookie) {\n addWarning(\n 'ACCESSI_AUTH_COOKIE_REFRESH_DISABLED',\n 'refreshFromCookie e attivo ma jwtOptions.refreshExpiresIn non e configurato.',\n );\n }\n }\n\n return { errors, warnings };\n}\n\n/** Lancia un errore aggregato se la configurazione non e valida. */\nexport function assertValidAccessiOptions(options: AccessiOptions): void {\n const result = validateAccessiOptions(options);\n if (result.errors.length === 0) return;\n throw new Error(\n `Configurazione Accessi non valida:\\n${result.errors\n .map((issue) => `- ${issue.code}: ${issue.message}`)\n .join('\\n')}`,\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"startupLog.js","sourceRoot":"","sources":["../../src/accessi-module/startupLog.ts"],"names":[],"mappings":";;AAUA,8CAqBC;AA/BD,sCAAmC;AAEnC,8DAA2E;AAC3E,4DAAwE;AAGxE;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,OAAuB,EACvB,eAA6C;;IAE7C,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,MAAA,OAAO,CAAC,aAAa,mCAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,IAAA,4CAA4B,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjF,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAA,MAAA,OAAO,CAAC,cAAc,0CAAE,OAAO,MAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAA,+CAA8B,GAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,kFAAkF,KAAK,EAAE,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC","sourcesContent":["import { Logger } from '../Logger';\nimport type { AccessiOptions } from './AccessiModule';\nimport { getOrCreateAdminBootstrapToken } from './security/adminBootstrap';\nimport { resolveAccessiOpenApiOptions } from '../openapi/OpenApiConfig';\nimport type { ResolvedOpenApiSetupOptions } from '../openapi/OpenApiConfig';\n\n/**\n * Logga gli indirizzi utili del modulo Accessi appena il bootstrap e completato, cosi che\n * console, OpenAPI e API siano visibili insieme nei log di avvio.\n */\nexport function logAccessiStartup(\n options: AccessiOptions,\n openApiOverride?: ResolvedOpenApiSetupOptions\n): void {\n const logger = new Logger('Accessi');\n const base = (options.publicBaseUrl ?? '').replace(/\\/+$/, '');\n const url = (path: string) => `${base}${path}`;\n const openApi = openApiOverride ?? resolveAccessiOpenApiOptions(options.openapi);\n\n logger.info('Accessi pronto. Indirizzi utili:');\n logger.info(` Console: ${url('/api/accessi/console')}`);\n if (openApi.enabled) {\n logger.info(` OpenAPI UI: ${url(`/${openApi.openApiPath}`)}`);\n logger.info(` OpenAPI JSON: ${url(`/${openApi.openApiJsonPath}`)}`);\n }\n logger.info(` API: ${url('/api/accessi')}`);\n\n if (options.adminBootstrap?.enabled === true) {\n const token = getOrCreateAdminBootstrapToken();\n logger.warning(` Bootstrap admin abilitato. Token di avvio (monouso, valido fino al riavvio): ${token}`);\n }\n}\n"]}
@@ -1,36 +0,0 @@
1
- import { AllegatiService } from "../Services/AllegatiService/AllegatiService";
2
- import { UploadAllegatoResponseDto } from "../Dtos/responses/UploadAllegatoResponseDto";
3
- import { AllegatoDto } from "../Dtos/AllegatoDto";
4
- import { DownloadAllegatoResponseDto } from "../Dtos/responses/DownloadAllegatoResponseDto";
5
- import { UploadSingleFileRequest } from "../Dtos/UploadSingleFileRequest";
6
- import e from "express";
7
- export declare class AllegatiController {
8
- private readonly allegatiService;
9
- private readonly logger;
10
- constructor(allegatiService: AllegatiService);
11
- upload(files: Express.Multer.File[], uploadRequest: UploadSingleFileRequest): Promise<UploadAllegatoResponseDto>;
12
- download(id: number): Promise<DownloadAllegatoResponseDto>;
13
- downloadFile(id: number, res: e.Response): Promise<void>;
14
- delete(id: number, res: e.Response): Promise<e.Response<any, Record<string, any>>>;
15
- list(tipcod?: string, codice?: number, docrif?: string, idxtipoall?: number): Promise<AllegatoDto[]>;
16
- searchByFields(body: {
17
- tipcod?: string;
18
- codice?: number;
19
- docrif?: string;
20
- idxtipoall?: number;
21
- }): Promise<AllegatoDto[]>;
22
- getOneByFields(body: {
23
- tipcod?: string;
24
- codice?: number;
25
- docrif?: string;
26
- idxtipoall?: number;
27
- }): Promise<AllegatoDto | null>;
28
- updateFieldsById(id: number, body: {
29
- tipcod?: string;
30
- codice?: number;
31
- docrif?: string;
32
- idxtipoall?: number;
33
- }): Promise<{
34
- message: string;
35
- }>;
36
- }