emilsoftware-utilities 2.0.0-dev.84 → 2.0.0-dev.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +373 -0
- package/SECURITY.md +66 -0
- package/dist/EmilsoftwareModule.d.ts +1 -1
- package/dist/EmilsoftwareModule.js +1 -1
- package/dist/EmilsoftwareModule.js.map +1 -1
- package/dist/Orm.js +19 -19
- package/dist/Orm.js.map +1 -1
- package/dist/Utilities.d.ts +1 -1
- package/dist/Utilities.js.map +1 -1
- package/dist/accessi/client/admin/index.d.ts +4 -4
- package/dist/accessi/client/admin/index.js +2 -2
- package/dist/accessi/client/admin/index.js.map +1 -1
- package/dist/accessi/client/createAccessiClient.d.ts +1 -1
- package/dist/accessi/client/createAccessiClient.js +1 -1
- package/dist/accessi/client/createAccessiClient.js.map +1 -1
- package/dist/accessi/client/generated/admin.d.ts +1 -1
- package/dist/accessi/client/generated/admin.js +1 -1
- package/dist/accessi/client/generated/admin.js.map +1 -1
- package/dist/accessi/client/generated/public.d.ts +1 -1
- package/dist/accessi/client/generated/public.js +1 -1
- package/dist/accessi/client/generated/public.js.map +1 -1
- package/dist/accessi/client/generated/service.d.ts +1 -1
- package/dist/accessi/client/generated/service.js +1 -1
- package/dist/accessi/client/generated/service.js.map +1 -1
- package/dist/accessi/client/index.d.ts +7 -7
- package/dist/accessi/client/index.js +6 -6
- package/dist/accessi/client/index.js.map +1 -1
- package/dist/accessi/client/public/index.d.ts +4 -4
- package/dist/accessi/client/public/index.js +2 -2
- package/dist/accessi/client/public/index.js.map +1 -1
- package/dist/accessi/client/service/index.d.ts +4 -4
- package/dist/accessi/client/service/index.js +2 -2
- package/dist/accessi/client/service/index.js.map +1 -1
- package/dist/accessi/contracts/dtos.d.ts +1 -1
- package/dist/accessi/contracts/dtos.js +1 -1
- package/dist/accessi/contracts/dtos.js.map +1 -1
- package/dist/accessi/contracts/index.d.ts +6 -6
- package/dist/accessi/contracts/index.js +4 -4
- package/dist/accessi/contracts/index.js.map +1 -1
- package/dist/accessi/resource-server/core.d.ts +13 -0
- package/dist/accessi/resource-server/core.js +17 -0
- package/dist/accessi/resource-server/core.js.map +1 -1
- package/dist/accessi/resource-server/express.js +1 -1
- package/dist/accessi/resource-server/express.js.map +1 -1
- package/dist/accessi/resource-server/nest.js +1 -1
- package/dist/accessi/resource-server/nest.js.map +1 -1
- package/dist/accessi/resource-server/token.js +1 -1
- package/dist/accessi/resource-server/token.js.map +1 -1
- package/dist/accessi/resource-server/types.d.ts +3 -3
- package/dist/accessi/resource-server/types.js.map +1 -1
- package/dist/accessi/server/index.d.ts +5 -5
- package/dist/accessi/server/index.js +3 -3
- package/dist/accessi/server/index.js.map +1 -1
- package/dist/accessi/server/standalone.d.ts +4 -4
- package/dist/accessi/server/standalone.js +6 -6
- package/dist/accessi/server/standalone.js.map +1 -1
- package/dist/accessi/server/tenantRouter.js +1 -1
- package/dist/accessi/server/tenantRouter.js.map +1 -1
- package/dist/accessi/server/tenantStores.d.ts +6 -6
- package/dist/accessi/server/tenantStores.js +5 -5
- package/dist/accessi/server/tenantStores.js.map +1 -1
- package/dist/accessi/server/tenants.d.ts +8 -8
- package/dist/accessi/server/tenants.js +1 -1
- package/dist/accessi/server/tenants.js.map +1 -1
- package/dist/accessi-service/AccessiModule.js +120 -0
- package/dist/accessi-service/AccessiModule.js.map +1 -0
- package/dist/accessi-service/accessiRuntime.d.ts +45 -0
- package/dist/accessi-service/accessiRuntime.js +39 -0
- package/dist/accessi-service/accessiRuntime.js.map +1 -0
- package/dist/accessi-service/console/accessiFetch.js.map +1 -0
- package/dist/accessi-service/console/console.js +4875 -0
- package/dist/accessi-service/console/console.js.map +1 -0
- package/dist/accessi-service/console/generated/emilsoftware-utilities.js.map +1 -0
- package/dist/accessi-service/console/generated/model/abilitazioneMenu.js.map +1 -0
- package/dist/accessi-service/console/generated/model/abilitazioneMenuTipoAbilitazione.js.map +1 -0
- package/dist/accessi-service/console/generated/model/accessiIntrospectionResultDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/actionResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/adminBootstrapStatusResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/adminBootstrapStatusResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/assignPermissionsToUserRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/assignRolesToUserRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/authenticatedTokenPayloadDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/authenticatedUserPayloadDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/bootstrapAdminRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/bootstrapAdminResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/bootstrapAdminResultDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/confirmResetPasswordRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/consoleEntryExchangeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/consoleEntrySessionResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/consoleEntrySessionResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/consoleEntryTicketResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/consoleEntryTicketResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/consoleEntryTokenResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createFederatedIdentityRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createFederatedProviderRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createFederatedUserRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createFilterTypeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createFilterTypeRequestFlgEnabled.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createMenuGroupRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createMenuRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createMenuTypeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createScopeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createServiceTokenRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/createServiceTokenResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/errorResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/exchangeFederatedIdentityRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/exportAuditOrder.js.map +1 -0
- package/dist/accessi-service/console/generated/model/exportAuditParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedAuthenticationResultDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedExchangeResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedIdentityListResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedIdentityResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedIdentityResponseDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedProviderListResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedProviderResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/federatedProviderResponseDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/filtriUtente.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getFiltriResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getFiltriUtenteParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getFiltriUtenteResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getGroupsWithMenusParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getGroupsWithMenusResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getMenuScopesResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getMenuTypesResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getMenusParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getMenusResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getRolesResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getSchemaResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getScopesResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getServiceTokensParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getServiceTokensResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUserByTokenRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUserByTokenResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUserRolesAndGrantsParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUsersParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUsersResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUsersResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/getUsersResultExtensionFields.js.map +1 -0
- package/dist/accessi-service/console/generated/model/groupWithMenusEntity.js.map +1 -0
- package/dist/accessi-service/console/generated/model/index.js.map +1 -0
- package/dist/accessi-service/console/generated/model/introspectAccessiTokenRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/introspectAccessiTokenResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/issuedServiceTokenDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginAsRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginAsResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginAsResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginResultExtensionFields.js.map +1 -0
- package/dist/accessi-service/console/generated/model/loginResultPasswordRequired.js.map +1 -0
- package/dist/accessi-service/console/generated/model/menuEntity.js.map +1 -0
- package/dist/accessi-service/console/generated/model/menuTypeEntity.js.map +1 -0
- package/dist/accessi-service/console/generated/model/passwordExpiredResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/permission.js.map +1 -0
- package/dist/accessi-service/console/generated/model/publicRegisterRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/queryAuditOrder.js.map +1 -0
- package/dist/accessi-service/console/generated/model/queryAuditParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/refreshTokenRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/refreshTokenResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/refreshTokenResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/registerRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/registerResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/resendTwoFactorRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/revokeTokenRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/role.js.map +1 -0
- package/dist/accessi-service/console/generated/model/ruoliMenu.js.map +1 -0
- package/dist/accessi-service/console/generated/model/ruoliMenuTipoAbilitazione.js.map +1 -0
- package/dist/accessi-service/console/generated/model/schemaDdlResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/schemaDdlSection.js.map +1 -0
- package/dist/accessi-service/console/generated/model/scopeEntity.js.map +1 -0
- package/dist/accessi-service/console/generated/model/sendResetPasswordEmailRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/serveResetPasswordPageParams.js.map +1 -0
- package/dist/accessi-service/console/generated/model/serviceTokenDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/setMenuScopesRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/setPasswordLoginPolicyRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/setScopeMenusRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/setStatoRegistrazioneDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js.map +1 -0
- package/dist/accessi-service/console/generated/model/setUserPasswordRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/status.js.map +1 -0
- package/dist/accessi-service/console/generated/model/tipoFiltro.js.map +1 -0
- package/dist/accessi-service/console/generated/model/tipoFiltroFlgEnabled.js.map +1 -0
- package/dist/accessi-service/console/generated/model/tokenResult.js.map +1 -0
- package/dist/accessi-service/console/generated/model/tokenResultType.js.map +1 -0
- package/dist/accessi-service/console/generated/model/twoFactorChallengeDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/twoFactorChallengeDtoMethod.js.map +1 -0
- package/dist/accessi-service/console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateEnabledStatusRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateFederatedIdentityRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateFederatedProviderRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateFilterTypeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateMenuGroupRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateMenuRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateMenuTypeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/updateScopeRequest.js.map +1 -0
- package/dist/accessi-service/console/generated/model/userDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/userDtoStatoRegistrazione.js.map +1 -0
- package/dist/accessi-service/console/generated/model/userGrantsDto.js.map +1 -0
- package/dist/accessi-service/console/generated/model/userGrantsResponse.js.map +1 -0
- package/dist/accessi-service/console/generated/model/verifyTwoFactorRequest.js.map +1 -0
- package/dist/accessi-service/console/help.js.map +1 -0
- package/dist/accessi-service/console/wiki.js +1533 -0
- package/dist/accessi-service/console/wiki.js.map +1 -0
- package/dist/accessi-service/controllers/AccessiAuditController.d.ts +16 -0
- package/dist/accessi-service/controllers/AccessiAuditController.js +155 -0
- package/dist/accessi-service/controllers/AccessiAuditController.js.map +1 -0
- package/dist/accessi-service/controllers/AccessiConsoleController.js +169 -0
- package/dist/accessi-service/controllers/AccessiConsoleController.js.map +1 -0
- package/dist/accessi-service/controllers/AccessiIntrospectionController.d.ts +17 -0
- package/dist/accessi-service/controllers/AccessiIntrospectionController.js +102 -0
- package/dist/accessi-service/controllers/AccessiIntrospectionController.js.map +1 -0
- package/dist/accessi-service/controllers/AuthController.d.ts +24 -0
- package/dist/accessi-service/controllers/AuthController.js +564 -0
- package/dist/accessi-service/controllers/AuthController.js.map +1 -0
- package/dist/accessi-service/controllers/ConfiguratorController.d.ts +9 -0
- package/dist/accessi-service/controllers/ConfiguratorController.js +136 -0
- package/dist/accessi-service/controllers/ConfiguratorController.js.map +1 -0
- package/dist/accessi-service/controllers/ConsoleEntryController.d.ts +16 -0
- package/dist/accessi-service/controllers/ConsoleEntryController.js +159 -0
- package/dist/accessi-service/controllers/ConsoleEntryController.js.map +1 -0
- package/dist/accessi-service/controllers/EmailController.d.ts +11 -0
- package/dist/accessi-service/controllers/EmailController.js +112 -0
- package/dist/accessi-service/controllers/EmailController.js.map +1 -0
- package/dist/accessi-service/controllers/FiltriController.d.ts +20 -0
- package/dist/accessi-service/controllers/FiltriController.js +303 -0
- package/dist/accessi-service/controllers/FiltriController.js.map +1 -0
- package/dist/accessi-service/controllers/PermissionController.d.ts +45 -0
- package/dist/accessi-service/controllers/PermissionController.js +862 -0
- package/dist/accessi-service/controllers/PermissionController.js.map +1 -0
- package/dist/accessi-service/controllers/SchemaController.d.ts +9 -0
- package/dist/accessi-service/controllers/SchemaController.js +79 -0
- package/dist/accessi-service/controllers/SchemaController.js.map +1 -0
- package/dist/accessi-service/controllers/ServiceTokenController.d.ts +23 -0
- package/dist/accessi-service/controllers/ServiceTokenController.js +176 -0
- package/dist/accessi-service/controllers/ServiceTokenController.js.map +1 -0
- package/dist/accessi-service/controllers/UserController.d.ts +39 -0
- package/dist/accessi-service/controllers/UserController.js +724 -0
- package/dist/accessi-service/controllers/UserController.js.map +1 -0
- package/dist/accessi-service/database-updates/AccessiCatalogMigrator.js.map +1 -0
- package/dist/accessi-service/database-updates/AccessiDatabaseUpdater.js.map +1 -0
- package/dist/accessi-service/database-updates/accessiOptionsFromEnv.js +347 -0
- package/dist/accessi-service/database-updates/accessiOptionsFromEnv.js.map +1 -0
- package/dist/accessi-service/database-updates/accessiSchema.js.map +1 -0
- package/dist/accessi-service/database-updates/menuScopeSeed.js.map +1 -0
- package/dist/accessi-service/database-updates/menuScopeSeeder.js.map +1 -0
- package/dist/accessi-service/database-updates/optionalColumns.js.map +1 -0
- package/dist/accessi-service/database-updates/runAccessiCatalogMigrations.js.map +1 -0
- package/dist/accessi-service/database-updates/runAccessiDbUpdate.js.map +1 -0
- package/dist/accessi-service/dtos/Abilitazione.js.map +1 -0
- package/dist/accessi-service/dtos/AbilitazioneMenu.js.map +1 -0
- package/dist/accessi-service/dtos/AdminBootstrapDtos.js.map +1 -0
- package/dist/accessi-service/dtos/AssignPermissionsToUserRequest.js.map +1 -0
- package/dist/accessi-service/dtos/AssignRolesToUserRequest.js.map +1 -0
- package/dist/accessi-service/dtos/AuditDtos.js.map +1 -0
- package/dist/accessi-service/dtos/AuthenticatedUserPayloadDto.js.map +1 -0
- package/dist/accessi-service/dtos/BaseResponse.js.map +1 -0
- package/dist/accessi-service/dtos/CatalogDtos.js.map +1 -0
- package/dist/accessi-service/dtos/ConfirmResetPasswordRequest.js.map +1 -0
- package/dist/accessi-service/dtos/ConsoleEntryDtos.js.map +1 -0
- package/dist/accessi-service/dtos/FederatedExchangeDtos.js.map +1 -0
- package/dist/accessi-service/dtos/FederatedIdentityDtos.js.map +1 -0
- package/dist/accessi-service/dtos/FiltriUtente.js.map +1 -0
- package/dist/accessi-service/dtos/GetGroupsWithMenusResponse.js.map +1 -0
- package/dist/accessi-service/dtos/GetMenusResponse.js.map +1 -0
- package/dist/accessi-service/dtos/GetRolesResponse.js.map +1 -0
- package/dist/accessi-service/dtos/GetUserByTokenRequest.js.map +1 -0
- package/dist/accessi-service/dtos/GetUserByTokenResponse.js.map +1 -0
- package/dist/accessi-service/dtos/GetUsersResponse.js.map +1 -0
- package/dist/accessi-service/dtos/IntrospectionDtos.js.map +1 -0
- package/dist/accessi-service/dtos/LoginAsDtos.js.map +1 -0
- package/dist/accessi-service/dtos/LoginRequest.js.map +1 -0
- package/dist/accessi-service/dtos/LoginResponse.js.map +1 -0
- package/dist/accessi-service/dtos/MenuItem.js.map +1 -0
- package/dist/accessi-service/dtos/Permission.js.map +1 -0
- package/dist/accessi-service/dtos/PublicRegisterRequest.js.map +1 -0
- package/dist/accessi-service/dtos/RefreshTokenDtos.js.map +1 -0
- package/dist/accessi-service/dtos/RegisterRequest.js.map +1 -0
- package/dist/accessi-service/dtos/RegisterResponse.js.map +1 -0
- package/dist/accessi-service/dtos/RevokeTokenRequest.js.map +1 -0
- package/dist/accessi-service/dtos/Role.js.map +1 -0
- package/dist/accessi-service/dtos/RuoliMenu.js.map +1 -0
- package/dist/accessi-service/dtos/SchemaDtos.js.map +1 -0
- package/dist/accessi-service/dtos/ScopeDtos.js.map +1 -0
- package/dist/accessi-service/dtos/SendResetPasswordEmailRequest.js.map +1 -0
- package/dist/accessi-service/dtos/ServiceToken.js.map +1 -0
- package/dist/accessi-service/dtos/SetStatoRegistrazione.js.map +1 -0
- package/dist/accessi-service/dtos/SetUserPasswordRequest.js.map +1 -0
- package/dist/accessi-service/dtos/StatoRegistrazione.js.map +1 -0
- package/dist/accessi-service/dtos/TipoAbilitazione.js.map +1 -0
- package/dist/accessi-service/dtos/TipoFiltro.js.map +1 -0
- package/dist/accessi-service/dtos/TokenResult.js.map +1 -0
- package/dist/accessi-service/dtos/TwoFactorDtos.js.map +1 -0
- package/dist/accessi-service/dtos/UpdateEnabledStatusRequest.js.map +1 -0
- package/dist/accessi-service/dtos/UserDto.js.map +1 -0
- package/dist/accessi-service/dtos/UserGrantsDto.js.map +1 -0
- package/dist/accessi-service/dtos/UserGrantsResponse.js.map +1 -0
- package/dist/accessi-service/dtos/index.js.map +1 -0
- package/dist/accessi-service/federated-auth/FederatedAuthController.d.ts +33 -0
- package/dist/accessi-service/federated-auth/FederatedAuthController.js +373 -0
- package/dist/accessi-service/federated-auth/FederatedAuthController.js.map +1 -0
- package/dist/accessi-service/federated-auth/FederatedAuthExchangeController.d.ts +15 -0
- package/dist/accessi-service/federated-auth/FederatedAuthExchangeController.js +85 -0
- package/dist/accessi-service/federated-auth/FederatedAuthExchangeController.js.map +1 -0
- package/dist/accessi-service/federated-auth/FederatedAuthService.d.ts +102 -0
- package/dist/accessi-service/federated-auth/FederatedAuthService.js +472 -0
- package/dist/accessi-service/federated-auth/FederatedAuthService.js.map +1 -0
- package/dist/accessi-service/federated-auth/FederatedAuthTypes.d.ts +53 -0
- package/dist/accessi-service/federated-auth/FederatedAuthTypes.js.map +1 -0
- package/dist/accessi-service/health/nest.js.map +1 -0
- package/dist/accessi-service/health/readiness.js.map +1 -0
- package/dist/accessi-service/index.d.ts +88 -0
- package/dist/accessi-service/index.js +304 -0
- package/dist/accessi-service/index.js.map +1 -0
- package/dist/accessi-service/jwt/JwtSimpleGuard.d.ts +9 -0
- package/dist/accessi-service/jwt/JwtSimpleGuard.js +88 -0
- package/dist/accessi-service/jwt/JwtSimpleGuard.js.map +1 -0
- package/dist/accessi-service/middleware/accessiRequirements.js.map +1 -0
- package/dist/accessi-service/middleware/authenticateGen.d.ts +32 -0
- package/dist/accessi-service/middleware/authenticateGen.js +315 -0
- package/dist/accessi-service/middleware/authenticateGen.js.map +1 -0
- package/dist/accessi-service/observability/metrics.js.map +1 -0
- package/dist/accessi-service/observability/redisMetrics.js.map +1 -0
- package/dist/accessi-service/security/AccessiHttpExceptionFilter.js.map +1 -0
- package/dist/accessi-service/security/accessControl.js.map +1 -0
- package/dist/accessi-service/security/accessTokenRevocation.js.map +1 -0
- package/dist/accessi-service/security/accessiValidation.js.map +1 -0
- package/dist/accessi-service/security/adminBootstrap.js.map +1 -0
- package/dist/accessi-service/security/audit.js.map +1 -0
- package/dist/accessi-service/security/auditSinks.js.map +1 -0
- package/dist/accessi-service/security/authCookies.js.map +1 -0
- package/dist/accessi-service/security/authenticatedToken.d.ts +31 -0
- package/dist/accessi-service/security/authenticatedToken.js +79 -0
- package/dist/accessi-service/security/authenticatedToken.js.map +1 -0
- package/dist/accessi-service/security/consoleEntry.js.map +1 -0
- package/dist/accessi-service/security/edgeRateLimit.js.map +1 -0
- package/dist/accessi-service/security/emailConfiguration.js.map +1 -0
- package/dist/accessi-service/security/jwks.js.map +1 -0
- package/dist/accessi-service/security/jwksBootstrap.js.map +1 -0
- package/dist/accessi-service/security/jwtTokenOptions.js.map +1 -0
- package/dist/accessi-service/security/loginAs.js.map +1 -0
- package/dist/accessi-service/security/passwordPolicy.js.map +1 -0
- package/dist/accessi-service/security/passwordResetToken.js.map +1 -0
- package/dist/accessi-service/security/publicAuthRateLimit.js.map +1 -0
- package/dist/accessi-service/security/rateLimitStore.js.map +1 -0
- package/dist/accessi-service/security/refreshTokenRotation.js.map +1 -0
- package/dist/accessi-service/security/securityHeaders.js.map +1 -0
- package/dist/accessi-service/security/serviceTokenGuard.d.ts +27 -0
- package/dist/accessi-service/security/serviceTokenGuard.js +90 -0
- package/dist/accessi-service/security/serviceTokenGuard.js.map +1 -0
- package/dist/accessi-service/security/serviceTokenRateLimit.js.map +1 -0
- package/dist/accessi-service/security/sessionRevocation.js.map +1 -0
- package/dist/accessi-service/security/validateOptions.js.map +1 -0
- package/dist/accessi-service/services/admin-bootstrap-service/AdminBootstrapService.d.ts +33 -0
- package/dist/accessi-service/services/admin-bootstrap-service/AdminBootstrapService.js +106 -0
- package/dist/accessi-service/services/admin-bootstrap-service/AdminBootstrapService.js.map +1 -0
- package/dist/accessi-service/services/auth-service/AuthService.d.ts +127 -0
- package/dist/accessi-service/services/auth-service/AuthService.js +734 -0
- package/dist/accessi-service/services/auth-service/AuthService.js.map +1 -0
- package/dist/accessi-service/services/configurator-service/ConfiguratorService.js.map +1 -0
- package/dist/accessi-service/services/email-service/EmailService.js +439 -0
- package/dist/accessi-service/services/email-service/EmailService.js.map +1 -0
- package/dist/accessi-service/services/filtri-service/FiltriService.d.ts +26 -0
- package/dist/accessi-service/services/filtri-service/FiltriService.js +203 -0
- package/dist/accessi-service/services/filtri-service/FiltriService.js.map +1 -0
- package/dist/accessi-service/services/permission-service/PermissionService.d.ts +126 -0
- package/dist/accessi-service/services/permission-service/PermissionService.js +944 -0
- package/dist/accessi-service/services/permission-service/PermissionService.js.map +1 -0
- package/dist/accessi-service/services/schema-export-service/SchemaExportService.js.map +1 -0
- package/dist/accessi-service/services/service-token-service/ServiceTokenService.js.map +1 -0
- package/dist/accessi-service/services/two-factor-service/TwoFactorService.d.ts +27 -0
- package/dist/accessi-service/services/two-factor-service/TwoFactorService.js +175 -0
- package/dist/accessi-service/services/two-factor-service/TwoFactorService.js.map +1 -0
- package/dist/accessi-service/services/user-service/UserService.d.ts +112 -0
- package/dist/accessi-service/services/user-service/UserService.js +837 -0
- package/dist/accessi-service/services/user-service/UserService.js.map +1 -0
- package/dist/accessi-service/startupLog.js.map +1 -0
- package/dist/accessi-service/tenancy/tenantContext.js.map +1 -0
- package/dist/allegati-module/AllegatiModule.js +2 -2
- package/dist/allegati-module/AllegatiModule.js.map +1 -1
- package/dist/allegati-module/controllers/AllegatiController.d.ts +36 -0
- package/dist/allegati-module/controllers/AllegatiController.js +230 -0
- package/dist/allegati-module/controllers/AllegatiController.js.map +1 -0
- package/dist/allegati-module/dtos/AllegatoDto.js.map +1 -0
- package/dist/allegati-module/dtos/BaseResponse.js.map +1 -0
- package/dist/allegati-module/dtos/UploadSingleFileRequest.js.map +1 -0
- package/dist/allegati-module/dtos/index.js.map +1 -0
- package/dist/allegati-module/dtos/responses/DownloadAllegatoResponseDto.js.map +1 -0
- package/dist/allegati-module/dtos/responses/GetListResponse.js.map +1 -0
- package/dist/allegati-module/dtos/responses/UploadAllegatoResponseDto.js.map +1 -0
- package/dist/allegati-module/index.d.ts +1 -1
- package/dist/allegati-module/index.js +1 -1
- package/dist/allegati-module/index.js.map +1 -1
- package/dist/allegati-module/services/allegati-service/AllegatiService.d.ts +61 -0
- package/dist/allegati-module/services/allegati-service/AllegatiService.js.map +1 -0
- package/dist/emilsoftware-utilities-2.0.0-dev.85.tgz +0 -0
- package/dist/firebirdCompat.js +269 -0
- package/dist/firebirdCompat.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/initEmilsoftwareModule.js +9 -9
- package/dist/initEmilsoftwareModule.js.map +1 -1
- package/dist/scripts/generateAccessiOpenApi.js +2 -2
- package/dist/scripts/generateAccessiOpenApi.js.map +1 -1
- package/dist/scripts/generateAccessiWiki.js +6 -4
- package/dist/scripts/generateAccessiWiki.js.map +1 -1
- package/docs/README.md +116 -0
- package/docs/audit.md +4 -0
- package/docs/auth-cookies.md +4 -0
- package/docs/conventions.md +86 -0
- package/docs/gateway-rate-limit.md +3 -0
- package/docs/import-migration.md +12 -6
- package/docs/jwt-key-rotation.md +3 -0
- package/docs/metrics.md +3 -0
- package/docs/multi-tenancy.md +6 -0
- package/docs/proxy-ip.md +8 -0
- package/docs/quickstart-frontend.md +217 -0
- package/docs/quickstart-resource-server.md +177 -0
- package/docs/quickstart-service.md +214 -0
- package/docs/redis-load-testing.md +4 -0
- package/docs/security-headers.md +3 -0
- package/docs/standalone-service.md +180 -54
- package/integration-prompt.md +38 -14
- package/package.json +24 -19
- package/README.MD +0 -323
- package/dist/accessi-module/AccessiModule.js +0 -120
- package/dist/accessi-module/AccessiModule.js.map +0 -1
- package/dist/accessi-module/Console/accessiFetch.js.map +0 -1
- package/dist/accessi-module/Console/console.js +0 -4173
- package/dist/accessi-module/Console/console.js.map +0 -1
- package/dist/accessi-module/Console/generated/emilsoftware-utilities.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/abilitazioneMenuTipoAbilitazione.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/accessiIntrospectionResultDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/actionResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/adminBootstrapStatusResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/adminBootstrapStatusResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/assignPermissionsToUserRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/assignRolesToUserRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/authenticatedTokenPayloadDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/authenticatedUserPayloadDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/bootstrapAdminRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/bootstrapAdminResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/bootstrapAdminResultDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/consoleEntryExchangeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/consoleEntrySessionResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/consoleEntrySessionResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/consoleEntryTicketResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/consoleEntryTicketResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/consoleEntryTokenResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createFederatedIdentityRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createFederatedProviderRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createFederatedUserRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createMenuRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createScopeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/errorResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/exchangeFederatedIdentityRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/exportAuditOrder.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/exportAuditParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedAuthenticationResultDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedExchangeResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedIdentityListResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedIdentityResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedIdentityResponseDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedProviderListResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedProviderResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/federatedProviderResponseDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/filtriUtente.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getFiltriResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getFiltriUtenteParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getFiltriUtenteResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getGroupsWithMenusParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getGroupsWithMenusResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getMenuScopesResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getMenusParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getMenusResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getRolesResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getSchemaResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getScopesResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUserByTokenRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUserByTokenResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUserRolesAndGrantsParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUsersResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUsersResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/getUsersResultExtensionFields.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/groupWithMenusEntity.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/index.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/introspectAccessiTokenRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/introspectAccessiTokenResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginAsRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginAsResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginAsResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginResultExtensionFields.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/loginResultPasswordRequired.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/menuEntity.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/menuTypeEntity.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/passwordExpiredResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/permission.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/publicRegisterRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/queryAuditOrder.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/queryAuditParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/refreshTokenRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/refreshTokenResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/refreshTokenResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/registerRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/registerResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/resendTwoFactorRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/revokeTokenRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/role.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/ruoliMenu.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/ruoliMenuTipoAbilitazione.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/schemaDdlResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/schemaDdlSection.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/scopeEntity.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/sendResetPasswordEmailRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/serveResetPasswordPageParams.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/serviceTokenDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/setMenuScopesRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/setPasswordLoginPolicyRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/setScopeMenusRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/status.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/tipoFiltro.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/tipoFiltroFlgEnabled.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/tokenResult.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/tokenResultType.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/twoFactorChallengeDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoMethod.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/twoFactorChallengeDtoTwoFactorRequired.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateEnabledStatusRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateFederatedIdentityRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateFederatedProviderRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateMenuRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/updateScopeRequest.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/userDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/userDtoStatoRegistrazione.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/userGrantsDto.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/userGrantsResponse.js.map +0 -1
- package/dist/accessi-module/Console/generated/model/verifyTwoFactorRequest.js.map +0 -1
- package/dist/accessi-module/Console/help.js.map +0 -1
- package/dist/accessi-module/Console/wiki.js +0 -867
- package/dist/accessi-module/Console/wiki.js.map +0 -1
- package/dist/accessi-module/Controllers/AccessiAuditController.d.ts +0 -16
- package/dist/accessi-module/Controllers/AccessiAuditController.js +0 -155
- package/dist/accessi-module/Controllers/AccessiAuditController.js.map +0 -1
- package/dist/accessi-module/Controllers/AccessiConsoleController.js +0 -169
- package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +0 -1
- package/dist/accessi-module/Controllers/AccessiIntrospectionController.d.ts +0 -17
- package/dist/accessi-module/Controllers/AccessiIntrospectionController.js +0 -102
- package/dist/accessi-module/Controllers/AccessiIntrospectionController.js.map +0 -1
- package/dist/accessi-module/Controllers/AuthController.d.ts +0 -24
- package/dist/accessi-module/Controllers/AuthController.js +0 -564
- package/dist/accessi-module/Controllers/AuthController.js.map +0 -1
- package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +0 -9
- package/dist/accessi-module/Controllers/ConfiguratorController.js +0 -136
- package/dist/accessi-module/Controllers/ConfiguratorController.js.map +0 -1
- package/dist/accessi-module/Controllers/ConsoleEntryController.d.ts +0 -16
- package/dist/accessi-module/Controllers/ConsoleEntryController.js +0 -159
- package/dist/accessi-module/Controllers/ConsoleEntryController.js.map +0 -1
- package/dist/accessi-module/Controllers/EmailController.d.ts +0 -11
- package/dist/accessi-module/Controllers/EmailController.js +0 -112
- package/dist/accessi-module/Controllers/EmailController.js.map +0 -1
- package/dist/accessi-module/Controllers/FiltriController.d.ts +0 -20
- package/dist/accessi-module/Controllers/FiltriController.js +0 -303
- package/dist/accessi-module/Controllers/FiltriController.js.map +0 -1
- package/dist/accessi-module/Controllers/PermissionController.d.ts +0 -45
- package/dist/accessi-module/Controllers/PermissionController.js +0 -862
- package/dist/accessi-module/Controllers/PermissionController.js.map +0 -1
- package/dist/accessi-module/Controllers/SchemaController.d.ts +0 -9
- package/dist/accessi-module/Controllers/SchemaController.js +0 -79
- package/dist/accessi-module/Controllers/SchemaController.js.map +0 -1
- package/dist/accessi-module/Controllers/ServiceTokenController.d.ts +0 -23
- package/dist/accessi-module/Controllers/ServiceTokenController.js +0 -176
- package/dist/accessi-module/Controllers/ServiceTokenController.js.map +0 -1
- package/dist/accessi-module/Controllers/UserController.d.ts +0 -39
- package/dist/accessi-module/Controllers/UserController.js +0 -724
- package/dist/accessi-module/Controllers/UserController.js.map +0 -1
- package/dist/accessi-module/Dtos/Abilitazione.js.map +0 -1
- package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +0 -1
- package/dist/accessi-module/Dtos/AdminBootstrapDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/AuditDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +0 -1
- package/dist/accessi-module/Dtos/BaseResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/CatalogDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/ConsoleEntryDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/FederatedExchangeDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/FederatedIdentityDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/FiltriUtente.js.map +0 -1
- package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/GetMenusResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/GetRolesResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/GetUsersResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/IntrospectionDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/LoginAsDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/LoginRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/LoginResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/MenuItem.js.map +0 -1
- package/dist/accessi-module/Dtos/Permission.js.map +0 -1
- package/dist/accessi-module/Dtos/PublicRegisterRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/RefreshTokenDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/RegisterRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/RegisterResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/RevokeTokenRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/Role.js.map +0 -1
- package/dist/accessi-module/Dtos/RuoliMenu.js.map +0 -1
- package/dist/accessi-module/Dtos/SchemaDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/ScopeDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/ServiceToken.js.map +0 -1
- package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +0 -1
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/StatoRegistrazione.js.map +0 -1
- package/dist/accessi-module/Dtos/TipoAbilitazione.js.map +0 -1
- package/dist/accessi-module/Dtos/TipoFiltro.js.map +0 -1
- package/dist/accessi-module/Dtos/TokenResult.js.map +0 -1
- package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +0 -1
- package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +0 -1
- package/dist/accessi-module/Dtos/UserDto.js.map +0 -1
- package/dist/accessi-module/Dtos/UserGrantsDto.js.map +0 -1
- package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +0 -1
- package/dist/accessi-module/Dtos/index.js.map +0 -1
- package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.d.ts +0 -33
- package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.js +0 -106
- package/dist/accessi-module/Services/AdminBootstrapService/AdminBootstrapService.js.map +0 -1
- package/dist/accessi-module/Services/AuthService/AuthService.d.ts +0 -127
- package/dist/accessi-module/Services/AuthService/AuthService.js +0 -734
- package/dist/accessi-module/Services/AuthService/AuthService.js.map +0 -1
- package/dist/accessi-module/Services/ConfiguratorService/ConfiguratorService.js.map +0 -1
- package/dist/accessi-module/Services/EmailService/EmailService.js +0 -439
- package/dist/accessi-module/Services/EmailService/EmailService.js.map +0 -1
- package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +0 -26
- package/dist/accessi-module/Services/FiltriService/FiltriService.js +0 -203
- package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +0 -1
- package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +0 -126
- package/dist/accessi-module/Services/PermissionService/PermissionService.js +0 -944
- package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +0 -1
- package/dist/accessi-module/Services/SchemaExportService/SchemaExportService.js.map +0 -1
- package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +0 -1
- package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.d.ts +0 -27
- package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +0 -175
- package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +0 -1
- package/dist/accessi-module/Services/UserService/UserService.d.ts +0 -112
- package/dist/accessi-module/Services/UserService/UserService.js +0 -837
- package/dist/accessi-module/Services/UserService/UserService.js.map +0 -1
- package/dist/accessi-module/accessiRuntime.d.ts +0 -45
- package/dist/accessi-module/accessiRuntime.js +0 -39
- package/dist/accessi-module/accessiRuntime.js.map +0 -1
- package/dist/accessi-module/database-updates/AccessiCatalogMigrator.js.map +0 -1
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +0 -1
- package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js +0 -134
- package/dist/accessi-module/database-updates/accessiOptionsFromEnv.js.map +0 -1
- package/dist/accessi-module/database-updates/accessiSchema.js.map +0 -1
- package/dist/accessi-module/database-updates/menuScopeSeed.js.map +0 -1
- package/dist/accessi-module/database-updates/menuScopeSeeder.js.map +0 -1
- package/dist/accessi-module/database-updates/optionalColumns.js.map +0 -1
- package/dist/accessi-module/database-updates/runAccessiCatalogMigrations.js.map +0 -1
- package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +0 -1
- package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +0 -33
- package/dist/accessi-module/federated-auth/FederatedAuthController.js +0 -373
- package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +0 -1
- package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.d.ts +0 -15
- package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.js +0 -85
- package/dist/accessi-module/federated-auth/FederatedAuthExchangeController.js.map +0 -1
- package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +0 -102
- package/dist/accessi-module/federated-auth/FederatedAuthService.js +0 -472
- package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +0 -1
- package/dist/accessi-module/federated-auth/FederatedAuthTypes.d.ts +0 -53
- package/dist/accessi-module/federated-auth/FederatedAuthTypes.js.map +0 -1
- package/dist/accessi-module/health/nest.js.map +0 -1
- package/dist/accessi-module/health/readiness.js.map +0 -1
- package/dist/accessi-module/index.d.ts +0 -88
- package/dist/accessi-module/index.js +0 -304
- package/dist/accessi-module/index.js.map +0 -1
- package/dist/accessi-module/jwt/jwt.strategy.d.ts +0 -9
- package/dist/accessi-module/jwt/jwt.strategy.js +0 -88
- package/dist/accessi-module/jwt/jwt.strategy.js.map +0 -1
- package/dist/accessi-module/middleware/accessiRequirements.js.map +0 -1
- package/dist/accessi-module/middleware/authenticateGen.d.ts +0 -32
- package/dist/accessi-module/middleware/authenticateGen.js +0 -315
- package/dist/accessi-module/middleware/authenticateGen.js.map +0 -1
- package/dist/accessi-module/observability/metrics.js.map +0 -1
- package/dist/accessi-module/observability/redisMetrics.js.map +0 -1
- package/dist/accessi-module/security/AccessiHttpExceptionFilter.js.map +0 -1
- package/dist/accessi-module/security/accessControl.js.map +0 -1
- package/dist/accessi-module/security/accessTokenRevocation.js.map +0 -1
- package/dist/accessi-module/security/accessiValidation.js.map +0 -1
- package/dist/accessi-module/security/adminBootstrap.js.map +0 -1
- package/dist/accessi-module/security/audit.js.map +0 -1
- package/dist/accessi-module/security/auditSinks.js.map +0 -1
- package/dist/accessi-module/security/authCookies.js.map +0 -1
- package/dist/accessi-module/security/authenticatedToken.d.ts +0 -31
- package/dist/accessi-module/security/authenticatedToken.js +0 -79
- package/dist/accessi-module/security/authenticatedToken.js.map +0 -1
- package/dist/accessi-module/security/consoleEntry.js.map +0 -1
- package/dist/accessi-module/security/edgeRateLimit.js.map +0 -1
- package/dist/accessi-module/security/emailConfiguration.js.map +0 -1
- package/dist/accessi-module/security/jwks.js.map +0 -1
- package/dist/accessi-module/security/jwksBootstrap.js.map +0 -1
- package/dist/accessi-module/security/jwtTokenOptions.js.map +0 -1
- package/dist/accessi-module/security/loginAs.js.map +0 -1
- package/dist/accessi-module/security/passwordPolicy.js.map +0 -1
- package/dist/accessi-module/security/passwordResetToken.js.map +0 -1
- package/dist/accessi-module/security/publicAuthRateLimit.js.map +0 -1
- package/dist/accessi-module/security/rateLimitStore.js.map +0 -1
- package/dist/accessi-module/security/refreshTokenRotation.js.map +0 -1
- package/dist/accessi-module/security/securityHeaders.js.map +0 -1
- package/dist/accessi-module/security/serviceTokenGuard.d.ts +0 -27
- package/dist/accessi-module/security/serviceTokenGuard.js +0 -90
- package/dist/accessi-module/security/serviceTokenGuard.js.map +0 -1
- package/dist/accessi-module/security/serviceTokenRateLimit.js.map +0 -1
- package/dist/accessi-module/security/sessionRevocation.js.map +0 -1
- package/dist/accessi-module/security/validateOptions.js.map +0 -1
- package/dist/accessi-module/startupLog.js.map +0 -1
- package/dist/accessi-module/tenancy/tenantContext.js.map +0 -1
- package/dist/allegati-module/Controllers/AllegatiController.d.ts +0 -36
- package/dist/allegati-module/Controllers/AllegatiController.js +0 -230
- package/dist/allegati-module/Controllers/AllegatiController.js.map +0 -1
- package/dist/allegati-module/Dtos/AllegatoDto.js.map +0 -1
- package/dist/allegati-module/Dtos/BaseResponse.js.map +0 -1
- package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +0 -1
- package/dist/allegati-module/Dtos/index.js.map +0 -1
- package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +0 -1
- package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +0 -1
- package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +0 -1
- package/dist/allegati-module/Services/AllegatiService/AllegatiService.d.ts +0 -61
- package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +0 -1
- package/dist/emilsoftware-utilities-2.0.0-dev.84.tgz +0 -0
- package/dist/firebird-compat.js +0 -269
- package/dist/firebird-compat.js.map +0 -1
- /package/dist/{accessi-module → accessi-service}/AccessiModule.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/accessiFetch.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/accessiFetch.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/console.css +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/console.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/emilsoftware-utilities.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/emilsoftware-utilities.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenu.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenu.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenuTipoAbilitazione.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/abilitazioneMenuTipoAbilitazione.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/accessiIntrospectionResultDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/accessiIntrospectionResultDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/actionResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/actionResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/adminBootstrapStatusResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignPermissionsToUserRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignPermissionsToUserRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignRolesToUserRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/assignRolesToUserRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedTokenPayloadDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedTokenPayloadDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedUserPayloadDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/authenticatedUserPayloadDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResultDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/bootstrapAdminResultDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/confirmResetPasswordRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/confirmResetPasswordRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryExchangeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryExchangeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntrySessionResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTicketResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTokenResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/consoleEntryTokenResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedIdentityRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedIdentityRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedProviderRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedProviderRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedUserRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFederatedUserRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequestFlgEnabled.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createFilterTypeRequestFlgEnabled.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuGroupRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuGroupRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuTypeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createMenuTypeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createScopeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createScopeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/createServiceTokenResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/errorResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/errorResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exchangeFederatedIdentityRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exchangeFederatedIdentityRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditOrder.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditOrder.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/exportAuditParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedAuthenticationResultDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedAuthenticationResultDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedExchangeResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedExchangeResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityListResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityListResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponseDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedIdentityResponseDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderListResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderListResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponseDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/federatedProviderResponseDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/filtriUtente.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/filtriUtente.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getFiltriUtenteResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getGroupsWithMenusResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuScopesResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuScopesResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuTypesResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenuTypesResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getMenusResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getRolesResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getRolesResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getSchemaResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getSchemaResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getScopesResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getScopesResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getServiceTokensResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserByTokenResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserRolesAndGrantsParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUserRolesAndGrantsParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResultExtensionFields.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/getUsersResultExtensionFields.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/groupWithMenusEntity.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/groupWithMenusEntity.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/index.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/index.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/introspectAccessiTokenResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/issuedServiceTokenDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/issuedServiceTokenDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginAsResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultExtensionFields.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultExtensionFields.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultPasswordRequired.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/loginResultPasswordRequired.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuEntity.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuEntity.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuTypeEntity.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/menuTypeEntity.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/passwordExpiredResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/passwordExpiredResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/permission.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/permission.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/publicRegisterRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/publicRegisterRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditOrder.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditOrder.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/queryAuditParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/refreshTokenResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/registerResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/resendTwoFactorRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/resendTwoFactorRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/revokeTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/revokeTokenRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/role.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/role.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenu.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenu.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenuTipoAbilitazione.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/ruoliMenuTipoAbilitazione.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlSection.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/schemaDdlSection.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/scopeEntity.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/scopeEntity.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/sendResetPasswordEmailRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/sendResetPasswordEmailRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serveResetPasswordPageParams.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serveResetPasswordPageParams.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serviceTokenDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/serviceTokenDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setMenuScopesRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setMenuScopesRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setPasswordLoginPolicyRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setPasswordLoginPolicyRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setScopeMenusRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setScopeMenusRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setStatoRegistrazioneDtoStatoRegistrazione.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setUserPasswordRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/setUserPasswordRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/status.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/status.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltro.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltro.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltroFlgEnabled.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tipoFiltroFlgEnabled.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResult.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResult.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResultType.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/tokenResultType.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoMethod.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoMethod.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoTwoFactorRequired.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/twoFactorChallengeDtoTwoFactorRequired.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateEnabledStatusRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateEnabledStatusRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedIdentityRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedIdentityRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedProviderRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFederatedProviderRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequestFlgEnabled.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateFilterTypeRequestFlgEnabled.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuGroupRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuGroupRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuTypeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateMenuTypeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateScopeRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/updateScopeRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDtoStatoRegistrazione.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userDtoStatoRegistrazione.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsDto.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsDto.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsResponse.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/userGrantsResponse.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/verifyTwoFactorRequest.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/generated/model/verifyTwoFactorRequest.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/help.d.ts +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/help.js +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/index.html +0 -0
- /package/dist/{accessi-module/Console → accessi-service/console}/wiki.d.ts +0 -0
- /package/dist/{accessi-module/Controllers → accessi-service/controllers}/AccessiConsoleController.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/AccessiCatalogMigrator.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/AccessiCatalogMigrator.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/AccessiDatabaseUpdater.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/AccessiDatabaseUpdater.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/accessiOptionsFromEnv.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/accessiSchema.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/accessiSchema.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeed.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeed.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeeder.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/menuScopeSeeder.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/optionalColumns.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/optionalColumns.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiCatalogMigrations.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiCatalogMigrations.js +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiDbUpdate.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/database-updates/runAccessiDbUpdate.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Abilitazione.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Abilitazione.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AbilitazioneMenu.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AbilitazioneMenu.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AdminBootstrapDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AdminBootstrapDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignPermissionsToUserRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignPermissionsToUserRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignRolesToUserRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AssignRolesToUserRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuditDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuditDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuthenticatedUserPayloadDto.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/AuthenticatedUserPayloadDto.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/BaseResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/BaseResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/CatalogDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/CatalogDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConfirmResetPasswordRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConfirmResetPasswordRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConsoleEntryDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ConsoleEntryDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedExchangeDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedExchangeDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedIdentityDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FederatedIdentityDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FiltriUtente.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/FiltriUtente.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetGroupsWithMenusResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetGroupsWithMenusResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetMenusResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetMenusResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetRolesResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetRolesResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUserByTokenResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUsersResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/GetUsersResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/IntrospectionDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/IntrospectionDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginAsDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginAsDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/LoginResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/MenuItem.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/MenuItem.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Permission.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Permission.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/PublicRegisterRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/PublicRegisterRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RefreshTokenDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RefreshTokenDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RegisterResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RevokeTokenRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RevokeTokenRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Role.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/Role.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RuoliMenu.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/RuoliMenu.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SchemaDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SchemaDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ScopeDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ScopeDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SendResetPasswordEmailRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SendResetPasswordEmailRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ServiceToken.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/ServiceToken.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetStatoRegistrazione.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetStatoRegistrazione.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetUserPasswordRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/SetUserPasswordRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/StatoRegistrazione.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/StatoRegistrazione.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoAbilitazione.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoAbilitazione.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoFiltro.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TipoFiltro.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TokenResult.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TokenResult.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TwoFactorDtos.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/TwoFactorDtos.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UpdateEnabledStatusRequest.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UpdateEnabledStatusRequest.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserDto.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserDto.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsDto.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsDto.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsResponse.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/UserGrantsResponse.js +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/index.d.ts +0 -0
- /package/dist/{accessi-module/Dtos → accessi-service/dtos}/index.js +0 -0
- /package/dist/{accessi-module → accessi-service}/federated-auth/FederatedAuthTypes.js +0 -0
- /package/dist/{accessi-module → accessi-service}/health/nest.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/health/nest.js +0 -0
- /package/dist/{accessi-module → accessi-service}/health/readiness.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/health/readiness.js +0 -0
- /package/dist/{accessi-module → accessi-service}/middleware/accessiRequirements.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/middleware/accessiRequirements.js +0 -0
- /package/dist/{accessi-module → accessi-service}/observability/metrics.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/observability/metrics.js +0 -0
- /package/dist/{accessi-module → accessi-service}/observability/redisMetrics.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/observability/redisMetrics.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/AccessiHttpExceptionFilter.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/AccessiHttpExceptionFilter.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/accessControl.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/accessControl.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/accessTokenRevocation.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/accessTokenRevocation.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/accessiValidation.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/accessiValidation.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/adminBootstrap.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/adminBootstrap.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/audit.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/audit.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/auditSinks.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/auditSinks.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/authCookies.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/authCookies.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/consoleEntry.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/consoleEntry.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/edgeRateLimit.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/edgeRateLimit.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/emailConfiguration.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/emailConfiguration.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/jwks.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/jwks.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/jwksBootstrap.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/jwksBootstrap.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/jwtTokenOptions.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/jwtTokenOptions.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/loginAs.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/loginAs.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/passwordPolicy.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/passwordPolicy.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/passwordResetToken.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/passwordResetToken.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/publicAuthRateLimit.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/publicAuthRateLimit.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/rateLimitStore.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/rateLimitStore.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/refreshTokenRotation.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/refreshTokenRotation.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/securityHeaders.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/securityHeaders.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/serviceTokenRateLimit.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/serviceTokenRateLimit.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/sessionRevocation.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/sessionRevocation.js +0 -0
- /package/dist/{accessi-module → accessi-service}/security/validateOptions.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/security/validateOptions.js +0 -0
- /package/dist/{accessi-module/Services/ConfiguratorService → accessi-service/services/configurator-service}/ConfiguratorService.d.ts +0 -0
- /package/dist/{accessi-module/Services/ConfiguratorService → accessi-service/services/configurator-service}/ConfiguratorService.js +0 -0
- /package/dist/{accessi-module/Services/EmailService → accessi-service/services/email-service}/EmailService.d.ts +0 -0
- /package/dist/{accessi-module/Services/SchemaExportService → accessi-service/services/schema-export-service}/SchemaExportService.d.ts +0 -0
- /package/dist/{accessi-module/Services/SchemaExportService → accessi-service/services/schema-export-service}/SchemaExportService.js +0 -0
- /package/dist/{accessi-module/Services/ServiceTokenService → accessi-service/services/service-token-service}/ServiceTokenService.d.ts +0 -0
- /package/dist/{accessi-module/Services/ServiceTokenService → accessi-service/services/service-token-service}/ServiceTokenService.js +0 -0
- /package/dist/{accessi-module → accessi-service}/startupLog.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/startupLog.js +0 -0
- /package/dist/{accessi-module → accessi-service}/tenancy/tenantContext.d.ts +0 -0
- /package/dist/{accessi-module → accessi-service}/tenancy/tenantContext.js +0 -0
- /package/dist/{accessi-module/Views → accessi-service/views}/reset-password.html +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/AllegatoDto.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/AllegatoDto.js +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/BaseResponse.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/BaseResponse.js +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/UploadSingleFileRequest.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/UploadSingleFileRequest.js +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/index.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/index.js +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/responses/DownloadAllegatoResponseDto.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/responses/DownloadAllegatoResponseDto.js +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/responses/GetListResponse.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/responses/GetListResponse.js +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/responses/UploadAllegatoResponseDto.d.ts +0 -0
- /package/dist/allegati-module/{Dtos → dtos}/responses/UploadAllegatoResponseDto.js +0 -0
- /package/dist/allegati-module/{Services/AllegatiService → services/allegati-service}/AllegatiService.js +0 -0
- /package/dist/{firebird-compat.d.ts → firebirdCompat.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionService.js","sourceRoot":"","sources":["../../../../src/accessi-service/services/permission-service/PermissionService.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { Orm } from \"../../../Orm\";\nimport { RestUtilities } from \"../../../Utilities\";\nimport type { AccessiOptions } from \"../../AccessiModule\";\nimport { Permission, TipoAbilitazione } from \"../../dtos\";\nimport { AbilitazioneMenu } from \"../../dtos/AbilitazioneMenu\";\nimport { GroupWithMenusEntity } from \"../../dtos/GetGroupsWithMenusResponse\";\nimport { MenuEntity } from \"../../dtos/GetMenusResponse\";\nimport { Role } from \"../../dtos/Role\";\nimport {\n CreateMenuGroupRequest,\n CreateMenuRequest,\n CreateMenuTypeRequest,\n MenuTypeEntity,\n UpdateMenuGroupRequest,\n UpdateMenuRequest,\n UpdateMenuTypeRequest,\n} from \"../../dtos/CatalogDtos\";\nimport {\n CreateScopeRequest,\n ScopeEntity,\n UpdateScopeRequest,\n} from \"../../dtos/ScopeDtos\";\nimport { BadRequestException, Inject, Injectable } from \"@nestjs/common\";\n\n/** Struttura storica menu/gruppi accettata dall'API legacy `addAbilitazioni`. */\ntype LegacyMenuGroup = {\n menu?: Array<{\n flgChk?: unknown;\n codiceMenu?: unknown;\n tipoAbilitazione?: unknown;\n }>;\n};\n\n@Injectable()\nexport class PermissionService {\n constructor(\n @Inject('ACCESSI_OPTIONS') private readonly accessiOptions: AccessiOptions\n ) { }\n\n private getCountFromResult(result: ReadonlyArray<Record<string, unknown>>, fieldName = 'COUNT'): number {\n const rawValue = result?.[0]?.[fieldName]\n ?? result?.[0]?.[fieldName.toLowerCase()]\n ?? result?.[0]?.count;\n return typeof rawValue === 'number' ? rawValue : Number.parseInt(`${rawValue ?? '0'}`, 10);\n }\n\n private extractIntegerColumn(result: ReadonlyArray<Record<string, unknown>>, fieldName: string): Set<number> {\n return new Set(\n result.map((row) => Number(row[fieldName] ?? row[fieldName.toLowerCase()])),\n );\n }\n\n private async getAllActiveMenusAsGrants(scopeCodes: string[] = []): Promise<AbilitazioneMenu[]> {\n const scopeFilter = this.scopeFilter('M', scopeCodes);\n const query = `\n SELECT\n M.CODMNU AS codice_menu,\n 30 AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n G.DESGRP AS descrizione_gruppo,\n G.CODGRP AS codice_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note\n FROM MENU M\n LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\n WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}\n `;\n\n return await Orm.query(this.accessiOptions.databaseOptions, query, scopeFilter.params)\n .then(results => results.map(RestUtilities.convertKeysToCamelCase)) as AbilitazioneMenu[];\n }\n\n /**\n * Normalizza e valida il filtro `scope` (CSV). Restituisce i codici in\n * maiuscolo; lista vuota significa \"nessun filtro\" (comportamento storico).\n */\n private async resolveScopeCodes(scope?: string | null): Promise<string[]> {\n const codes = Array.from(\n new Set(\n String(scope ?? '')\n .split(',')\n .map((value) => value.trim().toUpperCase())\n .filter((value) => value.length > 0),\n ),\n );\n if (codes.length === 0) {\n return [];\n }\n const placeholders = codes.map(() => '?').join(', ');\n const rows = (await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT CODICE FROM SCOPES WHERE CODICE IN (${placeholders})`,\n codes,\n )) as Array<Record<string, unknown>>;\n const known = new Set(rows.map((row) => String(row.CODICE ?? row.codice ?? '').trim().toUpperCase()));\n const missing = codes.filter((code) => !known.has(code));\n if (missing.length > 0) {\n throw new BadRequestException(`Scope non validi: ${missing.join(', ')}.`);\n }\n return codes;\n }\n\n /** Clausola SQL EXISTS per filtrare i menu sugli scope richiesti. */\n private scopeFilter(alias: string, scopeCodes: string[]): { sql: string; params: string[] } {\n if (scopeCodes.length === 0) {\n return { sql: '', params: [] };\n }\n const placeholders = scopeCodes.map(() => '?').join(', ');\n return {\n sql: ` AND EXISTS (SELECT 1 FROM MENU_SCOPES MS WHERE MS.CODICE_MENU = ${alias}.CODMNU AND MS.CODICE_SCOPE IN (${placeholders}))`,\n params: [...scopeCodes],\n };\n }\n\n private async getUserDirectPermissions(codiceUtente: number, scopeCodes: string[] = []): Promise<AbilitazioneMenu[]> {\n const scopeFilter = this.scopeFilter('M', scopeCodes);\n const queryAbilitazioni = `\n SELECT\n A.CODMNU AS codice_menu,\n A.TIPABI AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n G.DESGRP AS descrizione_gruppo,\n G.CODGRP AS codice_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note\n FROM ABILITAZIONI A\n INNER JOIN MENU M ON A.CODMNU = M.CODMNU\n LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\n WHERE A.CODUTE = ? AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}\n `;\n\n return await Orm.query(this.accessiOptions.databaseOptions, queryAbilitazioni, [codiceUtente, ...scopeFilter.params])\n .then(results => results.map(RestUtilities.convertKeysToCamelCase)) as AbilitazioneMenu[];\n }\n\n private async getUserRoles(codiceUtente: number, scopeCodes: string[] = []): Promise<Role[]> {\n const scopeFilter = this.scopeFilter('M', scopeCodes);\n const queryRuoli = `\n SELECT\n R.CODRUO AS codice_ruolo,\n R.DESRUO AS descrizione_ruolo,\n CASE WHEN COALESCE(G.FLGENABLED, 1) = 1 THEN M.CODMNU END AS codice_menu,\n RM.TIPABI AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n M.NOTE AS note\n FROM UTENTI_RUOLI RU\n INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO\n LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\n LEFT JOIN MENU M\n ON RM.CODMNU = M.CODMNU\n AND M.FLGENABLED = 1\n LEFT JOIN MENU_GRP G\n ON G.CODGRP = M.CODGRP\n WHERE RU.CODUTE = ?${scopeFilter.sql}\n `;\n const ruoliResult = (await Orm.query(this.accessiOptions.databaseOptions, queryRuoli, [codiceUtente, ...scopeFilter.params]))\n .map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n\n return this.assembleRoles(ruoliResult);\n }\n\n /** Costruisce l'albero ruoli/menu a partire dalle righe (riusato da lettura singola e batch). */\n private assembleRoles(ruoliResult: Array<Record<string, unknown>>): Role[] {\n const ruoliMap = new Map<number, Role>();\n for (const row of ruoliResult) {\n const codiceRuolo = Number(row.codiceRuolo);\n const descrizioneRuolo = typeof row.descrizioneRuolo === 'string' ? row.descrizioneRuolo.trim() : '';\n const codiceMenu = typeof row.codiceMenu === 'string' ? row.codiceMenu : undefined;\n // RUOLI_MNU.TIPABI e MENU.DESMNU sono nullable nello schema storico: un livello\n // mancante non deve far sparire il menu dal ruolo. Default prudente: lettura.\n const rawTipoAbilitazione = row.tipoAbilitazione;\n const parsedTipoAbilitazione = rawTipoAbilitazione === undefined || rawTipoAbilitazione === null || rawTipoAbilitazione === ''\n ? TipoAbilitazione.LETTURA\n : Number(rawTipoAbilitazione);\n const tipoAbilitazione = (Number.isFinite(parsedTipoAbilitazione)\n ? parsedTipoAbilitazione\n : TipoAbilitazione.LETTURA) as TipoAbilitazione;\n\n if (!ruoliMap.has(codiceRuolo)) {\n ruoliMap.set(codiceRuolo, {\n codiceRuolo,\n descrizioneRuolo,\n menu: []\n });\n }\n\n if (codiceMenu) {\n ruoliMap.get(codiceRuolo)!.menu.push({\n codiceRuolo,\n codiceMenu,\n tipoAbilitazione,\n });\n }\n }\n\n return Array.from(ruoliMap.values());\n }\n\n /**\n * Compone i grant effettivi: permessi diretti e ruoli si sommano per codice menu\n * prendendo il livello massimo. Un livello 0/non valido non rimuove un grant del ruolo.\n * I superutenti ricevono tutti i menu attivi al livello massimo.\n */\n private composeGrants(\n abilitazioni: AbilitazioneMenu[],\n ruoli: Role[],\n isSuperAdmin: boolean,\n allActiveMenus: AbilitazioneMenu[],\n ): AbilitazioneMenu[] {\n if (isSuperAdmin) return allActiveMenus;\n\n const catalog = new Map(allActiveMenus.map((menu) => [menu.codiceMenu, menu]));\n const grantsMap = new Map<string, AbilitazioneMenu>();\n const addGrant = (grant: AbilitazioneMenu | { codiceMenu?: string; tipoAbilitazione?: unknown }) => {\n const codiceMenu = typeof grant.codiceMenu === 'string' ? grant.codiceMenu.trim() : '';\n const livello = Number(grant.tipoAbilitazione ?? 0);\n if (!codiceMenu || !Number.isFinite(livello) || livello <= 0) return;\n const existing = grantsMap.get(codiceMenu);\n if (!existing || livello > Number(existing.tipoAbilitazione ?? 0)) {\n // I ruoli salvano solo codice e livello: completa i metadati di navigazione\n // (pagina, icona, gruppo, tipo) dal catalogo dei menu attivi.\n const metadata = catalog.get(codiceMenu);\n grantsMap.set(codiceMenu, {\n ...(metadata ?? {}),\n ...(grant as AbilitazioneMenu),\n codiceMenu,\n tipoAbilitazione: livello as TipoAbilitazione,\n });\n }\n };\n\n for (const abilitazione of abilitazioni) addGrant(abilitazione);\n for (const ruolo of ruoli) {\n for (const menu of ruolo.menu) addGrant(menu);\n }\n\n return Array.from(grantsMap.values());\n }\n\n\n /**\n * API legacy per salvare grant dalla struttura storica menu/gruppi.\n * Sostituisce tutti i grant diretti dell'utente; per le nuove integrazioni preferire `assignPermissionsToUser`.\n */\n public async addAbilitazioni(codiceUtente: number, menuAbilitazioni: LegacyMenuGroup[]): Promise<void> {\n const abilitazioniToInsert = menuAbilitazioni\n .flatMap(menuGrp => menuGrp.menu ?? [])\n .filter(menu => menu.flgChk)\n .map(menu => [codiceUtente, menu.codiceMenu, menu.tipoAbilitazione]);\n\n const insertQuery = `UPDATE OR INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`;\n\n // Delete + insert atomici: un errore a metà non lascia l'utente senza abilitazioni.\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, [\n { query: `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`, params: [codiceUtente] },\n ...abilitazioniToInsert.map(params => ({ query: insertQuery, params })),\n ]);\n }\n\n\n /** Rimuove tutti i grant diretti, senza toccare ruoli o menu ereditati dai ruoli. */\n public async resetAbilitazioni(codiceUtente: number): Promise<void> {\n const query = \"DELETE FROM ABILITAZIONI WHERE CODUTE = ?\";\n await Orm.execute(this.accessiOptions.databaseOptions, query, [codiceUtente]);\n }\n\n /**\n * Crea o aggiorna un ruolo. In aggiornamento la lista `role.menu` sostituisce integralmente i menu del ruolo.\n * Validare i codici menu nel chiamante quando si usano dati non provenienti dalla console o dalle API Accessi.\n */\n public async updateOrInsertRole(role: Role, codiceRuolo: number | null = null): Promise<void> {\n // Ruolo, sostituzione menu e inserimenti in un'unica transazione: niente ruoli senza menu in caso di errore.\n await Orm.withTransaction(this.accessiOptions.databaseOptions, async (transaction) => {\n let resolvedCodiceRuolo = codiceRuolo;\n\n if (resolvedCodiceRuolo == null) {\n const createdRoleResult = await Orm.transactionQuery<unknown>(\n transaction,\n `INSERT INTO RUOLI (DESRUO) VALUES (?) RETURNING CODRUO`,\n [role.descrizioneRuolo],\n );\n const createdRole = (Array.isArray(createdRoleResult) ? createdRoleResult[0] : createdRoleResult) as Record<string, unknown> | undefined;\n const rawCodiceRuolo = createdRole?.CODRUO ?? createdRole?.codruo;\n const parsedCodiceRuolo = typeof rawCodiceRuolo === 'number'\n ? rawCodiceRuolo\n : Number.parseInt(`${rawCodiceRuolo ?? ''}`, 10);\n if (Number.isNaN(parsedCodiceRuolo)) {\n throw new Error('Creazione ruolo non riuscita: impossibile recuperare CODRUO.');\n }\n resolvedCodiceRuolo = parsedCodiceRuolo;\n } else {\n await Orm.transactionQuery(\n transaction,\n `UPDATE RUOLI SET DESRUO = ? WHERE CODRUO = ?`,\n [role.descrizioneRuolo, resolvedCodiceRuolo],\n );\n\n await Orm.transactionQuery(\n transaction,\n `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`,\n [resolvedCodiceRuolo],\n );\n }\n\n if (resolvedCodiceRuolo === null) {\n throw new Error('Operazione ruolo non riuscita: codice ruolo non valorizzato.');\n }\n\n for (const menu of role.menu) {\n await Orm.transactionQuery(\n transaction,\n `INSERT INTO RUOLI_MNU (CODRUO, CODMNU, TIPABI) VALUES (?, ?, ?)`,\n [resolvedCodiceRuolo, menu.codiceMenu, menu.tipoAbilitazione],\n );\n }\n });\n }\n\n\n /** Restituisce il catalogo ruoli con ogni associazione menu e livello, inclusi ruoli senza menu. */\n public async getRolesWithMenus(): Promise<Role[]> {\n const query = `\n SELECT \n R.CODRUO AS codice_ruolo, \n R.DESRUO AS descrizione_ruolo, \n M.CODMNU AS codice_menu, \n M.DESMNU AS descrizione_menu,\n M.NOTE AS note,\n RM.TIPABI AS tipo_abilitazione\n FROM RUOLI R\n LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\n LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU\n ORDER BY R.CODRUO, M.CODMNU\n `;\n\n const result = (await Orm.query(this.accessiOptions.databaseOptions, query, []))\n .map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n\n const ruoliMap = new Map<number, Role>();\n\n for (const row of result) {\n const codiceRuolo = Number(row.codiceRuolo);\n const descrizioneRuolo = typeof row.descrizioneRuolo === 'string' ? row.descrizioneRuolo.trim() : '';\n const codiceMenu = typeof row.codiceMenu === 'string' ? row.codiceMenu : undefined;\n const rawTipoAbilitazione = row.tipoAbilitazione;\n\n if (!ruoliMap.has(codiceRuolo)) {\n ruoliMap.set(codiceRuolo, {\n codiceRuolo,\n descrizioneRuolo,\n menu: []\n });\n }\n\n const abilitationValue = typeof rawTipoAbilitazione === 'number'\n ? rawTipoAbilitazione\n : Number.parseInt(`${rawTipoAbilitazione ?? ''}`, 10);\n\n if (!codiceMenu || Number.isNaN(abilitationValue) || abilitationValue <= TipoAbilitazione.NESSUNA) {\n continue;\n }\n\n ruoliMap.get(codiceRuolo)!.menu.push({\n codiceRuolo,\n codiceMenu,\n tipoAbilitazione: abilitationValue as TipoAbilitazione,\n });\n }\n\n return Array.from(ruoliMap.values());\n }\n\n\n /**\n * Sostituisce l'intera lista di ruoli dell'utente con codici univoci e verificati.\n * Non modifica i grant diretti: il calcolo effettivo li unisce in `getUserRolesAndGrants`.\n */\n public async assignRolesToUser(codiceUtente: number, roles: number[]): Promise<void> {\n\n const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;\n let result = await Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);\n\n if (this.getCountFromResult(result) === 0) {\n throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);\n }\n\n const normalizedRoles = Array.from(\n new Set(\n roles\n .map((role) => Number.parseInt(`${role ?? ''}`, 10))\n .filter((role) => Number.isInteger(role) && role > 0),\n ),\n );\n\n const queriesWithParams = [\n { query: `DELETE FROM UTENTI_RUOLI WHERE CODUTE = ?`, params: [codiceUtente] },\n ...normalizedRoles.map((codiceRuolo) => ({\n query: `INSERT INTO UTENTI_RUOLI (CODUTE, CODRUO) VALUES (?, ?)`,\n params: [codiceUtente, codiceRuolo],\n })),\n ];\n\n if (normalizedRoles.length > 0) {\n // Un'unica query IN invece di N count: stessa validazione, meno round-trip.\n const placeholders = normalizedRoles.map(() => '?').join(', ');\n const existingRolesResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT CODRUO FROM RUOLI WHERE CODRUO IN (${placeholders})`,\n normalizedRoles,\n );\n const existingRoles = this.extractIntegerColumn(existingRolesResult, 'CODRUO');\n const missingRole = normalizedRoles.find((codiceRuolo) => !existingRoles.has(codiceRuolo));\n if (missingRole !== undefined) {\n throw new Error(`Il ruolo con codice ${missingRole} non esiste.`);\n }\n }\n\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);\n\n const assignedRolesResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT COUNT(*) FROM UTENTI_RUOLI WHERE CODUTE = ?`,\n [codiceUtente],\n );\n const assignedRolesCount = this.getCountFromResult(assignedRolesResult);\n if (assignedRolesCount !== normalizedRoles.length) {\n throw new Error(\n `Persistenza ruoli non coerente per utente ${codiceUtente}: attesi ${normalizedRoles.length}, trovati ${assignedRolesCount}.`,\n );\n }\n }\n\n\n /**\n * Sostituisce tutti i grant diretti dell'utente. I ruoli rimangono invariati e i loro grant sono aggiunti\n * solo nel risultato effettivo; per lo stesso menu vale il livello massimo tra diretto e ruoli.\n */\n public async assignPermissionsToUser(codiceUtente: number, permissions: Permission[]): Promise<void> {\n\n const userExistsQuery = `SELECT COUNT(*) FROM UTENTI WHERE CODUTE = ?`;\n let result = await Orm.query(this.accessiOptions.databaseOptions, userExistsQuery, [codiceUtente]);\n\n if (this.getCountFromResult(result) === 0) {\n throw new Error(`L'utente con codice ${codiceUtente} non esiste.`);\n }\n\n const normalizedPermissions = Array.from(\n new Map(\n permissions\n .map((permission) => ({\n codiceMenu: `${permission?.codiceMenu ?? ''}`.trim(),\n tipoAbilitazione: Number.parseInt(`${permission?.tipoAbilitazione ?? ''}`, 10),\n }))\n .filter(\n (permission) =>\n permission.codiceMenu.length > 0 && Number.isInteger(permission.tipoAbilitazione),\n )\n .map((permission) => [permission.codiceMenu, permission] as const),\n ).values(),\n );\n\n const queriesWithParams = [\n { query: `DELETE FROM ABILITAZIONI WHERE CODUTE = ?`, params: [codiceUtente] },\n ...normalizedPermissions.map((permission) => ({\n query: `INSERT INTO ABILITAZIONI (CODUTE, CODMNU, TIPABI) VALUES (?, ?, ?)`,\n params: [codiceUtente, permission.codiceMenu, permission.tipoAbilitazione],\n })),\n ];\n\n if (normalizedPermissions.length > 0) {\n // Un'unica query IN invece di N count: stessa validazione, meno round-trip.\n const menuCodes = normalizedPermissions.map((permission) => permission.codiceMenu);\n const placeholders = menuCodes.map(() => '?').join(', ');\n const existingMenusResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT CODMNU FROM MENU WHERE CODMNU IN (${placeholders})`,\n menuCodes,\n );\n const existingMenus = new Set(\n existingMenusResult.map((row) => String((row as Record<string, unknown>).CODMNU ?? (row as Record<string, unknown>).codmnu ?? '')),\n );\n const missingMenu = menuCodes.find((codiceMenu) => !existingMenus.has(codiceMenu));\n if (missingMenu !== undefined) {\n throw new Error(`Il menu con codice ${missingMenu} non esiste.`);\n }\n }\n\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, queriesWithParams);\n\n const assignedPermissionsResult = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT COUNT(*) FROM ABILITAZIONI WHERE CODUTE = ?`,\n [codiceUtente],\n );\n const assignedPermissionsCount = this.getCountFromResult(assignedPermissionsResult);\n if (assignedPermissionsCount !== normalizedPermissions.length) {\n throw new Error(\n `Persistenza abilitazioni non coerente per utente ${codiceUtente}: attese ${normalizedPermissions.length}, trovate ${assignedPermissionsCount}.`,\n );\n }\n }\n\n\n /** Elimina fisicamente ruolo, associazioni menu e assegnazioni utente. Operazione amministrativa irreversibile. */\n public async deleteRole(codiceRuolo: number): Promise<void> {\n\n const existsQuery = `SELECT COUNT(*) FROM RUOLI WHERE CODRUO = ?`;\n const result = await Orm.query(this.accessiOptions.databaseOptions, existsQuery, [codiceRuolo]);\n\n if (this.getCountFromResult(result) === 0) {\n throw new Error(`Il ruolo con codice ${codiceRuolo} non esiste.`);\n }\n\n // Le tre delete sono atomiche: nessun ruolo orfano se una fallisce.\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, [\n { query: `DELETE FROM RUOLI_MNU WHERE CODRUO = ?`, params: [codiceRuolo] },\n { query: `DELETE FROM UTENTI_RUOLI WHERE CODRUO = ?`, params: [codiceRuolo] },\n { query: `DELETE FROM RUOLI WHERE CODRUO = ?`, params: [codiceRuolo] },\n ]);\n\n }\n\n\n /** Restituisce solo menu abilitati; per il catalogo amministrativo usare `getGroupsWithMenus(true)`. */\n public async getMenus(scope?: string): Promise<MenuEntity[]> {\n const scopeCodes = await this.resolveScopeCodes(scope);\n const scopeFilter = this.scopeFilter('M', scopeCodes);\n const query = `\n SELECT\n M.CODMNU AS codice_menu,\n M.DESMNU AS descrizione_menu,\n M.CODGRP AS codice_gruppo,\n G.DESGRP AS descrizione_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note,\n G.ORDINE AS ordine_gruppo,\n M.ORDINE AS ordine_menu\n FROM MENU M\n LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP\n WHERE M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}\n ORDER BY G.CODGRP, M.CODMNU\n `;\n\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, scopeFilter.params);\n return result.map(RestUtilities.convertKeysToCamelCase) as unknown as MenuEntity[];\n }\n\n\n /**\n * Restituisce il catalogo ordinato per gruppo e menu. `includeDisabled` e riservato a console e amministrazione:\n * i flussi applicativi di autorizzazione devono usare il comportamento predefinito, che nasconde voci disabilitate.\n */\n public async getGroupsWithMenus(includeDisabled = false, scope?: string): Promise<GroupWithMenusEntity[]> {\n const scopeCodes = await this.resolveScopeCodes(scope);\n const scopeFilter = this.scopeFilter('M', scopeCodes);\n let filtersClause = includeDisabled\n ? ''\n : 'WHERE M.FLGENABLED = 1 AND (G.FLGENABLED IS NULL OR G.FLGENABLED = 1)';\n if (scopeFilter.sql) {\n filtersClause = filtersClause ? `${filtersClause}${scopeFilter.sql}` : `WHERE 1 = 1${scopeFilter.sql}`;\n }\n\n const query = `\n SELECT\n M.CODMNU AS codice_menu,\n M.DESMNU AS descrizione_menu,\n M.CODGRP AS codice_gruppo,\n G.DESGRP AS descrizione_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note,\n G.ORDINE AS ordine_gruppo,\n M.ORDINE as ordine_menu,\n M.FLGENABLED AS menu_enabled,\n G.FLGENABLED AS group_enabled\n FROM MENU M\n LEFT JOIN MENU_GRP G ON M.CODGRP = G.CODGRP\n ${filtersClause}\n ORDER BY G.CODGRP, M.CODMNU\n `;\n\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, scopeFilter.params);\n\n const groupMap = new Map<\n string,\n GroupWithMenusEntity & { menus: (MenuEntity & { enabled?: boolean })[] }\n >();\n\n result.forEach((row: unknown) => {\n const converted = RestUtilities.convertKeysToCamelCase(row) as MenuEntity & {\n menuEnabled?: number | boolean;\n groupEnabled?: number | boolean;\n };\n\n const { menuEnabled, groupEnabled, ...menuBase } = converted;\n const normalizedGroupKey = menuBase.codiceGruppo ?? '__UNGROUPED__';\n const groupEnabledFlag =\n groupEnabled == null ? true : Number(groupEnabled) === 1 || groupEnabled === true;\n const menuEnabledFlag =\n menuEnabled === undefined ? true : Number(menuEnabled) === 1 || menuEnabled === true;\n\n if (!groupMap.has(normalizedGroupKey)) {\n groupMap.set(normalizedGroupKey, {\n codiceGruppo: menuBase.codiceGruppo ?? normalizedGroupKey,\n descrizioneGruppo: menuBase.descrizioneGruppo ?? '',\n ordineGruppo: menuBase.ordineGruppo,\n enabled: groupEnabledFlag,\n menus: [],\n });\n }\n\n if (menuBase.codiceMenu) {\n groupMap.get(normalizedGroupKey)!.menus.push({\n ...menuBase,\n enabled: menuEnabledFlag,\n });\n }\n });\n\n const groupsArray = Array.from(groupMap.values())\n .map(group => ({\n ...group,\n menus: (group.menus ?? []).sort(\n (a, b) =>\n (a.ordineMenu ?? Number.MAX_SAFE_INTEGER) - (b.ordineMenu ?? Number.MAX_SAFE_INTEGER),\n ),\n }))\n .sort(\n (a, b) =>\n (a.ordineGruppo ?? Number.MAX_SAFE_INTEGER) - (b.ordineGruppo ?? Number.MAX_SAFE_INTEGER),\n );\n\n return groupsArray;\n }\n\n // -----------------------------------------------------------------------\n // Cataloghi di configurazione: CRUD di menu, gruppi, tipi menu.\n // `table` e `column` sono sempre costanti interne, mai input utente: i\n // valori sono parametrizzati, quindi non esiste superficie di SQL injection.\n // -----------------------------------------------------------------------\n\n private async countWhere(table: string, column: string, value: unknown): Promise<number> {\n const result = await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT COUNT(*) FROM ${table} WHERE ${column} = ?`,\n [value],\n );\n return this.getCountFromResult(result);\n }\n\n private async assertMenuGroupExists(codiceGruppo: string): Promise<void> {\n if ((await this.countWhere('MENU_GRP', 'CODGRP', codiceGruppo)) === 0) {\n throw new BadRequestException(`Il gruppo menu ${codiceGruppo} non esiste.`);\n }\n }\n\n private async assertMenuTypeExists(codiceTipo: string): Promise<void> {\n if ((await this.countWhere('MENU_TIPI', 'CODTIP', codiceTipo)) === 0) {\n throw new BadRequestException(`Il tipo menu ${codiceTipo} non esiste.`);\n }\n }\n\n /** Catalogo completo dei tipi menu, usato dagli editor di configurazione. */\n public async getMenuTypes(): Promise<MenuTypeEntity[]> {\n const query = `SELECT CODTIP AS codice_tipo, DESTIP AS descrizione_tipo FROM MENU_TIPI ORDER BY CODTIP`;\n const result = await Orm.query(this.accessiOptions.databaseOptions, query, []);\n return result.map(RestUtilities.convertKeysToCamelCase) as unknown as MenuTypeEntity[];\n }\n\n public async createMenuType(input: CreateMenuTypeRequest): Promise<void> {\n if ((await this.countWhere('MENU_TIPI', 'CODTIP', input.codiceTipo)) > 0) {\n throw new BadRequestException(`Il tipo menu ${input.codiceTipo} esiste gia.`);\n }\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `INSERT INTO MENU_TIPI (CODTIP, DESTIP) VALUES (?, ?)`,\n [input.codiceTipo, input.descrizioneTipo ?? null],\n );\n }\n\n public async updateMenuType(codiceTipo: string, input: UpdateMenuTypeRequest): Promise<void> {\n await this.assertMenuTypeExists(codiceTipo);\n if (input.descrizioneTipo === undefined) return;\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `UPDATE MENU_TIPI SET DESTIP = ? WHERE CODTIP = ?`,\n [input.descrizioneTipo, codiceTipo],\n );\n }\n\n /** Elimina un tipo menu solo se nessun menu lo utilizza (la FK lo impedirebbe comunque). */\n public async deleteMenuType(codiceTipo: string): Promise<void> {\n await this.assertMenuTypeExists(codiceTipo);\n const used = await this.countWhere('MENU', 'CODTIP', codiceTipo);\n if (used > 0) {\n throw new BadRequestException(\n `Impossibile eliminare il tipo ${codiceTipo}: ${used} menu lo utilizzano.`,\n );\n }\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `DELETE FROM MENU_TIPI WHERE CODTIP = ?`,\n [codiceTipo],\n );\n }\n\n public async createMenuGroup(input: CreateMenuGroupRequest): Promise<void> {\n if ((await this.countWhere('MENU_GRP', 'CODGRP', input.codiceGruppo)) > 0) {\n throw new BadRequestException(`Il gruppo menu ${input.codiceGruppo} esiste gia.`);\n }\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `INSERT INTO MENU_GRP (CODGRP, DESGRP, FLGENABLED, ORDINE) VALUES (?, ?, ?, ?)`,\n [\n input.codiceGruppo,\n input.descrizioneGruppo ?? null,\n input.enabled === false ? 0 : 1,\n input.ordineGruppo ?? 0,\n ],\n );\n }\n\n public async updateMenuGroup(codiceGruppo: string, input: UpdateMenuGroupRequest): Promise<void> {\n await this.assertMenuGroupExists(codiceGruppo);\n\n const sets: string[] = [];\n const params: unknown[] = [];\n if (input.descrizioneGruppo !== undefined) {\n sets.push('DESGRP = ?');\n params.push(input.descrizioneGruppo);\n }\n if (input.ordineGruppo !== undefined) {\n sets.push('ORDINE = ?');\n params.push(input.ordineGruppo);\n }\n if (input.enabled !== undefined) {\n sets.push('FLGENABLED = ?');\n params.push(input.enabled ? 1 : 0);\n }\n if (sets.length === 0) return;\n\n params.push(codiceGruppo);\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `UPDATE MENU_GRP SET ${sets.join(', ')} WHERE CODGRP = ?`,\n params,\n );\n }\n\n /** Elimina un gruppo solo se non contiene menu, per non lasciare menu orfani. */\n public async deleteMenuGroup(codiceGruppo: string): Promise<void> {\n await this.assertMenuGroupExists(codiceGruppo);\n const used = await this.countWhere('MENU', 'CODGRP', codiceGruppo);\n if (used > 0) {\n throw new BadRequestException(\n `Impossibile eliminare il gruppo ${codiceGruppo}: contiene ${used} menu.`,\n );\n }\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `DELETE FROM MENU_GRP WHERE CODGRP = ?`,\n [codiceGruppo],\n );\n }\n\n public async createMenu(input: CreateMenuRequest): Promise<void> {\n if ((await this.countWhere('MENU', 'CODMNU', input.codiceMenu)) > 0) {\n throw new BadRequestException(`Il menu ${input.codiceMenu} esiste gia.`);\n }\n await this.assertMenuGroupExists(input.codiceGruppo);\n if (input.tipo) await this.assertMenuTypeExists(input.tipo);\n\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `INSERT INTO MENU (CODMNU, DESMNU, CODGRP, FLGENABLED, ICON, ORDINE, CODTIP, PAGINA, RIFMENU, NOTE)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n input.codiceMenu,\n input.descrizioneMenu ?? null,\n input.codiceGruppo,\n input.enabled === false ? 0 : 1,\n input.icona ?? null,\n input.ordineMenu ?? null,\n input.tipo ?? null,\n input.pagina ?? null,\n input.rifMenu ?? null,\n input.note ?? null,\n ],\n );\n }\n\n public async updateMenu(codiceMenu: string, input: UpdateMenuRequest): Promise<void> {\n if ((await this.countWhere('MENU', 'CODMNU', codiceMenu)) === 0) {\n throw new BadRequestException(`Il menu ${codiceMenu} non esiste.`);\n }\n if (input.codiceGruppo !== undefined) await this.assertMenuGroupExists(input.codiceGruppo);\n if (input.tipo) await this.assertMenuTypeExists(input.tipo);\n\n const sets: string[] = [];\n const params: unknown[] = [];\n if (input.descrizioneMenu !== undefined) {\n sets.push('DESMNU = ?');\n params.push(input.descrizioneMenu);\n }\n if (input.codiceGruppo !== undefined) {\n sets.push('CODGRP = ?');\n params.push(input.codiceGruppo);\n }\n if (input.tipo !== undefined) {\n sets.push('CODTIP = ?');\n params.push(input.tipo || null);\n }\n if (input.icona !== undefined) {\n sets.push('ICON = ?');\n params.push(input.icona);\n }\n if (input.pagina !== undefined) {\n sets.push('PAGINA = ?');\n params.push(input.pagina);\n }\n if (input.ordineMenu !== undefined) {\n sets.push('ORDINE = ?');\n params.push(input.ordineMenu);\n }\n if (input.enabled !== undefined) {\n sets.push('FLGENABLED = ?');\n params.push(input.enabled ? 1 : 0);\n }\n if (input.rifMenu !== undefined) {\n sets.push('RIFMENU = ?');\n params.push(input.rifMenu);\n }\n if (input.note !== undefined) {\n sets.push('NOTE = ?');\n params.push(input.note);\n }\n if (sets.length === 0) return;\n\n params.push(codiceMenu);\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n `UPDATE MENU SET ${sets.join(', ')} WHERE CODMNU = ?`,\n params,\n );\n }\n\n /** Elimina menu, grant utente e associazioni ruolo in un'unica transazione. */\n public async deleteMenu(codiceMenu: string): Promise<void> {\n if ((await this.countWhere('MENU', 'CODMNU', codiceMenu)) === 0) {\n throw new BadRequestException(`Il menu ${codiceMenu} non esiste.`);\n }\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, [\n { query: `DELETE FROM ABILITAZIONI WHERE CODMNU = ?`, params: [codiceMenu] },\n { query: `DELETE FROM RUOLI_MNU WHERE CODMNU = ?`, params: [codiceMenu] },\n { query: `DELETE FROM MENU WHERE CODMNU = ?`, params: [codiceMenu] },\n ]);\n }\n\n\n /**\n * Calcola l'autorizzazione effettiva: grant diretti e grant dei ruoli sono uniti per codice menu\n * prendendo il livello massimo. I superutenti ricevono tutti i menu attivi.\n */\n public async getUserRolesAndGrants(codiceUtente: number, scope?: string): Promise<{\n abilitazioni: AbilitazioneMenu[],\n ruoli: Role[],\n grants: AbilitazioneMenu[]\n }> {\n const scopeCodes = await this.resolveScopeCodes(scope);\n const codiceUtenteQuery = \"SELECT FLGSUPER as flag_super FROM UTENTI_CONFIG WHERE CODUTE = ?\";\n const result = await Orm.query(this.accessiOptions.databaseOptions, codiceUtenteQuery, [codiceUtente]);\n if (!result || result.length == 0) throw new Error(\"Nessun utente trovato con il codice utente \" + codiceUtente);\n\n const isSuperAdmin = this.isSuperFlag(\n (result.map(RestUtilities.convertKeysToCamelCase)[0] as { flagSuper?: unknown } | undefined)?.flagSuper,\n );\n\n const abilitazioni = await this.getUserDirectPermissions(codiceUtente, scopeCodes);\n const ruoli = await this.getUserRoles(codiceUtente, scopeCodes);\n const grants = this.composeGrants(\n abilitazioni,\n ruoli,\n isSuperAdmin,\n await this.getAllActiveMenusAsGrants(scopeCodes),\n );\n\n return { abilitazioni, ruoli, grants };\n }\n\n private isSuperFlag(value: unknown): boolean {\n return value === true || value === 1 || value === '1';\n }\n\n /**\n * Versione batch di `getUserRolesAndGrants`: esegue un numero costante di query per N utenti\n * (invece di N set di query) e restituisce mappa per codice utente. Stessa composizione della\n * lettura singola.\n */\n public async getUsersRolesAndGrants(codiciUtente: number[], scope?: string): Promise<Map<number, {\n abilitazioni: AbilitazioneMenu[],\n ruoli: Role[],\n grants: AbilitazioneMenu[]\n }>> {\n const scopeCodes = await this.resolveScopeCodes(scope);\n const scopeFilter = this.scopeFilter('M', scopeCodes);\n const result = new Map<number, { abilitazioni: AbilitazioneMenu[], ruoli: Role[], grants: AbilitazioneMenu[] }>();\n const ids = Array.from(new Set(codiciUtente.filter((id) => Number.isInteger(id) && id > 0)));\n if (ids.length === 0) {\n return result;\n }\n\n const placeholders = ids.map(() => '?').join(', ');\n\n const superRows = (await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT CODUTE AS codice_utente, FLGSUPER AS flag_super FROM UTENTI_CONFIG WHERE CODUTE IN (${placeholders})`,\n ids,\n )).map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n const superUsers = new Set<number>();\n for (const row of superRows) {\n if (this.isSuperFlag(row.flagSuper)) {\n superUsers.add(Number(row.codiceUtente));\n }\n }\n\n const permissionRows = (await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT\n A.CODUTE AS codice_utente,\n A.CODMNU AS codice_menu,\n A.TIPABI AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n G.DESGRP AS descrizione_gruppo,\n G.CODGRP AS codice_gruppo,\n M.ICON AS icona,\n M.CODTIP AS tipo,\n M.PAGINA AS pagina,\n M.NOTE AS note\n FROM ABILITAZIONI A\n INNER JOIN MENU M ON A.CODMNU = M.CODMNU\n LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\n WHERE A.CODUTE IN (${placeholders}) AND M.FLGENABLED = 1 AND COALESCE(G.FLGENABLED, 1) = 1${scopeFilter.sql}`,\n [...ids, ...scopeFilter.params],\n )).map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n\n const roleRows = (await Orm.query(\n this.accessiOptions.databaseOptions,\n `SELECT\n RU.CODUTE AS codice_utente,\n R.CODRUO AS codice_ruolo,\n R.DESRUO AS descrizione_ruolo,\n CASE WHEN COALESCE(G.FLGENABLED, 1) = 1 THEN M.CODMNU END AS codice_menu,\n RM.TIPABI AS tipo_abilitazione,\n M.DESMNU AS descrizione_menu,\n M.NOTE AS note\n FROM UTENTI_RUOLI RU\n INNER JOIN RUOLI R ON RU.CODRUO = R.CODRUO\n LEFT JOIN RUOLI_MNU RM ON R.CODRUO = RM.CODRUO\n LEFT JOIN MENU M ON RM.CODMNU = M.CODMNU AND M.FLGENABLED = 1\n LEFT JOIN MENU_GRP G ON G.CODGRP = M.CODGRP\n WHERE RU.CODUTE IN (${placeholders})${scopeFilter.sql}`,\n [...ids, ...scopeFilter.params],\n )).map(RestUtilities.convertKeysToCamelCase) as Array<Record<string, unknown>>;\n\n const allActiveMenus = await this.getAllActiveMenusAsGrants(scopeCodes);\n\n const permissionsByUser = new Map<number, AbilitazioneMenu[]>();\n for (const row of permissionRows) {\n const { codiceUtente, ...grant } = row;\n const key = Number(codiceUtente);\n const bucket = permissionsByUser.get(key);\n if (bucket) {\n bucket.push(grant as unknown as AbilitazioneMenu);\n } else {\n permissionsByUser.set(key, [grant as unknown as AbilitazioneMenu]);\n }\n }\n\n const rolesByUser = new Map<number, Array<Record<string, unknown>>>();\n for (const row of roleRows) {\n const { codiceUtente, ...roleRow } = row;\n const key = Number(codiceUtente);\n const bucket = rolesByUser.get(key);\n if (bucket) {\n bucket.push(roleRow);\n } else {\n rolesByUser.set(key, [roleRow]);\n }\n }\n\n for (const id of ids) {\n const abilitazioni = permissionsByUser.get(id) ?? [];\n const ruoli = this.assembleRoles(rolesByUser.get(id) ?? []);\n const isSuperAdmin = superUsers.has(id);\n result.set(id, {\n abilitazioni,\n ruoli,\n grants: this.composeGrants(abilitazioni, ruoli, isSuperAdmin, allActiveMenus),\n });\n }\n\n return result;\n }\n\n\n\n // -----------------------------------------------------------------------\n // Scope applicativi: catalogo e associazioni menu/scope.\n // -----------------------------------------------------------------------\n\n private normalizeScopeCode(value: string): string {\n const code = String(value ?? '').trim().toUpperCase();\n if (!/^[A-Z][A-Z0-9_]{0,19}$/.test(code)) {\n throw new BadRequestException(\n 'Codice scope non valido: usa lettere maiuscole, cifre e underscore (max 20 caratteri).',\n );\n }\n return code;\n }\n\n private async assertScopeExists(codiceScope: string): Promise<void> {\n if ((await this.countWhere('SCOPES', 'CODICE', codiceScope)) === 0) {\n throw new BadRequestException(`Lo scope ${codiceScope} non esiste.`);\n }\n }\n\n private async assertMenuExists(codiceMenu: string): Promise<void> {\n if ((await this.countWhere('MENU', 'CODMNU', codiceMenu)) === 0) {\n throw new BadRequestException(`Il menu ${codiceMenu} non esiste.`);\n }\n }\n\n /** Catalogo degli scope applicativi (disponibile anche ai client per le etichette). */\n public async getScopes(): Promise<ScopeEntity[]> {\n const rows = await Orm.query(\n this.accessiOptions.databaseOptions,\n 'SELECT CODICE AS codice, NOME AS nome FROM SCOPES ORDER BY CODICE',\n [],\n );\n return rows.map(RestUtilities.convertKeysToCamelCase) as unknown as ScopeEntity[];\n }\n\n public async createScope(input: CreateScopeRequest): Promise<void> {\n const codice = this.normalizeScopeCode(input.codice);\n if ((await this.countWhere('SCOPES', 'CODICE', codice)) > 0) {\n throw new BadRequestException(`Lo scope ${codice} esiste gia.`);\n }\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n 'INSERT INTO SCOPES (CODICE, NOME) VALUES (?, ?)',\n [codice, input.nome],\n );\n }\n\n public async updateScope(codiceScope: string, input: UpdateScopeRequest): Promise<void> {\n const codice = this.normalizeScopeCode(codiceScope);\n await this.assertScopeExists(codice);\n if (input.nome === undefined) return;\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n 'UPDATE SCOPES SET NOME = ? WHERE CODICE = ?',\n [input.nome, codice],\n );\n }\n\n /** Elimina lo scope; le associazioni menu/scope spariscono per FK ON DELETE CASCADE. */\n public async deleteScope(codiceScope: string): Promise<void> {\n const codice = this.normalizeScopeCode(codiceScope);\n await this.assertScopeExists(codice);\n await Orm.execute(\n this.accessiOptions.databaseOptions,\n 'DELETE FROM SCOPES WHERE CODICE = ?',\n [codice],\n );\n }\n\n /** Scope associati a un menu. */\n public async getMenuScopes(codiceMenu: string): Promise<string[]> {\n const code = String(codiceMenu ?? '').trim().toUpperCase();\n await this.assertMenuExists(code);\n const rows = await Orm.query(\n this.accessiOptions.databaseOptions,\n 'SELECT CODICE_SCOPE FROM MENU_SCOPES WHERE CODICE_MENU = ? ORDER BY CODICE_SCOPE',\n [code],\n );\n return rows\n .map((row) => String((row as Record<string, unknown>).CODICE_SCOPE ?? (row as Record<string, unknown>).codiceScope ?? '').trim())\n .filter((value) => value.length > 0);\n }\n\n /** Sostituisce in modo atomico gli scope di un menu. */\n public async setMenuScopes(codiceMenu: string, scopes: string[]): Promise<void> {\n const code = String(codiceMenu ?? '').trim().toUpperCase();\n await this.assertMenuExists(code);\n const normalized = Array.from(\n new Set((scopes ?? []).map((scope) => this.normalizeScopeCode(scope))),\n );\n for (const scope of normalized) {\n await this.assertScopeExists(scope);\n }\n const queries = [\n { query: 'DELETE FROM MENU_SCOPES WHERE CODICE_MENU = ?', params: [code] },\n ...normalized.map((scope) => ({\n query: 'INSERT INTO MENU_SCOPES (CODICE_MENU, CODICE_SCOPE) VALUES (?, ?)',\n params: [code, scope],\n })),\n ];\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, queries);\n }\n\n /** Sostituisce in modo atomico i menu di uno scope (assegnazione massiva). */\n public async setScopeMenus(codiceScope: string, menus: string[]): Promise<void> {\n const scope = this.normalizeScopeCode(codiceScope);\n await this.assertScopeExists(scope);\n const normalized = Array.from(\n new Set((menus ?? []).map((menu) => String(menu ?? '').trim().toUpperCase()).filter(Boolean)),\n );\n for (const menu of normalized) {\n await this.assertMenuExists(menu);\n }\n const queries = [\n { query: 'DELETE FROM MENU_SCOPES WHERE CODICE_SCOPE = ?', params: [scope] },\n ...normalized.map((menu) => ({\n query: 'INSERT INTO MENU_SCOPES (CODICE_MENU, CODICE_SCOPE) VALUES (?, ?)',\n params: [menu, scope],\n })),\n ];\n await Orm.executeMultiple(this.accessiOptions.databaseOptions, queries);\n }\n\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaExportService.js","sourceRoot":"","sources":["../../../../src/accessi-service/services/schema-export-service/SchemaExportService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,sCAAmC;AACnC,kDAAmD;AAEnD,wEAQ8C;AAqB9C;;;;GAIG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAAwD,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAEnF,0DAA0D;IAC1D,QAAQ;QACN,MAAM,QAAQ,GAAuB;YACnC,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,oBAAoB,EAAE;SAC5B,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ;aACpB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uEAAuE,OAAO,CAAC,KAAK,sEAAsE,OAAO,CAAC,GAAG,EAAE,CAAC;aACzL,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO,EAAE,OAAO,EAAE,sCAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC/D,CAAC;IAED,kGAAkG;IAC5F,eAAe;;YACnB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,6BAAa,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;YAE9C,MAAM,SAAS,GAAG,CAAC,MAAM,SAAG,CAAC,KAAK,CAChC,IAAI,CAAC,OAAO,CAAC,eAAe,EAC5B;;;kCAG4B,EAC5B,EAAE,EACF,KAAK,CACN,CAAmC,CAAC;YACrC,MAAM,aAAa,GAAG,SAAS;iBAC5B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,MAAM,CAAC,MAAA,yBAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA,EAAA,CAAC;iBACjF,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnB,MAAM,aAAa,GAAG,CAAC,MAAM,SAAG,CAAC,KAAK,CACpC,IAAI,CAAC,OAAO,CAAC,eAAe,EAC5B;;;mCAG6B,EAC7B,EAAE,EACF,KAAK,CACN,CAAmC,CAAC;YACrC,MAAM,iBAAiB,GAAG,aAAa;iBACpC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,MAAM,CAAC,MAAA,yBAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA,EAAA,CAAC;iBACjF,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnB,OAAO;gBACL,aAAa;gBACb,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpE,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;KAAA;IAEO,kBAAkB;QACxB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAAa,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;iBAC3C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,UAAU,EAAE,CAAC;iBACxD,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,gBAAgB,KAAK,OAAO,OAAO,MAAM,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC,eAAe,KAAK,sBAAsB,KAAK,iBAAiB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,MAAM,CAAC,IAAI,CAAC,6BAAa,CAAC,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACjH,CAAC;IAEO,sBAAsB;QAC5B,MAAM,UAAU,GAAG,iCAAiB,CAAC,GAAG,CACtC,CAAC,SAAS,EAAE,EAAE,CACZ,qCAAqC,SAAS,CAAC,IAAI,qBAAqB,SAAS,CAAC,IAAI,GAAG,CAC5F,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,wBAAwB,iCAAiB,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxH,CAAC;IAEO,uBAAuB;QAC7B,MAAM,UAAU,GAAG,kCAAkB,CAAC,GAAG,CACvC,CAAC,EAAE,EAAE,EAAE,CACL,eAAe,EAAE,CAAC,KAAK,mBAAmB,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,MAAM,gBAAgB,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,GAAG,CACxK,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,kCAAkB,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACrH,CAAC;IAEO,mBAAmB;QACzB,MAAM,UAAU,GAAG,8BAAc,CAAC,GAAG,CACnC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACzF,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,8BAAc,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACrG,CAAC;IAEO,kBAAkB;QACxB,MAAM,UAAU,GAAG,6BAAa,CAAC,GAAG,CAClC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,KAAK,CAAC,KAAK,mBAAmB,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,UAAU,IAAI,CAClG,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,6BAAa,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1G,CAAC;IAEO,oBAAoB;QAC1B,IAAI,+BAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,+BAA+B,EAAE,CAAC;QACxF,CAAC;QACD,MAAM,UAAU,GAAG,+BAAe,CAAC,GAAG,CACpC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAC3G,CAAC;QACF,OAAO;YACL,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,YAAY,+BAAe,CAAC,MAAM,GAAG;YAC5C,GAAG,EAAE,mBAAmB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB;SACpE,CAAC;IACJ,CAAC;CACF,CAAA;AAnHY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;;GAD3B,mBAAmB,CAmH/B","sourcesContent":["import { Inject, Injectable } from '@nestjs/common';\nimport { Orm } from '../../../Orm';\nimport { RestUtilities } from '../../../Utilities';\nimport type { AccessiOptions } from '../../AccessiModule';\nimport {\n ACCESSI_SCHEMA_VERSION,\n accessiTables,\n accessiForeignKeys,\n accessiIndexes,\n accessiChecks,\n accessiTriggers,\n accessiGenerators,\n} from '../../database-updates/accessiSchema';\n\nexport interface SchemaDdlSection {\n id: string;\n title: string;\n sql: string;\n}\n\nexport interface SchemaDdlResult {\n version: string;\n sections: SchemaDdlSection[];\n script: string;\n}\n\nexport interface SchemaEntitiesResult {\n presentTables: string[];\n extraTables: string[];\n canonicalTables: string[];\n presentGenerators: string[];\n}\n\n/**\n * Genera il DDL delle entita Accessi a partire dallo schema canonico (stessa fonte della\n * riconciliazione) e rileva le entita effettivamente presenti nel database. Serve a\n * esportare lo schema per replicarlo su altre installazioni.\n */\n@Injectable()\nexport class SchemaExportService {\n constructor(@Inject('ACCESSI_OPTIONS') private readonly options: AccessiOptions) {}\n\n /** DDL completo e deterministico dello schema Accessi. */\n buildDdl(): SchemaDdlResult {\n const sections: SchemaDdlSection[] = [\n this.buildTablesSection(),\n this.buildGeneratorsSection(),\n this.buildForeignKeysSection(),\n this.buildIndexesSection(),\n this.buildChecksSection(),\n this.buildTriggersSection(),\n ];\n\n const script = sections\n .map((section) => `-- ============================================================\\n-- ${section.title}\\n-- ============================================================\\n${section.sql}`)\n .join('\\n\\n');\n\n return { version: ACCESSI_SCHEMA_VERSION, sections, script };\n }\n\n /** Elenca le tabelle/generatori presenti nel database e segnala quelli fuori schema canonical. */\n async presentEntities(): Promise<SchemaEntitiesResult> {\n const canonicalTables = Object.keys(accessiTables).sort();\n const canonicalSet = new Set(canonicalTables);\n\n const tableRows = (await Orm.query(\n this.options.databaseOptions,\n `SELECT TRIM(RDB$RELATION_NAME) AS NAME\n FROM RDB$RELATIONS\n WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0 AND RDB$VIEW_BLR IS NULL\n ORDER BY RDB$RELATION_NAME`,\n [],\n false,\n )) as Array<Record<string, unknown>>;\n const presentTables = tableRows\n .map((row) => String(RestUtilities.convertKeysToCamelCase(row).name ?? '').trim())\n .filter(Boolean);\n\n const generatorRows = (await Orm.query(\n this.options.databaseOptions,\n `SELECT TRIM(RDB$GENERATOR_NAME) AS NAME\n FROM RDB$GENERATORS\n WHERE COALESCE(RDB$SYSTEM_FLAG, 0) = 0\n ORDER BY RDB$GENERATOR_NAME`,\n [],\n false,\n )) as Array<Record<string, unknown>>;\n const presentGenerators = generatorRows\n .map((row) => String(RestUtilities.convertKeysToCamelCase(row).name ?? '').trim())\n .filter(Boolean);\n\n return {\n presentTables,\n extraTables: presentTables.filter((name) => !canonicalSet.has(name)),\n canonicalTables,\n presentGenerators,\n };\n }\n\n private buildTablesSection(): SchemaDdlSection {\n const statements: string[] = [];\n for (const [table, schema] of Object.entries(accessiTables)) {\n const columns = Object.entries(schema.columns)\n .map(([name, definition]) => ` ${name} ${definition}`)\n .join(',\\n');\n statements.push(`CREATE TABLE ${table} (\\n${columns}\\n);`);\n statements.push(`ALTER TABLE ${table} ADD CONSTRAINT PK_${table} PRIMARY KEY (${schema.primaryKey.join(', ')});`);\n }\n return { id: 'tables', title: `Tabelle (${Object.keys(accessiTables).length})`, sql: statements.join('\\n\\n') };\n }\n\n private buildGeneratorsSection(): SchemaDdlSection {\n const statements = accessiGenerators.map(\n (generator) =>\n `-- Firebird 2.5: CREATE GENERATOR ${generator.name}\\nCREATE SEQUENCE ${generator.name};`,\n );\n return { id: 'generators', title: `Generatori/Sequenze (${accessiGenerators.length})`, sql: statements.join('\\n\\n') };\n }\n\n private buildForeignKeysSection(): SchemaDdlSection {\n const statements = accessiForeignKeys.map(\n (fk) =>\n `ALTER TABLE ${fk.table} ADD CONSTRAINT ${fk.name} FOREIGN KEY (${fk.column}) REFERENCES ${fk.target} (${fk.targetColumn})${fk.cascade ? ' ON DELETE CASCADE' : ''};`,\n );\n return { id: 'foreignKeys', title: `Chiavi esterne (${accessiForeignKeys.length})`, sql: statements.join('\\n\\n') };\n }\n\n private buildIndexesSection(): SchemaDdlSection {\n const statements = accessiIndexes.map(\n (index) => `CREATE INDEX ${index.name} ON ${index.table} (${index.columns.join(', ')});`,\n );\n return { id: 'indexes', title: `Indici (${accessiIndexes.length})`, sql: statements.join('\\n\\n') };\n }\n\n private buildChecksSection(): SchemaDdlSection {\n const statements = accessiChecks.map(\n (check) => `ALTER TABLE ${check.table} ADD CONSTRAINT ${check.name} CHECK (${check.expression});`,\n );\n return { id: 'checks', title: `Vincoli CHECK (${accessiChecks.length})`, sql: statements.join('\\n\\n') };\n }\n\n private buildTriggersSection(): SchemaDdlSection {\n if (accessiTriggers.length === 0) {\n return { id: 'triggers', title: 'Trigger (0)', sql: '-- Nessun trigger di dominio.' };\n }\n const statements = accessiTriggers.map(\n (trigger) => `CREATE TRIGGER ${trigger.name} FOR ${trigger.table} ACTIVE ${trigger.event} ${trigger.body}`,\n );\n return {\n id: 'triggers',\n title: `Trigger (${accessiTriggers.length})`,\n sql: `SET TERM ^ ;\\n\\n${statements.join('^\\n\\n')}^\\n\\nSET TERM ; ^`,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceTokenService.js","sourceRoot":"","sources":["../../../../src/accessi-service/services/service-token-service/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 '../email-service/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("../email-service/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-service/services/two-factor-service/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 '../email-service/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"]}
|