emilsoftware-utilities 2.0.0-dev.4 → 2.0.0-dev.40

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 (596) hide show
  1. package/README.MD +199 -38
  2. package/dist/ContractGenerator.d.ts +4 -3
  3. package/dist/ContractGenerator.js +15 -5
  4. package/dist/ContractGenerator.js.map +1 -1
  5. package/dist/DailyFileTransport.d.ts +21 -0
  6. package/dist/DailyFileTransport.js +74 -0
  7. package/dist/DailyFileTransport.js.map +1 -0
  8. package/dist/DatabaseUpdater.d.ts +1 -1
  9. package/dist/DatabaseUpdater.js +32 -29
  10. package/dist/DatabaseUpdater.js.map +1 -1
  11. package/dist/EmilsoftwareModule.js.map +1 -1
  12. package/dist/ExecutionTimeLogger.d.ts +2 -2
  13. package/dist/ExecutionTimeLogger.js +5 -4
  14. package/dist/ExecutionTimeLogger.js.map +1 -1
  15. package/dist/Logger.d.ts +22 -11
  16. package/dist/Logger.js +132 -119
  17. package/dist/Logger.js.map +1 -1
  18. package/dist/Orm.d.ts +28 -12
  19. package/dist/Orm.js +194 -153
  20. package/dist/Orm.js.map +1 -1
  21. package/dist/RoutesLoggerMiddleware.js.map +1 -1
  22. package/dist/Utilities.d.ts +18 -8
  23. package/dist/Utilities.js +117 -38
  24. package/dist/Utilities.js.map +1 -1
  25. package/dist/accessi-module/AccessiModule.d.ts +116 -2
  26. package/dist/accessi-module/AccessiModule.js +36 -5
  27. package/dist/accessi-module/AccessiModule.js.map +1 -1
  28. package/dist/accessi-module/Console/accessiFetch.d.ts +7 -0
  29. package/dist/accessi-module/Console/accessiFetch.js +59 -0
  30. package/dist/accessi-module/Console/accessiFetch.js.map +1 -0
  31. package/dist/accessi-module/Console/console.css +676 -0
  32. package/dist/accessi-module/Console/console.d.ts +1 -0
  33. package/dist/accessi-module/Console/console.js +3351 -0
  34. package/dist/accessi-module/Console/console.js.map +1 -0
  35. package/dist/accessi-module/Console/generated/accessiApi.d.ts +582 -0
  36. package/dist/accessi-module/Console/generated/accessiApi.js +549 -0
  37. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -0
  38. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.d.ts +39 -0
  39. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js +3 -0
  40. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +1 -0
  41. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.d.ts +16 -0
  42. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.js +17 -0
  43. package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.js.map +1 -0
  44. package/dist/accessi-module/Console/generated/model/actionResponse.d.ts +12 -0
  45. package/dist/accessi-module/Console/generated/model/actionResponse.js +9 -0
  46. package/dist/accessi-module/Console/generated/model/actionResponse.js.map +1 -0
  47. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.d.ts +11 -0
  48. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.js +3 -0
  49. package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.js.map +1 -0
  50. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.d.ts +10 -0
  51. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.js +9 -0
  52. package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.js.map +1 -0
  53. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.d.ts +10 -0
  54. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.js +3 -0
  55. package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.js.map +1 -0
  56. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.d.ts +19 -0
  57. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.js +9 -0
  58. package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.js.map +1 -0
  59. package/dist/accessi-module/Console/generated/model/bootstrapAdminRequest.d.ts +17 -0
  60. package/dist/accessi-module/Console/generated/model/bootstrapAdminRequest.js +9 -0
  61. package/dist/accessi-module/Console/generated/model/bootstrapAdminRequest.js.map +1 -0
  62. package/dist/accessi-module/Console/generated/model/bootstrapAdminResponse.d.ts +14 -0
  63. package/dist/accessi-module/Console/generated/model/bootstrapAdminResponse.js +3 -0
  64. package/dist/accessi-module/Console/generated/model/bootstrapAdminResponse.js.map +1 -0
  65. package/dist/accessi-module/Console/generated/model/bootstrapAdminResultDto.d.ts +13 -0
  66. package/dist/accessi-module/Console/generated/model/bootstrapAdminResultDto.js +9 -0
  67. package/dist/accessi-module/Console/generated/model/bootstrapAdminResultDto.js.map +1 -0
  68. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.d.ts +14 -0
  69. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js +9 -0
  70. package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +1 -0
  71. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.d.ts +13 -0
  72. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.js +9 -0
  73. package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.js.map +1 -0
  74. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.d.ts +13 -0
  75. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.js +9 -0
  76. package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.js.map +1 -0
  77. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.d.ts +18 -0
  78. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.js +3 -0
  79. package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.js.map +1 -0
  80. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.d.ts +23 -0
  81. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js +3 -0
  82. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js.map +1 -0
  83. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.d.ts +14 -0
  84. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js +15 -0
  85. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js.map +1 -0
  86. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.d.ts +22 -0
  87. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js +9 -0
  88. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js.map +1 -0
  89. package/dist/accessi-module/Console/generated/model/createMenuRequest.d.ts +52 -0
  90. package/dist/accessi-module/Console/generated/model/createMenuRequest.js +9 -0
  91. package/dist/accessi-module/Console/generated/model/createMenuRequest.js.map +1 -0
  92. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.d.ts +18 -0
  93. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js +9 -0
  94. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js.map +1 -0
  95. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.d.ts +16 -0
  96. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js +9 -0
  97. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js.map +1 -0
  98. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.d.ts +14 -0
  99. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js +3 -0
  100. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js.map +1 -0
  101. package/dist/accessi-module/Console/generated/model/errorResponse.d.ts +18 -0
  102. package/dist/accessi-module/Console/generated/model/errorResponse.js +9 -0
  103. package/dist/accessi-module/Console/generated/model/errorResponse.js.map +1 -0
  104. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.d.ts +14 -0
  105. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.js +3 -0
  106. package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.js.map +1 -0
  107. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.d.ts +14 -0
  108. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.js +3 -0
  109. package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.js.map +1 -0
  110. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.d.ts +23 -0
  111. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.js +9 -0
  112. package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.js.map +1 -0
  113. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.d.ts +14 -0
  114. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.js +3 -0
  115. package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.js.map +1 -0
  116. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.d.ts +14 -0
  117. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.js +3 -0
  118. package/dist/accessi-module/Console/generated/model/federatedProviderResponse.js.map +1 -0
  119. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.d.ts +13 -0
  120. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.js +9 -0
  121. package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.js.map +1 -0
  122. package/dist/accessi-module/Console/generated/model/filtriUtente.d.ts +32 -0
  123. package/dist/accessi-module/Console/generated/model/filtriUtente.js +9 -0
  124. package/dist/accessi-module/Console/generated/model/filtriUtente.js.map +1 -0
  125. package/dist/accessi-module/Console/generated/model/getFiltriResponse.d.ts +14 -0
  126. package/dist/accessi-module/Console/generated/model/getFiltriResponse.js +3 -0
  127. package/dist/accessi-module/Console/generated/model/getFiltriResponse.js.map +1 -0
  128. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.d.ts +12 -0
  129. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.js +9 -0
  130. package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.js.map +1 -0
  131. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.d.ts +14 -0
  132. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.js +3 -0
  133. package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.js.map +1 -0
  134. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.d.ts +12 -0
  135. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js +9 -0
  136. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js.map +1 -0
  137. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.d.ts +14 -0
  138. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.js +3 -0
  139. package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.js.map +1 -0
  140. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.d.ts +14 -0
  141. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js +3 -0
  142. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js.map +1 -0
  143. package/dist/accessi-module/Console/generated/model/getMenusResponse.d.ts +14 -0
  144. package/dist/accessi-module/Console/generated/model/getMenusResponse.js +3 -0
  145. package/dist/accessi-module/Console/generated/model/getMenusResponse.js.map +1 -0
  146. package/dist/accessi-module/Console/generated/model/getRolesResponse.d.ts +14 -0
  147. package/dist/accessi-module/Console/generated/model/getRolesResponse.js +3 -0
  148. package/dist/accessi-module/Console/generated/model/getRolesResponse.js.map +1 -0
  149. package/dist/accessi-module/Console/generated/model/getSchemaResponse.d.ts +14 -0
  150. package/dist/accessi-module/Console/generated/model/getSchemaResponse.js +3 -0
  151. package/dist/accessi-module/Console/generated/model/getSchemaResponse.js.map +1 -0
  152. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.d.ts +12 -0
  153. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js +9 -0
  154. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js.map +1 -0
  155. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.d.ts +14 -0
  156. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js +3 -0
  157. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js.map +1 -0
  158. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.d.ts +10 -0
  159. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.js +9 -0
  160. package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.js.map +1 -0
  161. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.d.ts +14 -0
  162. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.js +3 -0
  163. package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.js.map +1 -0
  164. package/dist/accessi-module/Console/generated/model/getUsersParams.d.ts +32 -0
  165. package/dist/accessi-module/Console/generated/model/getUsersParams.js +9 -0
  166. package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +1 -0
  167. package/dist/accessi-module/Console/generated/model/getUsersResponse.d.ts +14 -0
  168. package/dist/accessi-module/Console/generated/model/getUsersResponse.js +3 -0
  169. package/dist/accessi-module/Console/generated/model/getUsersResponse.js.map +1 -0
  170. package/dist/accessi-module/Console/generated/model/getUsersResult.d.ts +17 -0
  171. package/dist/accessi-module/Console/generated/model/getUsersResult.js +3 -0
  172. package/dist/accessi-module/Console/generated/model/getUsersResult.js.map +1 -0
  173. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.d.ts +12 -0
  174. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.js +9 -0
  175. package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.js.map +1 -0
  176. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.d.ts +19 -0
  177. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.js +3 -0
  178. package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.js.map +1 -0
  179. package/dist/accessi-module/Console/generated/model/index.d.ts +99 -0
  180. package/dist/accessi-module/Console/generated/model/index.js +116 -0
  181. package/dist/accessi-module/Console/generated/model/index.js.map +1 -0
  182. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.d.ts +30 -0
  183. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js +9 -0
  184. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js.map +1 -0
  185. package/dist/accessi-module/Console/generated/model/loginRequest.d.ts +12 -0
  186. package/dist/accessi-module/Console/generated/model/loginRequest.js +9 -0
  187. package/dist/accessi-module/Console/generated/model/loginRequest.js.map +1 -0
  188. package/dist/accessi-module/Console/generated/model/loginResponse.d.ts +14 -0
  189. package/dist/accessi-module/Console/generated/model/loginResponse.js +3 -0
  190. package/dist/accessi-module/Console/generated/model/loginResponse.js.map +1 -0
  191. package/dist/accessi-module/Console/generated/model/loginResult.d.ts +32 -0
  192. package/dist/accessi-module/Console/generated/model/loginResult.js +3 -0
  193. package/dist/accessi-module/Console/generated/model/loginResult.js.map +1 -0
  194. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.d.ts +12 -0
  195. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.js +9 -0
  196. package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.js.map +1 -0
  197. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.d.ts +13 -0
  198. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.js +14 -0
  199. package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.js.map +1 -0
  200. package/dist/accessi-module/Console/generated/model/menuEntity.d.ts +32 -0
  201. package/dist/accessi-module/Console/generated/model/menuEntity.js +9 -0
  202. package/dist/accessi-module/Console/generated/model/menuEntity.js.map +1 -0
  203. package/dist/accessi-module/Console/generated/model/menuTypeEntity.d.ts +12 -0
  204. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js +9 -0
  205. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js.map +1 -0
  206. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.d.ts +12 -0
  207. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.js +9 -0
  208. package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.js.map +1 -0
  209. package/dist/accessi-module/Console/generated/model/permission.d.ts +12 -0
  210. package/dist/accessi-module/Console/generated/model/permission.js +9 -0
  211. package/dist/accessi-module/Console/generated/model/permission.js.map +1 -0
  212. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.d.ts +51 -0
  213. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js +9 -0
  214. package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js.map +1 -0
  215. package/dist/accessi-module/Console/generated/model/registerRequest.d.ts +62 -0
  216. package/dist/accessi-module/Console/generated/model/registerRequest.js +3 -0
  217. package/dist/accessi-module/Console/generated/model/registerRequest.js.map +1 -0
  218. package/dist/accessi-module/Console/generated/model/registerResponse.d.ts +14 -0
  219. package/dist/accessi-module/Console/generated/model/registerResponse.js +3 -0
  220. package/dist/accessi-module/Console/generated/model/registerResponse.js.map +1 -0
  221. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.d.ts +13 -0
  222. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.js +9 -0
  223. package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.js.map +1 -0
  224. package/dist/accessi-module/Console/generated/model/role.d.ts +15 -0
  225. package/dist/accessi-module/Console/generated/model/role.js +3 -0
  226. package/dist/accessi-module/Console/generated/model/role.js.map +1 -0
  227. package/dist/accessi-module/Console/generated/model/ruoliMenu.d.ts +15 -0
  228. package/dist/accessi-module/Console/generated/model/ruoliMenu.js +3 -0
  229. package/dist/accessi-module/Console/generated/model/ruoliMenu.js.map +1 -0
  230. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.d.ts +16 -0
  231. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.js +17 -0
  232. package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.js.map +1 -0
  233. package/dist/accessi-module/Console/generated/model/schemaDdlResult.d.ts +20 -0
  234. package/dist/accessi-module/Console/generated/model/schemaDdlResult.js +3 -0
  235. package/dist/accessi-module/Console/generated/model/schemaDdlResult.js.map +1 -0
  236. package/dist/accessi-module/Console/generated/model/schemaDdlSection.d.ts +12 -0
  237. package/dist/accessi-module/Console/generated/model/schemaDdlSection.js +9 -0
  238. package/dist/accessi-module/Console/generated/model/schemaDdlSection.js.map +1 -0
  239. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.d.ts +12 -0
  240. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.js +9 -0
  241. package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.js.map +1 -0
  242. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.d.ts +12 -0
  243. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.js +9 -0
  244. package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.js.map +1 -0
  245. package/dist/accessi-module/Console/generated/model/serviceTokenDto.d.ts +28 -0
  246. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js +9 -0
  247. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js.map +1 -0
  248. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.d.ts +10 -0
  249. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.js +9 -0
  250. package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.js.map +1 -0
  251. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.d.ts +13 -0
  252. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.js +3 -0
  253. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.js.map +1 -0
  254. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.d.ts +18 -0
  255. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js +19 -0
  256. package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js.map +1 -0
  257. package/dist/accessi-module/Console/generated/model/status.d.ts +12 -0
  258. package/dist/accessi-module/Console/generated/model/status.js +9 -0
  259. package/dist/accessi-module/Console/generated/model/status.js.map +1 -0
  260. package/dist/accessi-module/Console/generated/model/tipoFiltro.d.ts +23 -0
  261. package/dist/accessi-module/Console/generated/model/tipoFiltro.js +3 -0
  262. package/dist/accessi-module/Console/generated/model/tipoFiltro.js.map +1 -0
  263. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.d.ts +14 -0
  264. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.js +15 -0
  265. package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.js.map +1 -0
  266. package/dist/accessi-module/Console/generated/model/tokenResult.d.ts +15 -0
  267. package/dist/accessi-module/Console/generated/model/tokenResult.js +3 -0
  268. package/dist/accessi-module/Console/generated/model/tokenResult.js.map +1 -0
  269. package/dist/accessi-module/Console/generated/model/tokenResultType.d.ts +14 -0
  270. package/dist/accessi-module/Console/generated/model/tokenResultType.js +15 -0
  271. package/dist/accessi-module/Console/generated/model/tokenResultType.js.map +1 -0
  272. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.d.ts +18 -0
  273. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.js +3 -0
  274. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.js.map +1 -0
  275. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.d.ts +10 -0
  276. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.js +14 -0
  277. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.js.map +1 -0
  278. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.d.ts +13 -0
  279. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js +14 -0
  280. package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js.map +1 -0
  281. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.d.ts +10 -0
  282. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.js +9 -0
  283. package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.js.map +1 -0
  284. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.d.ts +11 -0
  285. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.js +9 -0
  286. package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.js.map +1 -0
  287. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.d.ts +12 -0
  288. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.js +9 -0
  289. package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.js.map +1 -0
  290. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.d.ts +21 -0
  291. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js +3 -0
  292. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js.map +1 -0
  293. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.d.ts +14 -0
  294. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js +15 -0
  295. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +1 -0
  296. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.d.ts +17 -0
  297. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js +9 -0
  298. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js.map +1 -0
  299. package/dist/accessi-module/Console/generated/model/updateMenuRequest.d.ts +47 -0
  300. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js +9 -0
  301. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js.map +1 -0
  302. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.d.ts +13 -0
  303. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js +9 -0
  304. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js.map +1 -0
  305. package/dist/accessi-module/Console/generated/model/userDto.d.ts +88 -0
  306. package/dist/accessi-module/Console/generated/model/userDto.js +3 -0
  307. package/dist/accessi-module/Console/generated/model/userDto.js.map +1 -0
  308. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.d.ts +18 -0
  309. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.js +19 -0
  310. package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.js.map +1 -0
  311. package/dist/accessi-module/Console/generated/model/userGrantsDto.d.ts +16 -0
  312. package/dist/accessi-module/Console/generated/model/userGrantsDto.js +3 -0
  313. package/dist/accessi-module/Console/generated/model/userGrantsDto.js.map +1 -0
  314. package/dist/accessi-module/Console/generated/model/userGrantsResponse.d.ts +14 -0
  315. package/dist/accessi-module/Console/generated/model/userGrantsResponse.js +3 -0
  316. package/dist/accessi-module/Console/generated/model/userGrantsResponse.js.map +1 -0
  317. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.d.ts +18 -0
  318. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.js +9 -0
  319. package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.js.map +1 -0
  320. package/dist/accessi-module/Console/help.d.ts +13 -0
  321. package/dist/accessi-module/Console/help.js +355 -0
  322. package/dist/accessi-module/Console/help.js.map +1 -0
  323. package/dist/accessi-module/Console/index.html +153 -0
  324. package/dist/accessi-module/Console/wiki.d.ts +52 -0
  325. package/dist/accessi-module/Console/wiki.js +730 -0
  326. package/dist/accessi-module/Console/wiki.js.map +1 -0
  327. package/dist/accessi-module/Controllers/AccessiConsoleController.d.ts +18 -0
  328. package/dist/accessi-module/Controllers/AccessiConsoleController.js +111 -0
  329. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +1 -0
  330. package/dist/accessi-module/Controllers/AuthController.d.ts +12 -6
  331. package/dist/accessi-module/Controllers/AuthController.js +167 -82
  332. package/dist/accessi-module/Controllers/AuthController.js.map +1 -1
  333. package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +1 -5
  334. package/dist/accessi-module/Controllers/ConfiguratorController.js +26 -44
  335. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  336. package/dist/accessi-module/Controllers/EmailController.d.ts +4 -6
  337. package/dist/accessi-module/Controllers/EmailController.js +12 -14
  338. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  339. package/dist/accessi-module/Controllers/FiltriController.d.ts +5 -4
  340. package/dist/accessi-module/Controllers/FiltriController.js +125 -6
  341. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  342. package/dist/accessi-module/Controllers/PermissionController.d.ts +12 -1
  343. package/dist/accessi-module/Controllers/PermissionController.js +322 -51
  344. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  345. package/dist/accessi-module/Controllers/SchemaController.d.ts +9 -0
  346. package/dist/accessi-module/Controllers/SchemaController.js +79 -0
  347. package/dist/accessi-module/Controllers/SchemaController.js.map +1 -0
  348. package/dist/accessi-module/Controllers/ServiceTokenController.d.ts +23 -0
  349. package/dist/accessi-module/Controllers/ServiceTokenController.js +176 -0
  350. package/dist/accessi-module/Controllers/ServiceTokenController.js.map +1 -0
  351. package/dist/accessi-module/Controllers/UserController.d.ts +8 -4
  352. package/dist/accessi-module/Controllers/UserController.js +161 -28
  353. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  354. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  355. package/dist/accessi-module/Dtos/AbilitazioneMenu.js +16 -8
  356. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  357. package/dist/accessi-module/Dtos/AdminBootstrapDtos.d.ts +19 -0
  358. package/dist/accessi-module/Dtos/AdminBootstrapDtos.js +83 -0
  359. package/dist/accessi-module/Dtos/AdminBootstrapDtos.js.map +1 -0
  360. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js +0 -1
  361. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  362. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js +1 -2
  363. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  364. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.d.ts +13 -0
  365. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js +70 -0
  366. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +1 -0
  367. package/dist/accessi-module/Dtos/BaseResponse.d.ts +22 -0
  368. package/dist/accessi-module/Dtos/BaseResponse.js +106 -1
  369. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  370. package/dist/accessi-module/Dtos/CatalogDtos.d.ts +64 -0
  371. package/dist/accessi-module/Dtos/CatalogDtos.js +322 -0
  372. package/dist/accessi-module/Dtos/CatalogDtos.js.map +1 -0
  373. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.d.ts +3 -0
  374. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js +31 -0
  375. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -0
  376. package/dist/accessi-module/Dtos/FederatedIdentityDtos.d.ts +69 -0
  377. package/dist/accessi-module/Dtos/FederatedIdentityDtos.js +236 -0
  378. package/dist/accessi-module/Dtos/FederatedIdentityDtos.js.map +1 -0
  379. package/dist/accessi-module/Dtos/FiltriUtente.js +5 -1
  380. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  381. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js +1 -1
  382. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  383. package/dist/accessi-module/Dtos/GetMenusResponse.js +1 -1
  384. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  385. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  386. package/dist/accessi-module/Dtos/GetUserByTokenRequest.d.ts +3 -0
  387. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js +26 -0
  388. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +1 -0
  389. package/dist/accessi-module/Dtos/GetUserByTokenResponse.d.ts +5 -0
  390. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js +27 -0
  391. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +1 -0
  392. package/dist/accessi-module/Dtos/GetUsersResponse.d.ts +1 -1
  393. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  394. package/dist/accessi-module/Dtos/LoginRequest.d.ts +1 -1
  395. package/dist/accessi-module/Dtos/LoginRequest.js +3 -2
  396. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  397. package/dist/accessi-module/Dtos/LoginResponse.d.ts +6 -2
  398. package/dist/accessi-module/Dtos/LoginResponse.js +20 -7
  399. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  400. package/dist/accessi-module/Dtos/MenuItem.js +1 -0
  401. package/dist/accessi-module/Dtos/Permission.d.ts +1 -0
  402. package/dist/accessi-module/Dtos/Permission.js +1 -0
  403. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  404. package/dist/accessi-module/Dtos/PublicRegisterRequest.d.ts +5 -0
  405. package/dist/accessi-module/Dtos/PublicRegisterRequest.js +15 -0
  406. package/dist/accessi-module/Dtos/PublicRegisterRequest.js.map +1 -0
  407. package/dist/accessi-module/Dtos/RegisterRequest.d.ts +2 -4
  408. package/dist/accessi-module/Dtos/RegisterRequest.js +18 -28
  409. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  410. package/dist/accessi-module/Dtos/RegisterResponse.d.ts +1 -1
  411. package/dist/accessi-module/Dtos/RegisterResponse.js +3 -3
  412. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  413. package/dist/accessi-module/Dtos/Role.d.ts +4 -0
  414. package/dist/accessi-module/Dtos/Role.js +4 -0
  415. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  416. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  417. package/dist/accessi-module/Dtos/SchemaDtos.d.ts +19 -0
  418. package/dist/accessi-module/Dtos/SchemaDtos.js +84 -0
  419. package/dist/accessi-module/Dtos/SchemaDtos.js.map +1 -0
  420. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.d.ts +4 -0
  421. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js +36 -0
  422. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +1 -0
  423. package/dist/accessi-module/Dtos/ServiceToken.d.ts +34 -0
  424. package/dist/accessi-module/Dtos/ServiceToken.js +128 -0
  425. package/dist/accessi-module/Dtos/ServiceToken.js.map +1 -0
  426. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  427. package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +1 -1
  428. package/dist/accessi-module/Dtos/TipoAbilitazione.d.ts +4 -0
  429. package/dist/accessi-module/Dtos/TipoAbilitazione.js +4 -0
  430. package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +1 -1
  431. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  432. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  433. package/dist/accessi-module/Dtos/TwoFactorDtos.d.ts +13 -0
  434. package/dist/accessi-module/Dtos/TwoFactorDtos.js +60 -0
  435. package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +1 -0
  436. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  437. package/dist/accessi-module/Dtos/UserDto.d.ts +9 -4
  438. package/dist/accessi-module/Dtos/UserDto.js +39 -24
  439. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  440. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  441. package/dist/accessi-module/Dtos/UserGrantsResponse.d.ts +5 -0
  442. package/dist/accessi-module/Dtos/UserGrantsResponse.js +27 -0
  443. package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +1 -0
  444. package/dist/accessi-module/Dtos/index.d.ts +13 -0
  445. package/dist/accessi-module/Dtos/index.js +13 -0
  446. package/dist/accessi-module/Dtos/index.js.map +1 -1
  447. package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.d.ts +33 -0
  448. package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.js +106 -0
  449. package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.js.map +1 -0
  450. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +40 -5
  451. package/dist/accessi-module/Services/AuthService/AuthService.js +192 -42
  452. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  453. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.d.ts +3 -1
  454. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js +5 -1
  455. package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +1 -1
  456. package/dist/accessi-module/Services/EmailService/EmailService.d.ts +9 -2
  457. package/dist/accessi-module/Services/EmailService/EmailService.js +47 -22
  458. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  459. package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +18 -3
  460. package/dist/accessi-module/Services/FiltriService/FiltriService.js +92 -16
  461. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  462. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +77 -2
  463. package/dist/accessi-module/Services/PermissionService/PermissionService.js +603 -206
  464. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  465. package/dist/accessi-module/Services/SchemaExportService/SchemaExportService.d.ts +36 -0
  466. package/dist/accessi-module/Services/SchemaExportService/SchemaExportService.js +125 -0
  467. package/dist/accessi-module/Services/SchemaExportService/SchemaExportService.js.map +1 -0
  468. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.d.ts +75 -0
  469. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js +265 -0
  470. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +1 -0
  471. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.d.ts +27 -0
  472. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +175 -0
  473. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +1 -0
  474. package/dist/accessi-module/Services/UserService/UserService.d.ts +51 -5
  475. package/dist/accessi-module/Services/UserService/UserService.js +396 -294
  476. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  477. package/dist/accessi-module/Views/reset-password.html +213 -213
  478. package/dist/accessi-module/accessiRuntime.d.ts +45 -0
  479. package/dist/accessi-module/accessiRuntime.js +39 -0
  480. package/dist/accessi-module/accessiRuntime.js.map +1 -0
  481. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.d.ts +83 -0
  482. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.js +360 -0
  483. package/dist/accessi-module/database-updates/AccessiCatalogMigrator.js.map +1 -0
  484. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +57 -10
  485. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +475 -179
  486. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  487. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.d.ts +5 -0
  488. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js +79 -0
  489. package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js.map +1 -0
  490. package/dist/accessi-module/database-updates/accessiSchema.d.ts +67 -0
  491. package/dist/accessi-module/database-updates/accessiSchema.js +124 -0
  492. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -0
  493. package/dist/accessi-module/database-updates/optionalColumns.d.ts +7 -0
  494. package/dist/accessi-module/database-updates/optionalColumns.js +58 -0
  495. package/dist/accessi-module/database-updates/optionalColumns.js.map +1 -0
  496. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.d.ts +1 -0
  497. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.js +69 -0
  498. package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.js.map +1 -0
  499. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +15 -53
  500. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  501. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +24 -0
  502. package/dist/accessi-module/federated-auth/FederatedAuthController.js +333 -0
  503. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +1 -0
  504. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +100 -0
  505. package/dist/accessi-module/federated-auth/FederatedAuthService.js +451 -0
  506. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -0
  507. package/dist/accessi-module/federated-auth/FederatedAuthTypes.d.ts +53 -0
  508. package/dist/accessi-module/federated-auth/FederatedAuthTypes.js +3 -0
  509. package/dist/accessi-module/federated-auth/FederatedAuthTypes.js.map +1 -0
  510. package/dist/accessi-module/index.d.ts +29 -0
  511. package/dist/accessi-module/index.js +89 -19
  512. package/dist/accessi-module/index.js.map +1 -1
  513. package/dist/accessi-module/jwt/jwt.strategy.d.ts +1 -1
  514. package/dist/accessi-module/jwt/jwt.strategy.js +16 -7
  515. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  516. package/dist/accessi-module/middleware/accessiRequirements.d.ts +23 -1
  517. package/dist/accessi-module/middleware/accessiRequirements.js +7 -0
  518. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  519. package/dist/accessi-module/middleware/authenticateGen.d.ts +16 -1
  520. package/dist/accessi-module/middleware/authenticateGen.js +63 -25
  521. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  522. package/dist/accessi-module/security/AccessiHttpExceptionFilter.d.ts +12 -0
  523. package/dist/accessi-module/security/AccessiHttpExceptionFilter.js +74 -0
  524. package/dist/accessi-module/security/AccessiHttpExceptionFilter.js.map +1 -0
  525. package/dist/accessi-module/security/accessControl.d.ts +22 -2
  526. package/dist/accessi-module/security/accessControl.js +47 -8
  527. package/dist/accessi-module/security/accessControl.js.map +1 -1
  528. package/dist/accessi-module/security/accessiValidation.d.ts +9 -0
  529. package/dist/accessi-module/security/accessiValidation.js +41 -0
  530. package/dist/accessi-module/security/accessiValidation.js.map +1 -0
  531. package/dist/accessi-module/security/adminBootstrap.d.ts +8 -0
  532. package/dist/accessi-module/security/adminBootstrap.js +41 -0
  533. package/dist/accessi-module/security/adminBootstrap.js.map +1 -0
  534. package/dist/accessi-module/security/authenticatedToken.d.ts +16 -2
  535. package/dist/accessi-module/security/authenticatedToken.js +31 -4
  536. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  537. package/dist/accessi-module/security/emailConfiguration.d.ts +20 -0
  538. package/dist/accessi-module/security/emailConfiguration.js +41 -0
  539. package/dist/accessi-module/security/emailConfiguration.js.map +1 -0
  540. package/dist/accessi-module/security/passwordResetToken.d.ts +13 -3
  541. package/dist/accessi-module/security/passwordResetToken.js +13 -5
  542. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  543. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +3 -3
  544. package/dist/accessi-module/security/publicAuthRateLimit.js +31 -8
  545. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  546. package/dist/accessi-module/security/serviceTokenGuard.d.ts +25 -0
  547. package/dist/accessi-module/security/serviceTokenGuard.js +85 -0
  548. package/dist/accessi-module/security/serviceTokenGuard.js.map +1 -0
  549. package/dist/accessi-module/security/serviceTokenRateLimit.d.ts +8 -0
  550. package/dist/accessi-module/security/serviceTokenRateLimit.js +49 -0
  551. package/dist/accessi-module/security/serviceTokenRateLimit.js.map +1 -0
  552. package/dist/accessi-module/startupLog.d.ts +6 -0
  553. package/dist/accessi-module/startupLog.js +25 -0
  554. package/dist/accessi-module/startupLog.js.map +1 -0
  555. package/dist/allegati-module/AllegatiModule.d.ts +12 -1
  556. package/dist/allegati-module/AllegatiModule.js +11 -1
  557. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  558. package/dist/allegati-module/Controllers/AllegatiController.d.ts +2 -1
  559. package/dist/allegati-module/Controllers/AllegatiController.js +23 -15
  560. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  561. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  562. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  563. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  564. package/dist/allegati-module/Dtos/index.js.map +1 -1
  565. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  566. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  567. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  568. package/dist/allegati-module/Services/AllegatiService/AllegatiService.d.ts +10 -3
  569. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +150 -101
  570. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  571. package/dist/allegati-module/index.js.map +1 -1
  572. package/dist/allegati-module/security/allegatiAuthorizationGuard.d.ts +14 -0
  573. package/dist/allegati-module/security/allegatiAuthorizationGuard.js +70 -0
  574. package/dist/allegati-module/security/allegatiAuthorizationGuard.js.map +1 -0
  575. package/dist/autobind.d.ts +10 -3
  576. package/dist/autobind.js +24 -9
  577. package/dist/autobind.js.map +1 -1
  578. package/dist/emilsoftware-utilities-2.0.0-dev.40.tgz +0 -0
  579. package/dist/firebird-compat.d.ts +27 -6
  580. package/dist/firebird-compat.js +150 -135
  581. package/dist/firebird-compat.js.map +1 -1
  582. package/dist/index.d.ts +2 -2
  583. package/dist/index.js +2 -2
  584. package/dist/index.js.map +1 -1
  585. package/dist/initEmilsoftwareModule.js +13 -3
  586. package/dist/initEmilsoftwareModule.js.map +1 -1
  587. package/dist/scripts/generateAccessiOpenApi.d.ts +1 -0
  588. package/dist/scripts/generateAccessiOpenApi.js +57 -0
  589. package/dist/scripts/generateAccessiOpenApi.js.map +1 -0
  590. package/dist/scripts/generateAccessiWiki.d.ts +1 -0
  591. package/dist/scripts/generateAccessiWiki.js +131 -0
  592. package/dist/scripts/generateAccessiWiki.js.map +1 -0
  593. package/dist/swagger/SwaggerConfig.d.ts +7 -1
  594. package/dist/swagger/SwaggerConfig.js +22 -8
  595. package/dist/swagger/SwaggerConfig.js.map +1 -1
  596. package/package.json +105 -83
