@oneuptime/common 13.0.8 → 14.0.1
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/Models/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/BaseAPI.ts +26 -5
- package/Server/API/GlobalConfigAPI.ts +228 -462
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/StatusPageAPI.ts +100 -42
- package/Server/API/TeamMemberAPI.ts +10 -1
- package/Server/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/UserAuthorization.ts +38 -16
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +10 -0
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +59 -6
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/ProjectService.ts +284 -0
- package/Server/Services/RumSessionPinService.ts +25 -6
- package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/Monitor/RootCauseList.ts +139 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
- package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Markdown.test.ts +183 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
- package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
- package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/Icon.test.tsx +26 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/Permission.ts +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Icon/Icon.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- package/build/dist/Server/API/BaseAPI.js +26 -5
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +93 -43
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +8 -1
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +7 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +48 -6
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +214 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +24 -6
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
- package/build/dist/Types/Permission.js +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
|
@@ -38,6 +38,11 @@ import {
|
|
|
38
38
|
import { getJestSpyOn } from "../../../Tests/Spy";
|
|
39
39
|
import getJestMockFunction from "../../../Tests/MockType";
|
|
40
40
|
import UserPermissionUtil from "../../../Server/Utils/UserPermission/UserPermission";
|
|
41
|
+
import {
|
|
42
|
+
installFakeEnterpriseModule,
|
|
43
|
+
uninstallEnterpriseModule,
|
|
44
|
+
} from "../Enterprise/FakeEnterpriseModule";
|
|
45
|
+
import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
|
|
41
46
|
|
|
42
47
|
jest.mock("../../../Server/Utils/Logger");
|
|
43
48
|
jest.mock("../../../Server/Middleware/ProjectAuthorization");
|
|
@@ -50,6 +55,28 @@ jest.mock("../../../Server/Services/ProjectService");
|
|
|
50
55
|
jest.mock("../../../Server/Services/TeamMemberService");
|
|
51
56
|
jest.mock("../../../Types/HashedString");
|
|
52
57
|
jest.mock("../../../Types/JSONFunctions");
|
|
58
|
+
/*
|
|
59
|
+
* SSO enforcement is an Enterprise Edition control (on while SSO is active:
|
|
60
|
+
* ee loaded and, with billing off, a license that covers SSO; relaxed on the
|
|
61
|
+
* Community Edition and while the license is lapsed). The enforcement tests
|
|
62
|
+
* below install a fake enterprise module with a valid license and pin billing
|
|
63
|
+
* so they test the same thing locally and in CI, whose config.env sets
|
|
64
|
+
* BILLING_ENABLED=true. The Community Edition and lapsed-license cases live in
|
|
65
|
+
* UserAuthorizationEditionEnforcement.test.ts.
|
|
66
|
+
*/
|
|
67
|
+
jest.mock("../../../Server/EnvironmentConfig", () => {
|
|
68
|
+
const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
|
|
69
|
+
jest.requireActual(
|
|
70
|
+
"../Enterprise/TestBillingFlag",
|
|
71
|
+
) as typeof import("../Enterprise/TestBillingFlag");
|
|
72
|
+
|
|
73
|
+
return billingFlag.withLiveBillingFlag(
|
|
74
|
+
jest.requireActual("../../../Server/EnvironmentConfig") as Record<
|
|
75
|
+
string,
|
|
76
|
+
unknown
|
|
77
|
+
>,
|
|
78
|
+
);
|
|
79
|
+
});
|
|
53
80
|
/*
|
|
54
81
|
* PasswordHash carries a pre-existing TS5.9 diagnostic that fails any suite
|
|
55
82
|
* whose runtime require graph reaches it (DatabaseService, the base class of
|
|
@@ -695,13 +722,17 @@ describe("UserMiddleware", () => {
|
|
|
695
722
|
|
|
696
723
|
afterEach(() => {
|
|
697
724
|
jest.clearAllMocks();
|
|
725
|
+
uninstallEnterpriseModule();
|
|
698
726
|
});
|
|
699
727
|
|
|
700
728
|
/*
|
|
701
729
|
* By default no project requires a specific SSO provider (discriminator),
|
|
702
|
-
* and the instance-wide "Require SSO for Login" flag is off.
|
|
730
|
+
* and the instance-wide "Require SSO for Login" flag is off. The
|
|
731
|
+
* Enterprise Edition is loaded, so a configured requirement is enforced.
|
|
703
732
|
*/
|
|
704
733
|
beforeEach(() => {
|
|
734
|
+
setTestBillingEnabled(false);
|
|
735
|
+
installFakeEnterpriseModule();
|
|
705
736
|
spyGetRequireSsoWithSsoProviderId.mockResolvedValue(null);
|
|
706
737
|
spyGetGlobalRequireSsoForLogin.mockResolvedValue(false);
|
|
707
738
|
});
|
|
@@ -822,13 +853,17 @@ describe("UserMiddleware", () => {
|
|
|
822
853
|
|
|
823
854
|
afterEach(() => {
|
|
824
855
|
jest.clearAllMocks();
|
|
856
|
+
uninstallEnterpriseModule();
|
|
825
857
|
});
|
|
826
858
|
|
|
827
859
|
/*
|
|
828
860
|
* By default neither a project's own nor the instance-wide "Require SSO for
|
|
829
|
-
* Login" flag is on, and no project requires a specific SSO provider.
|
|
861
|
+
* Login" flag is on, and no project requires a specific SSO provider. The
|
|
862
|
+
* Enterprise Edition is loaded, so a configured requirement is enforced.
|
|
830
863
|
*/
|
|
831
864
|
beforeEach(() => {
|
|
865
|
+
setTestBillingEnabled(false);
|
|
866
|
+
installFakeEnterpriseModule();
|
|
832
867
|
spyGetProjectRequireSsoForLogin.mockResolvedValue(false);
|
|
833
868
|
spyGetRequireSsoWithSsoProviderId.mockResolvedValue(null);
|
|
834
869
|
spyGetGlobalRequireSsoForLogin.mockResolvedValue(false);
|
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import UserMiddleware from "../../../Server/Middleware/UserAuthorization";
|
|
2
|
+
import AccessTokenService from "../../../Server/Services/AccessTokenService";
|
|
3
|
+
import GlobalConfigService from "../../../Server/Services/GlobalConfigService";
|
|
4
|
+
import ProjectService from "../../../Server/Services/ProjectService";
|
|
5
|
+
import EnterpriseEdition from "../../../Server/Enterprise/EnterpriseEdition";
|
|
6
|
+
import { ExpressRequest } from "../../../Server/Utils/Express";
|
|
7
|
+
import UserPermissionUtil from "../../../Server/Utils/UserPermission/UserPermission";
|
|
8
|
+
import Dictionary from "../../../Types/Dictionary";
|
|
9
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
10
|
+
import SsoAuthorizationException from "../../../Types/Exception/SsoAuthorizationException";
|
|
11
|
+
import TenantNotFoundException from "../../../Types/Exception/TenantNotFoundException";
|
|
12
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
13
|
+
import { UserTenantAccessPermission } from "../../../Types/Permission";
|
|
14
|
+
import FakeEnterpriseModule, {
|
|
15
|
+
createEditionStateCases,
|
|
16
|
+
createLicenseSnapshotWithStatus,
|
|
17
|
+
EditionStateCase,
|
|
18
|
+
installFakeEnterpriseModule,
|
|
19
|
+
uninstallEnterpriseModule,
|
|
20
|
+
} from "../Enterprise/FakeEnterpriseModule";
|
|
21
|
+
import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
|
|
22
|
+
import { getJestSpyOn } from "../../Spy";
|
|
23
|
+
import {
|
|
24
|
+
afterEach,
|
|
25
|
+
beforeEach,
|
|
26
|
+
describe,
|
|
27
|
+
expect,
|
|
28
|
+
jest,
|
|
29
|
+
test,
|
|
30
|
+
} from "@jest/globals";
|
|
31
|
+
|
|
32
|
+
type SpyInstance = ReturnType<typeof getJestSpyOn>;
|
|
33
|
+
|
|
34
|
+
jest.mock("../../../Server/Utils/Logger");
|
|
35
|
+
jest.mock("../../../Server/Services/AccessTokenService");
|
|
36
|
+
jest.mock("../../../Server/Services/GlobalConfigService");
|
|
37
|
+
jest.mock("../../../Server/Services/ProjectService");
|
|
38
|
+
jest.mock("../../../Server/Services/TeamMemberService");
|
|
39
|
+
jest.mock("../../../Server/Services/UserService");
|
|
40
|
+
/*
|
|
41
|
+
* PasswordHash carries a pre-existing TS5.9 diagnostic that fails any suite
|
|
42
|
+
* whose runtime require graph reaches it; nothing password-related is under
|
|
43
|
+
* test here, so it is replaced with a factory (see UserAuthorization.test.ts).
|
|
44
|
+
*/
|
|
45
|
+
jest.mock("../../../Server/Utils/PasswordHash", () => {
|
|
46
|
+
return {
|
|
47
|
+
__esModule: true,
|
|
48
|
+
default: {
|
|
49
|
+
hash: jest.fn(),
|
|
50
|
+
verify: jest.fn(),
|
|
51
|
+
generateSalt: jest.fn(),
|
|
52
|
+
needsUpgrade: jest.fn(),
|
|
53
|
+
applyPepper: jest.fn(),
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
jest.mock("../../../Server/EnvironmentConfig", () => {
|
|
58
|
+
const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
|
|
59
|
+
jest.requireActual(
|
|
60
|
+
"../Enterprise/TestBillingFlag",
|
|
61
|
+
) as typeof import("../Enterprise/TestBillingFlag");
|
|
62
|
+
|
|
63
|
+
return billingFlag.withLiveBillingFlag(
|
|
64
|
+
jest.requireActual("../../../Server/EnvironmentConfig") as Record<
|
|
65
|
+
string,
|
|
66
|
+
unknown
|
|
67
|
+
>,
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* Project, instance-wide and specific-provider SSO requirements are enforced
|
|
73
|
+
* by UserMiddleware on every tenant request, while SSO is ACTIVE
|
|
74
|
+
* (EnterpriseEdition.isFeatureActive(SSO), through EditionEnforcement):
|
|
75
|
+
*
|
|
76
|
+
* - ENFORCED: the Enterprise Edition with billing on (any license), or with
|
|
77
|
+
* billing off while the license covers SSO (valid, grace, trial, accepted
|
|
78
|
+
* unverified legacy) - and while the license state is UNKNOWN (not read
|
|
79
|
+
* yet, unreadable), which must never relax SSO.
|
|
80
|
+
* - RELAXED: the Community Edition, and an Enterprise install whose license
|
|
81
|
+
* has lapsed (expired past grace, missing after the trial, invalid, or
|
|
82
|
+
* without SSO). Their SSO login routes do not exist or refuse, so
|
|
83
|
+
* enforcing a stored requirement would lock every user out; users sign
|
|
84
|
+
* in with their password instead.
|
|
85
|
+
* - Error while deciding: ENFORCED.
|
|
86
|
+
*
|
|
87
|
+
* A license change applies to the next request, without a restart.
|
|
88
|
+
*
|
|
89
|
+
* Billing and the edition are pinned in every test (CI's config.env sets
|
|
90
|
+
* BILLING_ENABLED=true).
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
const EDITION_CASES: Array<EditionStateCase> = createEditionStateCases();
|
|
94
|
+
|
|
95
|
+
const toMatrix: (
|
|
96
|
+
cases: Array<EditionStateCase>,
|
|
97
|
+
) => Array<[string, EditionStateCase]> = (
|
|
98
|
+
cases: Array<EditionStateCase>,
|
|
99
|
+
): Array<[string, EditionStateCase]> => {
|
|
100
|
+
return cases.map(
|
|
101
|
+
(editionCase: EditionStateCase): [string, EditionStateCase] => {
|
|
102
|
+
return [editionCase.label, editionCase];
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Every state in which SSO requirements are enforced.
|
|
108
|
+
const ENFORCED_MATRIX: Array<[string, EditionStateCase]> = toMatrix(
|
|
109
|
+
EDITION_CASES.filter((editionCase: EditionStateCase): boolean => {
|
|
110
|
+
return editionCase.isActive;
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
// Every state in which they are relaxed: CE, and a lapsed Enterprise license.
|
|
115
|
+
const RELAXED_MATRIX: Array<[string, EditionStateCase]> = toMatrix(
|
|
116
|
+
EDITION_CASES.filter((editionCase: EditionStateCase): boolean => {
|
|
117
|
+
return !editionCase.isActive;
|
|
118
|
+
}),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const projectId: ObjectID = new ObjectID(
|
|
122
|
+
"11111111-1111-4111-8111-111111111111",
|
|
123
|
+
);
|
|
124
|
+
const otherProjectId: ObjectID = new ObjectID(
|
|
125
|
+
"33333333-3333-4333-8333-333333333333",
|
|
126
|
+
);
|
|
127
|
+
const userId: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
128
|
+
|
|
129
|
+
const userRequest: ExpressRequest = {} as ExpressRequest;
|
|
130
|
+
const masterAdminRequest: ExpressRequest = {
|
|
131
|
+
userAuthorization: { isMasterAdmin: true },
|
|
132
|
+
} as unknown as ExpressRequest;
|
|
133
|
+
|
|
134
|
+
const tenantPermission: UserTenantAccessPermission = {
|
|
135
|
+
projectId,
|
|
136
|
+
permissions: [],
|
|
137
|
+
} as unknown as UserTenantAccessPermission;
|
|
138
|
+
|
|
139
|
+
let projectRequireSso: SpyInstance;
|
|
140
|
+
let projectRequiredProvider: SpyInstance;
|
|
141
|
+
let globalRequireSso: SpyInstance;
|
|
142
|
+
let tenantPermissionLookup: SpyInstance;
|
|
143
|
+
let ssoSatisfied: SpyInstance;
|
|
144
|
+
|
|
145
|
+
const resolveSingle: (
|
|
146
|
+
req?: ExpressRequest,
|
|
147
|
+
) => Promise<UserTenantAccessPermission | null> = async (
|
|
148
|
+
req?: ExpressRequest,
|
|
149
|
+
): Promise<UserTenantAccessPermission | null> => {
|
|
150
|
+
return await UserMiddleware.getUserTenantAccessPermissionWithTenantId({
|
|
151
|
+
req: req || userRequest,
|
|
152
|
+
tenantId: projectId,
|
|
153
|
+
userId,
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const resolveMulti: (
|
|
158
|
+
req?: ExpressRequest,
|
|
159
|
+
) => Promise<Dictionary<UserTenantAccessPermission> | null> = async (
|
|
160
|
+
req?: ExpressRequest,
|
|
161
|
+
): Promise<Dictionary<UserTenantAccessPermission> | null> => {
|
|
162
|
+
return await UserMiddleware.getUserTenantAccessPermissionForMultiTenant(
|
|
163
|
+
req || userRequest,
|
|
164
|
+
userId,
|
|
165
|
+
[projectId, otherProjectId],
|
|
166
|
+
);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
describe("UserMiddleware SSO enforcement by edition", () => {
|
|
170
|
+
beforeEach(() => {
|
|
171
|
+
setTestBillingEnabled(false);
|
|
172
|
+
uninstallEnterpriseModule();
|
|
173
|
+
|
|
174
|
+
projectRequireSso = getJestSpyOn(
|
|
175
|
+
ProjectService,
|
|
176
|
+
"getRequireSsoForLogin",
|
|
177
|
+
).mockResolvedValue(false);
|
|
178
|
+
projectRequiredProvider = getJestSpyOn(
|
|
179
|
+
ProjectService,
|
|
180
|
+
"getRequireSsoWithSsoProviderId",
|
|
181
|
+
).mockResolvedValue(null);
|
|
182
|
+
globalRequireSso = getJestSpyOn(
|
|
183
|
+
GlobalConfigService,
|
|
184
|
+
"getRequireSsoForLogin",
|
|
185
|
+
).mockResolvedValue(false);
|
|
186
|
+
tenantPermissionLookup = getJestSpyOn(
|
|
187
|
+
AccessTokenService,
|
|
188
|
+
"getUserTenantAccessPermission",
|
|
189
|
+
).mockResolvedValue(tenantPermission);
|
|
190
|
+
// No SSO token on the request unless a test says otherwise.
|
|
191
|
+
ssoSatisfied = getJestSpyOn(
|
|
192
|
+
UserMiddleware,
|
|
193
|
+
"isSsoSatisfiedForProject",
|
|
194
|
+
).mockResolvedValue(false);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
afterEach(() => {
|
|
198
|
+
uninstallEnterpriseModule();
|
|
199
|
+
setTestBillingEnabled(false);
|
|
200
|
+
jest.restoreAllMocks();
|
|
201
|
+
jest.clearAllMocks();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("both matrices are populated, and a lapsed Enterprise license is among the relaxed states", () => {
|
|
205
|
+
expect(ENFORCED_MATRIX.length).toBeGreaterThan(0);
|
|
206
|
+
expect(
|
|
207
|
+
RELAXED_MATRIX.filter(
|
|
208
|
+
([, editionCase]: [string, EditionStateCase]): boolean => {
|
|
209
|
+
return editionCase.isLoaded;
|
|
210
|
+
},
|
|
211
|
+
).length,
|
|
212
|
+
).toBeGreaterThanOrEqual(4);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
describe("SSO active: enforced", () => {
|
|
216
|
+
describe.each(ENFORCED_MATRIX)(
|
|
217
|
+
"%s",
|
|
218
|
+
(_label: string, editionCase: EditionStateCase) => {
|
|
219
|
+
beforeEach(() => {
|
|
220
|
+
editionCase.apply();
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
test("a project that requires SSO refuses a request without an SSO token", async () => {
|
|
224
|
+
projectRequireSso.mockResolvedValue(true);
|
|
225
|
+
|
|
226
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
227
|
+
new SsoAuthorizationException(),
|
|
228
|
+
);
|
|
229
|
+
expect(ssoSatisfied).toHaveBeenCalledWith({
|
|
230
|
+
req: userRequest,
|
|
231
|
+
projectId,
|
|
232
|
+
userId,
|
|
233
|
+
requiredSsoProviderId: undefined,
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test("a project that requires a specific provider passes that provider on", async () => {
|
|
238
|
+
const providerId: ObjectID = ObjectID.generate();
|
|
239
|
+
projectRequireSso.mockResolvedValue(true);
|
|
240
|
+
projectRequiredProvider.mockResolvedValue(providerId);
|
|
241
|
+
|
|
242
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
243
|
+
new SsoAuthorizationException(),
|
|
244
|
+
);
|
|
245
|
+
expect(ssoSatisfied).toHaveBeenCalledWith(
|
|
246
|
+
expect.objectContaining({ requiredSsoProviderId: providerId }),
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test("a satisfied SSO token lets the request through", async () => {
|
|
251
|
+
projectRequireSso.mockResolvedValue(true);
|
|
252
|
+
ssoSatisfied.mockResolvedValue(true);
|
|
253
|
+
|
|
254
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("the instance-wide requirement refuses a user without an SSO token", async () => {
|
|
258
|
+
globalRequireSso.mockResolvedValue(true);
|
|
259
|
+
|
|
260
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
261
|
+
new SsoAuthorizationException(),
|
|
262
|
+
);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("master admins stay exempt from the instance-wide requirement (password recovery path)", async () => {
|
|
266
|
+
globalRequireSso.mockResolvedValue(true);
|
|
267
|
+
|
|
268
|
+
await expect(resolveSingle(masterAdminRequest)).resolves.toBe(
|
|
269
|
+
tenantPermission,
|
|
270
|
+
);
|
|
271
|
+
expect(globalRequireSso).not.toHaveBeenCalled();
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
test("master admins are still held to a project's own requirement", async () => {
|
|
275
|
+
projectRequireSso.mockResolvedValue(true);
|
|
276
|
+
|
|
277
|
+
await expect(resolveSingle(masterAdminRequest)).rejects.toThrow(
|
|
278
|
+
new SsoAuthorizationException(),
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
test("the multi-tenant path hands SSO-required projects the default permission only", async () => {
|
|
283
|
+
projectRequireSso.mockImplementation(
|
|
284
|
+
async (id: ObjectID): Promise<boolean> => {
|
|
285
|
+
return id.toString() === projectId.toString();
|
|
286
|
+
},
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
const result: Dictionary<UserTenantAccessPermission> | null =
|
|
290
|
+
await resolveMulti();
|
|
291
|
+
|
|
292
|
+
expect(result?.[projectId.toString()]).toEqual(
|
|
293
|
+
UserPermissionUtil.getDefaultUserTenantAccessPermission(projectId),
|
|
294
|
+
);
|
|
295
|
+
expect(result?.[otherProjectId.toString()]).toBe(tenantPermission);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
test("the multi-tenant path applies the instance-wide requirement to every project", async () => {
|
|
299
|
+
globalRequireSso.mockResolvedValue(true);
|
|
300
|
+
|
|
301
|
+
const result: Dictionary<UserTenantAccessPermission> | null =
|
|
302
|
+
await resolveMulti();
|
|
303
|
+
|
|
304
|
+
expect(result?.[projectId.toString()]).toEqual(
|
|
305
|
+
UserPermissionUtil.getDefaultUserTenantAccessPermission(projectId),
|
|
306
|
+
);
|
|
307
|
+
expect(result?.[otherProjectId.toString()]).toEqual(
|
|
308
|
+
UserPermissionUtil.getDefaultUserTenantAccessPermission(
|
|
309
|
+
otherProjectId,
|
|
310
|
+
),
|
|
311
|
+
);
|
|
312
|
+
});
|
|
313
|
+
},
|
|
314
|
+
);
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
describe("SSO not active (Community Edition, lapsed license): relaxed, because there is no SSO login to satisfy it", () => {
|
|
318
|
+
describe.each(RELAXED_MATRIX)(
|
|
319
|
+
"%s",
|
|
320
|
+
(_label: string, editionCase: EditionStateCase) => {
|
|
321
|
+
beforeEach(() => {
|
|
322
|
+
editionCase.apply();
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
test("a project that requires SSO still lets its members in", async () => {
|
|
326
|
+
projectRequireSso.mockResolvedValue(true);
|
|
327
|
+
|
|
328
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
329
|
+
expect(ssoSatisfied).not.toHaveBeenCalled();
|
|
330
|
+
expect(projectRequiredProvider).not.toHaveBeenCalled();
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
test("the instance-wide requirement is not even read", async () => {
|
|
334
|
+
globalRequireSso.mockResolvedValue(true);
|
|
335
|
+
|
|
336
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
337
|
+
expect(globalRequireSso).not.toHaveBeenCalled();
|
|
338
|
+
expect(ssoSatisfied).not.toHaveBeenCalled();
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test("an unknown project is still refused as TenantNotFound (the project lookup still runs)", async () => {
|
|
342
|
+
projectRequireSso.mockRejectedValue(
|
|
343
|
+
new BadDataException("Project not found"),
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
347
|
+
new TenantNotFoundException("Invalid tenantId"),
|
|
348
|
+
);
|
|
349
|
+
expect(projectRequireSso).toHaveBeenCalledWith(projectId);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
test("any other project lookup error still propagates", async () => {
|
|
353
|
+
projectRequireSso.mockRejectedValue(new Error("database down"));
|
|
354
|
+
|
|
355
|
+
await expect(resolveSingle()).rejects.toThrow("database down");
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("the user's real permission is what they get - relaxing SSO grants nothing extra", async () => {
|
|
359
|
+
projectRequireSso.mockResolvedValue(true);
|
|
360
|
+
tenantPermissionLookup.mockResolvedValue(null);
|
|
361
|
+
|
|
362
|
+
await expect(resolveSingle()).resolves.toBeNull();
|
|
363
|
+
expect(tenantPermissionLookup).toHaveBeenCalledWith(
|
|
364
|
+
userId,
|
|
365
|
+
projectId,
|
|
366
|
+
);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
test("the multi-tenant path returns real permissions without reading any SSO requirement", async () => {
|
|
370
|
+
projectRequireSso.mockResolvedValue(true);
|
|
371
|
+
globalRequireSso.mockResolvedValue(true);
|
|
372
|
+
|
|
373
|
+
const result: Dictionary<UserTenantAccessPermission> | null =
|
|
374
|
+
await resolveMulti();
|
|
375
|
+
|
|
376
|
+
expect(result).toEqual({
|
|
377
|
+
[projectId.toString()]: tenantPermission,
|
|
378
|
+
[otherProjectId.toString()]: tenantPermission,
|
|
379
|
+
});
|
|
380
|
+
expect(projectRequireSso).not.toHaveBeenCalled();
|
|
381
|
+
expect(globalRequireSso).not.toHaveBeenCalled();
|
|
382
|
+
expect(ssoSatisfied).not.toHaveBeenCalled();
|
|
383
|
+
});
|
|
384
|
+
},
|
|
385
|
+
);
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
describe("switching editions changes enforcement with no restart and no data change", () => {
|
|
389
|
+
test("the same stored requirement is relaxed on CE and enforced again once ee is loaded with a license", async () => {
|
|
390
|
+
projectRequireSso.mockResolvedValue(true);
|
|
391
|
+
|
|
392
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
393
|
+
|
|
394
|
+
installFakeEnterpriseModule({
|
|
395
|
+
snapshot: createLicenseSnapshotWithStatus("valid"),
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
399
|
+
new SsoAuthorizationException(),
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
uninstallEnterpriseModule();
|
|
403
|
+
|
|
404
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
describe("a license change applies to the next request, without a restart", () => {
|
|
409
|
+
test("an SSO-required project accepts a password session while the license is lapsed and enforces SSO again after renewal", async () => {
|
|
410
|
+
projectRequireSso.mockResolvedValue(true);
|
|
411
|
+
|
|
412
|
+
const fake: FakeEnterpriseModule = installFakeEnterpriseModule({
|
|
413
|
+
snapshot: createLicenseSnapshotWithStatus("valid"),
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
// Licensed: a password session (no SSO token) is refused.
|
|
417
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
418
|
+
new SsoAuthorizationException(),
|
|
419
|
+
);
|
|
420
|
+
|
|
421
|
+
// The license lapses: the same password session is let in.
|
|
422
|
+
fake.setSnapshot(createLicenseSnapshotWithStatus("expired"));
|
|
423
|
+
|
|
424
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
425
|
+
expect(tenantPermissionLookup).toHaveBeenLastCalledWith(
|
|
426
|
+
userId,
|
|
427
|
+
projectId,
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
// Renewed: refused again, with no restart and no data change.
|
|
431
|
+
fake.setSnapshot(createLicenseSnapshotWithStatus("valid"));
|
|
432
|
+
|
|
433
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
434
|
+
new SsoAuthorizationException(),
|
|
435
|
+
);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
test("the instance-wide requirement and the multi-tenant path follow the license too", async () => {
|
|
439
|
+
globalRequireSso.mockResolvedValue(true);
|
|
440
|
+
|
|
441
|
+
const fake: FakeEnterpriseModule = installFakeEnterpriseModule({
|
|
442
|
+
snapshot: createLicenseSnapshotWithStatus("missing"),
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
await expect(resolveSingle()).resolves.toBe(tenantPermission);
|
|
446
|
+
expect(await resolveMulti()).toEqual({
|
|
447
|
+
[projectId.toString()]: tenantPermission,
|
|
448
|
+
[otherProjectId.toString()]: tenantPermission,
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
fake.setSnapshot(createLicenseSnapshotWithStatus("grace"));
|
|
452
|
+
|
|
453
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
454
|
+
new SsoAuthorizationException(),
|
|
455
|
+
);
|
|
456
|
+
expect(await resolveMulti()).toEqual({
|
|
457
|
+
[projectId.toString()]:
|
|
458
|
+
UserPermissionUtil.getDefaultUserTenantAccessPermission(projectId),
|
|
459
|
+
[otherProjectId.toString()]:
|
|
460
|
+
UserPermissionUtil.getDefaultUserTenantAccessPermission(
|
|
461
|
+
otherProjectId,
|
|
462
|
+
),
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test("an unknown license state keeps enforcing (never relaxes SSO)", async () => {
|
|
467
|
+
projectRequireSso.mockResolvedValue(true);
|
|
468
|
+
|
|
469
|
+
const fake: FakeEnterpriseModule = installFakeEnterpriseModule({
|
|
470
|
+
snapshot: createLicenseSnapshotWithStatus("valid"),
|
|
471
|
+
});
|
|
472
|
+
fake.setSnapshot(null);
|
|
473
|
+
|
|
474
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
475
|
+
new SsoAuthorizationException(),
|
|
476
|
+
);
|
|
477
|
+
|
|
478
|
+
fake.licensing.getCachedSnapshotError = new Error("unreadable");
|
|
479
|
+
|
|
480
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
481
|
+
new SsoAuthorizationException(),
|
|
482
|
+
);
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
describe("an error while deciding answers 'enforce'", () => {
|
|
487
|
+
test("single-tenant", async () => {
|
|
488
|
+
getJestSpyOn(EnterpriseEdition, "isFeatureActive").mockImplementation(
|
|
489
|
+
(): boolean => {
|
|
490
|
+
throw new Error("facade exploded");
|
|
491
|
+
},
|
|
492
|
+
);
|
|
493
|
+
projectRequireSso.mockResolvedValue(true);
|
|
494
|
+
|
|
495
|
+
await expect(resolveSingle()).rejects.toThrow(
|
|
496
|
+
new SsoAuthorizationException(),
|
|
497
|
+
);
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
test("multi-tenant", async () => {
|
|
501
|
+
getJestSpyOn(EnterpriseEdition, "isFeatureActive").mockImplementation(
|
|
502
|
+
(): boolean => {
|
|
503
|
+
throw new Error("facade exploded");
|
|
504
|
+
},
|
|
505
|
+
);
|
|
506
|
+
projectRequireSso.mockResolvedValue(true);
|
|
507
|
+
|
|
508
|
+
const result: Dictionary<UserTenantAccessPermission> | null =
|
|
509
|
+
await resolveMulti();
|
|
510
|
+
|
|
511
|
+
expect(result?.[projectId.toString()]).toEqual(
|
|
512
|
+
UserPermissionUtil.getDefaultUserTenantAccessPermission(projectId),
|
|
513
|
+
);
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
});
|