emilsoftware-utilities 2.0.0-dev.83 → 2.0.0-dev.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +6 -3
- package/dist/accessi/server/index.js +8 -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.d.ts +35 -0
- package/dist/accessi/server/tenantRouter.js +71 -0
- package/dist/accessi/server/tenantRouter.js.map +1 -0
- 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 +229 -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.d.ts +84 -0
- package/dist/accessi-service/security/audit.js +214 -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.d.ts +15 -0
- package/dist/accessi-service/tenancy/tenantContext.js +26 -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/adr/0002-multi-tenancy.md +5 -3
- 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 +54 -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 -303
- 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 +0 -220
- 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.d.ts +0 -74
- package/dist/accessi-module/security/audit.js +0 -189
- 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/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.83.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/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/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/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":"wiki.js","sourceRoot":"","sources":["../../../src/accessi-service/console/wiki.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Contenuto della Wiki della console Accessi.\n *\n * I contenuti sono dati strutturati (non HTML) così da poter essere resi in modo\n * coerente dalla console e convertiti in un digest compatto per l'IA. Nessun\n * segreto o dato specifico di un ambiente deve finire qui.\n */\n\nexport type WikiTone = 'info' | 'ok' | 'warn' | 'danger';\n\nexport type WikiBlock =\n | { kind: 'p'; text: string }\n | { kind: 'h'; text: string }\n | { kind: 'list'; items: string[]; ordered?: boolean }\n | { kind: 'code'; language: string; title?: string; code: string; variant?: 'good' | 'bad' }\n | { kind: 'callout'; tone: WikiTone; title?: string; text: string }\n | { kind: 'table'; head: string[]; rows: string[][] };\n\nexport interface WikiSection {\n id: string;\n group: string;\n title: string;\n summary: string;\n blocks: WikiBlock[];\n}\n\nconst p = (text: string): WikiBlock => ({ kind: 'p', text });\nconst h = (text: string): WikiBlock => ({ kind: 'h', text });\nconst list = (items: string[], ordered = false): WikiBlock => ({ kind: 'list', items, ordered });\nconst code = (language: string, codeText: string, title?: string, variant?: 'good' | 'bad'): WikiBlock => ({ kind: 'code', language, title, code: codeText, variant });\nconst good = (language: string, codeText: string, title?: string): WikiBlock => code(language, codeText, title, 'good');\nconst bad = (language: string, codeText: string, title?: string): WikiBlock => code(language, codeText, title, 'bad');\nconst note = (tone: WikiTone, title: string, text: string): WikiBlock => ({ kind: 'callout', tone, title, text });\nconst table = (head: string[], rows: string[][]): WikiBlock => ({ kind: 'table', head, rows });\n\nexport const WIKI_SECTIONS: WikiSection[] = [\n // -------------------------------------------------------------------------\n {\n id: 'scegli-percorso',\n group: 'Percorsi',\n title: 'Scegli il percorso giusto',\n summary: 'Chi sei, che cosa devi fare e quale entry point usare.',\n blocks: [\n p(`Accessi è un servizio di identità, non una libreria da montare ovunque. Prima di scrivere codice individua il tuo ruolo nella topologia: cambiano entry point, permessi e responsabilità.`),\n table(\n ['Sei...', 'Devi...', 'Entry point', 'Guida'],\n [\n ['Sviluppatore frontend', 'Login, refresh, 2FA, reset password, chiamare i backend con Bearer', 'accessi/client/public, accessi/console', 'Frontend'],\n ['Backend che possiede il database Accessi', 'Bootstrap, database, SMTP, migrazioni, console, API', 'accessi/server', 'Bootstrap e Operazioni'],\n ['Backend fratello', 'Verificare JWT e grant senza credenziali del database Accessi', 'accessi/resource-server', 'Resource server e introspection'],\n ['Console o tool amministrativo', 'Gestire utenti, ruoli, menu, SSO e token di servizio', 'accessi/client/admin', 'Console e Dominio'],\n ['Job o servizio tecnico', 'Introspezione token e scambio identità SSO', 'accessi/client/service', 'Token macchina-a-macchina'],\n ['Operations o SRE', 'Deploy, Redis, health, metriche, audit, backup', 'accessi/server, deploy/', 'Operazioni'],\n ['DBA', 'Allineare e verificare lo schema Firebird', 'CLI db:update:accessi e db:check:accessi', 'Schema e aggiornamento del database'],\n ['Agente AI', 'Costruire un integrazione corretta senza inventare API', 'integration-prompt.md, WIKI.ai.md', 'Prompt di integrazione'],\n ],\n ),\n note('ok', `Regola d'oro`, `Un solo Accessi Service possiede database, encryptionKey, SMTP, chiavi JWT e console. Gli altri backend sono resource server: verificano i token e chiedono i grant, senza credenziali del database Accessi.`),\n h(`Percorso minimo: backend che possiede Accessi`),\n list([\n `Leggi Topologie di deployment e scegli servizio dedicato oppure embedded.`,\n `Configura AccessiOptions con database, encryptionKey, SMTP e jwtOptions (issuer e audience espliciti).`,\n `Chiama initializeAccessiModule oppure AccessiModule.forRoot e attendi il bootstrap prima di aprire la porta HTTP.`,\n `Esegui la migrazione dello schema una sola volta e avvia le repliche con autoUpdateDatabase: false.`,\n `Verifica /health/ready, crea il primo admin e prova login e una rotta protetta.`,\n ], true),\n h(`Percorso minimo: backend fratello`),\n list([\n `Non installare AccessiModule e non configurare il database Accessi.`,\n `Usa createAccessiAuthMiddleware (Express) o createAccessiAuthGuard (Nest) da accessi/resource-server.`,\n `Verifica i JWT con publicKey/JWKS (consigliato) oppure serverSecret solo per HS256 transitorio.`,\n `Configura introspection con un service token scope accessi:introspect se servono i grant correnti.`,\n `Applica una policy esplicita sulle rotte sensibili e gestisci 401, 403 e 503 senza autorizzare per errore.`,\n ], true),\n h(`Percorso minimo: frontend`),\n list([\n `Usa accessi/client/public: non importare mai il client admin o un service token nel browser.`,\n `Chiama login su Accessi Service, conserva l'access token e gestisci refresh e 2FA.`,\n `Verso i backend invia Authorization: Bearer. Non chiamare il database Accessi.`,\n `Sul 401 porta l'utente al login; sul 403 mostra un messaggio di permessi insufficienti; sul 503 riprova senza perdere la sessione.`,\n `Per la console usa buildAccessiConsoleUrl con il ticket monouso: il JWT non va mai nell'URL.`,\n ], true),\n note('info', `Documentazione correlata`, `La mappa completa di file e guide è in docs/README.md. I quickstart copiabili sono docs/quickstart-service.md, docs/quickstart-resource-server.md e docs/quickstart-frontend.md.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'topologie',\n group: 'Percorsi',\n title: 'Topologie di deployment',\n summary: 'Embedded, servizio centrale o multi-tenant: vantaggi, limiti e quando scegliere quale.',\n blocks: [\n p(`Accessi può vivere dentro un backend già esistente oppure come servizio autonomo. La scelta dipende da chi possiede il database, quanti backend devono autenticare le stesse persone e se serve isolamento tra clienti.`),\n h(`1. Accessi embedded in un backend esistente`),\n list([\n `Il backend ospitante è anche il proprietario del database Accessi: monta AccessiModule o chiama initializeAccessiModule.`,\n `Va bene per una sola applicazione o per una fase di migrazione da un monolite.`,\n `Non montare lo stesso modulo in due backend puntati allo stesso database.`,\n `La console è servita dallo stesso backend su /api/accessi/console.`,\n ]),\n h(`2. Accessi Service dedicato (consigliato)`),\n code('text', [\n 'Frontend A ─┐',\n 'Frontend B ─┼──> Accessi Service (DB, SMTP, utenti, ruoli, console, SSO, 2FA)',\n ' │ ▲',\n 'Backend A ──┼─────────┤ introspection / service token',\n 'Backend B ──┘ │',\n ' └──> Accessi DB (solo Accessi Service)',\n ].join('\\n'), 'Topologia consigliata'),\n list([\n `Accessi Service usa accessi/server: possiede database, migrazioni, encryptionKey, SMTP, chiavi JWT e console.`,\n `I backend fratelli usano accessi/resource-server e non hanno credenziali del database Accessi.`,\n `I frontend usano accessi/client/public e chiamano i backend con il JWT Accessi.`,\n `Un solo punto di verità per utenti, ruoli e grant; la console resta centralizzata.`,\n `È la topologia da preferire quando più applicazioni condividono le stesse identità.`,\n ]),\n h(`3. Un processo per tenant`),\n list([\n `Un database e un processo Accessi per tenant: nessuna colonna tenant nel database.`,\n `Configurazione in file <id>.environment.ts tipizzati; validazione e avvio con npm run accessi:tenants.`,\n `Chiavi JWT, issuer, audience, encryptionKey e prefissi Redis separati per tenant.`,\n `Supervisore incluso con hot reload, oppure router in-process opt-in per ridurre i processi.`,\n `Dettagli operativi in docs/multi-tenancy.md e nella sezione Operazioni di questa wiki.`,\n ]),\n table(\n ['Topologia', 'Vantaggi', 'Limiti', 'Quando sceglierla'],\n [\n ['Embedded', 'Meno processi e deploy semplice', 'Un solo backend può possedere il DB', 'Applicazione singola o migrazione iniziale'],\n ['Servizio dedicato', 'Confini chiari, più backend, console unica', 'Un servizio in più da monitorare', 'Più applicazioni con le stesse identità'],\n ['Un processo per tenant', 'Isolamento forte di dati e chiavi', 'Più processi, più deploy e osservabilità per tenant', 'Clienti che richiedono database o chiavi separate'],\n ],\n ),\n note('warn', `Non mescolare i modelli`, `Non montare AccessiModule in un backend fratello e non condividere un database Accessi tra più proprietari. Se due processi eseguono migrazioni o emettono ticket console sullo stesso database, il comportamento diventa ambiguo.`),\n note('info', `Quando basta un resource server`, `Se il backend non gestisce utenti ma deve solo accettare i token emessi da Accessi Service, non gli serve accessi/server: usa accessi/resource-server e, se servono i grant correnti, l'introspection con un service token.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'panoramica',\n group: 'Per iniziare',\n title: 'Panoramica e architettura',\n summary: 'Che cosa fa Accessi, come si incastra nel backend e come scorre una richiesta.',\n blocks: [\n p(`Accessi è un modulo Node/NestJS che aggiunge a un backend già esistente: autenticazione JWT, autorizzazione per ruoli e menu, gestione utenti, reset password, codici email (2FA e passwordless), SSO generico, token macchina-a-macchina e una console amministrativa. Il database è Firebird/InterBase.`),\n h(`Che cosa possiede il modulo`),\n list([\n `Le rotte sotto /api/accessi/* (login, utenti, ruoli, menu, SSO, token, console).`,\n `Lo schema database del dominio Accessi, riconciliato automaticamente al bootstrap.`,\n `Il middleware di autorizzazione authorizeAccessi per le rotte della tua applicazione.`,\n `La console web su /api/accessi/console.`,\n ]),\n h(`Che cosa resta alla tua applicazione`),\n list([\n `Il proprio frontend e le proprie rotte di business.`,\n `La validazione dei token dei provider SSO esterni (Accessi non li vede).`,\n `I segreti: jwtOptions.secret, SMTP, database ed encryptionKey non raggiungono mai il browser.`,\n ]),\n h(`Flusso di una richiesta protetta`),\n list([\n `Il client chiama una rotta della tua app con header Authorization: Bearer <jwt>.`,\n `La tua rotta esegue authorizeAccessi, che verifica firma HS256, scadenza e stato utente corrente.`,\n `Se passi un requisito, il modulo carica ruoli e grant dell'utente e li valuta.`,\n `Su successo req.user, req.data e (se richiesto) req.userGrants sono popolati; altrimenti risponde con il contratto errore Accessi.`,\n ], true),\n note('info', `Due modalità di bootstrap`, `Express esistente: initializeAccessiModule(app, options). NestJS esistente: AccessiModule.forRoot(options) nei tuoi imports. Non usarle entrambe.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'installazione',\n group: 'Per iniziare',\n title: 'Installazione',\n summary: 'Dipendenze, peer e build.',\n blocks: [\n code('bash', `npm install emilsoftware-utilities`, 'Installazione'),\n p(`La libreria dipende da node-firebird per il database e da Express 5 come peer per il montaggio. È consigliato Node 18 o superiore.`),\n p(`Il pacchetto è pubblicato in CommonJS con export map esplicita per ogni entry point (accessi/server, accessi/resource-server/*, accessi/client/*, accessi/contracts*, accessi/openapi, accessi/console, accessi/ui): gli import ESM funzionano tramite interop Node. sideEffects elenca solo root barrel, firebirdCompat e bundle console, così il resto è tree-shakable.`),\n note('warn', `Un solo modulo per processo`, `AccessiModule è @Global(): inizializzalo una sola volta per processo. In caso di più istanze, usa un processo per istanza.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'bootstrap-express',\n group: 'Per iniziare',\n title: 'Bootstrap su Express esistente',\n summary: 'initializeAccessiModule: ordine corretto e attesa prima di listen.',\n blocks: [\n p(`Chiama initializeAccessiModule prima di aprire la porta HTTP. Durante il bootstrap, authorizeAccessi risponde 503 ACCESSI_AUTH_INITIALIZING invece di autorizzare richieste parziali.`),\n good('ts', [\n \"import express from 'express';\",\n \"import { initializeAccessiModule, authorizeAccessi } from 'emilsoftware-utilities';\",\n '',\n 'const app = express();',\n 'app.use(express.json());',\n '',\n 'await initializeAccessiModule(app, options); // prima di app.listen',\n '',\n \"app.get('/api/ordini', authorizeAccessi, (req, res) => {\",\n ' res.json({ utente: req.user });',\n '});',\n '',\n \"app.get('/api/ordini/scrivi', (req, res, next) =>\",\n ' authorizeAccessi(req, res, next, {',\n \" requirements: [{ menuCode: 'ORDINI', minPermissionLevel: 20 }],\",\n ' }),',\n '(req, res) => res.json({ ok: true }));',\n '',\n 'app.listen(3000);',\n ].join('\\n'), 'Express + Accessi'),\n bad('ts', [\n 'const app = express();',\n 'app.listen(3000); // porta aperta prima del bootstrap',\n 'await initializeAccessiModule(app, options); // le richieste nel frattempo ricevono 503',\n ].join('\\n'), 'Non aprire la porta prima del bootstrap'),\n h(`Rotte montate`),\n p(`Accessi intercetta solo /api/accessi/* e i path OpenAPI configurati (default /accessi/openapi* e /accessi/openapi.json). Tutte le altre rotte passano intatte al tuo stack Express.`),\n note('ok', `req.user`, `authorizeAccessi popola req.user con il payload utente corrente (utente, codiceUtente, flag) e req.data come alias storico. req.userGrants è presente solo se hai richiesto dei requisiti.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'bootstrap-nest',\n group: 'Per iniziare',\n title: 'Bootstrap su NestJS esistente',\n summary: 'AccessiModule.forRoot e uso dei provider esportati.',\n blocks: [\n p(`Se la tua applicazione è già NestJS, importa AccessiModule.forRoot(options). Il modulo è @Global e riesporta i servizi (AuthService, UserService, PermissionService, FederatedAuthService, ServiceTokenService, ServiceTokenGuard, AuthenticateGenService).`),\n good('ts', [\n \"import { Module } from '@nestjs/common';\",\n \"import { AccessiModule } from 'emilsoftware-utilities';\",\n '',\n '@Module({',\n ' imports: [AccessiModule.forRoot(options)],',\n '})',\n 'export class AppModule {}',\n ].join('\\n'), 'app.module.ts'),\n p(`Il global prefix api e le rotte /api/accessi/* sono gestiti dal modulo. Le tue rotte Nest si proteggono con JwtSimpleGuard usando il JWT Accessi. Per health e readiness usare createAccessiHealthModule({ accessiOptions }): espone /health/live e /health/ready con lo stesso contratto del servizio standalone (bootstrap, database, store Redis e check aggiuntivi).`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'distribuzione',\n group: 'Per iniziare',\n title: 'Distribuzione multi-app e package entry point',\n summary: 'Come usare Accessi come servizio centrale, come resource server o solo come contratti.',\n blocks: [\n p(`Accessi non va montato per forza in ogni backend. La distribuzione consigliata separa il servizio che possiede il database e la console dai backend fratelli che devono solo autenticare le richieste.`),\n table(\n ['Entry point', 'Uso', 'Dipendenze server'],\n [\n ['accessi/server', 'Bootstrap completo: DB, SMTP, migrazioni, console, API.', 'sì'],\n ['accessi/resource-server', 'Guard/middleware per backend fratelli: verifica JWT e autorizzazione remota.', 'no'],\n ['accessi/client', 'Client OpenAPI generato per chiamare Accessi Service.', 'no'],\n ['accessi/client/public', 'Solo API pubbliche (login, refresh, 2FA, reset password, registrazione, ticket console).', 'no'],\n ['accessi/client/admin', 'Solo API amministrative (utenti, ruoli, menu, filtri, provider federati, schema).', 'no'],\n ['accessi/client/service', 'Solo API service-to-service (service token e introspezione), mai nei frontend.', 'no'],\n ['accessi/contracts', 'Tipi, enum e helper puri browser-safe.', 'no'],\n ['accessi/contracts/dtos', 'DTO Nest con class-validator e decoratori OpenAPI.', 'no'],\n ['accessi/openapi', 'setupOpenApi e merge del documento OpenAPI.', 'no'],\n ['accessi/console', 'Helper per URL console, ticket e 2FA handoff.', 'no'],\n ['accessi/ui', 'Percorsi degli asset Web Component frameworkless.', 'no'],\n ],\n ),\n p(`Topologia consigliata: un solo Accessi Service possiede database, encryptionKey, SMTP, chiavi JWT e console. Gli altri backend usano resource-server e client, senza credenziali del database Accessi.`),\n p(`Multi-tenancy: un database per tenant, configurato da file <id>.environment.ts tipizzati (AccessiTenantEnvironment). Il database resta invariato (nessuna colonna tenant); ogni tenant gira in un processo separato con chiavi, issuer e store propri. Validazione e avvio con npm run accessi:tenants; template systemd/Docker/Nginx/Traefik in deploy/; dettagli in docs/multi-tenancy.md.`),\n note('warn', `Root barrel legacy`, `Il root barrel e i deep import restano supportati fino alla prossima major. I nuovi consumer devono usare gli entry point della tabella; la mappa di migrazione e in docs/import-migration.md.`),\n p(`Per avviare Accessi come servizio autonomo usare startAccessiService: espone /health/live, /health/ready, /health/metrics, valida la configurazione e gestisce SIGTERM/SIGINT.`),\n p(`Per parlare con piu Accessi Service o tenant dallo stesso processo usare createAccessiClient: ogni istanza ha base URL e token propri, isolati anche tra richieste concorrenti. configureAccessiClient resta il default globale per le funzioni esportate dal package.`),\n good('ts', [\n \"// Backend che ospita Accessi\",\n \"import { initializeAccessiModule } from 'emilsoftware-utilities/accessi/server';\",\n '',\n \"// Backend fratello: nessun AccessiModule, nessun DB Accessi\",\n \"import { createAccessiAuthMiddleware } from 'emilsoftware-utilities/accessi/resource-server';\",\n \"import { createAccessiClient } from 'emilsoftware-utilities/accessi/client';\",\n '',\n \"const milano = createAccessiClient({ baseUrl: 'https://accessi-milano.example.com', getToken });\",\n \"const roma = createAccessiClient({ baseUrl: 'https://accessi-roma.example.com', token: tokenRoma });\",\n \"const [utentiMilano, utentiRoma] = await Promise.all([milano.getUsers(), roma.getUsers()]);\",\n ].join('\\n'), 'Import corretti per ruolo'),\n note('warn', `Un solo proprietario`, `Non montare AccessiModule in due backend puntati allo stesso database: migrazioni, bootstrap admin, ticket console e rate limit diventano ambigui.`),\n note('info', `Client per scope`, `Usare accessi/client/public nei frontend pubblici, accessi/client/admin nella console e nei tool amministrativi, accessi/client/service solo nei backend fratelli. Gli scope partizionano il client completo e condividono gli stessi tipi; il client completo resta disponibile per compatibilita.`),\n note('info', `Split in pacchetti`, `Il package resta unico con entry point per scope: decisione, soglie per rivalutarla e piano di migrazione sono nell'ADR docs/adr/0001-split-package.md.`),\n note('info', `IP reali dietro proxy`, `Imposta http.trustProxy sul numero di proxy davanti al servizio (1 per Nginx/Traefik/ALB, 2 con Cloudflare + ingress) e lascialo false se il servizio e esposto direttamente. Rate limit e audit usano req.ip: dettagli in docs/proxy-ip.md.`),\n note('info', `Prompt di integrazione`, `Il file integration-prompt.md nella root del repository contiene il contesto completo per frontend, backend e agenti AI.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'verifica-rapida',\n group: 'Per iniziare',\n title: 'Verifica rapida dopo il bootstrap',\n summary: 'Checklist per capire subito se Accessi è configurato correttamente.',\n blocks: [\n p(`Dopo il bootstrap non fidarti solo del log di avvio. Verifica nell'ordine questi punti: un errore a monte rende inutili tutti i test successivi.`),\n list([\n `GET /health/live risponde 200: il processo è vivo.`,\n `GET /health/ready risponde 200 e ogni check è verde: bootstrap completato, database raggiungibile, schema allineato e store Redis configurati raggiungibili.`,\n `Il primo admin esiste: usa il bootstrap admin dalla console oppure crea l'utente con la CLI, poi disabilita adminBootstrap.`,\n `POST /api/accessi/auth/login restituisce un token e Result.token.expiresIn è espresso in secondi.`,\n `Una rotta protetta del backend accetta il token e popola req.user; senza token risponde 401 con un codice AUTH_*.`,\n `Una rotta con requisito e utente senza grant risponde 403 AUTH_INSUFFICIENT_PERMISSIONS, non 401.`,\n `Con Accessi Service spento, un backend fratello configurato con introspection risponde 503 e non autorizza.`,\n `La console si apre e il ticket di ingresso è monouso; in multi-istanza lo store condiviso è configurato.`,\n ], true),\n code('bash', [\n 'curl -fsS https://accessi.example.com/health/live',\n 'curl -fsS https://accessi.example.com/health/ready',\n 'curl -fsS https://accessi.example.com/health/metrics | head',\n ].join('\\n'), 'Health check'),\n note('ok', `Prima del rilascio`, `Esegui npm run typecheck, npm test, npm run build, npm run test:pack e npm run check:accessi-openapi. Se hai modificato il contratto OpenAPI, aggiorna il fingerprint con npm run accessi:update-openapi-fingerprint.`),\n note('warn', `Segreti`, `Non copiare token, ticket console, password o chiavi private nei log, nelle issue o nei documenti. Le verifiche manuali vanno fatte con un utente e un ambiente di test.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'opzioni',\n group: 'Configurazione',\n title: 'AccessiOptions (riferimento completo)',\n summary: 'Ogni campo di configurazione con tipo, obbligo e note.',\n blocks: [\n table(\n ['Campo', 'Tipo', 'Obbligo', 'Note'],\n [\n ['databaseOptions', 'Options (node-firebird)', 'sì', 'Connessione Firebird al database Accessi.'],\n ['confirmationEmailUrl', 'string', 'sì', 'Base URL usata per il reset password.'],\n ['confirmationEmailReturnUrl', 'string', 'sì', 'URL di ritorno dopo il reset.'],\n ['confirmationEmailPrefix', 'string', 'no', 'Prefisso passato alla pagina di reset.'],\n ['customResetPage', 'string', 'no', 'Sostituisce la pagina HTML di reset inclusa.'],\n ['encryptionKey', 'string', 'sì', 'Compatibilità e migrazione delle password legacy.'],\n ['mockDemoUser', 'boolean', 'sì', 'Utenti fittizi admin e demo solo fuori produzione.'],\n ['passwordExpiration', 'boolean', 'no', 'Attiva il controllo della scadenza password al login.'],\n ['passwordExpirationDays', 'number', 'no', 'Valore predefinito: 90 giorni.'],\n ['legacyPasswordMigrationOnStartup', 'boolean', 'no', 'Predefinito true: converte le password legacy.'],\n ['autoUpdateDatabase', 'boolean', 'no', 'Predefinito true: riconcilia lo schema al boot.'],\n ['jwtOptions', '{ secret, expiresIn, refreshExpiresIn, algorithm, issuer, audience, privateKey, publicKey, keyId, jwksPath, previousPublicKeys, onUnknownKeyId }', 'sì', 'Firma, durata, refresh token, JWKS e rotazione chiavi. Default HS256; RS/ES consigliati per resource server multi-servizio.'],\n ['emailOptions', 'EmailOptions', 'sì', 'SMTP per reset e codici email.'],\n ['publicAuthRateLimit', 'PublicAuthRateLimitOptions', 'no', 'Limiti per endpoint pubblici; store condiviso opzionale (Redis) per il cluster.'],\n ['edgeRateLimit', 'AccessiEdgeRateLimitOptions', 'no', 'Limite grossolano per IP davanti alle rotte Accessi; opzionale, store condiviso supportato.'],\n ['http', '{ cors, trustProxy, securityHeaders }', 'no', 'CORS, IP reali dietro proxy e header di sicurezza con CSP a nonce per la console e direttive configurabili.'],\n ['authCookie', '{ enabled, secure, sameSite, csrf, ... }', 'no', 'Cookie HttpOnly e CSRF double-submit al posto del Bearer. Default disattivato.'],\n ['metrics', '{ enabled, sink, prefix }', 'no', 'Metriche Prometheus di dominio (login, 2FA, refresh, rate limit, store) e sink esterno opzionale.'],\n ['audit', '{ enabled, sinks, store, retentionDays, redact }', 'no', 'Audit persistente redatto, retention e query/export admin. Default: solo log strutturato.'],\n ['publicRegistration', '{ enabled }', 'no', 'Registrazione pubblica: disattivata per impostazione predefinita.'],\n ['federatedAuthentication', 'FederatedAuthenticationOptions', 'no', `Abilita l'SSO generico.`],\n ['extensionFieldsOptions', 'ExtensionFieldsOptions[]', 'no', 'Tabelle esterne allegate al profilo.'],\n ['serviceTokens', '{ enabled, defaultTtlDays, rateLimitStore }', 'no', 'Token macchina-a-macchina, abilitati per impostazione predefinita; rate limit condiviso opzionale.'],\n ['catalogScripts', '{ enabled, folder, ... }', 'no', 'Catalog migrations SQL eseguite dopo la riconciliazione dello schema.'],\n ['adminBootstrap', '{ enabled, superUser }', 'no', 'Token casuale a ogni avvio per creare il primo admin dalla console.'],\n ['publicBaseUrl', 'string', 'no', 'Base URL usata solo per loggare console/OpenAPI/API.'],\n ['consoleApiBaseUrl', 'string', 'no', 'Base URL API per la console quando UI e API sono su domini diversi.'],\n ['openapi', 'OpenApiSetupOptions', 'no', 'Path, titolo, descrizione e enabled della documentazione OpenAPI. Default invariati.'],\n ['consoleEntry', '{ ttlMs, store }', 'no', 'TTL e store condiviso dei ticket console (Redis per multi-istanza). Default in memoria.'],\n ['sessionRevocation', '{ enabled, store, ttlMs }', 'no', 'Revoca sessioni per utente tramite store memory/Redis; abilita POST /api/accessi/auth/revoke-sessions.'],\n ['accessTokenRevocation', '{ enabled, store, ttlMs }', 'no', 'Revoca dei singoli access token tramite jti (memory/Redis); abilita POST /api/accessi/auth/revoke-token.'],\n ['refreshTokenRotation', '{ enabled, store, reuseGraceMs, revokeUserSessionsOnReuse }', 'no', 'Refresh token monouso tramite store memory/Redis; al riuso oltre la finestra di grazia revoca la famiglia di token. Consigliato in multi-istanza.'],\n ['logger', 'LoggerService', 'no', 'Logger Nest del sotto-app; se assente Nest usa il proprio logger.'],\n ['bufferLogs', 'boolean', 'no', 'Buffer dei log di bootstrap del sotto-app. Default true.'],\n ],\n ),\n good('ts', [\n \"import type { AccessiOptions } from 'emilsoftware-utilities';\",\n '',\n 'export const options: AccessiOptions = {',\n ' databaseOptions: {',\n ' host: process.env.ACCESSI_DB_HOST!,',\n ' port: Number(process.env.ACCESSI_DB_PORT ?? 3050),',\n ' database: process.env.ACCESSI_DB_NAME!,',\n ' user: process.env.ACCESSI_DB_USER!,',\n ' password: process.env.ACCESSI_DB_PASSWORD!,',\n ' },',\n \" confirmationEmailUrl: 'https://app.example.com',\",\n \" confirmationEmailReturnUrl: 'https://app.example.com/login',\",\n ' encryptionKey: process.env.ACCESSI_ENCRYPTION_KEY!,',\n ' mockDemoUser: false,',\n ' passwordExpiration: true,',\n ' passwordExpirationDays: 90,',\n ' jwtOptions: {',\n \" secret: process.env.ACCESSI_JWT_SECRET!, // almeno 32 caratteri casuali, unico per ambiente\",\n \" expiresIn: '24h',\",\n \" issuer: 'accessi',\",\n \" audience: 'backend-app',\",\n ' },',\n ' emailOptions: {',\n ' host: process.env.SMTP_HOST!,',\n ' port: Number(process.env.SMTP_PORT ?? 587),',\n ' secure: false,',\n ' requireTLS: true,',\n ' tls: { rejectUnauthorized: true },',\n \" from: 'no-reply@example.com',\",\n ' auth: { user: process.env.SMTP_USER!, pass: process.env.SMTP_PASS! },',\n ' },',\n ' publicRegistration: { enabled: false },',\n ' serviceTokens: { enabled: true, defaultTtlDays: 365 },',\n '};',\n ].join('\\n'), 'Configurazione tipica'),\n p(`options.openapi personalizza path, titolo e descrizione della documentazione OpenAPI. Con enabled: false UI e JSON non vengono montati, ma le API /api/accessi restano attive. initializeAccessiModule restituisce { nestApp, document } per mergiare il contratto nel documento OpenAPI unico dell'host.`),\n good('ts', [\n 'const { document } = await initializeAccessiModule(app, {',\n ' ...options,',\n \" openapi: { openApiPath: 'auth/docs', openApiJsonPath: 'auth/docs.json', title: 'Auth API' },\",\n '});',\n '// document.paths e document.components.schemas sono pronti per il merge',\n ].join('\\n'), 'OpenAPI personalizzato'),\n bad('ts', [\n \"jwtOptions: { secret: 'accessi', expiresIn: '24h' }, // segreto debole e condiviso\",\n 'mockDemoUser: true, // MAI in produzione',\n ].join('\\n'), 'Errori comuni'),\n note('danger', `Segreti`, `Non versionare i segreti e non passarli al frontend. jwtOptions.secret deve essere identico tra le istanze del backend e diverso da quello dei provider SSO.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'database',\n group: 'Configurazione',\n title: 'Schema e aggiornamento del database',\n summary: 'Tabelle, riconciliazione automatica e CLI.',\n blocks: [\n p(`Accessi possiede lo schema del dominio. Con autoUpdateDatabase true (predefinito) lo riconcilia a ogni avvio; con false verifica comunque la compatibilità in sola lettura e blocca gli avvii incompatibili.`),\n h(`Tabelle principali`),\n list([\n `PARAMETRI, UTENTI, UTENTI_CONFIG, UTENTI_PWD, UTENTI_OLDPWD, UTENTI_GDPR`,\n `RUOLI, MENU_GRP, MENU_TIPI, MENU, ABILITAZIONI, RUOLI_MNU, UTENTI_RUOLI`,\n `FILTRI, FILTRI_TIPO`,\n `SSO_PROVIDER, UTENTI_IDENTITA_EXT`,\n `ACCESSI_2FA, ACCESSI_SERVICE_TOKEN, ACCESSI_CATALOG_SCRIPT`,\n ]),\n code('bash', `npm run db:update:accessi # riconcilia lo schema\\nnpm run db:check:accessi # verifica senza modificare`, 'CLI schema'),\n note('warn', `Versioni`, `La libreria richiede uno schema compatibile con la versione corrente (ACCESSI_SCHEMA_VERSION). Se la verifica fallisce, leggi il codice errore ACCESSI_DATABASE_SCHEMA_OUTDATED ed esegui db:update:accessi.`),\n note('info', `Schema esatto`, `La riconciliazione allinea le tabelle Accessi a \"niente in piu, niente in meno\": le colonne non previste vengono segnalate come incompatibili e rimosse automaticamente (dopo rename e copie dei dati legacy). Gli indici, i trigger e i CHECK extra non previsti non vengono tolti, ma un indice non previsto su una tabella Accessi viene riportato come avviso senza bloccare l'avvio.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'catalog-migrations',\n group: 'Configurazione',\n title: 'Catalog migrations SQL',\n summary: 'Allinea menu, ruoli e cataloghi su piu database in modo idempotente.',\n blocks: [\n p(`Gli script SQL applicativi (menu, ruoli, tipi, cataloghi) restano nel repository del backend ospitante e Accessi li esegue dopo la riconciliazione dello schema. Ogni script viene tracciato nella tabella ACCESSI_CATALOG_SCRIPT (nome + checksum), quindi viene applicato una sola volta per database.`),\n h(`Configurazione`),\n good('ts', [\n 'catalogScripts: {',\n \" enabled: true,\",\n \" folder: './db/accessi-catalog', // versionata nel repo del backend\",\n \" onChecksumMismatch: 'error', // 'error' (default) | 'warn' | 'reapply'\",\n \" stopOnError: true,\",\n '}',\n ].join('\\n'), 'AccessiOptions'),\n list([\n 'Gli script sono ordinati per percorso (usa prefissi numerici: 0001_, 0002_, ...).',\n 'Devono essere idempotenti e ripetibili: UPDATE OR INSERT ... MATCHING, MERGE, DELETE+INSERT mirati.',\n 'Non includere utenti: le catalog migrations allineano solo catalogo e configurazione.',\n 'Supportati stringhe, commenti e statement multipli; SET TERM non serve perché gli script sono solo DML.',\n ]),\n note('danger', `Solo righe (DML)`, `Vincolo tassativo: uno script puo eseguire solo INSERT, UPDATE, DELETE, MERGE, SELECT, EXECUTE. Qualunque DDL (CREATE/ALTER/DROP, trigger, procedure, GRANT, transazioni) viene rifiutato. Lo schema si aggiorna solo con db:update:accessi.`),\n note('info', `File non conformi`, `Un file con statement non consentiti non viene applicato ne registrato nel ledger; il run prosegue con gli altri e il report riporta una voce per ogni file con i relativi messaggi di errore (visibili anche con db:catalog:accessi:check).`),\n note('info', `allowDdl`, `Disattivato di default. Impostarlo a true disabilita la validazione e permette DDL: usarlo solo consapevolmente e mai come sostituto dell'updater dello schema.`),\n code('bash', `# Applica (schema + catalog migrations) su un database\\nACCESSI_CATALOG_FOLDER=./db/accessi-catalog npm run db:catalog:accessi\\n\\n# Elenca solo quelle da applicare / modificate\\nACCESSI_CATALOG_FOLDER=./db/accessi-catalog npm run db:catalog:accessi:check`, 'CLI catalog migrations'),\n note('info', `Idempotenza`, `Uno script gia applicato con lo stesso checksum viene saltato. Se il file cambia dopo l'applicazione, con policy error il run si interrompe: non modificare uno script applicato, aggiungine uno nuovo.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'login',\n group: 'Autenticazione',\n title: 'Login locale e JWT',\n summary: 'Endpoint di login, risposta e gestione della password scaduta.',\n blocks: [\n code('http', `POST /api/accessi/auth/login\\nContent-Type: application/json\\n\\n{ \"email\": \"utente@example.com\", \"password\": \"Segreta123!\" }`, 'Login con password'),\n p(`La risposta include Result.token (il JWT) e il profilo utente con ruoli e permessi. Se l'account è passwordless, ometti la password: il server risponde con un challenge via email (vedi la sezione su 2FA e passwordless).`),\n note('info', `Scadenza del token`, `Result.token.expiresIn e sempre espresso in secondi (per esempio 86400 per 24h), indipendentemente dal formato usato in jwtOptions.expiresIn.`),\n note('info', `Autorizzazioni lato client`, `La fonte autorevole è Result.userGrants.grants: contiene i grant effettivi (ruoli + permessi diretti, livello massimo). Non leggere i permessi dal JWT e non usare Result.utente.permissions: non sono popolati. Per i superutenti grants contiene tutti i menu attivi al livello 30.`),\n good('ts', [\n \"const res = await fetch('/api/accessi/auth/login', {\",\n \" method: 'POST',\",\n \" headers: { 'Content-Type': 'application/json' },\",\n ' body: JSON.stringify({ email, password }),',\n '});',\n 'const body = await res.json();',\n 'if (body.Result?.challenge) { /* richiedi il codice */ }',\n 'const token = body.Result?.token;',\n ].join('\\n'), 'Chiamata dal frontend'),\n note('warn', `Password scaduta`, `Con passwordExpiration attivo, una password scaduta produce una PasswordExpiredResponse con code PASSWORD_EXPIRED. Il client deve avviare il reset della password.`),\n h(`Verifica del token`),\n code('http', `POST /api/accessi/auth/get-user-by-token\\nContent-Type: application/json\\n\\n{ \"token\": \"<jwt>\" }`, 'get-user-by-token'),\n p(`Usalo per verificare un JWT e ottenere il profilo corrente (utile al bootstrap di una SPA). Restituisce Result.userData.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'passwordless-2fa',\n group: 'Autenticazione',\n title: 'Codici email, 2FA e passwordless',\n summary: 'Verifica in due passi, challenge e policy per utente.',\n blocks: [\n p(`La verifica con codice email è per-utente (flagDueFattori / UTENTI_CONFIG.FLG2FATT) ed è disattivata per impostazione predefinita. Con passwordlessLoginEnabled (FLGPWDLESS, richiede la 2FA attiva) l'accesso avviene con il solo codice email.`),\n table(\n ['Configurazione', 'Accesso locale', 'Accesso SSO'],\n [\n ['2FA disattivata', 'Password', 'Provider'],\n ['2FA attiva', 'Password + codice email', 'Provider + codice email'],\n ['2FA + passwordless', 'Solo codice email', 'Provider + codice email'],\n ],\n ),\n code('json', `{\\n \"Result\": {\\n \"challenge\": {\\n \"twoFactorRequired\": true,\\n \"challengeId\": \"64-caratteri-esadecimali\",\\n \"method\": \"email\",\\n \"expiresAt\": \"2026-09-11T14:00:00.000Z\",\\n \"resendAfterSeconds\": 60\\n }\\n }\\n}`, 'Risposta con challenge'),\n code('http', `POST /api/accessi/auth/two-factor/verify\\n{ \"challengeId\": \"...\", \"code\": \"012345\" }\\n\\nPOST /api/accessi/auth/two-factor/resend\\n{ \"challengeId\": \"...\" }`, 'Verifica e reinvio'),\n list([\n `Il codice ha 6 cifre, dura 10 minuti, consente 5 tentativi totali e al massimo 3 invii per challenge.`,\n `Fino alla verifica non sono presenti token, profilo o grant.`,\n `Il challenge non è un JWT e non va usato nell'header Authorization.`,\n ]),\n bad('ts', [\n '// Sbagliato: usare il challenge come token',\n \"fetch('/api/ordini', { headers: { Authorization: 'Bearer ' + challengeId } }); // 401\",\n ].join('\\n'), 'Il challenge non è un token'),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'reset-password',\n group: 'Autenticazione',\n title: 'Reset password',\n summary: 'Invio email e conferma con token monouso.',\n blocks: [\n code('http', `POST /api/accessi/email/send-reset-password-email\\n{ \"email\": \"utente@example.com\" }\\n\\nPOST /api/accessi/auth/confirm-reset-password/{token}\\n{ \"newPassword\": \"NuovaSegreta123!\" }`, 'Reset in due passi'),\n p(`L'invio non rivela se l'email esiste (anti-enumerazione). Il token di reset è monouso ed è firmato con una chiave dedicata.`),\n note('warn', `Policy password (solo quando si imposta)`, `Reset, set-password admin e bootstrap richiedono almeno 8 caratteri con maiuscola, minuscola, cifra e carattere speciale, senza spazi e non comuni. Se non conforme l'API risponde 400 con code ACCESSI_WEAK_PASSWORD e l'elenco dei requisiti in details. La policy NON si applica al login: le password preesistenti eventualmente deboli continuano ad autenticare e vengono migrate senza blocco.`),\n note('info', `Pagina personalizzata`, `Imposta customResetPage per usare la tua pagina di reset invece di quella inclusa. confirmationEmailReturnUrl e confirmationEmailPrefix controllano il ritorno.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'middleware',\n group: 'Autorizzazione',\n title: 'authorizeAccessi (middleware)',\n summary: 'Proteggere le rotte della tua app con il JWT Accessi.',\n blocks: [\n p(`authorizeAccessi è un middleware Express che verifica il JWT, ricarica lo stato utente corrente e applica i requisiti. Su successo prosegue; su errore risponde direttamente con il contratto Accessi (non chiamare un tuo next(error)).`),\n good('ts', [\n \"app.get('/api/report',\",\n ' (req, res, next) => authorizeAccessi(req, res, next, {',\n \" requirements: [{ menuCode: 'REPORT', minPermissionLevel: 10 }],\",\n ' }),',\n ' (req, res) => res.json({ user: req.user, grants: req.userGrants }),',\n ');',\n ].join('\\n'), 'Rotta protetta'),\n h(`Che cosa trovi nella request`),\n list([\n `req.user e req.data: payload utente corrente (alias storici).`,\n `req.userGrants: grant effettivi, presente solo quando hai richiesto dei requisiti.`,\n ]),\n bad('ts', [\n \"app.get('/api/report', authorizeAccessi, (req, res) => {\",\n ' // Sbagliato: assumere che req.userGrants esista senza requisiti',\n ' const grants = req.userGrants.grants; // possibile TypeError',\n '});',\n ].join('\\n'), 'Non dare per scontato req.userGrants'),\n note('danger', `Lo stato utente è sempre ricontrollato`, `Un JWT valido non basta: se l'utente è stato bloccato, eliminato o ha cambiato policy, il middleware risponde 401 AUTH_USER_DISABLED.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'resource-server',\n group: 'Autorizzazione',\n title: 'Resource server e introspection',\n summary: 'Proteggere un backend fratello senza accedere al database Accessi.',\n blocks: [\n p(`Un backend che non possiede Accessi usa resource-server. La verifica puo essere locale (JWT) oppure delegata all'introspection di Accessi Service. La policy di autorizzazione usa gli stessi accessiRequirement del middleware storico.`),\n good('ts', [\n \"import { createAccessiAuthMiddleware } from 'emilsoftware-utilities/accessi/resource-server';\",\n '',\n 'app.use(createAccessiAuthMiddleware({',\n ' jwt: {',\n ' // In una topologia multi-servizio preferire RS256/JWKS:',\n ' // publicKey: process.env.ACCESSI_JWT_PUBLIC_KEY,',\n ' // algorithms: [\"RS256\"],',\n ' serverSecret: process.env.ACCESSI_JWT_SECRET, // HS256: deriva la chiave access',\n ' issuer: \"accessi\",',\n ' audience: \"backend-a\",',\n ' },',\n ' introspection: {',\n ' url: \"https://accessi.example.com/api/accessi/auth/introspect\",',\n ' serviceToken: process.env.ACCESSI_SERVICE_TOKEN!,',\n ' },',\n '}));',\n ].join('\\n'), 'Express resource server'),\n good('ts', [\n \"import { createAccessiAuthGuard } from 'emilsoftware-utilities/accessi/resource-server';\",\n '',\n '@UseGuards(createAccessiAuthGuard({',\n ' jwt: { publicKey: process.env.ACCESSI_JWT_PUBLIC_KEY, algorithms: [\"RS256\"] },',\n ' introspection: { url: process.env.ACCESSI_INTROSPECT_URL!, serviceToken: process.env.ACCESSI_SERVICE_TOKEN! },',\n ' authorization: { requirements: [{ menuCode: \"ORDINI\", minPermissionLevel: 20 }] },',\n '}))',\n '@Get(\"ordini\")',\n 'list(@Req() req: Request) { return req.user; }',\n ].join('\\n'), 'Guard Nest'),\n table(\n ['Campo', 'Obbligo', 'Note'],\n [\n ['jwt.serverSecret', 'HS256', 'Segreto grezzo Accessi; il resource server applica la KDF access.'],\n ['jwt.publicKey / jwt.jwks', 'RS/ES', 'Consigliato in multi-servizio. JWKS ha cache e timeout.'],\n ['jwt.issuer / jwt.audience', 'no', 'Consigliati per evitare token di altri ambienti.'],\n ['introspection.url', 'se servono grant', 'Endpoint service-to-service protetto da service token.'],\n ['introspection.serviceToken', 'se introspection', 'Scope richiesto: accessi:introspect.'],\n ['authorization', 'no', 'Policy accessiRequirement; senza introspection i grant sono obbligatori.'],\n ],\n ),\n note('warn', `Fail closed`, `Se introspection e configurata ma non raggiungibile, il resource server risponde 503. Non autorizza la richiesta.`),\n note('info', `Introspection`, `POST /api/accessi/auth/introspect restituisce active=false per token invalido, scaduto o utente disabilitato. I risultati attivi sono cachati lato resource server per 30 secondi per default.`),\n note('info', `JWKS`, `Con RS256/ES256 Accessi pubblica la JWKS su /accessi/.well-known/jwks.json (configurabile con jwtOptions.jwksPath). Il resource server puo usare jwks.url e ruotare le chiavi con previousPublicKeys.`),\n note('info', `Revoca`, `revocation.store applica la revoca per utente; revocation.accessTokenStore rifiuta i singoli jti revocati e revocation.familyStore invalida le famiglie di refresh token revocate per riuso sospetto.`),\n note('info', `Audit`, `I fallimenti di autenticazione del resource server, i blocchi edge, il riuso dei refresh token e le revoche di sessione producono eventi strutturati tramite auditAccessi; i token e i segreti vengono redatti dal Logger.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'requisiti',\n group: 'Autorizzazione',\n title: 'Requisiti e livelli di abilitazione',\n summary: 'DSL accessiRequirement: permission, and, or, not, custom.',\n blocks: [\n p(`I requisiti si compongono con accessiRequirement. La forma storica requirements è un AND di permessi. Il livello è TipoAbilitazione: NESSUNA=0, LETTURA=10, SCRITTURA=20, SPECIAL=30; il confronto è tipoAbilitazione >= soglia.`),\n good('ts', [\n \"import { authorizeAccessi, accessiRequirement as r } from 'emilsoftware-utilities';\",\n '',\n '// AND (entrambi i menu)',\n 'const both = r.and(r.permission(\"ORDINI\", 20), r.permission(\"CLIENTI\", 10));',\n '',\n '// OR',\n 'const either = r.or(r.permission(\"REPORT\", 10), r.permission(\"EXPORT\", 20));',\n '',\n '// NOT + custom',\n 'const policy = r.and(',\n ' r.permission(\"AREA_RISERVATA\", 10),',\n ' r.not(r.permission(\"BLOCCO_TOTALE\", 0)),',\n ');',\n '',\n 'app.get(\"/api/riservato\", (req, res, next) => authorizeAccessi(req, res, next, {',\n ' requirementTree: policy,',\n ' customRequirementHandlers: {',\n ' stessoReparto: async (ctx) => ctx.userCode === Number(ctx.req.query.reparto),',\n ' },',\n '}), handler);',\n ].join('\\n'), 'Policy composte'),\n bad('ts', [\n '// Sbagliato: AND/OR senza figli -> errore di configurazione (500 AUTH_REQUIREMENTS_MISCONFIGURED)',\n 'const empty = r.and();',\n ].join('\\n'), 'Configurazione non valida'),\n note('warn', `custom senza handler`, `Un requisito custom la cui chiave non ha un handler produce 500 AUTH_REQUIREMENTS_MISCONFIGURED: è un errore di programmazione, non un 403.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'frontend-login',\n group: 'Frontend',\n title: 'Login, refresh, 2FA e reset password',\n summary: 'Il flusso completo lato browser con accessi/client/public.',\n blocks: [\n p(`Il frontend non monta Accessi e non vede il database: chiama Accessi Service, conserva l'access token e lo invia ai backend come Bearer. Il client pubblico espone solo le operazioni sicure per il browser.`),\n h(`Flusso di login`),\n list([\n `POST /api/accessi/auth/login con email e password.`,\n `Se la risposta contiene challenge e twoFactorRequired, il login non è completo: chiedi il codice e chiama verifyTwoFactor. Nessun JWT è stato emesso.`,\n `Se la risposta contiene token, conserva token.value, token.expiresIn (secondi) e, se presente, refreshToken.`,\n `Chiama i backend con Authorization: Bearer <access-token>.`,\n `Prima della scadenza, o dopo un 401 AUTH_TOKEN_INVALID, usa refreshAccessToken e riprova una sola volta.`,\n `Al logout chiama revokeToken per il token corrente oppure revokeSessions per tutte le sessioni.`,\n ], true),\n code('ts', [\n \"import { configureAccessiClient, login } from 'emilsoftware-utilities/accessi/client/public';\",\n '',\n \"configureAccessiClient({ baseUrl: 'https://accessi.example.com' });\",\n '',\n 'const response = await login({ email, password });',\n 'const result = response.data.Result;',\n '',\n 'if (result.challenge?.twoFactorRequired) {',\n ' // Mostra il campo codice e chiama verifyTwoFactor({ challengeId, code })',\n ' return { twoFactor: result.challenge };',\n '}',\n '',\n \"if (!result.token) throw new Error('Login senza token: controlla la configurazione');\",\n 'authStore.setAccessToken(result.token.value);',\n 'authStore.setRefreshToken(result.refreshToken?.value ?? null);',\n ].join('\\n'), 'Login dal browser'),\n h(`Refresh e retry`),\n code('ts', [\n \"import { refreshAccessToken } from 'emilsoftware-utilities/accessi/client/public';\",\n '',\n 'async function apiFetch(input: RequestInfo, init: RequestInit = {}) {',\n ' const token = authStore.getAccessToken();',\n ' const response = await fetch(input, {',\n ' ...init,',\n \" headers: { ...init.headers, Authorization: `Bearer ${token}` },\",\n ' });',\n '',\n ' if (response.status !== 401) return response;',\n '',\n ' const refreshToken = authStore.getRefreshToken();',\n ' if (!refreshToken) throw new Error(\"Sessione scaduta\");',\n '',\n ' const refreshed = await refreshAccessToken({ refreshToken });',\n ' authStore.setAccessToken(refreshed.data.Result.token.value);',\n ' authStore.setRefreshToken(refreshed.data.Result.refreshToken?.value ?? null);',\n '',\n ' // Un solo retry: se fallisce di nuovo, logout.',\n ' return fetch(input, {',\n ' ...init,',\n \" headers: { ...init.headers, Authorization: `Bearer ${authStore.getAccessToken()}` },\",\n ' });',\n '}',\n ].join('\\n'), 'Refresh con un solo retry'),\n table(\n ['Campo', 'Significato', 'Uso lato frontend'],\n [\n ['Result.token.value', 'Access token JWT', 'Header Authorization verso i backend, mai nell URL'],\n ['Result.token.expiresIn', 'Durata in secondi', 'Programma il refresh prima della scadenza'],\n ['Result.refreshToken', 'Refresh token opzionale', 'Conservalo separato; non usarlo come Bearer'],\n ['Result.challenge', 'Challenge 2FA', 'Chiedi il codice e completa il login'],\n ['Result.passwordRequired', 'Passo password richiesto', 'Completa il flusso passwordless senza perdere la challenge'],\n ['Result.utente / userGrants', 'Profilo e grant', 'UI, menu e messaggi di permesso'],\n ],\n ),\n h(`Errori da gestire`),\n table(\n ['HTTP / codice', 'Cosa fare'],\n [\n ['401 AUTH_TOKEN_MISSING / AUTH_TOKEN_INVALID', 'Nessun token o token scaduto: refresh e, se fallisce, login'],\n ['401 AUTH_USER_DISABLED', 'Sessione non più valida: logout e messaggio dedicato'],\n ['403 AUTH_INSUFFICIENT_PERMISSIONS', 'Non fare logout: mostra permessi insufficienti e nascondi l azione'],\n ['403 AUTH_CSRF_INVALID', 'Cookie mode: rileggi il cookie CSRF e ripeti la richiesta'],\n ['429', 'Rate limit: rispetta Retry-After e non ritentare in loop'],\n ['503 AUTH_INTROSPECTION_UNAVAILABLE / AUTH_JWKS_UNAVAILABLE', 'Servizio non raggiungibile: riprova con backoff, non cancellare la sessione'],\n ],\n ),\n h(`2FA`),\n p(`La challenge 2FA è un identificativo opaco, non un JWT: non va usato come Bearer e non va salvato come sessione. verifyTwoFactor restituisce il login completo con token e refreshToken. resendTwoFactor rispetta resendAfterSeconds.`),\n h(`Reset password`),\n p(`Il reset è un flusso pubblico in due passi: sendPasswordResetEmail invia il link, la pagina di reset arriva da Accessi oppure è custom, confirmResetPassword consuma il token monouso e imposta la nuova password. La nuova password deve rispettare la policy (minimo 8 caratteri, maiuscola, minuscola, cifra e carattere speciale). Dopo il reset le sessioni precedenti vengono revocate se sessionRevocation è configurato.`),\n note('danger', `Mai nel browser`, `Non importare accessi/client/admin, non usare accessi/client/service e non inserire service token, encryptionKey o chiavi JWT nel bundle. Non mettere JWT o ticket console nell URL o nei log.`),\n note('info', `Dove conservare il token`, `Con Bearer evita localStorage se puoi: memoria più refresh token in storage sicuro limita il danno di XSS. Se il browser non può proteggere il token, valuta la modalità cookie HttpOnly con CSRF descritta nella sezione successiva.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'frontend-client',\n group: 'Frontend',\n title: 'Scegliere e configurare il client',\n summary: 'Client pubblico, admin e service: scope, configurazione globale e per istanza.',\n blocks: [\n p(`Il package espone client separati per scope. La scelta non è stilistica: un client troppo ampio porta nel bundle operazioni che il browser non deve poter chiamare.`),\n table(\n ['Client', 'Contenuto', 'Dove usarlo'],\n [\n ['accessi/client/public', 'Login, refresh, 2FA, reset password, registrazione, ticket console', 'Frontend pubblico e SPA'],\n ['accessi/client/admin', 'Utenti, ruoli, menu, filtri, provider SSO, schema, audit', 'Console e tool amministrativi interni'],\n ['accessi/client/service', 'Service token e introspezione', 'Solo backend fratelli e job, mai browser'],\n ['accessi/client', 'Client completo generato', 'Compatibilità e tool interni; non distribuirlo a frontend pubblici'],\n ['accessi/contracts', 'Tipi, enum e helper puri', 'Bundle browser-safe senza Nest o database'],\n ],\n ),\n h(`Configurazione globale`),\n code('ts', [\n \"import { configureAccessiClient, login } from 'emilsoftware-utilities/accessi/client/public';\",\n '',\n \"configureAccessiClient({ baseUrl: 'https://accessi.example.com' });\",\n 'const response = await login({ email, password });',\n '',\n '// Se il token cambia nel tempo, passa un provider invece del valore:',\n 'configureAccessiClient({',\n \" baseUrl: 'https://accessi.example.com',\",\n ' getToken: () => authStore.getAccessToken(),',\n '});',\n ].join('\\n'), 'Client globale'),\n h(`Più Accessi Service o più tenant`),\n code('ts', [\n \"import { createAccessiPublicClient } from 'emilsoftware-utilities/accessi/client/public';\",\n '',\n \"const milano = createAccessiPublicClient({ baseUrl: 'https://accessi-milano.example.com' });\",\n \"const roma = createAccessiPublicClient({ baseUrl: 'https://accessi-roma.example.com', token: tokenRoma });\",\n '',\n 'const [utentiMilano, utentiRoma] = await Promise.all([milano.getUsers(), roma.getUsers()]);',\n ].join('\\n'), 'Client isolati per istanza'),\n p(`Le istanze create con createAccessiPublicClient, createAccessiAdminClient e createAccessiServiceClient non condividono base URL né token: sono sicure anche con richieste concorrenti. configureAccessiClient resta il default globale per le funzioni esportate direttamente.`),\n h(`Link alla console`),\n code('ts', [\n \"import { buildAccessiConsoleUrl } from 'emilsoftware-utilities/accessi/console';\",\n '',\n \"const url = buildAccessiConsoleUrl('https://accessi.example.com', { entryTicket: ticket });\",\n 'window.location.assign(url);',\n ].join('\\n'), 'Apertura console'),\n note('warn', `Ticket, non JWT`, `Il ticket console è monouso e dura 60 secondi. Non passare il JWT nell URL: buildAccessiConsoleUrl mette il ticket nel fragment e non nel query string.`),\n note('info', `Tipi condivisi`, `Tutti gli scope condividono gli stessi tipi generati dall OpenAPI. Se aggiorni il contratto, rigenera il client con npm run generate:accessi-client e verifica con npm run check:accessi-openapi.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'frontend-cookie',\n group: 'Frontend',\n title: 'Modalità cookie HttpOnly e CSRF',\n summary: 'Quando usare i cookie invece del Bearer e come configurare il browser.',\n blocks: [\n p(`Bearer resta il default. La modalità cookie serve quando il browser non può custodire un access token in memoria in modo sicuro: Accessi invia access e refresh token in cookie HttpOnly e il browser non li legge da JavaScript.`),\n code('ts', [\n 'const accessiOptions: AccessiOptions = {',\n ' // ...',\n ' authCookie: {',\n ' enabled: true,',\n ' secure: true,',\n \" sameSite: 'lax',\",\n ' },',\n '};',\n ].join('\\n'), 'Abilitazione lato server'),\n code('ts', [\n \"const response = await fetch('https://accessi.example.com/api/accessi/auth/login', {\",\n \" method: 'POST',\",\n \" credentials: 'include',\",\n \" headers: { 'Content-Type': 'application/json' },\",\n ' body: JSON.stringify({ email, password }),',\n '});',\n '',\n '// Sulle richieste che modificano stato invia il token CSRF double-submit:',\n \"const csrf = document.cookie.split('; ').find((c) => c.startsWith('accessi_csrf='))?.split('=')[1];\",\n \"await fetch('/api/ordini', {\",\n \" method: 'POST',\",\n \" credentials: 'include',\",\n ' headers: {',\n \" 'Content-Type': 'application/json',\",\n \" 'x-csrf-token': csrf ?? '',\",\n ' },',\n ' body: JSON.stringify(payload),',\n '});',\n ].join('\\n'), 'Login e richiesta con cookie'),\n list([\n `Il login non restituisce più i token nel body, salvo exposeTokens: true.`,\n `Il refresh avviene dal cookie: POST /api/accessi/auth/refresh può essere chiamato con body vuoto.`,\n `Le richieste non sicure richiedono x-csrf-token; token mancante o diverso produce 403 AUTH_CSRF_INVALID.`,\n `CORS deve avere credentials: true e un origin esplicito, mai wildcard.`,\n `La revoca cancella i cookie; logout e revoke-sessions restano gli stessi endpoint.`,\n ]),\n note('danger', `CSRF obbligatorio`, `Non disabilitare CSRF (csrf: off) se non hai un altra protezione equivalente davanti al servizio. Senza CSRF, un sito ostile può inviare richieste autenticate per conto dell utente.`),\n note('info', `Convivenza con Bearer`, `Il resource server continua a leggere l header Authorization. In cookie mode il middleware Accessi copia il cookie nell header interno, quindi guard e policy esistenti non cambiano.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'utenti',\n group: 'Dominio',\n title: 'Utenti',\n summary: 'Creazione, aggiornamento, stati e GDPR.',\n blocks: [\n h(`Stati di registrazione (STAREG)`),\n table(\n ['Valore', 'Nome', 'Effetto sul login'],\n [\n ['0', 'NULL', 'Non confermato'],\n ['5', 'INSERT', 'Non confermato'],\n ['10', 'INVIO', 'Richiede il rinnovo della password'],\n ['20', 'CONF', 'Valido'],\n ['50', 'DELETE', 'Bloccato (soft delete)'],\n ['99', 'BLOCC', 'Bloccato'],\n ],\n ),\n h(`Endpoint principali (superutente salvo diversamente indicato)`),\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/user/get-users', 'Elenco con paginazione (limit e offset, header X-Total-Count).'],\n ['POST', '/api/accessi/user/create-managed-user', 'Crea un utente locale e invia il reset password.'],\n ['PUT', '/api/accessi/user/update-user/:codiceUtente', 'Aggiorna profilo e policy (campi privilegiati solo superutente).'],\n ['DELETE', '/api/accessi/user/delete-user/:codiceUtente', 'Soft delete: STAREG=DELETE. Admin o superutente.'],\n ['DELETE', '/api/accessi/user/delete-user-permanent/:codiceUtente', 'Eliminazione definitiva: rimuove utente e record collegati. Solo admin.'],\n ['POST', '/api/accessi/user/set-password/:codiceUtente', 'Imposta direttamente la password: hash lato backend e scadenza secondo policy, nessuna email.'],\n ['POST', '/api/accessi/user/set-stato', 'Imposta lo stato di registrazione.'],\n ['PATCH', '/api/accessi/user/set-gdpr/:codiceUtente', 'Registra il consenso GDPR.'],\n ['POST', '/api/accessi/user/register', 'Registrazione pubblica, solo se publicRegistration.enabled.'],\n ],\n ),\n note('warn', `Eliminazione: soft o definitiva`, `Il soft delete (STAREG=DELETE) è disponibile per admin e superutenti ed è reversibile. L'eliminazione definitiva rimuove utente e record collegati in transazione ed è riservata agli admin; il superutente senza flag Admin può solo flaggare l'utente come eliminato. Se l'utente ha dati collegati in altre tabelle (per esempio campi estesi del backend) l'eliminazione definitiva fallisce con code ACCESSI_USER_DELETE_HAS_REFERENCES e messaggio esplicito: usa allora il soft delete.`),\n note('ok', `Creazione con invito atomica`, `La creazione utente con invio email è atomica: se SMTP non è configurato si fallisce prima di scrivere, e se l'invio fallisce l'utente creato viene annullato (codice ACCESSI_USER_INVITE_EMAIL_FAILED). Non restano utenti senza password. In alternativa un admin crea l'utente e imposta la password dal form dedicato.`),\n note('ok', `Admin: controllo completo del profilo`, `Dalla scheda utente un admin modifica tutti i campi Accessi: anagrafica, cellulare, lingua, avatar, pagina di default, metadata JSON, 2FA/passwordless/login con password, flag, GDPR, stato registrazione e scadenza password. La password si imposta direttamente con set-password. Le scritture sono idempotenti (UPDATE OR INSERT su UTENTI_CONFIG) e verificate dal backend; non serve accedere al database.`),\n note('info', `Consenso GDPR`, `Il pulsante \"Registra consenso GDPR\" completa il processo: imposta FLGGDPR e DATGDPR e scrive la riga storica in UTENTI_GDPR (endpoint set-gdpr). Anche impostare flagGdpr via update-user completa il processo con la stessa riga storica.`),\n good('ts', [\n \"await fetch('/api/accessi/user/create-managed-user', {\",\n \" method: 'POST',\",\n \" headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + adminToken },\",\n ' body: JSON.stringify({',\n \" email: 'nuovo@example.com',\",\n \" nome: 'Mario',\",\n \" cognome: 'Rossi',\",\n ' roles: [1, 2],',\n \" permissions: [{ codiceMenu: 'REPORT', tipoAbilitazione: 10 }],\",\n ' }),',\n '});',\n ].join('\\n'), 'Creazione di un utente gestito'),\n bad('ts', [\n '// Sbagliato: inviare flag privilegiati dal frontend pubblico',\n 'fetch(\"/api/accessi/user/register\", {',\n ' method: \"POST\",',\n ' body: JSON.stringify({ email, flagSuper: true }), // ignorato o negato',\n '});',\n ].join('\\n'), 'Privilegi dal client'),\n note('info', `Campi di dominio`, `UTENTI_CONFIG contiene i campi di dominio Accessi: FLGSUPER, FLGADMIN, FLG2FATT (2FA), FLGPWDLESS (passwordless), FLGPASSWORD (login locale), CODLINGUA, CELLULARE, PAGDEF (pagina di default) e JSON_METADATA. I flag/colonne applicativi (FLGMOP, FLGPIANA, FLGADDETTI, FLGOSPITI, FLGPIANARFID, FLGCONTA, FLGCUBI, FLGCICLPASS, FLGDIPENDENTI, FLGINVENTARI, CAUMOV, NUMMAC, RAGSOCCLI, ENABLEIA, CELLUTE e NOMECAMPO) sono stati rimossi: i backend devono gestirli in tabelle proprie. Il telefono canonico e UTENTI_CONFIG.CELLULARE.`),\n note('info', `Autorizzazioni`, `I gruppi/menu si abilitano tramite ABILITAZIONI, RUOLI_MNU e UTENTI_RUOLI. Il vecchio meccanismo NOMECAMPO (flag applicativo su UTENTI_CONFIG) e stato rimosso.`),\n note('info', `Campi estesi`, `extensionFieldsOptions allega colonne di tabelle applicative al profilo (per esempio la ragione sociale). Le colonne sono in whitelist: non costruirle mai da input HTTP.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'ruoli',\n group: 'Dominio',\n title: 'Ruoli e permessi',\n summary: 'Assegnazioni sostitutive e composizione dei grant.',\n blocks: [\n p(`I ruoli contengono una lista di menu con livello. Le assegnazioni (ruoli e permessi diretti) sono SOSTITUTIVE: invia sempre la lista completa desiderata. I grant effettivi sommano ruoli e permessi diretti prendendo il livello massimo per menu; un livello 0 non annulla un grant del ruolo. I superutenti ricevono tutti i menu attivi al livello massimo.`),\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/permission/roles', 'Ruoli con i menu associati.'],\n ['POST', '/api/accessi/permission/create-role', 'Crea un ruolo (i menu sono obbligatori).'],\n ['PUT', '/api/accessi/permission/update-role/:codiceRuolo', 'Aggiorna un ruolo (menu sostitutivi).'],\n ['DELETE', '/api/accessi/permission/delete-role/:codiceRuolo', 'Elimina ruolo, mapping e assegnazioni.'],\n ['POST', '/api/accessi/permission/assign-roles/:codiceUtente', `Sostituisce i ruoli dell'utente.`],\n ['POST', '/api/accessi/permission/assign-permissions/:codiceUtente', 'Sostituisce i permessi diretti.'],\n ['GET', '/api/accessi/permission/grants/:codiceUtente', 'Grant effettivi, permessi diretti e ruoli.'],\n ],\n ),\n good('ts', [\n 'const role = {',\n \" descrizioneRuolo: 'Gestore ordini',\",\n ' menu: [',\n \" { codiceMenu: 'ORDINI', tipoAbilitazione: 20 },\",\n \" { codiceMenu: 'CLIENTI', tipoAbilitazione: 10 },\",\n ' ],',\n '};',\n 'await createRole(role); // POST /api/accessi/permission/create-role',\n '',\n \"// Sostitutivo: questa lista diventa l'intero set di ruoli dell'utente\",\n 'await assignRolesToUser(codiceUtente, { roles: [3, 7] });',\n ].join('\\n'), 'Creazione di un ruolo e assegnazione'),\n bad('ts', [\n \"// Sbagliato: pensare che l'assegnazione sia incrementale\",\n 'await assignRolesToUser(codiceUtente, { roles: [3] });',\n \"// ora l'utente ha SOLO il ruolo 3, non 3 più quelli di prima\",\n ].join('\\n'), 'Assegnazione non additiva'),\n note('warn', `Menu obbligatori`, `create-role e update-role rifiutano un ruolo senza menu. Se ti serve un ruolo senza accessi, non crearlo.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'menu',\n group: 'Dominio',\n title: 'Menu, gruppi e tipi menu',\n summary: 'Catalogo di navigazione e CRUD completo (superutente).',\n blocks: [\n table(\n ['Metodo', 'Percorso', 'Descrizione'],\n [\n ['GET', '/api/accessi/permission/menus', 'Menu attivi.'],\n ['GET', '/api/accessi/permission/menu-types', 'Catalogo dei tipi menu.'],\n ['GET', '/api/accessi/permission/groups-with-menus?includeDisabled=true', 'Gruppi con menu (anche disabilitati).'],\n ['POST', '/api/accessi/permission/menus', 'Crea un menu.'],\n ['PUT', '/api/accessi/permission/menus/:codiceMenu', 'Aggiorna un menu.'],\n ['DELETE', '/api/accessi/permission/menus/:codiceMenu', 'Elimina un menu (con grant e associazioni ai ruoli).'],\n ['POST', '/api/accessi/permission/menu-groups', 'Crea un gruppo.'],\n ['PUT', '/api/accessi/permission/menu-groups/:codiceGruppo', 'Aggiorna un gruppo.'],\n ['DELETE', '/api/accessi/permission/menu-groups/:codiceGruppo', 'Elimina un gruppo (solo se vuoto).'],\n ['POST/PUT/DELETE', '/api/accessi/permission/menu-types[/:codiceTipo]', 'CRUD dei tipi menu.'],\n ],\n ),\n p(`I codici (CODMNU, CODGRP, CODTIP) sono chiavi immutabili: si indicano in creazione e poi si passano nel percorso. Un gruppo o un tipo si elimina solo se non è referenziato.`),\n good('ts', [\n \"await createMenuGroup({ codiceGruppo: 'A', descrizioneGruppo: 'Amministrazione', ordineGruppo: 1, enabled: true });\",\n \"await createMenuType({ codiceTipo: 'X', descrizioneTipo: 'Operativo' });\",\n \"await createMenu({ codiceMenu: 'ORDINI', descrizioneMenu: 'Ordini', codiceGruppo: 'A', tipo: 'X', ordineMenu: 10, enabled: true });\",\n ].join('\\n'), 'Catalogo in ordine'),\n bad('ts', [\n '// Sbagliato: eliminare un gruppo che contiene menu -> 400 con spiegazione',\n \"await deleteMenuGroup('A'); // contiene N menu\",\n ].join('\\n'), 'Vincoli di integrità'),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'sso',\n group: 'SSO',\n title: 'SSO generico (federated authentication)',\n summary: 'Il backend valida il provider, Accessi gestisce identità e sessioni.',\n blocks: [\n p(`Accessi non valida i token Azure, Google o SAML: è il TUO backend a validare il flusso SSO e a passare solo { provider, subject } verificati a FederatedAuthService. Così issuer, secret e token restano fuori dal modulo.`),\n good('ts', [\n \"import { FederatedAuthService } from 'emilsoftware-utilities';\",\n '',\n '// Nel tuo callback SSO, dopo aver validato il token del provider:',\n 'const verified = { provider: \"azure-ad-acme\", subject: claims.oid };',\n 'const result = await federatedAuthService.authenticate(verified);',\n '',\n 'if (result.login.challenge) {',\n ' // 2FA attiva: restituisci il challenge al frontend',\n ' return res.json({ challenge: result.login.challenge });',\n '}',\n 'return res.json({ login: result.login, token: result.token });',\n ].join('\\n'), 'Login SSO'),\n note('info', `Scambio service-to-service`, `Se il backend fratello valida il provider SSO, può scambiare { provider, subject } con POST /api/accessi/federated-auth/exchange usando un service token con scope accessi:federated:exchange. Accessi non riceve il token del provider.`),\n h(`API amministrative (superutente)`),\n list([\n `GET/POST /api/accessi/federated-auth/providers, PATCH/DELETE providers/:provider`,\n `GET/POST /api/accessi/federated-auth/users/:codiceUtente/identities`,\n `POST /api/accessi/federated-auth/users (crea un utente SSO-only)`,\n `PATCH /api/accessi/federated-auth/users/:codiceUtente/password-login`,\n ]),\n bad('ts', [\n \"// Sbagliato: far validare il token del provider ad Accessi o fidarsi del frontend\",\n 'await federatedAuthService.authenticate({ provider, subject: req.body.email }); // subject non verificato',\n ].join('\\n'), `Non fidarti dell'input`),\n note('warn', `Provider in uso`, `Un provider si elimina solo se nessuna identità è collegata; altrimenti disabilitalo. La chiave del provider deve coincidere con la configurazione del backend.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'service-token',\n group: 'Token di servizio',\n title: 'Token macchina-a-macchina',\n summary: 'Autenticazione tecnica con scope: non è un superutente.',\n blocks: [\n p(`Formato: st_<id>.<segreto> (segreto da 256 bit). Nel database si salva solo lo SHA-256 del segreto; il segreto è mostrato una sola volta. La verifica restituisce { tokenId, label, scopes }: nessun ruolo o grant.`),\n note('danger', `Non è un superutente`, `Un service token non apre le API Accessi: abilita solo le rotte della tua app che proteggi con ServiceTokenGuard.`),\n note('info', `Introspection`, `Per un backend fratello creare un service token con scope accessi:introspect e usarlo in POST /api/accessi/auth/introspect. Il resource server lo configura in introspection.serviceToken.`),\n note('warn', `Rate limit condiviso`, `In cluster configurare serviceTokens.rateLimitStore e publicAuthRateLimit.store con createRedisRateLimitStore: i contatori in memoria valgono solo per singola istanza.`),\n note('info', `Edge rate limit`, `Per una soglia grossolana per IP configurare edgeRateLimit: viene applicata davanti alle rotte Accessi. Il gateway/API gateway resta comunque consigliato per bot protection e limiti di connessione.`),\n good('ts', [\n \"import { ServiceTokenGuard, RequireServiceTokenScopes } from 'emilsoftware-utilities';\",\n '',\n '@UseGuards(ServiceTokenGuard)',\n \"@RequireServiceTokenScopes('ia')\",\n '@Post(\"internal/ask\")',\n 'ask() { /* req.accessiServiceToken = { tokenId, label, scopes } */ }',\n ].join('\\n'), 'Rotta tecnica protetta'),\n h(`Gestione (superutente)`),\n list([\n `POST /api/accessi/service-token (label, scopes, expiresAt o ttlDays) -> segreto mostrato una volta`,\n `GET /api/accessi/service-token?includeRevoked=true`,\n `DELETE /api/accessi/service-token/:tokenId (revoca immediata)`,\n `POST /api/accessi/service-token/:tokenId/rotate`,\n ]),\n bad('ts', [\n '// Sbagliato: usare un service token per autenticare un utente umano',\n \"fetch('/api/profilo', { headers: { Authorization: 'Bearer ' + serviceToken } }); // req.user assente\",\n ].join('\\n'), 'Non è un utente'),\n note('warn', `Scadenza`, `Senza expiresAt né defaultTtlDays il token non scade: imposta serviceTokens.defaultTtlDays o una scadenza esplicita.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'console',\n group: 'Console',\n title: 'Console amministrativa',\n summary: 'Accesso, sezioni e che cosa si può fare.',\n blocks: [\n p(`La console è servita dal modulo su /api/accessi/console. Non ha stato proprio: ogni azione chiama le API protette con il JWT dell'utente connesso.`),\n list([\n `Utenti: elenco, creazione locale o SSO, profilo, ruoli, grant diretti, stato, 2FA e Login as.`,\n `Ruoli e grant: CRUD dei ruoli con l'albero delle abilitazioni.`,\n `Menu e gruppi: CRUD di gruppi, menu e tipi menu.`,\n `Token di servizio: creazione, rotazione, revoca.`,\n `SSO: provider e identità.`,\n `Wiki e Changelog: documentazione e novità della libreria.`,\n `SQL: esporta il DDL delle entità Accessi (tabelle, generatori, FK, indici, check, trigger) per replicare il database.`,\n ]),\n note('info', `Superutente (FLGSUPER)`, `Riceve TUTTE le abilitazioni al livello massimo (30) dopo il login. In console vede solo la sezione Utenti e gestisce utenti, ruoli e grant.`),\n note('info', `Admin (FLGADMIN)`, `Accede a tutta la console (catalogo, token, SSO, utenti) ma NON conferisce abilitazioni: i menu restano quelli assegnati via ABILITAZIONI/RUOLI_MNU. Gerarchia: ADMIN > SUPER > utente.`),\n note('info', `Gerarchia dei ruoli`, `Vale ADMIN (2) > SUPER (1) > utente comune (0). Un attore può gestire solo utenti di rango pari o inferiore: un superutente può amministrare totalmente utenti comuni e superutenti (profilo, password, flag, ruoli, grant, stato, eliminazione e identità/utenti SSO) ma NON può toccare un admin. Un admin può gestire chiunque. La regola è imposta dal backend (ensureCanManageTargetUser): un tentativo non consentito restituisce 403.`),\n note('info', `Gestione dei flag`, `Dalla scheda utente i flag sono mostrati in base al ruolo di chi è connesso: un admin può assegnare o togliere sia il flag Admin sia il flag Superutente; un superutente senza flag Admin può gestire solo il flag Superutente. I flag si impostano anche in creazione (utente locale o SSO).`),\n note('warn', `Ultimo admin`, `Per non restare chiusi fuori dalla console, l'ultimo admin attivo non può essere disattivato, bloccato, eliminato né privato del flag Admin: l'operazione restituisce 400 finché non viene promosso un altro admin.`),\n note('info', `Accesso`, `Apri /api/accessi/console e accedi con un utente con FLGSUPER o FLGADMIN. Le sezioni sono raggiungibili anche tramite deep link (per esempio /api/accessi/console/menu-e-gruppi/menu).`),\n note('info', `Bootstrap admin`, `Con adminBootstrap.enabled il backend stampa a ogni avvio un token casuale (monouso, valido fino al riavvio). La sezione \"Crea utente admin\" nella schermata di login compare solo quando adminBootstrap è abilitato (stato esposto da GET /api/accessi/auth/bootstrap-admin/status): incolla il token e crea il primo admin senza email di conferma. La password è opzionale: se assente viene generata e mostrata una sola volta.`),\n note('ok', `Auto-ingresso dal frontend`, `Se un frontend ha già una sessione Accessi valida e l'utente è abilitato alla console, può aprire la console senza rifare il login: \\`POST /api/accessi/console/entry\\` con \\`Authorization: Bearer <jwt>\\` restituisce un ticket monouso; apri poi \\`/api/accessi/console#entry=<ticket>\\`. Il JWT non finisce mai nell'URL; il ticket dura 60 secondi ed è utilizzabile una sola volta (endpoint di scambio protetto da rate limit).`),\n note('info', `Console centralizzata`, `In una topologia multi-backend la console va ospitata una sola volta su Accessi Service. Gli altri backend possono linkarla con \\`buildAccessiConsoleUrl\\` di \\`accessi/console\\` oppure proxare \\`/api/accessi/*\\` sullo stesso dominio. Non copiare gli asset della console in ogni applicazione.`),\n note('warn', `Ticket multi-istanza`, `I ticket di ingresso console sono in memoria per default. Con piu istanze configurare \\`consoleEntry.store\\` con \\`createRedisConsoleEntryStore\\`: il JWT viene cifrato e il consume e atomico.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'login-as',\n group: 'Console',\n title: 'Login as (accesso temporaneo)',\n summary: 'Superutenti e admin possono generare un URL per entrare in un applicazione come un altro utente.',\n blocks: [\n p(`Dalla lista utenti della console il pulsante Login as apre il pannello dedicato: inserisci l'URL dell'applicazione e premi \"Genera URL di accesso\". Accessi emette un JWT per l'utente target e lo allega all'URL come query parameter \\`loginAsToken\\`.`),\n code('http', `POST /api/accessi/user/login-as/:codiceUtente\\nContent-Type: application/json\\nAuthorization: Bearer <jwt amministratore>\\n\\n{ \"url\": \"https://app.example.com/dashboard\" }`, 'Richiesta'),\n code('json', `{\\n \"Result\": {\\n \"loginUrl\": \"https://app.example.com/dashboard?loginAsToken=eyJ...\",\\n \"token\": \"eyJ...\",\\n \"expiresInSeconds\": 86400,\\n \"expiresAt\": \"2026-10-24T14:05:00.000Z\"\\n }\\n}`, 'Risposta'),\n note('danger', `La durata è quella standard`, `Il token dura quanto la sessione Accessi standard (jwtOptions.expiresIn). È una credenziale: chiunque abbia l'URL può usarlo fino alla scadenza per entrare nell'applicazione come l'utente target. Non condividerlo, non salvarlo in log o documenti e non usarlo in produzione per operazioni distruttive.`),\n note('info', `Chi può generarlo`, `Solo utenti con FLGSUPER o FLGADMIN. Vale la stessa gerarchia della gestione utenti: un superutente non può impersonare un admin; un admin può impersonare chiunque. Il tentativo non consentito restituisce 403.`),\n note('warn', `Responsabilità dell applicazione`, `Accessi non controlla l'URL di destinazione né consuma il token al posto dell'applicazione. L'app deve leggere \\`loginAsToken\\`, validarlo (per esempio con \\`POST /api/accessi/auth/get-user-by-token\\` o \\`authorizeAccessi\\`) e decidere cosa consentire. Il token è un access token Accessi a tutti gli effetti, con claim \\`loginAs: true\\`, \\`amr: [\"login_as\"]\\` e \\`act\\` valorizzato con l'attore.`),\n p(`Il token viene emesso anche per utenti con 2FA attiva: l'attore ha già completato l'autenticazione amministrativa. Non usare questa funzione per aggirare la 2FA di un utente comune al di fuori di un intervento amministrativo autorizzato.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'operations-deploy',\n group: 'Operazioni',\n title: 'Deploy del servizio',\n summary: 'Servizio standalone, variabili d ambiente, migrazioni e rollout senza downtime.',\n blocks: [\n p(`Accessi Service è un processo Node che possiede database, migrazioni, SMTP, chiavi JWT e console. In produzione va eseguito come servizio gestito (systemd, container o supervisor) e protetto da TLS.`),\n code('ts', [\n \"import { startAccessiService } from 'emilsoftware-utilities/accessi/server';\",\n '',\n 'await startAccessiService({',\n ' port: Number(process.env.PORT ?? 3000),',\n ' healthPath: \"/health\",',\n ' metrics: true,',\n '});',\n ].join('\\n'), 'Avvio standalone'),\n h(`Variabili principali`),\n table(\n ['Gruppo', 'Variabili', 'Note'],\n [\n ['Database', 'ACCESSI_DB_HOST, ACCESSI_DB_PORT, ACCESSI_DB_DATABASE, ACCESSI_DB_USER, ACCESSI_DB_PASSWORD', 'Firebird 2.5 o successivo'],\n ['Sicurezza', 'ACCESSI_ENCRYPTION_KEY, ACCESSI_JWT_SECRET', 'Obbligatorie; mai nel repository'],\n ['JWT', 'ACCESSI_JWT_ALGORITHM, ACCESSI_JWT_PRIVATE_KEY, ACCESSI_JWT_PUBLIC_KEY, ACCESSI_JWT_KEY_ID, ACCESSI_JWKS_PATH, ACCESSI_JWT_PREVIOUS_PUBLIC_KEYS', 'RS/ES consigliato in multi-servizio'],\n ['Token', 'ACCESSI_JWT_ISSUER, ACCESSI_JWT_AUDIENCE, ACCESSI_JWT_EXPIRES, ACCESSI_JWT_REFRESH_EXPIRES', 'Issuer e audience espliciti per ambiente'],\n ['Email', 'ACCESSI_EMAIL_HOST, ACCESSI_EMAIL_PORT, ACCESSI_EMAIL_USER, ACCESSI_EMAIL_PASSWORD, ACCESSI_EMAIL_FROM', 'SMTP obbligatorio per reset, 2FA e inviti'],\n ['URL', 'ACCESSI_PUBLIC_BASE_URL, ACCESSI_CONFIRMATION_EMAIL_URL, ACCESSI_CONFIRMATION_RETURN_EMAIL_URL, ACCESSI_CONSOLE_API_BASE_URL', 'Link nelle email e console su dominio separato'],\n ['Console', 'ACCESSI_CONSOLE_ENTRY_TTL_MS, ACCESSI_CONSOLE_ENTRY_KEY', 'Ticket monouso; store Redis in multi-istanza'],\n ['Migrazioni', 'ACCESSI_AUTO_UPDATE_DATABASE, ACCESSI_LEGACY_PASSWORD_MIGRATION, ACCESSI_SYSTEM_SEEDS_ENABLED, ACCESSI_ADMIN_BOOTSTRAP_ENABLED', 'false su auto-update per le repliche dopo la migrazione'],\n ['Cookie', 'ACCESSI_AUTH_COOKIE_ENABLED, _SECURE, _SAME_SITE, _DOMAIN, _CSRF', 'Bearer resta il default; abilitare solo se serve HttpOnly'],\n ['Osservabilità', 'ACCESSI_METRICS_*, ACCESSI_AUDIT_*', 'Metriche e audit; store e sink restano oggetti runtime'],\n ['Feature e tenant', 'ACCESSI_TENANT_ID, ACCESSI_PUBLIC_REGISTRATION_ENABLED, ACCESSI_FEDERATED_*, ACCESSI_SERVICE_TOKENS_*', 'Registrazione e SSO sono opt-in'],\n ['HTTP e proxy', 'ACCESSI_HTTP_TRUST_PROXY, ACCESSI_CORS_ORIGINS, ACCESSI_CORS_CREDENTIALS, ACCESSI_SECURITY_HEADERS', 'trust proxy corretto per rate limit e audit'],\n ['Rate limit', 'ACCESSI_PUBLIC_RATE_LIMIT_*, ACCESSI_EDGE_RATE_LIMIT_*', 'Finestra e tentativi dello stesso scope vanno configurati insieme'],\n ],\n ),\n h(`Rollout sicuro`),\n list([\n 'Costruisci l artefatto e valida la configurazione prima del deploy: assertValidAccessiOptions blocca gli errori evidenti.',\n 'Esegui la migrazione dello schema con un solo processo (autoUpdateDatabase: true oppure npm run db:update:accessi).',\n 'Avvia le repliche con autoUpdateDatabase: false: verificano lo schema in sola lettura e non eseguono DDL concorrenti.',\n 'Attendi /health/ready prima di inviare traffico dal load balancer.',\n 'Ruota una replica alla volta; il servizio gestisce SIGTERM/SIGINT e chiude Nest e i pool Firebird.',\n 'Dopo il rollout verifica login, una rotta protetta, introspection e console.',\n ], true),\n code('ini', [\n '[Unit]',\n 'Description=Accessi Service',\n 'After=network.target',\n '',\n '[Service]',\n 'WorkingDirectory=/opt/accessi-service',\n 'EnvironmentFile=/etc/accessi/accessi.env',\n 'ExecStart=/usr/bin/node dist/scripts/startAccessiService.js',\n 'Restart=on-failure',\n 'RestartSec=5',\n 'KillSignal=SIGTERM',\n 'TimeoutStopSec=15',\n '',\n '[Install]',\n 'WantedBy=multi-user.target',\n ].join('\\n'), 'systemd minimale'),\n p(`Template pronti per multi-tenant, Docker, Nginx e Traefik sono in deploy/: systemd/accessi-tenant@.service, systemd/tenant.secrets.example, docker/docker-compose.yml, nginx/accessi-tenants.conf e traefik/dynamic.yml. Non contengono segreti e vanno adattati.`),\n note('warn', `Migrazioni`, `Non eseguire DDL concorrenti con più repliche o con traffico applicativo. Migra prima del rollout e lascia autoUpdateDatabase: false sulle repliche. Fai un backup e collauda su una copia rappresentativa.`),\n note('warn', `Proxy`, `Imposta http.trustProxy sul numero esatto di proxy davanti al servizio (1 per Nginx/Traefik/ALB, 2 con Cloudflare più ingress). Un valore sbagliato rende rate limit e audit aggirabili tramite header.`),\n note('info', `Dettagli`, `Procedura completa in docs/standalone-service.md, deploy/README.md e docs/proxy-ip.md.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'operations-redis',\n group: 'Operazioni',\n title: 'Store condivisi e multi-istanza',\n summary: 'Quali store devono stare su Redis e che cosa succede se Redis non risponde.',\n blocks: [\n p(`Con una sola istanza gli store in memoria bastano. Con più repliche o più tenant gli store devono essere condivisi, altrimenti ticket, revoche e rate limit divergono tra processi.`),\n table(\n ['Store', 'Opzione', 'Serve per', 'Se manca in multi-istanza'],\n [\n ['Rate limit pubblico', 'publicAuthRateLimit.store', 'Login, reset, 2FA, refresh, console entry', 'Contatori separati per istanza: il limite effettivo si moltiplica'],\n ['Rate limit service token', 'serviceTokens.rateLimitStore', 'Protezione API tecniche', 'Lo stesso token può superare il limite su istanze diverse'],\n ['Ticket console', 'consoleEntry.store', 'Ingresso console monouso', 'Il ticket emesso da una istanza non vale su un altra'],\n ['Revoca sessioni', 'sessionRevocation.store', 'Logout globale e cambio password', 'La revoca vale solo nel processo che la esegue'],\n ['Revoca access token', 'accessTokenRevocation.store', 'Logout del singolo jti', 'Il token revocato resta valido altrove'],\n ['Rotazione refresh', 'refreshTokenRotation.store', 'Refresh monouso e riuso sospetto', 'Due refresh concorrenti possono riuscire entrambi'],\n ['Audit', 'audit.store o audit.sinks', 'Record interrogabili e retention', 'Solo log locale, nessuna query admin'],\n ],\n ),\n code('ts', [\n \"import {\",\n ' createRedisRateLimitStore,',\n ' createRedisConsoleEntryStore,',\n ' createRedisSessionRevocationStore,',\n ' createRedisAccessTokenRevocationStore,',\n ' createRedisRefreshTokenRotationStore,',\n \"} from 'emilsoftware-utilities/accessi/server';\",\n '',\n 'const rateLimitStore = createRedisRateLimitStore({ client: redis, keyPrefix: \"accessi:rate:\" });',\n '',\n 'const options: AccessiServerOptions = {',\n ' // ...',\n ' publicAuthRateLimit: { store: rateLimitStore },',\n ' serviceTokens: { enabled: true, rateLimitStore },',\n ' consoleEntry: { store: createRedisConsoleEntryStore({ client: redis, encryptionKey }) },',\n ' sessionRevocation: { store: createRedisSessionRevocationStore({ client: redis, ttlMs }) },',\n ' accessTokenRevocation: { store: createRedisAccessTokenRevocationStore({ client: redis }) },',\n ' refreshTokenRotation: { store: createRedisRefreshTokenRotationStore({ client: redis }) },',\n '};',\n ].join('\\n'), 'Store condivisi'),\n h(`Multi-tenant`),\n code('ts', [\n \"import { createAccessiTenantStores } from 'emilsoftware-utilities/accessi/server';\",\n '',\n \"const stores = createAccessiTenantStores({ tenantId: 'acme', client: redis });\",\n '// rateLimit, consoleEntry, sessionRevocation, accessTokenRevocation,',\n '// refreshTokenRotation e serviceTokenRateLimit hanno già il prefisso del tenant.',\n ].join('\\n'), 'Prefissi automatici per tenant'),\n list([\n 'Non comporre i prefissi a mano: usa createAccessiTenantStores o getAccessiTenantRedisPrefix.',\n 'Ogni tenant deve avere chiavi JWT, issuer, audience e encryptionKey propri.',\n 'healthCheck() degli store partecipa a /health/ready: uno store irraggiungibile rende il servizio non pronto.',\n 'Se Redis non è raggiungibile i controlli falliscono chiusi: l endpoint risponde con errore e non autorizza.',\n ]),\n note('warn', `Fail closed`, `Redis non disponibile non significa limiti disattivati. Significa che le operazioni protette da store condiviso rispondono con errore (spesso 503) finché lo store non torna disponibile.`),\n note('info', `Test`, `I test di integrazione Redis sono opt-in con ACCESSI_TEST_REDIS_URL; carico e concorrenza sono in docs/redis-load-testing.md.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'operations-security',\n group: 'Operazioni',\n title: 'Hardening e checklist di sicurezza',\n summary: 'Le impostazioni che non vanno lasciate al caso in produzione.',\n blocks: [\n p(`Accessi concentra identità, password, token e chiavi: la configurazione di sicurezza non è opzionale. Questa checklist vale per qualsiasi topologia.`),\n list([\n 'Database Accessi raggiungibile solo da Accessi Service: nessun backend fratello ha credenziali del DB.',\n 'Con NODE_ENV=production il servizio rifiuta JWT secret ed encryptionKey mancanti o uguali ai default locali.',\n 'encryptionKey, SMTP, chiavi JWT private e token di bootstrap vivono in un secret manager, mai nel repository o nei file tenant versionati.',\n 'In multi-servizio usa RS256 o ES256 con JWKS; HS256 con segreto condiviso solo come transizione.',\n 'Imposta issuer e audience espliciti e diversi per ambiente: un token di staging non deve valere in produzione.',\n 'Configura http.trustProxy con il numero esatto di proxy e non fidarti di header tenant o IP inviati dal client.',\n 'CORS con origin espliciti: credentials: true solo se usi cookie e mai insieme a wildcard.',\n 'Tieni attivi securityHeaders e CSP; se usi cookie, abilita CSRF double-submit e SameSite adeguato.',\n 'Configura rate limit pubblico, service token ed edge rate limit; in multi-istanza usa store Redis.',\n 'Service token con lo scope minimo (accessi:introspect, accessi:federated:exchange) e rotazione periodica; mai nel browser.',\n 'Configura sessionRevocation, accessTokenRevocation e refreshTokenRotation: cambio password, disabilitazione e riuso devono invalidare le sessioni.',\n 'Configura audit con retention e sink interrogabile; token, ticket, password e chiavi non devono finire nei log.',\n 'Backup del database e test di ripristino; migrazioni collaudate su copia prima del rollout.',\n ], true),\n table(\n ['Rischio', 'Contromisura principale'],\n [\n ['Token di un altro ambiente', 'issuer e audience obbligatori, chiavi diverse per ambiente'],\n ['Furto di un access token', 'scadenza breve, revoca per jti, session revocation store condiviso'],\n ['Riuso di un refresh token', 'refresh rotation con store Redis e revoca della famiglia'],\n ['Rate limit aggirato', 'trustProxy corretto, edge rate limit, store condiviso'],\n ['XSS che ruba token', 'cookie HttpOnly con CSRF oppure token in memoria e CSP rigorosa'],\n ['CSRF su cookie mode', 'double-submit token e SameSite; mai csrf off senza protezione esterna'],\n ['Privilegi eccessivi', 'service token con scope minimo, gerarchia ADMIN > SUPER, ultimo admin protetto'],\n ['Dati o token tra tenant', 'un processo e un DB per tenant, chiavi e prefissi Redis separati'],\n ['Perdita di audit', 'sink persistente, retention, export e alert su error rate'],\n ],\n ),\n note('danger', `Mai nel browser`, `Non esporre accessi/client/admin o accessi/client/service a un frontend pubblico e non inserire service token, chiavi private o encryptionKey nel bundle.`),\n note('info', `Dettagli`, `CSP e header in docs/security-headers.md, cookie e CSRF in docs/auth-cookies.md, rotazione chiavi in docs/jwt-key-rotation.md, proxy in docs/proxy-ip.md e gateway in docs/gateway-rate-limit.md.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'operations-observability',\n group: 'Operazioni',\n title: 'Health, metriche e audit',\n summary: 'Come capire se Accessi sta funzionando e che cosa monitorare.',\n blocks: [\n p(`Il servizio standalone espone health e metriche; un host Nest/Express può montare gli stessi controlli con createAccessiHealthModule e renderAccessiMetrics.`),\n table(\n ['Endpoint', 'Significato', 'Uso'],\n [\n ['GET /health/live', 'Processo vivo', 'Liveness probe; non controlla il database'],\n ['GET /health/ready', 'Bootstrap, DB, schema e store pronti', 'Readiness probe del load balancer'],\n ['GET /health/metrics', 'Metriche Prometheus', 'Scrape periodico, protetto in rete interna'],\n ],\n ),\n code('ts', [\n \"import { createAccessiHealthModule } from 'emilsoftware-utilities/accessi/server';\",\n '',\n '@Module({',\n ' imports: [',\n ' AccessiModule.forRoot(accessiOptions),',\n ' createAccessiHealthModule({',\n ' accessiOptions,',\n ' path: \"/health\",',\n ' readinessChecks: [{ name: \"coda\", check: async () => queue.isReady() }],',\n ' }),',\n ' ],',\n '})',\n 'export class AppModule {}',\n ].join('\\n'), 'Health in un host Nest'),\n h(`Metriche di dominio`),\n list([\n 'Login riusciti e falliti, 2FA, refresh token e riuso.',\n 'Blocchi di rate limit pubblico, edge e service token.',\n 'Introspection, JWKS, revoche sessioni e ticket console.',\n 'Errori degli store Redis e durata delle operazioni.',\n ]),\n h(`Audit`),\n list([\n 'Login, logout, revoche, cambio password, 2FA, rate limit e rotazione chiavi producono eventi strutturati.',\n 'I campi sensibili vengono redatti dal Logger; non aggiungere token o segreti nei metadati.',\n 'Con un sink interrogabile gli admin usano GET /api/accessi/audit e /audit/export con retention configurabile.',\n 'Senza sink interrogabile gli endpoint rispondono 501 ACCESSI_AUDIT_STORE_DISABLED, ma il log continua.',\n ]),\n note('ok', `Alert suggeriti`, `Error rate 5xx sopra soglia, readiness rossa, errori Redis, aumento di login falliti o 429, kid JWKS sconosciuto, riuso refresh token e audit non raggiungibile.`),\n note('info', `Dettagli`, `Metriche e alert in docs/metrics.md; audit, retention ed export in docs/audit.md.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'operations-tenancy',\n group: 'Operazioni',\n title: 'Multi-tenancy operativa',\n summary: 'Un database e un processo per tenant, con configurazione validata e hot reload.',\n blocks: [\n p(`La multi-tenancy di Accessi isola i tenant a livello di processo e database: non esiste una colonna tenant nelle tabelle Accessi. Ogni tenant ha configurazione, chiavi e store propri.`),\n code('ts', [\n \"import { defineAccessiTenantEnvironment } from 'emilsoftware-utilities/accessi/server';\",\n '',\n 'export default defineAccessiTenantEnvironment({',\n \" tenant: { id: 'acme', hosts: ['accessi.acme.example.com'], port: 3201, enabled: true },\",\n ' database: {',\n \" host: process.env.ACME_DB_HOST!,\",\n ' port: 3050,',\n \" database: process.env.ACME_DB_DATABASE!,\",\n \" user: process.env.ACME_DB_USER!,\",\n \" password: process.env.ACME_DB_PASSWORD!,\",\n ' },',\n ' jwt: {',\n \" algorithm: 'RS256',\",\n \" secret: process.env.ACME_JWT_SECRET!,\",\n \" privateKey: process.env.ACME_JWT_PRIVATE_KEY!,\",\n \" publicKey: process.env.ACME_JWT_PUBLIC_KEY!,\",\n \" issuer: 'https://accessi.acme.example.com',\",\n \" audience: 'accessi-api',\",\n ' },',\n \" encryptionKey: process.env.ACME_ENCRYPTION_KEY!,\",\n \" confirmationEmailUrl: 'https://accessi.acme.example.com',\",\n \" confirmationEmailReturnUrl: 'https://accessi.acme.example.com',\",\n ' email: {',\n \" host: process.env.ACME_SMTP_HOST!,\",\n ' port: 587,',\n \" from: 'noreply@acme.example.com',\",\n ' auth: {',\n \" user: process.env.ACME_SMTP_USER!,\",\n \" pass: process.env.ACME_SMTP_PASSWORD!,\",\n ' },',\n ' },',\n '});',\n ].join('\\n'), 'tenants/acme.environment.ts'),\n code('bash', [\n 'npm run accessi:tenants -- --dir ./tenants --check',\n 'npm run accessi:tenants -- --dir ./tenants --list',\n 'npm run accessi:tenants -- --dir ./tenants --resolve accessi.acme.example.com /api/accessi',\n 'npm run accessi:tenants -- --dir ./tenants --serve --base-port 3200',\n 'npm run accessi:tenants -- --dir ./tenants --serve --base-port 3200 --watch',\n ].join('\\n'), 'CLI tenant'),\n list([\n 'Un processo per tenant è il default: errori, memoria e pool non si mescolano.',\n 'Il supervisore avvia i tenant abilitati e con --watch applica aggiunte, modifiche e rimozioni senza riavviare i tenant invariati.',\n 'Se la nuova configurazione non è valida, il supervisore mantiene la precedente e logga l errore.',\n 'Il router in-process (createAccessiTenantRouter) è opt-in: risolve host, path o header fidato e non accetta header tenant dal client.',\n 'Metriche e audit ricevono il label tenant; gli store Redis usano prefissi separati tramite createAccessiTenantStores.',\n ]),\n note('danger', `Isolamento`, `Non condividere chiavi JWT, encryptionKey, database o prefissi Redis tra tenant. Un token o un ticket di un tenant non deve essere valido per un altro.`),\n note('info', `Dettagli e template`, `Configurazione, hot reload, router e test di leakage in docs/multi-tenancy.md; systemd, Docker, Nginx e Traefik in deploy/.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'operations-upgrade',\n group: 'Operazioni',\n title: 'Versioni, migrazioni e deprecazioni',\n summary: 'Come aggiornare Accessi senza rompere consumer, token o database.',\n blocks: [\n p(`Il package usa semantic-release: feat e fix su dev producono versioni 2.0.0-dev.N; il merge su main produce la versione stabile. Le modifiche breaking richiedono una major e una finestra di migrazione.`),\n table(\n ['Cambiamento', 'Impatto', 'Procedura'],\n [\n ['Aggiornamento patch/minor', 'Nessuna azione di codice attesa', 'Aggiorna la dipendenza, riavvia e verifica /health/ready'],\n ['Nuovo schema database', 'Migrazione DDL', 'Un solo processo, backup, poi repliche con autoUpdateDatabase: false'],\n ['Rotazione chiavi JWT', 'Token firmati con la vecchia chiave', 'Pubblica la nuova in JWKS, mantieni previousPublicKeys, attendi la scadenza dei token, rimuovi la vecchia'],\n ['Passaggio a cookie HttpOnly', 'Cambia il trasporto, non le API', 'Abilita authCookie, aggiorna CORS e CSRF, testa login, refresh, revoca e console'],\n ['Passaggio a RS256/JWKS', 'I token HS256 non sono più validi', 'Pianifica una finestra: i token emessi prima restano validi solo fino alla scadenza'],\n ['Deprecazione root barrel o deep import', 'Import legacy', 'Passa agli entry point accessi/*; i deep import restano fino alla prossima major'],\n ],\n ),\n h(`Gate prima del rilascio`),\n code('bash', [\n 'npm run typecheck',\n 'npm test',\n 'npm run build',\n 'npm run test:pack',\n 'npm run check:naming',\n 'npm run check:deploy',\n 'npm run check:accessi-openapi',\n ].join('\\n'), 'Verifiche'),\n p(`Se modifichi intenzionalmente il contratto OpenAPI, aggiorna il fingerprint con npm run accessi:update-openapi-fingerprint e includilo nel commit. Il diff semantico in CI blocca rimozioni di operation o schema e breaking change non approvati.`),\n note('warn', `Deep import e root barrel`, `Sono supportati fino alla prossima major, ma il layout interno può cambiare in una minor. I consumer devono usare gli entry point dichiarati in package.json#exports. Mappa completa in docs/import-migration.md.`),\n note('info', `ADR`, `Le decisioni su split in pacchetti e multi-tenancy sono in docs/adr/0001-split-package.md e docs/adr/0002-multi-tenancy.md.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'errori',\n group: 'Riferimenti',\n title: 'Contratto errori e codici',\n summary: 'Formato della risposta e codici stabili ACCESSI_* e AUTH_*.',\n blocks: [\n p(`Gli errori HTTP delle API Accessi usano un contratto stabile: severity, status, statusCode, code, error (campo legacy uguale a code), message e details per gli errori di validazione.`),\n code('json', `{\\n \"severity\": \"error\",\\n \"status\": 400,\\n \"statusCode\": 2,\\n \"code\": \"ACCESSI_VALIDATION_ERROR\",\\n \"error\": \"ACCESSI_VALIDATION_ERROR\",\\n \"message\": \"La richiesta contiene dati non validi.\",\\n \"details\": [\"email: deve essere una stringa.\"]\\n}`, 'Errore di validazione'),\n table(\n ['Codice', 'Quando'],\n [\n ['ACCESSI_VALIDATION_ERROR', 'Body o parametri non validi (400).'],\n ['ACCESSI_AUTH_INITIALIZING', 'Bootstrap in corso (503).'],\n ['ACCESSI_AUTH_NOT_INITIALIZED', 'Modulo non inizializzato (500).'],\n ['AUTH_HEADER_MISSING / AUTH_TOKEN_MISSING', 'Header Authorization assente (401).'],\n ['AUTH_TOKEN_INVALID', 'JWT non valido o scaduto (401).'],\n ['AUTH_USER_DISABLED', 'Utente non più autorizzato (401).'],\n ['AUTH_INSUFFICIENT_PERMISSIONS', 'Requisiti non soddisfatti (403).'],\n ['AUTH_REQUIREMENTS_MISCONFIGURED', 'Policy malformata o handler custom mancante (500).'],\n ['ACCESSI_DATABASE_SCHEMA_OUTDATED', 'Schema del database incompatibile.'],\n ['ACCESSI_SERVICE_TOKEN_RATE_LIMITED', 'Troppi tentativi (429).'],\n ],\n ),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'endpoint',\n group: 'Riferimenti',\n title: 'Indice degli endpoint',\n summary: 'Tutte le rotte /api/accessi/* in una tabella.',\n blocks: [\n table(\n ['Area', 'Endpoint principali'],\n [\n ['Auth', 'POST auth/login, auth/get-user-by-token, auth/confirm-reset-password/:token, auth/refresh, auth/revoke-sessions, auth/revoke-token, auth/two-factor/verify, auth/two-factor/resend'],\n ['Email', 'POST email/send-reset-password-email, GET email/reset-password-page/:token'],\n ['Utenti', 'GET user/get-users, POST user/create-managed-user, PUT user/update-user/:codiceUtente, DELETE user/delete-user/:codiceUtente, DELETE user/delete-user-permanent/:codiceUtente, POST user/set-password/:codiceUtente, POST user/set-stato, PATCH user/set-gdpr/:codiceUtente, POST user/register, POST user/login-as/:codiceUtente'],\n ['Permessi', 'GET permission/roles, POST permission/create-role, PUT permission/update-role/:codiceRuolo, DELETE permission/delete-role/:codiceRuolo, POST permission/assign-roles/:codiceUtente, POST permission/assign-permissions/:codiceUtente, GET permission/grants/:codiceUtente, GET permission/menus, GET permission/menu-types, GET permission/groups-with-menus'],\n ['Catalogo', 'POST/PUT/DELETE permission/menus[/:codiceMenu], permission/menu-groups[/:codiceGruppo], permission/menu-types[/:codiceTipo]'],\n ['Configurator', 'PATCH configurator/menus/:codiceMenu/enabled, PATCH configurator/groups/:codiceGruppo/enabled'],\n ['SSO', 'GET/POST federated-auth/providers, PATCH/DELETE providers/:provider, GET/POST users/:codiceUtente/identities, POST users, PATCH users/:codiceUtente/password-login'],\n ['Token', 'POST/GET service-token, DELETE service-token/:tokenId, POST service-token/:tokenId/rotate'],\n ['Schema', 'GET schema (DDL completo + entità presenti, solo admin)'],\n ['Console', 'GET console, console/:view, console/:view/:sub, console/assets/:file'],\n ],\n ),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'antipattern',\n group: 'Riferimenti',\n title: 'Antipattern e checklist',\n summary: 'Che cosa non fare, in breve.',\n blocks: [\n list([\n `Non aprire la porta HTTP prima di initializeAccessiModule.`,\n `Non usare authorizeAccessi come unico strato: valida sempre anche l'input applicativo.`,\n `Non dare per scontato che req.userGrants esista se non hai richiesto dei requisiti.`,\n `Non considerare incrementali assignRolesToUser e assignPermissionsToUser: sono sostitutivi.`,\n `Non far validare i token SSO ad Accessi: passagli solo { provider, subject } verificati.`,\n `Non usare un service token come identità utente.`,\n `Non versionare segreti; jwtOptions.secret deve essere unico per ambiente.`,\n `Non eliminare gruppi o tipi in uso: gestisci l'errore 400 e disabilita invece.`,\n `Non usare il challenge 2FA come JWT.`,\n ]),\n note('ok', `Checklist di rilascio`, `Schema verificato (db:check), segreti da un secret manager, mockDemoUser=false, rate limit pubblico configurato, SMTP reale testato, serviceTokens.defaultTtlDays impostato.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'faq',\n group: 'Riferimenti',\n title: 'Problemi comuni e come risolverli',\n summary: 'Sintomo, causa probabile e rimedio per gli errori più frequenti.',\n blocks: [\n p(`Prima di cambiare configurazione, leggi il codice di errore: Accessi distingue autenticazione, autorizzazione, bootstrap e disponibilità. Un 503 non è un 401 e un 403 non va risolto facendo logout.`),\n table(\n ['Sintomo', 'Causa probabile', 'Rimedio'],\n [\n ['401 AUTH_TOKEN_MISSING', 'Header Authorization assente o malformato', 'Invia Bearer <access-token>; non usare il refresh token come Bearer'],\n ['401 AUTH_TOKEN_INVALID', 'Firma, issuer, audience, scadenza o tipo token errati', 'Allinea issuer/audience e chiavi; rinnova il token con refresh'],\n ['401 AUTH_USER_DISABLED', 'Utente bloccato, cancellato o non più autorizzato', 'Verifica STAREG, flag e stato utente in console'],\n ['403 AUTH_INSUFFICIENT_PERMISSIONS', 'Menu o livello insufficiente, grant non aggiornati', 'Controlla ruoli e grant; verifica che il backend usi introspection se richiede i grant correnti'],\n ['403 AUTH_CSRF_INVALID', 'Cookie mode senza header CSRF o token diverso', 'Invia x-csrf-token letto dal cookie accessi_csrf'],\n ['503 ACCESSI_AUTH_INITIALIZING', 'La porta HTTP è stata aperta prima del bootstrap', 'Attendi initializeAccessiModule o AccessiModule.forRoot prima di app.listen'],\n ['503 AUTH_INTROSPECTION_UNAVAILABLE / AUTH_JWKS_UNAVAILABLE', 'Accessi Service o JWKS non raggiungibile', 'Fail closed: ripristina la rete o il servizio; non autorizzare per errore'],\n ['500 ACCESSI_DATABASE_SCHEMA_OUTDATED', 'Schema Firebird incompatibile', 'Esegui db:check:accessi, poi la migrazione con un solo processo e backup'],\n ['429 ripetuto', 'Rate limit o edge rate limit superato', 'Rispetta Retry-After; se dietro proxy verifica trustProxy e il numero di hop'],\n ['Ticket console non valido', 'Ticket scaduto, già consumato o emesso da un altra istanza', 'Rigenera il ticket; in multi-istanza configura consoleEntry.store su Redis'],\n ['Login senza token e con challenge', '2FA richiesta: il login non è completo', 'Chiama verifyTwoFactor con challengeId e codice, poi usa il token restituito'],\n ['Email di reset non ricevute', 'SMTP non configurato o bloccato', 'Verifica ACCESSI_EMAIL_*, TLS e mittente; i log riportano l errore SMTP senza password'],\n ['CORS o cookie ignorati dal browser', 'Origin non in allowlist o credentials mancanti', 'Origin esplicito, credentials: true, SameSite/Secure coerenti con HTTPS'],\n ],\n ),\n h(`Come isolare il problema`),\n list([\n 'Controlla /health/live e /health/ready: se readiness è rossa, il problema è infrastrutturale.',\n 'Leggi il codice nel body della risposta, non solo lo status HTTP.',\n 'Verifica lo stato dell utente e i suoi grant in console prima di modificare la policy.',\n 'Per i backend fratelli, distingui verifica locale (firma/claim) da introspection (stato e grant correnti).',\n 'Riproduci con un utente di test e un token appena emesso; non riusare token trovati nei log.',\n ], true),\n note('info', `Serve aiuto in più`, `Apri una issue con: versione del package, topologia, endpoint chiamato, status e codice errore, estratto di log senza token o segreti. Non allegare database o file di configurazione con credenziali.`),\n ],\n },\n // -------------------------------------------------------------------------\n {\n id: 'glossario',\n group: 'Riferimenti',\n title: 'Glossario',\n summary: 'I termini usati nella documentazione, senza ambiguità.',\n blocks: [\n table(\n ['Termine', 'Significato'],\n [\n ['Accessi Service', 'Il servizio che possiede database, migrazioni, encryptionKey, SMTP, chiavi JWT e console'],\n ['Proprietario', 'L unico backend o servizio autorizzato a montare AccessiModule e a eseguire migrazioni'],\n ['Resource server', 'Backend fratello che verifica i token Accessi e non ha credenziali del database Accessi'],\n ['Entry point', 'Subpath pubblico del package, per esempio accessi/server o accessi/client/public'],\n ['Root barrel', 'Import legacy da emilsoftware-utilities; resta fino alla prossima major ma non è consigliato'],\n ['Abilitazione', 'Permesso su un menu con livello NESSUNA=0, LETTURA=10, SCRITTURA=20, SPECIAL=30'],\n ['Grant', 'Insieme di abilitazioni e ruoli correnti di un utente, letto da Accessi'],\n ['Menu code', 'Codice stabile del menu usato nelle policy di autorizzazione'],\n ['Service token', 'Credenziale macchina-a-macchina con scope, non un utente e mai per il browser'],\n ['Introspection', 'Chiamata service-to-service che restituisce active, profilo e grant correnti di un token'],\n ['JWKS', 'Documento con le chiavi pubbliche per verificare JWT asimmetrici'],\n ['kid', 'Identificativo della chiave JWT, usato per la rotazione'],\n ['jti', 'Identificativo del singolo JWT, usato per la revoca puntuale'],\n ['Refresh family', 'Catena di refresh token collegati; il riuso di uno consumato revoca la famiglia'],\n ['Console ticket', 'Ticket monouso e a scadenza breve per aprire la console senza rimettere il JWT nell URL'],\n ['Tenant', 'Cliente isolato con database, processo, chiavi e store propri'],\n ['Sink', 'Destinazione esterna per audit o metriche (Redis, HTTP, callback, OpenTelemetry)'],\n ['Readiness', 'Stato che indica se il servizio può ricevere traffico: bootstrap, DB, schema e store'],\n ['Fail closed', 'In caso di dubbio o dipendenza non raggiungibile, la richiesta viene rifiutata'],\n ['CSRF double-submit', 'Cookie leggibile più header uguale per proteggere le richieste che modificano stato'],\n ],\n ),\n ],\n },\n];\n\n/** Elenco ordinato dei gruppi per l'indice. */\nexport function wikiGroups(): Array<{ group: string; sections: WikiSection[] }> {\n const groups: Array<{ group: string; sections: WikiSection[] }> = [];\n for (const section of WIKI_SECTIONS) {\n let bucket = groups.find((item) => item.group === section.group);\n if (!bucket) {\n bucket = { group: section.group, sections: [] };\n groups.push(bucket);\n }\n bucket.sections.push(section);\n }\n return groups;\n}\n\n/**\n * Digest compatto in Markdown per l'IA che costruisce il backend integratore.\n * Deriva dagli stessi dati della wiki, quindi resta sincronizzato.\n */\nexport function buildAiDigest(): string {\n const lines: string[] = [\n `# Accessi (emilsoftware-utilities) - guida compatta per l'integrazione backend`,\n '',\n `Modulo NestJS/Express + Firebird per autenticazione JWT, autorizzazione per menu, utenti, 2FA e passwordless, SSO generico, service token e console.`,\n '',\n ];\n\n for (const { group, sections } of wikiGroups()) {\n lines.push(`## ${group}`);\n for (const section of sections) {\n lines.push(`### ${section.title}`);\n lines.push(section.summary);\n for (const block of section.blocks) {\n switch (block.kind) {\n case 'p':\n lines.push(block.text);\n break;\n case 'h':\n lines.push(`**${block.text}**`);\n break;\n case 'list':\n block.items.forEach((item, index) => lines.push(`${block.ordered ? `${index + 1}.` : '-'} ${item}`));\n break;\n case 'code':\n lines.push('```' + block.language);\n lines.push(block.code);\n lines.push('```');\n break;\n case 'callout':\n lines.push(`[${block.tone.toUpperCase()}] ${block.title ? block.title + ': ' : ''}${block.text}`);\n break;\n case 'table':\n lines.push('| ' + block.head.join(' | ') + ' |');\n lines.push('| ' + block.head.map(() => '---').join(' | ') + ' |');\n block.rows.forEach((row) => lines.push('| ' + row.join(' | ') + ' |'));\n break;\n }\n }\n lines.push('');\n }\n }\n\n return lines.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { AuditQueryRequest } from '../dtos';
|
|
3
|
+
/**
|
|
4
|
+
* Consultazione ed export dell'audit persistente.
|
|
5
|
+
*
|
|
6
|
+
* Richiede un utente super/admin Accessi. Se non e configurato uno store
|
|
7
|
+
* interrogabile (`audit.store` o un sink con `query`), risponde 501 con un
|
|
8
|
+
* codice stabile: l'host puo continuare a usare il solo log strutturato.
|
|
9
|
+
*/
|
|
10
|
+
export declare class AccessiAuditController {
|
|
11
|
+
private store;
|
|
12
|
+
private static toQuery;
|
|
13
|
+
private authorize;
|
|
14
|
+
query(request: Request, query: AuditQueryRequest, res: Response): Promise<Response>;
|
|
15
|
+
export(request: Request, query: AuditQueryRequest, res: Response): Promise<Response | void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
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
|
+
var AccessiAuditController_1;
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.AccessiAuditController = void 0;
|
|
26
|
+
const common_1 = require("@nestjs/common");
|
|
27
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
28
|
+
const Utilities_1 = require("../../Utilities");
|
|
29
|
+
const dtos_1 = require("../dtos");
|
|
30
|
+
const JwtSimpleGuard_1 = require("../jwt/JwtSimpleGuard");
|
|
31
|
+
const accessControl_1 = require("../security/accessControl");
|
|
32
|
+
const audit_1 = require("../security/audit");
|
|
33
|
+
/** Dimensione massima della pagina usata dall'export NDJSON. */
|
|
34
|
+
const EXPORT_PAGE_SIZE = 1000;
|
|
35
|
+
/** Limite di sicurezza per un singolo export. */
|
|
36
|
+
const EXPORT_MAX_RECORDS = 100000;
|
|
37
|
+
/**
|
|
38
|
+
* Consultazione ed export dell'audit persistente.
|
|
39
|
+
*
|
|
40
|
+
* Richiede un utente super/admin Accessi. Se non e configurato uno store
|
|
41
|
+
* interrogabile (`audit.store` o un sink con `query`), risponde 501 con un
|
|
42
|
+
* codice stabile: l'host puo continuare a usare il solo log strutturato.
|
|
43
|
+
*/
|
|
44
|
+
let AccessiAuditController = AccessiAuditController_1 = class AccessiAuditController {
|
|
45
|
+
store() {
|
|
46
|
+
const store = (0, audit_1.getAccessiAuditStore)();
|
|
47
|
+
if (!store) {
|
|
48
|
+
throw new common_1.HttpException({
|
|
49
|
+
code: 'ACCESSI_AUDIT_STORE_DISABLED',
|
|
50
|
+
message: 'Audit persistente non configurato su questa istanza.',
|
|
51
|
+
}, common_1.HttpStatus.NOT_IMPLEMENTED);
|
|
52
|
+
}
|
|
53
|
+
return store;
|
|
54
|
+
}
|
|
55
|
+
static toQuery(request) {
|
|
56
|
+
var _a;
|
|
57
|
+
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (((_a = request.event) === null || _a === void 0 ? void 0 : _a.trim()) ? { event: request.event.trim() } : {})), (request.from ? { from: request.from } : {})), (request.to ? { to: request.to } : {})), (request.codiceUtente !== undefined ? { codiceUtente: request.codiceUtente } : {})), (request.limit !== undefined ? { limit: request.limit } : {})), (request.offset !== undefined ? { offset: request.offset } : {})), (request.order ? { order: request.order } : {}));
|
|
58
|
+
}
|
|
59
|
+
authorize(request) {
|
|
60
|
+
const user = (0, accessControl_1.getAuthenticatedAccessiUser)(request);
|
|
61
|
+
(0, accessControl_1.ensureConsoleAccess)(user, 'La consultazione audit richiede un superutente o un admin Accessi.');
|
|
62
|
+
}
|
|
63
|
+
query(request, query, res) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
try {
|
|
66
|
+
this.authorize(request);
|
|
67
|
+
const page = yield this.store().query(AccessiAuditController_1.toQuery(query));
|
|
68
|
+
return Utilities_1.RestUtilities.sendBaseResponse(res, page);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return Utilities_1.RestUtilities.sendErrorMessage(res, error, AccessiAuditController_1.name, error instanceof common_1.HttpException ? error.getStatus() : common_1.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
export(request, query, res) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
try {
|
|
78
|
+
this.authorize(request);
|
|
79
|
+
const store = this.store();
|
|
80
|
+
const filter = AccessiAuditController_1.toQuery(Object.assign(Object.assign({}, query), { limit: undefined, offset: undefined }));
|
|
81
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
82
|
+
res.setHeader('Content-Type', 'application/x-ndjson; charset=utf-8');
|
|
83
|
+
res.setHeader('Cache-Control', 'no-store, max-age=0');
|
|
84
|
+
res.setHeader('Content-Disposition', `attachment; filename="accessi-audit-${date}.ndjson"`);
|
|
85
|
+
let offset = 0;
|
|
86
|
+
let written = 0;
|
|
87
|
+
for (;;) {
|
|
88
|
+
const remaining = EXPORT_MAX_RECORDS - written;
|
|
89
|
+
if (remaining <= 0)
|
|
90
|
+
break;
|
|
91
|
+
const page = yield store.query(Object.assign(Object.assign({}, filter), { limit: Math.min(EXPORT_PAGE_SIZE, remaining), offset }));
|
|
92
|
+
for (const record of page.records) {
|
|
93
|
+
res.write(`${JSON.stringify(record)}\n`);
|
|
94
|
+
written += 1;
|
|
95
|
+
}
|
|
96
|
+
offset += page.records.length;
|
|
97
|
+
if (page.records.length === 0 || offset >= page.total)
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
res.end();
|
|
101
|
+
return res;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (res.headersSent) {
|
|
105
|
+
// L'export e gia iniziato: chiudere in modo esplicito invece di inviare JSON sopra l'NDJSON.
|
|
106
|
+
res.end();
|
|
107
|
+
return res;
|
|
108
|
+
}
|
|
109
|
+
return Utilities_1.RestUtilities.sendErrorMessage(res, error, AccessiAuditController_1.name, error instanceof common_1.HttpException ? error.getStatus() : common_1.HttpStatus.INTERNAL_SERVER_ERROR);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
exports.AccessiAuditController = AccessiAuditController;
|
|
115
|
+
__decorate([
|
|
116
|
+
(0, common_1.Get)(),
|
|
117
|
+
(0, swagger_1.ApiOperation)({
|
|
118
|
+
operationId: 'queryAudit',
|
|
119
|
+
summary: 'Elenca gli eventi di audit persistiti',
|
|
120
|
+
description: 'Richiede audit.store o un sink interrogabile. Supporta filtro per evento, intervallo, utente e paginazione.',
|
|
121
|
+
}),
|
|
122
|
+
(0, swagger_1.ApiOkResponse)({ description: 'Pagina di record di audit redatti.' }),
|
|
123
|
+
(0, swagger_1.ApiResponse)({ status: 401, type: dtos_1.ErrorResponse, description: 'Token Accessi mancante o non valido.' }),
|
|
124
|
+
(0, swagger_1.ApiResponse)({ status: 403, type: dtos_1.ErrorResponse, description: 'Utente non abilitato alla console.' }),
|
|
125
|
+
(0, swagger_1.ApiResponse)({ status: 501, type: dtos_1.ErrorResponse, description: 'Audit persistente non configurato.' }),
|
|
126
|
+
__param(0, (0, common_1.Req)()),
|
|
127
|
+
__param(1, (0, common_1.Query)()),
|
|
128
|
+
__param(2, (0, common_1.Res)()),
|
|
129
|
+
__metadata("design:type", Function),
|
|
130
|
+
__metadata("design:paramtypes", [Object, dtos_1.AuditQueryRequest, Object]),
|
|
131
|
+
__metadata("design:returntype", Promise)
|
|
132
|
+
], AccessiAuditController.prototype, "query", null);
|
|
133
|
+
__decorate([
|
|
134
|
+
(0, common_1.Get)('export'),
|
|
135
|
+
(0, swagger_1.ApiOperation)({
|
|
136
|
+
operationId: 'exportAudit',
|
|
137
|
+
summary: 'Esporta gli eventi di audit in NDJSON',
|
|
138
|
+
description: 'Stessi filtri della query, senza paginazione. Il file contiene record gia redatti; limite di sicurezza 100000 record.',
|
|
139
|
+
}),
|
|
140
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: 'NDJSON scaricabile.' }),
|
|
141
|
+
(0, swagger_1.ApiResponse)({ status: 501, type: dtos_1.ErrorResponse, description: 'Audit persistente non configurato.' }),
|
|
142
|
+
__param(0, (0, common_1.Req)()),
|
|
143
|
+
__param(1, (0, common_1.Query)()),
|
|
144
|
+
__param(2, (0, common_1.Res)()),
|
|
145
|
+
__metadata("design:type", Function),
|
|
146
|
+
__metadata("design:paramtypes", [Object, dtos_1.AuditQueryRequest, Object]),
|
|
147
|
+
__metadata("design:returntype", Promise)
|
|
148
|
+
], AccessiAuditController.prototype, "export", null);
|
|
149
|
+
exports.AccessiAuditController = AccessiAuditController = AccessiAuditController_1 = __decorate([
|
|
150
|
+
(0, swagger_1.ApiTags)('Audit'),
|
|
151
|
+
(0, swagger_1.ApiBearerAuth)(),
|
|
152
|
+
(0, common_1.Controller)('accessi/audit'),
|
|
153
|
+
(0, common_1.UseGuards)(JwtSimpleGuard_1.JwtSimpleGuard)
|
|
154
|
+
], AccessiAuditController);
|
|
155
|
+
//# sourceMappingURL=AccessiAuditController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessiAuditController.js","sourceRoot":"","sources":["../../../src/accessi-service/controllers/AccessiAuditController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Controller,\n Get,\n HttpException,\n HttpStatus,\n Query,\n Req,\n Res,\n UseGuards,\n} from '@nestjs/common';\nimport {\n ApiBearerAuth,\n ApiOkResponse,\n ApiOperation,\n ApiResponse,\n ApiTags,\n} from '@nestjs/swagger';\nimport { Request, Response } from 'express';\nimport { RestUtilities } from '../../Utilities';\nimport { AuditQueryRequest, ErrorResponse } from '../dtos';\nimport { JwtSimpleGuard } from '../jwt/JwtSimpleGuard';\nimport { ensureConsoleAccess, getAuthenticatedAccessiUser } from '../security/accessControl';\nimport { getAccessiAuditStore } from '../security/audit';\nimport type { AccessiAuditQuery, AccessiAuditQueryableSink } from '../security/audit';\n\n/** Dimensione massima della pagina usata dall'export NDJSON. */\nconst EXPORT_PAGE_SIZE = 1_000;\n/** Limite di sicurezza per un singolo export. */\nconst EXPORT_MAX_RECORDS = 100_000;\n\n/**\n * Consultazione ed export dell'audit persistente.\n *\n * Richiede un utente super/admin Accessi. Se non e configurato uno store\n * interrogabile (`audit.store` o un sink con `query`), risponde 501 con un\n * codice stabile: l'host puo continuare a usare il solo log strutturato.\n */\n@ApiTags('Audit')\n@ApiBearerAuth()\n@Controller('accessi/audit')\n@UseGuards(JwtSimpleGuard)\nexport class AccessiAuditController {\n private store(): AccessiAuditQueryableSink {\n const store = getAccessiAuditStore();\n if (!store) {\n throw new HttpException(\n {\n code: 'ACCESSI_AUDIT_STORE_DISABLED',\n message: 'Audit persistente non configurato su questa istanza.',\n },\n HttpStatus.NOT_IMPLEMENTED,\n );\n }\n return store;\n }\n\n private static toQuery(request: AuditQueryRequest): AccessiAuditQuery {\n return {\n ...(request.event?.trim() ? { event: request.event.trim() } : {}),\n ...(request.from ? { from: request.from } : {}),\n ...(request.to ? { to: request.to } : {}),\n ...(request.codiceUtente !== undefined ? { codiceUtente: request.codiceUtente } : {}),\n ...(request.limit !== undefined ? { limit: request.limit } : {}),\n ...(request.offset !== undefined ? { offset: request.offset } : {}),\n ...(request.order ? { order: request.order } : {}),\n };\n }\n\n private authorize(request: Request): void {\n const user = getAuthenticatedAccessiUser(request);\n ensureConsoleAccess(user, 'La consultazione audit richiede un superutente o un admin Accessi.');\n }\n\n @Get()\n @ApiOperation({\n operationId: 'queryAudit',\n summary: 'Elenca gli eventi di audit persistiti',\n description:\n 'Richiede audit.store o un sink interrogabile. Supporta filtro per evento, intervallo, utente e paginazione.',\n })\n @ApiOkResponse({ description: 'Pagina di record di audit redatti.' })\n @ApiResponse({ status: 401, type: ErrorResponse, description: 'Token Accessi mancante o non valido.' })\n @ApiResponse({ status: 403, type: ErrorResponse, description: 'Utente non abilitato alla console.' })\n @ApiResponse({ status: 501, type: ErrorResponse, description: 'Audit persistente non configurato.' })\n async query(\n @Req() request: Request,\n @Query() query: AuditQueryRequest,\n @Res() res: Response,\n ): Promise<Response> {\n try {\n this.authorize(request);\n const page = await this.store().query(AccessiAuditController.toQuery(query));\n return RestUtilities.sendBaseResponse(res, page);\n } catch (error) {\n return RestUtilities.sendErrorMessage(\n res,\n error,\n AccessiAuditController.name,\n error instanceof HttpException ? error.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR,\n );\n }\n }\n\n @Get('export')\n @ApiOperation({\n operationId: 'exportAudit',\n summary: 'Esporta gli eventi di audit in NDJSON',\n description:\n 'Stessi filtri della query, senza paginazione. Il file contiene record gia redatti; limite di sicurezza 100000 record.',\n })\n @ApiResponse({ status: 200, description: 'NDJSON scaricabile.' })\n @ApiResponse({ status: 501, type: ErrorResponse, description: 'Audit persistente non configurato.' })\n async export(\n @Req() request: Request,\n @Query() query: AuditQueryRequest,\n @Res() res: Response,\n ): Promise<Response | void> {\n try {\n this.authorize(request);\n const store = this.store();\n const filter = AccessiAuditController.toQuery({ ...query, limit: undefined, offset: undefined });\n const date = new Date().toISOString().slice(0, 10);\n res.setHeader('Content-Type', 'application/x-ndjson; charset=utf-8');\n res.setHeader('Cache-Control', 'no-store, max-age=0');\n res.setHeader('Content-Disposition', `attachment; filename=\"accessi-audit-${date}.ndjson\"`);\n\n let offset = 0;\n let written = 0;\n for (;;) {\n const remaining = EXPORT_MAX_RECORDS - written;\n if (remaining <= 0) break;\n const page = await store.query({\n ...filter,\n limit: Math.min(EXPORT_PAGE_SIZE, remaining),\n offset,\n });\n for (const record of page.records) {\n res.write(`${JSON.stringify(record)}\\n`);\n written += 1;\n }\n offset += page.records.length;\n if (page.records.length === 0 || offset >= page.total) break;\n }\n res.end();\n return res;\n } catch (error) {\n if (res.headersSent) {\n // L'export e gia iniziato: chiudere in modo esplicito invece di inviare JSON sopra l'NDJSON.\n res.end();\n return res;\n }\n return RestUtilities.sendErrorMessage(\n res,\n error,\n AccessiAuditController.name,\n error instanceof HttpException ? error.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR,\n );\n }\n }\n}\n"]}
|