@@ -0,0 +1,265 @@
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.ServiceTokenService = exports.SERVICE_TOKEN_PREFIX = void 0;
25
+ exports.generateServiceToken = generateServiceToken;
26
+ exports.parseServiceToken = parseServiceToken;
27
+ exports.hashServiceTokenSecret = hashServiceTokenSecret;
28
+ exports.normalizeServiceTokenScopes = normalizeServiceTokenScopes;
29
+ exports.serviceTokenHasScope = serviceTokenHasScope;
30
+ const common_1 = require("@nestjs/common");
31
+ const crypto_1 = require("crypto");
32
+ const autobind_1 = require("../../../autobind");
33
+ const Orm_1 = require("../../../Orm");
34
+ const Utilities_1 = require("../../../Utilities");
35
+ /** Prefisso riconoscibile dei token di servizio; il formato completo e `st_<id>.<segreto>`. */
36
+ exports.SERVICE_TOKEN_PREFIX = 'st_';
37
+ const TOKEN_ID_PATTERN = /^st_[a-f0-9]{32}$/;
38
+ const SCOPE_PATTERN = /^[a-z0-9:_-]{1,40}$/i;
39
+ const LAST_USED_REFRESH_MS = 60000;
40
+ /** Genera un nuovo token di servizio: identificativo pubblico + segreto ad alta entropia. */
41
+ function generateServiceToken() {
42
+ const tokenId = `${exports.SERVICE_TOKEN_PREFIX}${(0, crypto_1.randomBytes)(16).toString('hex')}`;
43
+ const secret = (0, crypto_1.randomBytes)(32).toString('base64url');
44
+ return { token: `${tokenId}.${secret}`, tokenId, secret };
45
+ }
46
+ /** Estrae identificativo e segreto; restituisce `null` se il formato non e valido. */
47
+ function parseServiceToken(token) {
48
+ if (typeof token !== 'string') {
49
+ return null;
50
+ }
51
+ const separator = token.indexOf('.');
52
+ if (separator <= 0) {
53
+ return null;
54
+ }
55
+ const tokenId = token.slice(0, separator);
56
+ const secret = token.slice(separator + 1);
57
+ if (!TOKEN_ID_PATTERN.test(tokenId) || secret.length < 16) {
58
+ return null;
59
+ }
60
+ return { tokenId, secret };
61
+ }
62
+ /** Hash del segreto per lo storage at-rest. Il segreto e ad alta entropia (256 bit), non una password. */
63
+ function hashServiceTokenSecret(secret) {
64
+ return (0, crypto_1.createHash)('sha256').update(secret, 'utf8').digest('hex');
65
+ }
66
+ /** Normalizza e valida gli scope: trim, dedup e controllo del formato. */
67
+ function normalizeServiceTokenScopes(scopes) {
68
+ if (scopes === undefined) {
69
+ return [];
70
+ }
71
+ if (!Array.isArray(scopes)) {
72
+ throw new common_1.BadRequestException('Gli scope devono essere un array di stringhe.');
73
+ }
74
+ const normalized = [];
75
+ for (const rawScope of scopes) {
76
+ if (typeof rawScope !== 'string' || !SCOPE_PATTERN.test(rawScope.trim())) {
77
+ throw new common_1.BadRequestException(`Scope non valido: ${String(rawScope)}. Usare lettere, numeri, ':', '_' o '-'.`);
78
+ }
79
+ const scope = rawScope.trim().toLowerCase();
80
+ if (!normalized.includes(scope)) {
81
+ normalized.push(scope);
82
+ }
83
+ }
84
+ return normalized;
85
+ }
86
+ /** True se l'insieme di scope soddisfa quello richiesto (uno scope vuoto non richiede nulla). */
87
+ function serviceTokenHasScope(scopes, required) {
88
+ if (!required) {
89
+ return true;
90
+ }
91
+ return scopes.includes(required.toLowerCase());
92
+ }
93
+ function toIso(value) {
94
+ if (value === undefined || value === null) {
95
+ return undefined;
96
+ }
97
+ const date = value instanceof Date ? value : new Date(String(value));
98
+ return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
99
+ }
100
+ function resolveExpiration(input, defaultTtlDays) {
101
+ var _a;
102
+ if (input.expiresAt !== undefined && input.expiresAt !== null && input.expiresAt !== '') {
103
+ const expiresAt = input.expiresAt instanceof Date ? input.expiresAt : new Date(String(input.expiresAt));
104
+ if (Number.isNaN(expiresAt.getTime())) {
105
+ throw new common_1.BadRequestException('Data di scadenza non valida.');
106
+ }
107
+ if (expiresAt.getTime() <= Date.now()) {
108
+ throw new common_1.BadRequestException('La data di scadenza deve essere nel futuro.');
109
+ }
110
+ return expiresAt;
111
+ }
112
+ const ttlDays = (_a = input.ttlDays) !== null && _a !== void 0 ? _a : defaultTtlDays;
113
+ if (typeof ttlDays === 'number' && Number.isFinite(ttlDays) && ttlDays > 0) {
114
+ return new Date(Date.now() + ttlDays * 24 * 60 * 60 * 1000);
115
+ }
116
+ return null;
117
+ }
118
+ /** Gestisce il ciclo di vita dei token di servizio (emissione, elenco, revoca, rotazione, verifica). */
119
+ let ServiceTokenService = class ServiceTokenService {
120
+ constructor(accessiOptions) {
121
+ this.accessiOptions = accessiOptions;
122
+ }
123
+ get databaseOptions() {
124
+ return this.accessiOptions.databaseOptions;
125
+ }
126
+ toMetadata(row) {
127
+ var _a;
128
+ const scopesRaw = typeof row.scopes === 'string' ? row.scopes.trim() : '';
129
+ return {
130
+ tokenId: String((_a = row.tokenId) !== null && _a !== void 0 ? _a : ''),
131
+ label: typeof row.label === 'string' ? row.label : '',
132
+ scopes: scopesRaw === '' ? [] : scopesRaw.split(/\s+/),
133
+ createdAt: toIso(row.createdAt),
134
+ expiresAt: toIso(row.expiresAt),
135
+ lastUsedAt: toIso(row.lastUsedAt),
136
+ lastUsedIp: typeof row.lastUsedIp === 'string' && row.lastUsedIp !== '' ? row.lastUsedIp : undefined,
137
+ revoked: row.revokedAt !== undefined && row.revokedAt !== null,
138
+ revokedAt: toIso(row.revokedAt),
139
+ revokedBy: row.revokedBy == null ? undefined : Number(row.revokedBy),
140
+ };
141
+ }
142
+ readRow(tokenId) {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ const rows = yield Orm_1.Orm.query(this.databaseOptions, `SELECT TOKEN_ID, TOKEN_HASH, LABEL, SCOPES, CREATED_BY, CREATED_AT, EXPIRES_AT, LAST_USED_AT, LAST_USED_IP, REVOKED_AT, REVOKED_BY
145
+ FROM ACCESSI_SERVICE_TOKEN WHERE TOKEN_ID = ?`, [tokenId], false);
146
+ return rows.map(Utilities_1.RestUtilities.convertKeysToCamelCase)[0];
147
+ });
148
+ }
149
+ /** Crea un nuovo token. Il segreto in chiaro e restituito una sola volta e non e recuperabile. */
150
+ issue(input, createdBy) {
151
+ return __awaiter(this, void 0, void 0, function* () {
152
+ var _a;
153
+ const label = typeof (input === null || input === void 0 ? void 0 : input.label) === 'string' ? input.label.trim() : '';
154
+ if (label.length < 1 || label.length > 100) {
155
+ throw new common_1.BadRequestException('La descrizione del token deve essere compresa tra 1 e 100 caratteri.');
156
+ }
157
+ const scopes = normalizeServiceTokenScopes(input.scopes);
158
+ const expiresAt = resolveExpiration(input, (_a = this.accessiOptions.serviceTokens) === null || _a === void 0 ? void 0 : _a.defaultTtlDays);
159
+ const { token, tokenId, secret } = generateServiceToken();
160
+ yield Orm_1.Orm.execute(this.databaseOptions, `INSERT INTO ACCESSI_SERVICE_TOKEN (TOKEN_ID, TOKEN_HASH, LABEL, SCOPES, CREATED_BY, EXPIRES_AT)
161
+ VALUES (?, ?, ?, ?, ?, ?)`, [tokenId, hashServiceTokenSecret(secret), label, scopes.join(' '), createdBy !== null && createdBy !== void 0 ? createdBy : null, expiresAt]);
162
+ const row = yield this.readRow(tokenId);
163
+ return Object.assign(Object.assign({}, this.toMetadata(row !== null && row !== void 0 ? row : { tokenId, label, scopes: scopes.join(' ') })), { token });
164
+ });
165
+ }
166
+ /** Elenca i token (metadati soltanto, mai il segreto). */
167
+ list() {
168
+ return __awaiter(this, arguments, void 0, function* (includeRevoked = false) {
169
+ const rows = yield Orm_1.Orm.query(this.databaseOptions, `SELECT TOKEN_ID, LABEL, SCOPES, CREATED_BY, CREATED_AT, EXPIRES_AT, LAST_USED_AT, LAST_USED_IP, REVOKED_AT, REVOKED_BY
170
+ FROM ACCESSI_SERVICE_TOKEN ${includeRevoked ? '' : 'WHERE REVOKED_AT IS NULL'}
171
+ ORDER BY CREATED_AT DESC, TOKEN_ID DESC`, [], false);
172
+ return rows.map(Utilities_1.RestUtilities.convertKeysToCamelCase).map((row) => this.toMetadata(row));
173
+ });
174
+ }
175
+ /** Revoca un token rendendolo immediatamente inutilizzabile. Idempotente su token gia revocati. */
176
+ revoke(tokenId, revokedBy) {
177
+ return __awaiter(this, void 0, void 0, function* () {
178
+ var _a;
179
+ const parsed = parseServiceToken(tokenId);
180
+ const normalizedId = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.tokenId) !== null && _a !== void 0 ? _a : tokenId;
181
+ const row = yield this.readRow(normalizedId);
182
+ if (!row) {
183
+ throw new common_1.NotFoundException(`Token di servizio ${normalizedId} non trovato.`);
184
+ }
185
+ if (row.revokedAt !== undefined && row.revokedAt !== null) {
186
+ return;
187
+ }
188
+ yield Orm_1.Orm.execute(this.databaseOptions, 'UPDATE ACCESSI_SERVICE_TOKEN SET REVOKED_AT = CURRENT_TIMESTAMP, REVOKED_BY = ? WHERE TOKEN_ID = ?', [revokedBy !== null && revokedBy !== void 0 ? revokedBy : null, normalizedId]);
189
+ });
190
+ }
191
+ /** Revoca il token indicato ed emette un sostituto con gli stessi metadati. */
192
+ rotate(tokenId, createdBy) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ var _a, _b;
195
+ const parsed = parseServiceToken(tokenId);
196
+ const normalizedId = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.tokenId) !== null && _a !== void 0 ? _a : tokenId;
197
+ const row = yield this.readRow(normalizedId);
198
+ if (!row) {
199
+ throw new common_1.NotFoundException(`Token di servizio ${normalizedId} non trovato.`);
200
+ }
201
+ const metadata = this.toMetadata(row);
202
+ yield this.revoke(normalizedId, createdBy);
203
+ return this.issue({
204
+ label: metadata.label,
205
+ scopes: metadata.scopes,
206
+ expiresAt: (_b = metadata.expiresAt) !== null && _b !== void 0 ? _b : null,
207
+ }, createdBy);
208
+ });
209
+ }
210
+ /**
211
+ * Verifica un token presentato: formato, esistenza, revoca, scadenza e hash a tempo costante.
212
+ * Aggiorna `LAST_USED_AT` (best-effort, al massimo una volta al minuto).
213
+ */
214
+ verify(token, context) {
215
+ return __awaiter(this, void 0, void 0, function* () {
216
+ const parsed = parseServiceToken(token);
217
+ if (!parsed) {
218
+ return undefined;
219
+ }
220
+ const row = yield this.readRow(parsed.tokenId);
221
+ if (!row) {
222
+ return undefined;
223
+ }
224
+ if (row.revokedAt !== undefined && row.revokedAt !== null) {
225
+ return undefined;
226
+ }
227
+ const expiresAt = toIso(row.expiresAt);
228
+ if (expiresAt && new Date(expiresAt).getTime() <= Date.now()) {
229
+ return undefined;
230
+ }
231
+ const storedHash = typeof row.tokenHash === 'string' ? row.tokenHash : '';
232
+ if (!storedHash || !this.safeHashEquals(hashServiceTokenSecret(parsed.secret), storedHash)) {
233
+ return undefined;
234
+ }
235
+ const metadata = this.toMetadata(row);
236
+ yield this.touchLastUsed(parsed.tokenId, row.lastUsedAt, context === null || context === void 0 ? void 0 : context.ip).catch(() => undefined);
237
+ return { tokenId: metadata.tokenId, label: metadata.label, scopes: metadata.scopes };
238
+ });
239
+ }
240
+ safeHashEquals(candidate, stored) {
241
+ const candidateBuffer = Buffer.from(candidate, 'hex');
242
+ const storedBuffer = Buffer.from(stored, 'hex');
243
+ if (candidateBuffer.length !== storedBuffer.length || candidateBuffer.length === 0) {
244
+ return false;
245
+ }
246
+ return (0, crypto_1.timingSafeEqual)(candidateBuffer, storedBuffer);
247
+ }
248
+ touchLastUsed(tokenId, lastUsedAt, ip) {
249
+ return __awaiter(this, void 0, void 0, function* () {
250
+ const lastUsed = toIso(lastUsedAt);
251
+ if (lastUsed && Date.now() - new Date(lastUsed).getTime() < LAST_USED_REFRESH_MS) {
252
+ return;
253
+ }
254
+ yield Orm_1.Orm.execute(this.databaseOptions, 'UPDATE ACCESSI_SERVICE_TOKEN SET LAST_USED_AT = CURRENT_TIMESTAMP, LAST_USED_IP = ? WHERE TOKEN_ID = ?', [ip !== null && ip !== void 0 ? ip : null, tokenId], false);
255
+ });
256
+ }
257
+ };
258
+ exports.ServiceTokenService = ServiceTokenService;
259
+ exports.ServiceTokenService = ServiceTokenService = __decorate([
260
+ autobind_1.autobind,
261
+ (0, common_1.Injectable)(),
262
+ __param(0, (0, common_1.Inject)('ACCESSI_OPTIONS')),
263
+ __metadata("design:paramtypes", [Object])
264
+ ], ServiceTokenService);
265
+ //# sourceMappingURL=ServiceTokenService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceTokenService.js","sourceRoot":"","sources":["../../../../src/accessi-module/Services/ServiceTokenService/ServiceTokenService.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { createHash, randomBytes, timingSafeEqual } from 'crypto';\nimport { autobind } from '../../../autobind';\nimport { Orm } from '../../../Orm';\nimport { RestUtilities } from '../../../Utilities';\nimport type { AccessiOptions } from '../../AccessiModule';\n\n/** Prefisso riconoscibile dei token di servizio; il formato completo e `st_<id>.<segreto>`. */\nexport const SERVICE_TOKEN_PREFIX = 'st_';\nconst TOKEN_ID_PATTERN = /^st_[a-f0-9]{32}$/;\nconst SCOPE_PATTERN = /^[a-z0-9:_-]{1,40}$/i;\nconst LAST_USED_REFRESH_MS = 60_000;\n\n/** Metadati pubblici di un token (mai il segreto). */\nexport interface ServiceTokenMetadata {\n tokenId: string;\n label: string;\n scopes: string[];\n createdAt?: string;\n expiresAt?: string;\n lastUsedAt?: string;\n lastUsedIp?: string;\n revoked: boolean;\n revokedAt?: string;\n revokedBy?: number;\n}\n\n/** Risultato dell'emissione: contiene il segreto in chiaro, mostrato una sola volta. */\nexport interface IssuedServiceToken extends ServiceTokenMetadata {\n token: string;\n}\n\n/** Risultato della verifica di un token presentato. */\nexport interface VerifiedServiceToken {\n tokenId: string;\n label: string;\n scopes: string[];\n}\n\nexport interface IssueServiceTokenInput {\n label: string;\n scopes?: string[];\n expiresAt?: Date | string | null;\n /** Giorni di validita; ignorato se `expiresAt` e valorizzato. */\n ttlDays?: number;\n}\n\n/** Genera un nuovo token di servizio: identificativo pubblico + segreto ad alta entropia. */\nexport function generateServiceToken(): { token: string; tokenId: string; secret: string } {\n const tokenId = `${SERVICE_TOKEN_PREFIX}${randomBytes(16).toString('hex')}`;\n const secret = randomBytes(32).toString('base64url');\n return { token: `${tokenId}.${secret}`, tokenId, secret };\n}\n\n/** Estrae identificativo e segreto; restituisce `null` se il formato non e valido. */\nexport function parseServiceToken(token: unknown): { tokenId: string; secret: string } | null {\n if (typeof token !== 'string') {\n return null;\n }\n\n const separator = token.indexOf('.');\n if (separator <= 0) {\n return null;\n }\n\n const tokenId = token.slice(0, separator);\n const secret = token.slice(separator + 1);\n if (!TOKEN_ID_PATTERN.test(tokenId) || secret.length < 16) {\n return null;\n }\n\n return { tokenId, secret };\n}\n\n/** Hash del segreto per lo storage at-rest. Il segreto e ad alta entropia (256 bit), non una password. */\nexport function hashServiceTokenSecret(secret: string): string {\n return createHash('sha256').update(secret, 'utf8').digest('hex');\n}\n\n/** Normalizza e valida gli scope: trim, dedup e controllo del formato. */\nexport function normalizeServiceTokenScopes(scopes: string[] | undefined): string[] {\n if (scopes === undefined) {\n return [];\n }\n if (!Array.isArray(scopes)) {\n throw new BadRequestException('Gli scope devono essere un array di stringhe.');\n }\n\n const normalized: string[] = [];\n for (const rawScope of scopes) {\n if (typeof rawScope !== 'string' || !SCOPE_PATTERN.test(rawScope.trim())) {\n throw new BadRequestException(`Scope non valido: ${String(rawScope)}. Usare lettere, numeri, ':', '_' o '-'.`);\n }\n const scope = rawScope.trim().toLowerCase();\n if (!normalized.includes(scope)) {\n normalized.push(scope);\n }\n }\n return normalized;\n}\n\n/** True se l'insieme di scope soddisfa quello richiesto (uno scope vuoto non richiede nulla). */\nexport function serviceTokenHasScope(scopes: string[], required: string | undefined): boolean {\n if (!required) {\n return true;\n }\n return scopes.includes(required.toLowerCase());\n}\n\nfunction toIso(value: unknown): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n const date = value instanceof Date ? value : new Date(String(value));\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\nfunction resolveExpiration(input: IssueServiceTokenInput, defaultTtlDays?: number): Date | null {\n if (input.expiresAt !== undefined && input.expiresAt !== null && input.expiresAt !== '') {\n const expiresAt = input.expiresAt instanceof Date ? input.expiresAt : new Date(String(input.expiresAt));\n if (Number.isNaN(expiresAt.getTime())) {\n throw new BadRequestException('Data di scadenza non valida.');\n }\n if (expiresAt.getTime() <= Date.now()) {\n throw new BadRequestException('La data di scadenza deve essere nel futuro.');\n }\n return expiresAt;\n }\n\n const ttlDays = input.ttlDays ?? defaultTtlDays;\n if (typeof ttlDays === 'number' && Number.isFinite(ttlDays) && ttlDays > 0) {\n return new Date(Date.now() + ttlDays * 24 * 60 * 60 * 1000);\n }\n\n return null;\n}\n\n/** Gestisce il ciclo di vita dei token di servizio (emissione, elenco, revoca, rotazione, verifica). */\n@autobind\n@Injectable()\nexport class ServiceTokenService {\n constructor(@Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions) {}\n\n private get databaseOptions() {\n return this.accessiOptions.databaseOptions;\n }\n\n private toMetadata(row: Record<string, unknown>): ServiceTokenMetadata {\n const scopesRaw = typeof row.scopes === 'string' ? row.scopes.trim() : '';\n return {\n tokenId: String(row.tokenId ?? ''),\n label: typeof row.label === 'string' ? row.label : '',\n scopes: scopesRaw === '' ? [] : scopesRaw.split(/\\s+/),\n createdAt: toIso(row.createdAt),\n expiresAt: toIso(row.expiresAt),\n lastUsedAt: toIso(row.lastUsedAt),\n lastUsedIp: typeof row.lastUsedIp === 'string' && row.lastUsedIp !== '' ? row.lastUsedIp : undefined,\n revoked: row.revokedAt !== undefined && row.revokedAt !== null,\n revokedAt: toIso(row.revokedAt),\n revokedBy: row.revokedBy == null ? undefined : Number(row.revokedBy),\n };\n }\n\n private async readRow(tokenId: string): Promise<Record<string, unknown> | undefined> {\n const rows = await Orm.query(\n this.databaseOptions,\n `SELECT TOKEN_ID, TOKEN_HASH, LABEL, SCOPES, CREATED_BY, CREATED_AT, EXPIRES_AT, LAST_USED_AT, LAST_USED_IP, REVOKED_AT, REVOKED_BY\n FROM ACCESSI_SERVICE_TOKEN WHERE TOKEN_ID = ?`,\n [tokenId],\n false,\n );\n return (rows.map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>)[0];\n }\n\n /** Crea un nuovo token. Il segreto in chiaro e restituito una sola volta e non e recuperabile. */\n async issue(input: IssueServiceTokenInput, createdBy?: number): Promise<IssuedServiceToken> {\n const label = typeof input?.label === 'string' ? input.label.trim() : '';\n if (label.length < 1 || label.length > 100) {\n throw new BadRequestException('La descrizione del token deve essere compresa tra 1 e 100 caratteri.');\n }\n\n const scopes = normalizeServiceTokenScopes(input.scopes);\n const expiresAt = resolveExpiration(input, this.accessiOptions.serviceTokens?.defaultTtlDays);\n const { token, tokenId, secret } = generateServiceToken();\n\n await Orm.execute(\n this.databaseOptions,\n `INSERT INTO ACCESSI_SERVICE_TOKEN (TOKEN_ID, TOKEN_HASH, LABEL, SCOPES, CREATED_BY, EXPIRES_AT)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [tokenId, hashServiceTokenSecret(secret), label, scopes.join(' '), createdBy ?? null, expiresAt],\n );\n\n const row = await this.readRow(tokenId);\n return { ...this.toMetadata(row ?? { tokenId, label, scopes: scopes.join(' ') }), token };\n }\n\n /** Elenca i token (metadati soltanto, mai il segreto). */\n async list(includeRevoked = false): Promise<ServiceTokenMetadata[]> {\n const rows = await Orm.query(\n this.databaseOptions,\n `SELECT TOKEN_ID, LABEL, SCOPES, CREATED_BY, CREATED_AT, EXPIRES_AT, LAST_USED_AT, LAST_USED_IP, REVOKED_AT, REVOKED_BY\n FROM ACCESSI_SERVICE_TOKEN ${includeRevoked ? '' : 'WHERE REVOKED_AT IS NULL'}\n ORDER BY CREATED_AT DESC, TOKEN_ID DESC`,\n [],\n false,\n );\n return (rows.map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>).map((row) => this.toMetadata(row));\n }\n\n /** Revoca un token rendendolo immediatamente inutilizzabile. Idempotente su token gia revocati. */\n async revoke(tokenId: string, revokedBy?: number): Promise<void> {\n const parsed = parseServiceToken(tokenId);\n const normalizedId = parsed?.tokenId ?? tokenId;\n const row = await this.readRow(normalizedId);\n if (!row) {\n throw new NotFoundException(`Token di servizio ${normalizedId} non trovato.`);\n }\n if (row.revokedAt !== undefined && row.revokedAt !== null) {\n return;\n }\n await Orm.execute(\n this.databaseOptions,\n 'UPDATE ACCESSI_SERVICE_TOKEN SET REVOKED_AT = CURRENT_TIMESTAMP, REVOKED_BY = ? WHERE TOKEN_ID = ?',\n [revokedBy ?? null, normalizedId],\n );\n }\n\n /** Revoca il token indicato ed emette un sostituto con gli stessi metadati. */\n async rotate(tokenId: string, createdBy?: number): Promise<IssuedServiceToken> {\n const parsed = parseServiceToken(tokenId);\n const normalizedId = parsed?.tokenId ?? tokenId;\n const row = await this.readRow(normalizedId);\n if (!row) {\n throw new NotFoundException(`Token di servizio ${normalizedId} non trovato.`);\n }\n\n const metadata = this.toMetadata(row);\n await this.revoke(normalizedId, createdBy);\n\n return this.issue(\n {\n label: metadata.label,\n scopes: metadata.scopes,\n expiresAt: metadata.expiresAt ?? null,\n },\n createdBy,\n );\n }\n\n /**\n * Verifica un token presentato: formato, esistenza, revoca, scadenza e hash a tempo costante.\n * Aggiorna `LAST_USED_AT` (best-effort, al massimo una volta al minuto).\n */\n async verify(token: string, context?: { ip?: string }): Promise<VerifiedServiceToken | undefined> {\n const parsed = parseServiceToken(token);\n if (!parsed) {\n return undefined;\n }\n\n const row = await this.readRow(parsed.tokenId);\n if (!row) {\n return undefined;\n }\n\n if (row.revokedAt !== undefined && row.revokedAt !== null) {\n return undefined;\n }\n\n const expiresAt = toIso(row.expiresAt);\n if (expiresAt && new Date(expiresAt).getTime() <= Date.now()) {\n return undefined;\n }\n\n const storedHash = typeof row.tokenHash === 'string' ? row.tokenHash : '';\n if (!storedHash || !this.safeHashEquals(hashServiceTokenSecret(parsed.secret), storedHash)) {\n return undefined;\n }\n\n const metadata = this.toMetadata(row);\n await this.touchLastUsed(parsed.tokenId, row.lastUsedAt, context?.ip).catch(() => undefined);\n\n return { tokenId: metadata.tokenId, label: metadata.label, scopes: metadata.scopes };\n }\n\n private safeHashEquals(candidate: string, stored: string): boolean {\n const candidateBuffer = Buffer.from(candidate, 'hex');\n const storedBuffer = Buffer.from(stored, 'hex');\n if (candidateBuffer.length !== storedBuffer.length || candidateBuffer.length === 0) {\n return false;\n }\n return timingSafeEqual(candidateBuffer, storedBuffer);\n }\n\n private async touchLastUsed(tokenId: string, lastUsedAt: unknown, ip?: string): Promise<void> {\n const lastUsed = toIso(lastUsedAt);\n if (lastUsed && Date.now() - new Date(lastUsed).getTime() < LAST_USED_REFRESH_MS) {\n return;\n }\n await Orm.execute(\n this.databaseOptions,\n 'UPDATE ACCESSI_SERVICE_TOKEN SET LAST_USED_AT = CURRENT_TIMESTAMP, LAST_USED_IP = ? WHERE TOKEN_ID = ?',\n [ip ?? null, tokenId],\n false,\n );\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import type { AccessiOptions } from '../../AccessiModule';
2
+ import { TwoFactorChallengeDto } from '../../Dtos/TwoFactorDtos';
3
+ import { EmailService } from '../EmailService/EmailService';
4
+ export type TwoFactorMode = 'password' | 'passwordless' | 'federated';
5
+ export interface TwoFactorProof {
6
+ codiceUtente: number;
7
+ email: string;
8
+ mode: TwoFactorMode;
9
+ identityKey?: string;
10
+ }
11
+ /** Database-backed challenges: no OTP, password or authentication token is logged or stored in clear text. */
12
+ export declare class TwoFactorService {
13
+ private readonly options;
14
+ private readonly emailService;
15
+ constructor(options: AccessiOptions, emailService: EmailService);
16
+ private invalid;
17
+ private limited;
18
+ private hash;
19
+ private row;
20
+ private transaction;
21
+ private response;
22
+ private deliver;
23
+ issue(proof: TwoFactorProof): Promise<TwoFactorChallengeDto>;
24
+ describe(id: string): Promise<TwoFactorProof>;
25
+ resend(id: string): Promise<TwoFactorChallengeDto>;
26
+ consume(id: string, code: string): Promise<TwoFactorProof>;
27
+ }
@@ -0,0 +1,175 @@
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.TwoFactorService = void 0;
25
+ const common_1 = require("@nestjs/common");
26
+ const crypto_1 = require("crypto");
27
+ const Orm_1 = require("../../../Orm");
28
+ const Utilities_1 = require("../../../Utilities");
29
+ const passwordResetToken_1 = require("../../security/passwordResetToken");
30
+ const EmailService_1 = require("../EmailService/EmailService");
31
+ const LIFETIME_SECONDS = 600;
32
+ const MAX_ATTEMPTS = 5;
33
+ const RESEND_SECONDS = 60;
34
+ const MAX_SENDS = 3;
35
+ const RETURN_FIELDS = 'CODUTE, EMAIL, AUTHMODE, IDNKEY, CODEHASH, EXPIRES_AT, ATTEMPTS, SENDS, SENT_AT';
36
+ /** Database-backed challenges: no OTP, password or authentication token is logged or stored in clear text. */
37
+ let TwoFactorService = class TwoFactorService {
38
+ constructor(options, emailService) {
39
+ this.options = options;
40
+ this.emailService = emailService;
41
+ }
42
+ invalid() {
43
+ return new common_1.UnauthorizedException({ code: 'ACCESSI_2FA_INVALID', message: 'Codice non valido o scaduto. Ripeti l accesso se hai esaurito i tentativi.' });
44
+ }
45
+ limited() {
46
+ return new common_1.HttpException({ code: 'ACCESSI_2FA_RATE_LIMITED', message: 'Attendi prima di richiedere un altro codice.' }, 429);
47
+ }
48
+ hash(id, code) {
49
+ return (0, crypto_1.createHmac)('sha256', (0, passwordResetToken_1.getAccessiJwtSecret)(this.options, '2fa')).update(`accessi-2fa:${id}:${code}`).digest('hex');
50
+ }
51
+ row(result) {
52
+ var _a, _b, _c, _d, _e, _f;
53
+ const row = (Array.isArray(result) ? result[0] : result);
54
+ if (!row)
55
+ return undefined;
56
+ const raw = Utilities_1.RestUtilities.convertKeysToCamelCase(row);
57
+ const asString = (value) => typeof value === 'string' ? value : undefined;
58
+ const codiceUtente = Number(raw.codute);
59
+ if (!codiceUtente)
60
+ return undefined;
61
+ const converted = {
62
+ codiceUtente,
63
+ email: (_b = (_a = asString(raw.email)) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : '',
64
+ mode: (_d = (_c = asString(raw.authmode)) === null || _c === void 0 ? void 0 : _c.trim()) !== null && _d !== void 0 ? _d : 'password',
65
+ identityKey: (_e = asString(raw.idnkey)) === null || _e === void 0 ? void 0 : _e.trim(),
66
+ codeHash: (_f = asString(raw.codehash)) !== null && _f !== void 0 ? _f : '',
67
+ expiresAt: raw.expiresAt,
68
+ attempts: Number(raw.attempts),
69
+ sends: Number(raw.sends),
70
+ sentAt: raw.sentAt,
71
+ };
72
+ return converted;
73
+ }
74
+ transaction(operation) {
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ return Orm_1.Orm.withTransaction(this.options.databaseOptions, (transaction) => __awaiter(this, void 0, void 0, function* () {
77
+ const query = (sql, params = []) => Orm_1.Orm.transactionQuery(transaction, sql, params);
78
+ return operation(query);
79
+ }));
80
+ });
81
+ }
82
+ response(id, expiresAt) {
83
+ return { twoFactorRequired: true, challengeId: id, expiresAt: new Date(expiresAt).toISOString(), resendAfterSeconds: RESEND_SECONDS, method: 'email' };
84
+ }
85
+ deliver(id, code, email) {
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ try {
88
+ yield this.emailService.sendTwoFactorCode(email, code, LIFETIME_SECONDS / 60);
89
+ }
90
+ catch (_a) {
91
+ // Invalidate only the code whose delivery failed, preserving a concurrent newer code.
92
+ yield Orm_1.Orm.execute(this.options.databaseOptions, 'UPDATE ACCESSI_2FA SET ATTEMPTS = ? WHERE CHALLENGE_ID = ? AND CODEHASH = ?', [MAX_ATTEMPTS, id, this.hash(id, code)], false).catch(() => undefined);
93
+ throw new common_1.ServiceUnavailableException({ code: 'ACCESSI_2FA_DELIVERY_FAILED', message: 'Invio del codice non riuscito. Riprova tra poco.' });
94
+ }
95
+ });
96
+ }
97
+ issue(proof) {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ var _a;
100
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test((_a = proof.email) !== null && _a !== void 0 ? _a : '')) {
101
+ throw new common_1.ServiceUnavailableException({ code: 'ACCESSI_2FA_EMAIL_REQUIRED', message: 'Per il codice di accesso serve un indirizzo email valido. Contatta un amministratore.' });
102
+ }
103
+ const id = (0, crypto_1.randomBytes)(32).toString('hex');
104
+ const code = String((0, crypto_1.randomInt)(1000000)).padStart(6, '0');
105
+ const expiresAt = yield this.transaction((query) => __awaiter(this, void 0, void 0, function* () {
106
+ var _a, _b, _c, _d, _e, _f;
107
+ // Serialize issuance for this account across backend instances.
108
+ yield query('SELECT CODUTE FROM UTENTI WHERE CODUTE = ? WITH LOCK', [proof.codiceUtente]);
109
+ const recent = yield query('SELECT COUNT(*) AS TOTAL FROM ACCESSI_2FA WHERE CODUTE = ? AND CREATED_AT > DATEADD(-15 MINUTE TO CURRENT_TIMESTAMP)', [proof.codiceUtente]);
110
+ if (Number((_d = (_b = (_a = recent === null || recent === void 0 ? void 0 : recent[0]) === null || _a === void 0 ? void 0 : _a.TOTAL) !== null && _b !== void 0 ? _b : (_c = recent === null || recent === void 0 ? void 0 : recent[0]) === null || _c === void 0 ? void 0 : _c.total) !== null && _d !== void 0 ? _d : 0) >= 5)
111
+ throw this.limited();
112
+ yield query('DELETE FROM ACCESSI_2FA WHERE EXPIRES_AT < DATEADD(-1 DAY TO CURRENT_TIMESTAMP)');
113
+ const created = yield query(`INSERT INTO ACCESSI_2FA (CHALLENGE_ID, CODUTE, EMAIL, AUTHMODE, IDNKEY, CODEHASH, EXPIRES_AT) VALUES (?, ?, ?, ?, ?, ?, DATEADD(${LIFETIME_SECONDS} SECOND TO CURRENT_TIMESTAMP)) RETURNING EXPIRES_AT`, [id, proof.codiceUtente, proof.email, proof.mode, (_e = proof.identityKey) !== null && _e !== void 0 ? _e : null, this.hash(id, code)]);
114
+ const row = (Array.isArray(created) ? created[0] : created);
115
+ return ((_f = row === null || row === void 0 ? void 0 : row.EXPIRES_AT) !== null && _f !== void 0 ? _f : row === null || row === void 0 ? void 0 : row.expires_at);
116
+ }));
117
+ yield this.deliver(id, code, proof.email);
118
+ return this.response(id, expiresAt);
119
+ });
120
+ }
121
+ describe(id) {
122
+ return __awaiter(this, void 0, void 0, function* () {
123
+ if (!/^[a-f0-9]{64}$/.test(id))
124
+ throw this.invalid();
125
+ const row = this.row(yield Orm_1.Orm.query(this.options.databaseOptions, `SELECT ${RETURN_FIELDS} FROM ACCESSI_2FA WHERE CHALLENGE_ID = ? AND EXPIRES_AT > CURRENT_TIMESTAMP AND ATTEMPTS < ?`, [id, MAX_ATTEMPTS], false));
126
+ if (!row)
127
+ throw this.invalid();
128
+ return row;
129
+ });
130
+ }
131
+ resend(id) {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ if (!/^[a-f0-9]{64}$/.test(id))
134
+ throw this.invalid();
135
+ const code = String((0, crypto_1.randomInt)(1000000)).padStart(6, '0');
136
+ const row = yield this.transaction((query) => __awaiter(this, void 0, void 0, function* () {
137
+ const result = this.row(yield query(`UPDATE ACCESSI_2FA SET CODEHASH = ?, SENDS = SENDS + 1, SENT_AT = CURRENT_TIMESTAMP WHERE CHALLENGE_ID = ? AND EXPIRES_AT > CURRENT_TIMESTAMP AND ATTEMPTS < ? AND SENDS < ? AND SENT_AT <= DATEADD(-${RESEND_SECONDS} SECOND TO CURRENT_TIMESTAMP) RETURNING ${RETURN_FIELDS}`, [this.hash(id, code), id, MAX_ATTEMPTS, MAX_SENDS]));
138
+ if (!result)
139
+ throw this.limited();
140
+ return result;
141
+ }));
142
+ yield this.deliver(id, code, row.email);
143
+ return this.response(id, row.expiresAt);
144
+ });
145
+ }
146
+ consume(id, code) {
147
+ return __awaiter(this, void 0, void 0, function* () {
148
+ if (!/^[a-f0-9]{64}$/.test(id) || !/^\d{6}$/.test(code))
149
+ throw this.invalid();
150
+ const proof = yield this.transaction((query) => __awaiter(this, void 0, void 0, function* () {
151
+ // The conditional write serializes verification and persists failed attempts.
152
+ const row = this.row(yield query(`UPDATE ACCESSI_2FA SET ATTEMPTS = ATTEMPTS + 1 WHERE CHALLENGE_ID = ? AND EXPIRES_AT > CURRENT_TIMESTAMP AND ATTEMPTS < ? RETURNING ${RETURN_FIELDS}`, [id, MAX_ATTEMPTS]));
153
+ if (!row)
154
+ return null;
155
+ const expected = Buffer.from(row.codeHash.trim(), 'hex');
156
+ const actual = Buffer.from(this.hash(id, code), 'hex');
157
+ if (expected.length !== actual.length || !(0, crypto_1.timingSafeEqual)(expected, actual))
158
+ return null;
159
+ yield query('UPDATE ACCESSI_2FA SET ATTEMPTS = ? WHERE CHALLENGE_ID = ?', [MAX_ATTEMPTS, id]);
160
+ return row;
161
+ }));
162
+ // Throw after commit, otherwise a wrong code would roll back the attempt counter.
163
+ if (!proof)
164
+ throw this.invalid();
165
+ return proof;
166
+ });
167
+ }
168
+ };
169
+ exports.TwoFactorService = TwoFactorService;
170
+ exports.TwoFactorService = TwoFactorService = __decorate([
171
+ (0, common_1.Injectable)(),
172
+ __param(0, (0, common_1.Inject)('ACCESSI_OPTIONS')),
173
+ __metadata("design:paramtypes", [Object, EmailService_1.EmailService])
174
+ ], TwoFactorService);
175
+ //# sourceMappingURL=TwoFactorService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TwoFactorService.js","sourceRoot":"","sources":["../../../../src/accessi-module/Services/TwoFactorService/TwoFactorService.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpException, Inject, Injectable, ServiceUnavailableException, UnauthorizedException } from '@nestjs/common';\nimport { createHmac, randomBytes, randomInt, timingSafeEqual } from 'crypto';\nimport { Orm } from '../../../Orm';\nimport { RestUtilities } from '../../../Utilities';\nimport type { AccessiOptions } from '../../AccessiModule';\nimport { TwoFactorChallengeDto } from '../../Dtos/TwoFactorDtos';\nimport { getAccessiJwtSecret } from '../../security/passwordResetToken';\nimport { EmailService } from '../EmailService/EmailService';\n\nexport type TwoFactorMode = 'password' | 'passwordless' | 'federated';\nexport interface TwoFactorProof {\n codiceUtente: number;\n email: string;\n mode: TwoFactorMode;\n identityKey?: string;\n}\ntype ChallengeRow = TwoFactorProof & {\n codeHash: string;\n expiresAt: Date;\n attempts: number;\n sends: number;\n sentAt: Date;\n};\ntype Query = (sql: string, params?: unknown[]) => Promise<unknown>;\n\nconst LIFETIME_SECONDS = 600;\nconst MAX_ATTEMPTS = 5;\nconst RESEND_SECONDS = 60;\nconst MAX_SENDS = 3;\nconst RETURN_FIELDS = 'CODUTE, EMAIL, AUTHMODE, IDNKEY, CODEHASH, EXPIRES_AT, ATTEMPTS, SENDS, SENT_AT';\n\n/** Database-backed challenges: no OTP, password or authentication token is logged or stored in clear text. */\n@Injectable()\nexport class TwoFactorService {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly options: AccessiOptions,\n private readonly emailService: EmailService,\n ) {}\n\n private invalid(): UnauthorizedException {\n return new UnauthorizedException({ code: 'ACCESSI_2FA_INVALID', message: 'Codice non valido o scaduto. Ripeti l accesso se hai esaurito i tentativi.' });\n }\n\n private limited(): HttpException {\n return new HttpException({ code: 'ACCESSI_2FA_RATE_LIMITED', message: 'Attendi prima di richiedere un altro codice.' }, 429);\n }\n\n private hash(id: string, code: string): string {\n return createHmac('sha256', getAccessiJwtSecret(this.options, '2fa')).update(`accessi-2fa:${id}:${code}`).digest('hex');\n }\n\n private row(result: unknown): ChallengeRow | undefined {\n const row = (Array.isArray(result) ? result[0] : result) as Record<string, unknown> | undefined;\n if (!row) return undefined;\n\n const raw = RestUtilities.convertKeysToCamelCase(row);\n const asString = (value: unknown): string | undefined => typeof value === 'string' ? value : undefined;\n const codiceUtente = Number(raw.codute);\n if (!codiceUtente) return undefined;\n\n const converted: ChallengeRow = {\n codiceUtente,\n email: asString(raw.email)?.trim() ?? '',\n mode: (asString(raw.authmode)?.trim() as TwoFactorMode | undefined) ?? 'password',\n identityKey: asString(raw.idnkey)?.trim(),\n codeHash: asString(raw.codehash) ?? '',\n expiresAt: raw.expiresAt as Date,\n attempts: Number(raw.attempts),\n sends: Number(raw.sends),\n sentAt: raw.sentAt as Date,\n };\n return converted;\n }\n\n private async transaction<T>(operation: (query: Query) => Promise<T>): Promise<T> {\n return Orm.withTransaction(this.options.databaseOptions, async (transaction) => {\n const query: Query = (sql, params = []) => Orm.transactionQuery(transaction, sql, params);\n return operation(query);\n });\n }\n\n private response(id: string, expiresAt: Date): TwoFactorChallengeDto {\n return { twoFactorRequired: true, challengeId: id, expiresAt: new Date(expiresAt).toISOString(), resendAfterSeconds: RESEND_SECONDS, method: 'email' };\n }\n\n private async deliver(id: string, code: string, email: string): Promise<void> {\n try {\n await this.emailService.sendTwoFactorCode(email, code, LIFETIME_SECONDS / 60);\n } catch {\n // Invalidate only the code whose delivery failed, preserving a concurrent newer code.\n await Orm.execute(this.options.databaseOptions,\n 'UPDATE ACCESSI_2FA SET ATTEMPTS = ? WHERE CHALLENGE_ID = ? AND CODEHASH = ?',\n [MAX_ATTEMPTS, id, this.hash(id, code)], false).catch(() => undefined);\n throw new ServiceUnavailableException({ code: 'ACCESSI_2FA_DELIVERY_FAILED', message: 'Invio del codice non riuscito. Riprova tra poco.' });\n }\n }\n\n async issue(proof: TwoFactorProof): Promise<TwoFactorChallengeDto> {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(proof.email ?? '')) {\n throw new ServiceUnavailableException({ code: 'ACCESSI_2FA_EMAIL_REQUIRED', message: 'Per il codice di accesso serve un indirizzo email valido. Contatta un amministratore.' });\n }\n const id = randomBytes(32).toString('hex');\n const code = String(randomInt(1000000)).padStart(6, '0');\n const expiresAt = await this.transaction(async query => {\n // Serialize issuance for this account across backend instances.\n await query('SELECT CODUTE FROM UTENTI WHERE CODUTE = ? WITH LOCK', [proof.codiceUtente]);\n const recent = await query('SELECT COUNT(*) AS TOTAL FROM ACCESSI_2FA WHERE CODUTE = ? AND CREATED_AT > DATEADD(-15 MINUTE TO CURRENT_TIMESTAMP)', [proof.codiceUtente]) as Array<Record<string, unknown>> | undefined;\n if (Number(recent?.[0]?.TOTAL ?? recent?.[0]?.total ?? 0) >= 5) throw this.limited();\n await query('DELETE FROM ACCESSI_2FA WHERE EXPIRES_AT < DATEADD(-1 DAY TO CURRENT_TIMESTAMP)');\n const created = await query(\n `INSERT INTO ACCESSI_2FA (CHALLENGE_ID, CODUTE, EMAIL, AUTHMODE, IDNKEY, CODEHASH, EXPIRES_AT) VALUES (?, ?, ?, ?, ?, ?, DATEADD(${LIFETIME_SECONDS} SECOND TO CURRENT_TIMESTAMP)) RETURNING EXPIRES_AT`,\n [id, proof.codiceUtente, proof.email, proof.mode, proof.identityKey ?? null, this.hash(id, code)],\n );\n const row = (Array.isArray(created) ? created[0] : created) as Record<string, unknown> | undefined;\n return (row?.EXPIRES_AT ?? row?.expires_at) as Date;\n });\n await this.deliver(id, code, proof.email);\n return this.response(id, expiresAt);\n }\n\n async describe(id: string): Promise<TwoFactorProof> {\n if (!/^[a-f0-9]{64}$/.test(id)) throw this.invalid();\n const row = this.row(await Orm.query(this.options.databaseOptions,\n `SELECT ${RETURN_FIELDS} FROM ACCESSI_2FA WHERE CHALLENGE_ID = ? AND EXPIRES_AT > CURRENT_TIMESTAMP AND ATTEMPTS < ?`, [id, MAX_ATTEMPTS], false));\n if (!row) throw this.invalid();\n return row;\n }\n\n async resend(id: string): Promise<TwoFactorChallengeDto> {\n if (!/^[a-f0-9]{64}$/.test(id)) throw this.invalid();\n const code = String(randomInt(1000000)).padStart(6, '0');\n const row = await this.transaction(async query => {\n const result = this.row(await query(\n `UPDATE ACCESSI_2FA SET CODEHASH = ?, SENDS = SENDS + 1, SENT_AT = CURRENT_TIMESTAMP WHERE CHALLENGE_ID = ? AND EXPIRES_AT > CURRENT_TIMESTAMP AND ATTEMPTS < ? AND SENDS < ? AND SENT_AT <= DATEADD(-${RESEND_SECONDS} SECOND TO CURRENT_TIMESTAMP) RETURNING ${RETURN_FIELDS}`,\n [this.hash(id, code), id, MAX_ATTEMPTS, MAX_SENDS],\n ));\n if (!result) throw this.limited();\n return result;\n });\n await this.deliver(id, code, row.email);\n return this.response(id, row.expiresAt);\n }\n\n async consume(id: string, code: string): Promise<TwoFactorProof> {\n if (!/^[a-f0-9]{64}$/.test(id) || !/^\\d{6}$/.test(code)) throw this.invalid();\n const proof = await this.transaction(async query => {\n // The conditional write serializes verification and persists failed attempts.\n const row = this.row(await query(\n `UPDATE ACCESSI_2FA SET ATTEMPTS = ATTEMPTS + 1 WHERE CHALLENGE_ID = ? AND EXPIRES_AT > CURRENT_TIMESTAMP AND ATTEMPTS < ? RETURNING ${RETURN_FIELDS}`,\n [id, MAX_ATTEMPTS],\n ));\n if (!row) return null;\n const expected = Buffer.from(row.codeHash.trim(), 'hex');\n const actual = Buffer.from(this.hash(id, code), 'hex');\n if (expected.length !== actual.length || !timingSafeEqual(expected, actual)) return null;\n await query('UPDATE ACCESSI_2FA SET ATTEMPTS = ? WHERE CHALLENGE_ID = ?', [MAX_ATTEMPTS, id]);\n return row;\n });\n // Throw after commit, otherwise a wrong code would roll back the attempt counter.\n if (!proof) throw this.invalid();\n return proof;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { AccessiOptions } from '../../AccessiModule';
1
+ import type { AccessiOptions } from '../../AccessiModule';
2
2
  import { GetUsersResult } from '../../Dtos/GetUsersResponse';
