@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
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import { act, cleanup, render, screen } from "@testing-library/react";
|
|
11
|
+
import userEvent from "@testing-library/user-event";
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import path from "path";
|
|
14
|
+
import * as React from "react";
|
|
15
|
+
import { MemoryRouter } from "react-router-dom";
|
|
16
|
+
import API from "../../../UI/Utils/API/API";
|
|
17
|
+
import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
|
|
18
|
+
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
19
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
20
|
+
import LoginUtil from "../../../UI/Utils/Login";
|
|
21
|
+
import Navigation from "../../../UI/Utils/Navigation";
|
|
22
|
+
import UiAnalytics from "../../../UI/Utils/Analytics";
|
|
23
|
+
import UserUtil from "../../../UI/Utils/User";
|
|
24
|
+
import i18n from "../../../../App/FeatureSet/Accounts/src/Utils/i18n";
|
|
25
|
+
import english from "../../../../App/FeatureSet/Accounts/src/Locales/en.json";
|
|
26
|
+
import german from "../../../../App/FeatureSet/Accounts/src/Locales/de.json";
|
|
27
|
+
import LoginPage from "../../../../App/FeatureSet/Accounts/src/Pages/Login";
|
|
28
|
+
import LoginWithSSOPage from "../../../../App/FeatureSet/Accounts/src/Pages/LoginWithSSO";
|
|
29
|
+
import {
|
|
30
|
+
isSsoLoginOffered,
|
|
31
|
+
isSsoUnavailableStatusCode,
|
|
32
|
+
} from "../../../../App/FeatureSet/Accounts/src/Utils/SsoAvailability";
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* Sign-in surfaces on the Community Edition (design v2 section 0/5).
|
|
36
|
+
*
|
|
37
|
+
* SSO login is part of the Enterprise Edition, which the cloud also runs. So:
|
|
38
|
+
* - the password page offers "Use single sign-on (SSO) instead" only when
|
|
39
|
+
* the EFFECTIVE edition (env.js IS_ENTERPRISE_EDITION, true only when the
|
|
40
|
+
* enterprise code is loaded) is Enterprise, or billing is on;
|
|
41
|
+
* - the SSO page, reached directly on a Community Edition server, gets 404
|
|
42
|
+
* from every provider lookup, and on an Enterprise Edition server whose
|
|
43
|
+
* license has lapsed (or does not include SSO) it gets 402 - SSO is off
|
|
44
|
+
* there until a license is activated, and that server still offers the
|
|
45
|
+
* link. Either way the page explains that SSO needs the Enterprise
|
|
46
|
+
* Edition with an active license, instead of "no SSO configuration
|
|
47
|
+
* found" - and never tells an Enterprise server that SSO is only part of
|
|
48
|
+
* the Enterprise Edition, as it used to.
|
|
49
|
+
*
|
|
50
|
+
* Billing and the edition are pinned in every test: CI's config.env sets
|
|
51
|
+
* BILLING_ENABLED=true.
|
|
52
|
+
*
|
|
53
|
+
* The explanation is a real locale string (sso.enterpriseEditionRequired),
|
|
54
|
+
* not the English defaultValue the page passes as a safety net: the tests
|
|
55
|
+
* below check the key exists in every Accounts locale and that the page
|
|
56
|
+
* renders the locale's text, in English and in another language.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
let billingEnabledForTest: boolean = false;
|
|
60
|
+
let enterpriseEditionForTest: boolean = false;
|
|
61
|
+
|
|
62
|
+
jest.mock("../../../UI/Config", () => {
|
|
63
|
+
const actual: Record<string, unknown> = jest.requireActual(
|
|
64
|
+
"../../../UI/Config",
|
|
65
|
+
) as Record<string, unknown>;
|
|
66
|
+
|
|
67
|
+
const mocked: Record<string, unknown> = { ...actual };
|
|
68
|
+
|
|
69
|
+
Object.defineProperty(mocked, "BILLING_ENABLED", {
|
|
70
|
+
get: (): boolean => {
|
|
71
|
+
return billingEnabledForTest;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
Object.defineProperty(mocked, "IS_ENTERPRISE_EDITION", {
|
|
76
|
+
get: (): boolean => {
|
|
77
|
+
return enterpriseEditionForTest;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return mocked;
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
jest.mock("../../../UI/Components/EditionLabel/EditionLabel", () => {
|
|
85
|
+
return {
|
|
86
|
+
__esModule: true,
|
|
87
|
+
default: (): null => {
|
|
88
|
+
return null;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const USE_SSO_LINK: string = "Use single sign-on (SSO) instead";
|
|
94
|
+
const ENTERPRISE_NOTICE: RegExp =
|
|
95
|
+
/Single sign-on \(SSO\) is not available on this server/;
|
|
96
|
+
const USE_PASSWORD_LINK: string = "Use username and password instead.";
|
|
97
|
+
const ENTERPRISE_NOTICE_KEY: string = "sso.enterpriseEditionRequired";
|
|
98
|
+
const ENTERPRISE_NOTICE_TEXT: string =
|
|
99
|
+
"Single sign-on (SSO) is not available on this server: it needs the OneUptime Enterprise Edition with an active license. Sign in with your email and password instead.";
|
|
100
|
+
/*
|
|
101
|
+
* The explanation before the license could stop SSO. It only fits the
|
|
102
|
+
* Community Edition: on an Enterprise server whose license lapsed it says the
|
|
103
|
+
* server is not what it is.
|
|
104
|
+
*/
|
|
105
|
+
const RETIRED_COMMUNITY_ONLY_NOTICE_TEXT: string =
|
|
106
|
+
"Single sign-on (SSO) is part of the OneUptime Enterprise Edition and is not available on this server. Sign in with your email and password instead.";
|
|
107
|
+
const LOGIN_WITH_SSO_SOURCE: string = path.resolve(
|
|
108
|
+
__dirname,
|
|
109
|
+
"..",
|
|
110
|
+
"..",
|
|
111
|
+
"..",
|
|
112
|
+
"..",
|
|
113
|
+
"App",
|
|
114
|
+
"FeatureSet",
|
|
115
|
+
"Accounts",
|
|
116
|
+
"src",
|
|
117
|
+
"Pages",
|
|
118
|
+
"LoginWithSSO.tsx",
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* What the explanation must say to fit both servers that show it: the
|
|
123
|
+
* Community Edition (no SSO routes) needs to hear about the Enterprise
|
|
124
|
+
* Edition, an Enterprise server with a lapsed license about the license. And
|
|
125
|
+
* it must not claim the server lacks the Enterprise Edition.
|
|
126
|
+
*/
|
|
127
|
+
interface NoticeRule {
|
|
128
|
+
problem: string;
|
|
129
|
+
pattern: RegExp;
|
|
130
|
+
// true: the text must match; false: it must not.
|
|
131
|
+
isRequired: boolean;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const NOTICE_RULES: Array<NoticeRule> = [
|
|
135
|
+
{
|
|
136
|
+
problem: "does not say SSO is unavailable here",
|
|
137
|
+
pattern: /\bnot available on this server\b/,
|
|
138
|
+
isRequired: true,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
problem: "does not name the Enterprise Edition",
|
|
142
|
+
pattern: /\bOneUptime Enterprise Edition\b/,
|
|
143
|
+
isRequired: true,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
problem: "does not mention the license",
|
|
147
|
+
pattern: /\bactive license\b/,
|
|
148
|
+
isRequired: true,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
problem: "tells an Enterprise server it is not the Enterprise Edition",
|
|
152
|
+
pattern:
|
|
153
|
+
/\bis part of the OneUptime Enterprise Edition and is not available\b/,
|
|
154
|
+
isRequired: false,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
problem: "does not point to password sign-in",
|
|
158
|
+
pattern: /\bemail and password\b/,
|
|
159
|
+
isRequired: true,
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
|
|
163
|
+
const noticeProblems: (text: string) => Array<string> = (
|
|
164
|
+
text: string,
|
|
165
|
+
): Array<string> => {
|
|
166
|
+
return NOTICE_RULES.filter((rule: NoticeRule): boolean => {
|
|
167
|
+
return rule.pattern.test(text) !== rule.isRequired;
|
|
168
|
+
}).map((rule: NoticeRule): string => {
|
|
169
|
+
return rule.problem;
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const ACCOUNTS_LOCALES_DIR: string = path.resolve(
|
|
174
|
+
__dirname,
|
|
175
|
+
"..",
|
|
176
|
+
"..",
|
|
177
|
+
"..",
|
|
178
|
+
"..",
|
|
179
|
+
"App",
|
|
180
|
+
"FeatureSet",
|
|
181
|
+
"Accounts",
|
|
182
|
+
"src",
|
|
183
|
+
"Locales",
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
type LookupAnswer = { status: number; data: Array<JSONObject> | JSONObject };
|
|
187
|
+
|
|
188
|
+
let globalSamlAnswer: LookupAnswer;
|
|
189
|
+
let globalOidcAnswer: LookupAnswer;
|
|
190
|
+
let emailSamlAnswer: LookupAnswer;
|
|
191
|
+
let emailOidcAnswer: LookupAnswer;
|
|
192
|
+
let requestedUrls: Array<string>;
|
|
193
|
+
|
|
194
|
+
const toResponse: (
|
|
195
|
+
answer: LookupAnswer,
|
|
196
|
+
) => HTTPResponse<JSONObject> | HTTPErrorResponse = (
|
|
197
|
+
answer: LookupAnswer,
|
|
198
|
+
): HTTPResponse<JSONObject> | HTTPErrorResponse => {
|
|
199
|
+
if (answer.status >= 400) {
|
|
200
|
+
return new HTTPErrorResponse(answer.status, answer.data, {});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return new HTTPResponse<JSONObject>(answer.status, answer.data, {});
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const NOT_SERVED: LookupAnswer = {
|
|
207
|
+
status: 404,
|
|
208
|
+
data: { message: "Page not found - /identity/..." },
|
|
209
|
+
};
|
|
210
|
+
const NO_PROVIDERS: LookupAnswer = { status: 200, data: [] };
|
|
211
|
+
const NO_CONFIG_FOR_EMAIL: LookupAnswer = {
|
|
212
|
+
status: 400,
|
|
213
|
+
data: { message: "No SSO config found for this user" },
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const renderLogin: () => void = (): void => {
|
|
217
|
+
render(
|
|
218
|
+
<MemoryRouter>
|
|
219
|
+
<LoginPage />
|
|
220
|
+
</MemoryRouter>,
|
|
221
|
+
);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
const renderSso: () => Promise<void> = async (): Promise<void> => {
|
|
225
|
+
await act(async () => {
|
|
226
|
+
render(
|
|
227
|
+
<MemoryRouter>
|
|
228
|
+
<LoginWithSSOPage />
|
|
229
|
+
</MemoryRouter>,
|
|
230
|
+
);
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
const submitEmail: (email: string) => Promise<void> = async (
|
|
235
|
+
email: string,
|
|
236
|
+
): Promise<void> => {
|
|
237
|
+
const user: ReturnType<typeof userEvent.setup> = userEvent.setup({
|
|
238
|
+
delay: null,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
await user.type(await screen.findByTestId("email"), email);
|
|
242
|
+
|
|
243
|
+
await act(async () => {
|
|
244
|
+
await user.click(screen.getByTestId("Login with SSO"));
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
describe("Accounts sign-in on the Community and Enterprise Editions", () => {
|
|
249
|
+
beforeEach(() => {
|
|
250
|
+
billingEnabledForTest = false;
|
|
251
|
+
enterpriseEditionForTest = false;
|
|
252
|
+
requestedUrls = [];
|
|
253
|
+
globalSamlAnswer = NO_PROVIDERS;
|
|
254
|
+
globalOidcAnswer = NO_PROVIDERS;
|
|
255
|
+
emailSamlAnswer = NO_CONFIG_FOR_EMAIL;
|
|
256
|
+
emailOidcAnswer = NO_CONFIG_FOR_EMAIL;
|
|
257
|
+
|
|
258
|
+
jest.spyOn(UserUtil, "isLoggedIn").mockReturnValue(false);
|
|
259
|
+
jest.spyOn(Navigation, "navigate").mockImplementation(() => {});
|
|
260
|
+
jest.spyOn(Navigation, "getQueryStringByName").mockReturnValue("");
|
|
261
|
+
jest.spyOn(UiAnalytics, "userAuth").mockImplementation(() => {});
|
|
262
|
+
jest.spyOn(UiAnalytics, "capture").mockImplementation(() => {});
|
|
263
|
+
jest.spyOn(LoginUtil, "login").mockImplementation(() => {});
|
|
264
|
+
|
|
265
|
+
jest
|
|
266
|
+
.spyOn(API, "get")
|
|
267
|
+
.mockImplementation(
|
|
268
|
+
async (
|
|
269
|
+
options: Parameters<typeof API.get>[0],
|
|
270
|
+
): Promise<HTTPResponse<JSONObject> | HTTPErrorResponse> => {
|
|
271
|
+
const url: string = options.url?.toString() || "";
|
|
272
|
+
requestedUrls.push(url);
|
|
273
|
+
|
|
274
|
+
if (url.includes("/global-sso/service-provider-login")) {
|
|
275
|
+
return toResponse(globalSamlAnswer);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (url.includes("/global-oidc/service-provider-login")) {
|
|
279
|
+
return toResponse(globalOidcAnswer);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (url.includes("/service-provider-login-oidc")) {
|
|
283
|
+
return toResponse(emailOidcAnswer);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (url.includes("/service-provider-login")) {
|
|
287
|
+
return toResponse(emailSamlAnswer);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return toResponse(NOT_SERVED);
|
|
291
|
+
},
|
|
292
|
+
);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
afterEach(async () => {
|
|
296
|
+
cleanup();
|
|
297
|
+
jest.restoreAllMocks();
|
|
298
|
+
billingEnabledForTest = false;
|
|
299
|
+
enterpriseEditionForTest = false;
|
|
300
|
+
await i18n.changeLanguage("en");
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
describe("SsoAvailability", () => {
|
|
304
|
+
test.each([
|
|
305
|
+
[false, false, false],
|
|
306
|
+
[true, false, true],
|
|
307
|
+
[false, true, true],
|
|
308
|
+
[true, true, true],
|
|
309
|
+
])(
|
|
310
|
+
"IS_ENTERPRISE_EDITION=%p, BILLING_ENABLED=%p -> SSO offered: %p",
|
|
311
|
+
(enterprise: boolean, billing: boolean, offered: boolean) => {
|
|
312
|
+
enterpriseEditionForTest = enterprise;
|
|
313
|
+
billingEnabledForTest = billing;
|
|
314
|
+
|
|
315
|
+
expect(isSsoLoginOffered()).toBe(offered);
|
|
316
|
+
},
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
test.each([
|
|
320
|
+
[404, true],
|
|
321
|
+
[402, true],
|
|
322
|
+
[400, false],
|
|
323
|
+
[401, false],
|
|
324
|
+
[403, false],
|
|
325
|
+
[500, false],
|
|
326
|
+
[200, false],
|
|
327
|
+
])(
|
|
328
|
+
"status %p means 'this server has no SSO login': %p",
|
|
329
|
+
(statusCode: number, unavailable: boolean) => {
|
|
330
|
+
expect(isSsoUnavailableStatusCode(statusCode)).toBe(unavailable);
|
|
331
|
+
},
|
|
332
|
+
);
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
describe("password sign-in page", () => {
|
|
336
|
+
test("the Community Edition does not offer SSO", async () => {
|
|
337
|
+
renderLogin();
|
|
338
|
+
|
|
339
|
+
expect(await screen.findByTestId("email")).toBeInTheDocument();
|
|
340
|
+
expect(screen.getByTestId("password")).toBeInTheDocument();
|
|
341
|
+
expect(screen.queryByText(USE_SSO_LINK)).not.toBeInTheDocument();
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
test("the Enterprise Edition offers SSO", async () => {
|
|
345
|
+
enterpriseEditionForTest = true;
|
|
346
|
+
renderLogin();
|
|
347
|
+
|
|
348
|
+
expect(await screen.findByTestId("email")).toBeInTheDocument();
|
|
349
|
+
expect(screen.getByText(USE_SSO_LINK)).toBeInTheDocument();
|
|
350
|
+
expect(screen.getByText(USE_SSO_LINK).closest("a")).toHaveAttribute(
|
|
351
|
+
"href",
|
|
352
|
+
"/accounts/sso",
|
|
353
|
+
);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
test("the cloud (billing on) offers SSO", async () => {
|
|
357
|
+
billingEnabledForTest = true;
|
|
358
|
+
renderLogin();
|
|
359
|
+
|
|
360
|
+
expect(await screen.findByTestId("email")).toBeInTheDocument();
|
|
361
|
+
expect(screen.getByText(USE_SSO_LINK)).toBeInTheDocument();
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
describe("SSO sign-in page", () => {
|
|
366
|
+
test("on the Community Edition (the provider routes answer 404) it explains SSO is an Enterprise Edition feature", async () => {
|
|
367
|
+
globalSamlAnswer = NOT_SERVED;
|
|
368
|
+
globalOidcAnswer = NOT_SERVED;
|
|
369
|
+
|
|
370
|
+
await renderSso();
|
|
371
|
+
|
|
372
|
+
expect(
|
|
373
|
+
await screen.findByTestId("sso-enterprise-edition-required"),
|
|
374
|
+
).toBeInTheDocument();
|
|
375
|
+
expect(screen.getByText(ENTERPRISE_NOTICE)).toBeInTheDocument();
|
|
376
|
+
expect(screen.getByText(USE_PASSWORD_LINK).closest("a")).toHaveAttribute(
|
|
377
|
+
"href",
|
|
378
|
+
"/accounts/login",
|
|
379
|
+
);
|
|
380
|
+
// No email form to fill in for a lookup that cannot succeed.
|
|
381
|
+
expect(screen.queryByTestId("email")).not.toBeInTheDocument();
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
test("the explanation is the only message: the notice and the way back, nothing else", async () => {
|
|
385
|
+
globalSamlAnswer = NOT_SERVED;
|
|
386
|
+
globalOidcAnswer = NOT_SERVED;
|
|
387
|
+
|
|
388
|
+
await renderSso();
|
|
389
|
+
|
|
390
|
+
const notice: HTMLElement = await screen.findByTestId(
|
|
391
|
+
"sso-enterprise-edition-required",
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
expect(notice.textContent).toBe(
|
|
395
|
+
`${ENTERPRISE_NOTICE_TEXT}${USE_PASSWORD_LINK}`,
|
|
396
|
+
);
|
|
397
|
+
expect(screen.getAllByText(ENTERPRISE_NOTICE)).toHaveLength(1);
|
|
398
|
+
expect(
|
|
399
|
+
screen.queryByText(/No SSO configuration found/),
|
|
400
|
+
).not.toBeInTheDocument();
|
|
401
|
+
expect(screen.queryByText(english.sso.subtitle)).not.toBeInTheDocument();
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
test("the explanation resolves from the Accounts locales, not from its defaultValue", async () => {
|
|
405
|
+
globalSamlAnswer = NOT_SERVED;
|
|
406
|
+
globalOidcAnswer = NOT_SERVED;
|
|
407
|
+
|
|
408
|
+
expect(i18n.exists(ENTERPRISE_NOTICE_KEY)).toBe(true);
|
|
409
|
+
expect(english.sso.enterpriseEditionRequired).toBe(
|
|
410
|
+
ENTERPRISE_NOTICE_TEXT,
|
|
411
|
+
);
|
|
412
|
+
// Without a defaultValue, a missing key would come back as the key.
|
|
413
|
+
expect(i18n.t(ENTERPRISE_NOTICE_KEY)).toBe(ENTERPRISE_NOTICE_TEXT);
|
|
414
|
+
|
|
415
|
+
await renderSso();
|
|
416
|
+
|
|
417
|
+
expect(
|
|
418
|
+
await screen.findByTestId("sso-enterprise-edition-required"),
|
|
419
|
+
).toHaveTextContent(ENTERPRISE_NOTICE_TEXT);
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
test("the explanation is translated: German gets the German text", async () => {
|
|
423
|
+
globalSamlAnswer = NOT_SERVED;
|
|
424
|
+
globalOidcAnswer = NOT_SERVED;
|
|
425
|
+
await i18n.changeLanguage("de");
|
|
426
|
+
|
|
427
|
+
await renderSso();
|
|
428
|
+
|
|
429
|
+
const notice: HTMLElement = await screen.findByTestId(
|
|
430
|
+
"sso-enterprise-edition-required",
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
expect(notice).toHaveTextContent(german.sso.enterpriseEditionRequired);
|
|
434
|
+
expect(notice).not.toHaveTextContent(ENTERPRISE_NOTICE_TEXT);
|
|
435
|
+
expect(german.sso.enterpriseEditionRequired).not.toBe(
|
|
436
|
+
ENTERPRISE_NOTICE_TEXT,
|
|
437
|
+
);
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
test("every Accounts locale translates the explanation", () => {
|
|
441
|
+
const locales: Array<string> = fs
|
|
442
|
+
.readdirSync(ACCOUNTS_LOCALES_DIR)
|
|
443
|
+
.filter((file: string) => {
|
|
444
|
+
return file.endsWith(".json") && file !== "en.json";
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
expect(locales).toHaveLength(16);
|
|
448
|
+
|
|
449
|
+
for (const file of locales) {
|
|
450
|
+
const locale: { sso?: Record<string, unknown> } = JSON.parse(
|
|
451
|
+
fs.readFileSync(path.join(ACCOUNTS_LOCALES_DIR, file), "utf8"),
|
|
452
|
+
) as { sso?: Record<string, unknown> };
|
|
453
|
+
const value: unknown = locale.sso?.["enterpriseEditionRequired"];
|
|
454
|
+
|
|
455
|
+
expect([file, typeof value]).toEqual([file, "string"]);
|
|
456
|
+
expect((value as string).trim()).not.toBe("");
|
|
457
|
+
expect([file, value]).not.toEqual([file, ENTERPRISE_NOTICE_TEXT]);
|
|
458
|
+
expect([file, value]).not.toEqual([
|
|
459
|
+
file,
|
|
460
|
+
RETIRED_COMMUNITY_ONLY_NOTICE_TEXT,
|
|
461
|
+
]);
|
|
462
|
+
// The product name stays in Latin script in every language.
|
|
463
|
+
expect([
|
|
464
|
+
file,
|
|
465
|
+
(value as string).includes("OneUptime Enterprise Edition"),
|
|
466
|
+
]).toEqual([file, true]);
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
test("a 402 from the provider routes is explained the same way", async () => {
|
|
471
|
+
globalSamlAnswer = { status: 402, data: { message: "Payment required" } };
|
|
472
|
+
globalOidcAnswer = { status: 402, data: { message: "Payment required" } };
|
|
473
|
+
|
|
474
|
+
await renderSso();
|
|
475
|
+
|
|
476
|
+
expect(
|
|
477
|
+
await screen.findByTestId("sso-enterprise-edition-required"),
|
|
478
|
+
).toBeInTheDocument();
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
/*
|
|
482
|
+
* An Enterprise Edition server whose license has lapsed still offers the
|
|
483
|
+
* SSO link (isSsoLoginOffered follows the edition, not the license), and
|
|
484
|
+
* every SSO discovery route answers 402 until a license is activated.
|
|
485
|
+
*/
|
|
486
|
+
test("an Enterprise server whose license lapsed (402 everywhere): the explanation fits it", async () => {
|
|
487
|
+
enterpriseEditionForTest = true;
|
|
488
|
+
const lapsed: LookupAnswer = {
|
|
489
|
+
status: 402,
|
|
490
|
+
data: {
|
|
491
|
+
message:
|
|
492
|
+
"Single sign-on is unavailable because this OneUptime installation's Enterprise license has lapsed or does not include it.",
|
|
493
|
+
},
|
|
494
|
+
};
|
|
495
|
+
globalSamlAnswer = lapsed;
|
|
496
|
+
globalOidcAnswer = lapsed;
|
|
497
|
+
emailSamlAnswer = lapsed;
|
|
498
|
+
emailOidcAnswer = lapsed;
|
|
499
|
+
|
|
500
|
+
expect(isSsoLoginOffered()).toBe(true);
|
|
501
|
+
|
|
502
|
+
await renderSso();
|
|
503
|
+
|
|
504
|
+
const notice: HTMLElement = await screen.findByTestId(
|
|
505
|
+
"sso-enterprise-edition-required",
|
|
506
|
+
);
|
|
507
|
+
|
|
508
|
+
expect(notice).toHaveTextContent(ENTERPRISE_NOTICE_TEXT);
|
|
509
|
+
expect(noticeProblems(notice.textContent || "")).toEqual([]);
|
|
510
|
+
expect(notice).not.toHaveTextContent(RETIRED_COMMUNITY_ONLY_NOTICE_TEXT);
|
|
511
|
+
expect(screen.queryByTestId("email")).not.toBeInTheDocument();
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
test("the English explanation fits both servers, and the page's defaultValue is the same text", () => {
|
|
515
|
+
expect(noticeProblems(english.sso.enterpriseEditionRequired)).toEqual([]);
|
|
516
|
+
|
|
517
|
+
const source: string = fs.readFileSync(LOGIN_WITH_SSO_SOURCE, "utf8");
|
|
518
|
+
|
|
519
|
+
expect(source).toContain(JSON.stringify(ENTERPRISE_NOTICE_TEXT));
|
|
520
|
+
expect(source).not.toContain(RETIRED_COMMUNITY_ONLY_NOTICE_TEXT);
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
test("the explanation check rejects the retired Community-only copy (negative control)", () => {
|
|
524
|
+
expect(noticeProblems(RETIRED_COMMUNITY_ONLY_NOTICE_TEXT)).toEqual([
|
|
525
|
+
"does not mention the license",
|
|
526
|
+
"tells an Enterprise server it is not the Enterprise Edition",
|
|
527
|
+
]);
|
|
528
|
+
expect(
|
|
529
|
+
noticeProblems(
|
|
530
|
+
"Single sign-on (SSO) is not available on this server. Sign in with your email and password instead.",
|
|
531
|
+
),
|
|
532
|
+
).toEqual([
|
|
533
|
+
"does not name the Enterprise Edition",
|
|
534
|
+
"does not mention the license",
|
|
535
|
+
]);
|
|
536
|
+
expect(
|
|
537
|
+
noticeProblems(
|
|
538
|
+
"Single sign-on (SSO) is not available on this server: it needs the OneUptime Enterprise Edition with an active license.",
|
|
539
|
+
),
|
|
540
|
+
).toEqual(["does not point to password sign-in"]);
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
test("when only the email lookups answer 404, submitting the email shows the explanation", async () => {
|
|
544
|
+
emailSamlAnswer = NOT_SERVED;
|
|
545
|
+
emailOidcAnswer = NOT_SERVED;
|
|
546
|
+
|
|
547
|
+
await renderSso();
|
|
548
|
+
await submitEmail("ada@example.com");
|
|
549
|
+
|
|
550
|
+
expect(
|
|
551
|
+
await screen.findByTestId("sso-enterprise-edition-required"),
|
|
552
|
+
).toBeInTheDocument();
|
|
553
|
+
expect(
|
|
554
|
+
screen.queryByText(/No SSO configuration found/),
|
|
555
|
+
).not.toBeInTheDocument();
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
test("on the Enterprise Edition the email form is shown, and an unknown email gets the normal message", async () => {
|
|
559
|
+
await renderSso();
|
|
560
|
+
|
|
561
|
+
expect(
|
|
562
|
+
screen.queryByTestId("sso-enterprise-edition-required"),
|
|
563
|
+
).not.toBeInTheDocument();
|
|
564
|
+
|
|
565
|
+
await submitEmail("ada@example.com");
|
|
566
|
+
|
|
567
|
+
expect(
|
|
568
|
+
await screen.findByText(
|
|
569
|
+
"No SSO configuration found for the email: ada@example.com",
|
|
570
|
+
),
|
|
571
|
+
).toBeInTheDocument();
|
|
572
|
+
expect(
|
|
573
|
+
screen.queryByTestId("sso-enterprise-edition-required"),
|
|
574
|
+
).not.toBeInTheDocument();
|
|
575
|
+
expect(
|
|
576
|
+
requestedUrls.some((url: string) => {
|
|
577
|
+
return url.includes("/service-provider-login?email=");
|
|
578
|
+
}),
|
|
579
|
+
).toBe(true);
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
test("one lookup answering 404 is not enough: the other may still have providers", async () => {
|
|
583
|
+
emailSamlAnswer = NOT_SERVED;
|
|
584
|
+
emailOidcAnswer = {
|
|
585
|
+
status: 200,
|
|
586
|
+
data: [
|
|
587
|
+
{
|
|
588
|
+
_id: "99999999-9999-4999-8999-999999999999",
|
|
589
|
+
name: "Entra ID",
|
|
590
|
+
projectId: "11111111-1111-4111-8111-111111111111",
|
|
591
|
+
},
|
|
592
|
+
],
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
await renderSso();
|
|
596
|
+
await submitEmail("ada@example.com");
|
|
597
|
+
|
|
598
|
+
expect(await screen.findByText("Entra ID")).toBeInTheDocument();
|
|
599
|
+
expect(
|
|
600
|
+
screen.queryByTestId("sso-enterprise-edition-required"),
|
|
601
|
+
).not.toBeInTheDocument();
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
test("a server error is not mistaken for the Community Edition", async () => {
|
|
605
|
+
globalSamlAnswer = { status: 500, data: { message: "boom" } };
|
|
606
|
+
globalOidcAnswer = { status: 500, data: { message: "boom" } };
|
|
607
|
+
|
|
608
|
+
await renderSso();
|
|
609
|
+
|
|
610
|
+
expect(await screen.findByTestId("email")).toBeInTheDocument();
|
|
611
|
+
expect(
|
|
612
|
+
screen.queryByTestId("sso-enterprise-edition-required"),
|
|
613
|
+
).not.toBeInTheDocument();
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
});
|