3
3
  import { RegisterRequest } from '../../Dtos/RegisterRequest';
4
4
  import { StatoRegistrazione } from '../../Dtos/StatoRegistrazione';
@@ -14,31 +14,77 @@ export declare class UserService {
14
14
  private readonly filtriService;
15
15
  constructor(accessiOptions: AccessiOptions, emailService: EmailService, permissionService: PermissionService, filtriService: FiltriService);
16
16
  private normalizeDatabaseBoolean;
17
+ private normalizeUserFlags;
17
18
  private normalizeEmail;
18
19
  private ensureEmailIsAvailable;
19
- isAdminConfigurator(codiceUtente: number): Promise<boolean>;
20
+ /**
21
+ * Legge il minimo profilo autorevole usato da JWT e middleware. Restituisce `null` per utenti inesistenti.
22
+ * Non usare `UserDto` dal token per decisioni di sicurezza: i flag vengono sempre riletti qui.
23
+ */
20
24
  getAuthenticatedUserSnapshot(codiceUtente: number): Promise<AccessiAuthenticatedUserSnapshot | null>;
25
+ /**
26
+ * Elenca gli utenti con filtri opzionali. Grant e campi estesi sono costosi e vengono caricati soltanto
27
+ * quando richiesti esplicitamente nelle opzioni; usare filtri puntuali nei flussi di autenticazione.
28
+ */
21
29
  getUsers(filters?: {
22
30
  email?: string;
23
- codiceUtente?: number;
31
+ codiceUtente?: number | number[];
32
+ numRep?: number | number[];
33
+ codDipendente?: number;
34
+ cellulare?: string;
35
+ tipFil?: number;
36
+ flagSuper?: boolean;
37
+ limit?: number;
38
+ offset?: number;
24
39
  }, options?: {
25
40
  includeExtensionFields: boolean;
26
41
  includeGrants: boolean;
27
42
  }): Promise<GetUsersResult[]>;
43
+ /** Conteggio utenti con gli stessi filtri di `getUsers`, per la paginazione (header X-Total-Count). */
44
+ countUsers(filters?: {
45
+ email?: string;
46
+ codiceUtente?: number;
47
+ }): Promise<number>;
48
+ private loadExtensionFieldsForUsers;
49
+ private chunkArray;
50
+ /** Cerca il codice interno per email normalizzata. Il chiamante deve gestire il caso senza righe. */
28
51
  getCodiceUtenteByEmail(email: string): Promise<{
29
52
  codiceUtente: number;
30
53
  }>;
54
+ /** Recupera il profilo locale usato dal login, compresi filtri Accessi eventualmente presenti. */
31
55
  getUserByEmail(email: string): Promise<UserDto | null>;
32
56
  insertUserFilters(codiceUtente: number, filterData: RegisterRequest): Promise<void>;
33
- private executeInTransaction;
57
+ /**
58
+ * Crea utente, configurazione e filtri. La registrazione pubblica resta in stato `INVIO` e non puo
59
+ * impostare privilegi, ruoli o grant; soltanto flussi backend fidati possono usare `allowPrivilegedFields`.
60
+ */
34
61
  register(registrationData: RegisterRequest, options?: {
35
62
  allowPrivilegedFields?: boolean;
63
+ initialState?: StatoRegistrazione;
36
64
  }): Promise<number>;
65
+ /**
66
+ * Aggiorna il profilo utente e i filtri. Le modifiche a stato, ruoli, grant e flag amministrativi richiedono
67
+ * `allowPrivilegedChanges`; gli array ruolo/grant passati in un flusso fidato sostituiscono le assegnazioni.
68
+ */
37
69
  updateUser(codiceUtente: number, user: UserDto, options?: {
38
70
  allowPrivilegedChanges?: boolean;
39
71
  }): Promise<void>;
40
72
  updateUserFilters(codiceUtente: number, user: UserDto): Promise<void>;
73
+ /** Eliminazione logica: imposta lo stato `DELETE` senza cancellare lo storico o i collegamenti SSO. */
41
74
  deleteUser(codiceCliente: number): Promise<void>;
75
+ /** Cambia esplicitamente lo stato di registrazione; usare questa API per blocco, conferma o eliminazione logica. */
42
76
  setStato(codiceCliente: number, statoRegistrazione: StatoRegistrazione): Promise<void>;
43
- setGdpr(codiceUtente: number): Promise<any>;
77
+ setGdpr(codiceUtente: number): Promise<string>;
78
+ /**
79
+ * Forza l'invio dell'email di reset password per un utente. Operazione amministrativa.
80
+ * Richiede un servizio email configurato: altrimenti solleva ACCESSI_EMAIL_NOT_CONFIGURED.
81
+ */
82
+ forcePasswordReset(codiceUtente: number): Promise<void>;
83
+ /**
84
+ * Forza l'invio dell'email di reset a tutti gli utenti la cui password non e ancora nel formato
85
+ * moderno (`scrypt$...`), cioe' legacy grezza o `scrypt-legacy` non piu verificabile. Utile quando
86
+ * la `encryptionKey` storica e perduta. Richiede email configurata. Ritorna quanti utenti hanno
87
+ * ricevuto l'email.
88
+ */
89
+ forcePasswordResetForLegacyPasswords(): Promise<number>;
44
90
  }