@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,192 @@
|
|
|
1
|
+
import EnterpriseFeature from "./EnterpriseFeature";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* The seat usage of an Enterprise install, as
|
|
5
|
+
* EnterpriseEdition.getSeatUsage() returns it and the /global-config/license
|
|
6
|
+
* response carries it. Only the type lives in core: the arithmetic that
|
|
7
|
+
* computes it belongs to the Enterprise license client
|
|
8
|
+
* (ee/Server/License/EnterpriseLicenseSeats.ts).
|
|
9
|
+
*/
|
|
10
|
+
export interface SeatUsage {
|
|
11
|
+
/*
|
|
12
|
+
* False when the license carries no usable seat limit. Every other field is
|
|
13
|
+
* still filled in — a caller that wants to display usage can, it just must
|
|
14
|
+
* not block anything.
|
|
15
|
+
*/
|
|
16
|
+
isEnforced: boolean;
|
|
17
|
+
|
|
18
|
+
// The limit actually being enforced, or null when there is none.
|
|
19
|
+
userLimit: number | null;
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
* The best estimate of how many licensed seats are consumed right now,
|
|
23
|
+
* across every instance on this license, counting this installation's live
|
|
24
|
+
* users and the other instances' users from the last usage report.
|
|
25
|
+
*/
|
|
26
|
+
seatsInUse: number;
|
|
27
|
+
|
|
28
|
+
// Null when there is no limit. Never negative — a breach reads as 0 free.
|
|
29
|
+
seatsRemaining: number | null;
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* The single question enforcement asks. True whenever there is no limit, so
|
|
33
|
+
* a caller can use this on its own without re-checking isEnforced.
|
|
34
|
+
*/
|
|
35
|
+
hasSeatForNewUser: boolean;
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* How many of seatsInUse are users this installation has never seen. Zero
|
|
39
|
+
* whenever the topology is not known well enough to say, which is the
|
|
40
|
+
* conservative answer.
|
|
41
|
+
*/
|
|
42
|
+
seatsUsedByOtherInstances: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Where the license stands in time. Deliberately about time only; whether the
|
|
47
|
+
* token was cryptographically verified is the separate `verification` axis.
|
|
48
|
+
*
|
|
49
|
+
* missing no license token is stored and the unlicensed trial is over, in
|
|
50
|
+
* which case graceEndsAt says when it ended. With no graceEndsAt
|
|
51
|
+
* the trial start is not known (see isTrialStartUnknown).
|
|
52
|
+
* valid the license is current
|
|
53
|
+
* grace expired no more than the grace period
|
|
54
|
+
* (ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS) ago, OR an unlicensed
|
|
55
|
+
* Enterprise install still inside its trial
|
|
56
|
+
* (ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS from first seen). Both
|
|
57
|
+
* share this status because both entitle everything until they
|
|
58
|
+
* end; graceReason tells them apart, and graceEndsAt is the end of
|
|
59
|
+
* whichever one it is.
|
|
60
|
+
* expired expired longer ago than the grace period
|
|
61
|
+
* invalid a token is stored but cannot be trusted: a bad signature from a
|
|
62
|
+
* trusted key, the wrong audience or issuer, bound to a different
|
|
63
|
+
* instance, or malformed
|
|
64
|
+
*/
|
|
65
|
+
export type EnterpriseLicenseStatus =
|
|
66
|
+
| "missing"
|
|
67
|
+
| "valid"
|
|
68
|
+
| "grace"
|
|
69
|
+
| "expired"
|
|
70
|
+
| "invalid";
|
|
71
|
+
|
|
72
|
+
/*
|
|
73
|
+
* verified signed by a key this build trusts; every limit comes from the
|
|
74
|
+
* signed claims
|
|
75
|
+
* unverified a legacy HS256 token or one signed by a key this build does not
|
|
76
|
+
* know; accepted while legacy acceptance is on, with limits taken
|
|
77
|
+
* from the stored columns
|
|
78
|
+
* none there is no token to verify
|
|
79
|
+
*/
|
|
80
|
+
export type EnterpriseLicenseVerification = "verified" | "unverified" | "none";
|
|
81
|
+
|
|
82
|
+
export type EnterpriseLicenseGraceReason = "expired" | "unlicensed";
|
|
83
|
+
|
|
84
|
+
export type EnterpriseLicenseFeatures = "all" | Array<EnterpriseFeature>;
|
|
85
|
+
|
|
86
|
+
export interface EnterpriseLicenseSnapshot {
|
|
87
|
+
status: EnterpriseLicenseStatus;
|
|
88
|
+
verification: EnterpriseLicenseVerification;
|
|
89
|
+
graceReason?: EnterpriseLicenseGraceReason | undefined;
|
|
90
|
+
companyName?: string | undefined;
|
|
91
|
+
expiresAt?: Date | undefined;
|
|
92
|
+
graceEndsAt?: Date | undefined;
|
|
93
|
+
// Null when the license sets no seat limit.
|
|
94
|
+
userLimit: number | null;
|
|
95
|
+
isEvaluation: boolean;
|
|
96
|
+
features: EnterpriseLicenseFeatures;
|
|
97
|
+
// A human-readable explanation of the status, for logs and admin banners.
|
|
98
|
+
message?: string | undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
* ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS (30): how long an expired license
|
|
103
|
+
* keeps working, counted from its expiry - a verified license's signed
|
|
104
|
+
* expiry, or an unverified legacy license's stored expiry column.
|
|
105
|
+
*
|
|
106
|
+
* ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS (14): how long an Enterprise install
|
|
107
|
+
* that has no license is on trial, counted from
|
|
108
|
+
* GlobalConfig.enterpriseEditionFirstSeenAt.
|
|
109
|
+
*
|
|
110
|
+
* Until either ends nothing changes; after it, enterprise configuration
|
|
111
|
+
* becomes read-only and SSO, SCIM and audit logging stop
|
|
112
|
+
* (EnterpriseEdition.isFeatureActive) until a license is activated. They are
|
|
113
|
+
* defined in Common/Types so the browser copy derives the same numbers.
|
|
114
|
+
*/
|
|
115
|
+
export {
|
|
116
|
+
ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS,
|
|
117
|
+
ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS,
|
|
118
|
+
} from "../../Types/EnterpriseLicense/EnterpriseLicensePeriods";
|
|
119
|
+
|
|
120
|
+
export class EnterpriseLicenseSnapshotUtil {
|
|
121
|
+
/*
|
|
122
|
+
* True when the license currently entitles anything at all. Grace counts:
|
|
123
|
+
* the whole point of grace is that nothing changes until it ends.
|
|
124
|
+
*/
|
|
125
|
+
public static isUsable(snapshot: EnterpriseLicenseSnapshot | null): boolean {
|
|
126
|
+
if (!snapshot) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return snapshot.status === "valid" || snapshot.status === "grace";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public static includesFeature(
|
|
134
|
+
snapshot: EnterpriseLicenseSnapshot | null,
|
|
135
|
+
feature: EnterpriseFeature,
|
|
136
|
+
): boolean {
|
|
137
|
+
if (!snapshot) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (snapshot.features === "all") {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (!Array.isArray(snapshot.features)) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return snapshot.features.includes(feature);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Usable AND entitled: the license half of EnterpriseEdition.isFeatureAvailable.
|
|
153
|
+
public static entitles(
|
|
154
|
+
snapshot: EnterpriseLicenseSnapshot | null,
|
|
155
|
+
feature: EnterpriseFeature,
|
|
156
|
+
): boolean {
|
|
157
|
+
return (
|
|
158
|
+
EnterpriseLicenseSnapshotUtil.isUsable(snapshot) &&
|
|
159
|
+
EnterpriseLicenseSnapshotUtil.includesFeature(snapshot, feature)
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* "missing" with no graceEndsAt: no license is installed, and the start of
|
|
165
|
+
* the unlicensed trial (GlobalConfig.enterpriseEditionFirstSeenAt) is not
|
|
166
|
+
* known - the stamp has not been written yet (it failed, or the row does
|
|
167
|
+
* not exist yet), or nothing could be read at all (createMissing). So
|
|
168
|
+
* whether the install is still in its trial is unknown.
|
|
169
|
+
* EnterpriseEdition.isFeatureActive treats it as an unknown license state
|
|
170
|
+
* (active); the configuration checks still fail closed on it.
|
|
171
|
+
*/
|
|
172
|
+
public static isTrialStartUnknown(
|
|
173
|
+
snapshot: EnterpriseLicenseSnapshot | null,
|
|
174
|
+
): boolean {
|
|
175
|
+
if (!snapshot) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return snapshot.status === "missing" && !snapshot.graceEndsAt;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
public static createMissing(message?: string): EnterpriseLicenseSnapshot {
|
|
183
|
+
return {
|
|
184
|
+
status: "missing",
|
|
185
|
+
verification: "none",
|
|
186
|
+
userLimit: null,
|
|
187
|
+
isEvaluation: false,
|
|
188
|
+
features: [],
|
|
189
|
+
message: message || "No OneUptime Enterprise license is installed.",
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type { ExpressRouter } from "../Utils/Express";
|
|
2
|
+
import type {
|
|
3
|
+
EnterpriseLicenseSnapshot,
|
|
4
|
+
SeatUsage,
|
|
5
|
+
} from "./EnterpriseLicenseSnapshot";
|
|
6
|
+
import type BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
7
|
+
import type DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
8
|
+
import type { JSONObject } from "../../Types/JSON";
|
|
9
|
+
import type ObjectID from "../../Types/ObjectID";
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
* The contract between core (Apache-2.0, everything outside ee/) and the
|
|
13
|
+
* enterprise module in ee/ (OneUptime Enterprise License).
|
|
14
|
+
*
|
|
15
|
+
* Core never imports ee. The App loader (packages/App/Utils/EnterpriseLoader.ts)
|
|
16
|
+
* finds ee/Server/Index.ts at boot, requires it, checks it against this
|
|
17
|
+
* interface and registers it with EnterpriseEdition. Everything in core that
|
|
18
|
+
* behaves differently per edition asks EnterpriseEdition, never ee directly.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export type EnterpriseServerModuleName = "oneuptime-enterprise";
|
|
22
|
+
|
|
23
|
+
export const ENTERPRISE_SERVER_MODULE_NAME: EnterpriseServerModuleName =
|
|
24
|
+
"oneuptime-enterprise";
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* The recording half of the audit log. Core's AuditLogService keeps these four
|
|
28
|
+
* public methods as thin delegates, so DatabaseService, ProjectService and the
|
|
29
|
+
* user-notification services call exactly what they call today; on the
|
|
30
|
+
* Community Edition there is no recorder and nothing is recorded.
|
|
31
|
+
*
|
|
32
|
+
* The signatures mirror AuditLogService's public methods one for one.
|
|
33
|
+
*/
|
|
34
|
+
export interface AuditLogRecorder {
|
|
35
|
+
recordCreate<TModel extends BaseModel>(data: {
|
|
36
|
+
model: TModel;
|
|
37
|
+
createdItem: TModel;
|
|
38
|
+
props: DatabaseCommonInteractionProps;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
|
|
41
|
+
recordUpdate<TModel extends BaseModel>(data: {
|
|
42
|
+
model: TModel;
|
|
43
|
+
before: TModel;
|
|
44
|
+
updatedFields: JSONObject;
|
|
45
|
+
itemId: ObjectID;
|
|
46
|
+
props: DatabaseCommonInteractionProps;
|
|
47
|
+
}): Promise<void>;
|
|
48
|
+
|
|
49
|
+
recordDelete<TModel extends BaseModel>(data: {
|
|
50
|
+
model: TModel;
|
|
51
|
+
deletedItem: TModel;
|
|
52
|
+
itemId: ObjectID;
|
|
53
|
+
props: DatabaseCommonInteractionProps;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
|
|
56
|
+
invalidateProjectSettings(projectId: ObjectID): void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface EnterpriseLicensingProvider {
|
|
60
|
+
/*
|
|
61
|
+
* Recomputes the snapshot from the cached inputs (token + stored columns)
|
|
62
|
+
* and the current time, so expiry and grace boundaries are exact. A failed
|
|
63
|
+
* refresh keeps the last good inputs; it never drops to "missing".
|
|
64
|
+
*/
|
|
65
|
+
getSnapshot(): Promise<EnterpriseLicenseSnapshot>;
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* The synchronous twin for synchronous checks. Null until the first load
|
|
69
|
+
* finished. Configuration checks (isFeatureAvailableSync) treat null as "not
|
|
70
|
+
* licensed" (fail closed); runtime checks (isFeatureActive) treat it as
|
|
71
|
+
* active, so an unknown license state never locks anyone out.
|
|
72
|
+
*/
|
|
73
|
+
getCachedSnapshot(): EnterpriseLicenseSnapshot | null;
|
|
74
|
+
|
|
75
|
+
refresh(): Promise<void>;
|
|
76
|
+
|
|
77
|
+
// Drops this process's cached inputs; the next read reloads them.
|
|
78
|
+
invalidate(): void;
|
|
79
|
+
|
|
80
|
+
getSeatUsage(): Promise<SeatUsage | null>;
|
|
81
|
+
|
|
82
|
+
/*
|
|
83
|
+
* Throws when adding one more user would exceed the license's seat limit.
|
|
84
|
+
* A no-op when billing is enabled or the license is not valid/grace.
|
|
85
|
+
*/
|
|
86
|
+
assertSeatAvailableForNewUser(): Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export default interface EnterpriseServerModule {
|
|
90
|
+
name: typeof ENTERPRISE_SERVER_MODULE_NAME;
|
|
91
|
+
version: string;
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
* Bounded by the loader with a timeout. Must not throw on a database blip,
|
|
95
|
+
* and must not make network calls the boot has to wait for.
|
|
96
|
+
*/
|
|
97
|
+
init(): Promise<void>;
|
|
98
|
+
|
|
99
|
+
licensing: EnterpriseLicensingProvider;
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
* Mounted at ["/api/identity", "/"] right after core's identity routers.
|
|
103
|
+
* RULE for every router below: no layer without a route (no router.use), because
|
|
104
|
+
* a path-less middleware in a router mounted at "/" or ahead of a core router
|
|
105
|
+
* runs for requests meant for core routes.
|
|
106
|
+
*/
|
|
107
|
+
getIdentityRouters(): Array<ExpressRouter>;
|
|
108
|
+
|
|
109
|
+
// Mounted at "/api".
|
|
110
|
+
getApiRouters(): Array<ExpressRouter>;
|
|
111
|
+
|
|
112
|
+
// Mounted at "/api/admin/health" BEFORE core's AdminHealth router.
|
|
113
|
+
getAdminHealthRouter(): ExpressRouter | null;
|
|
114
|
+
|
|
115
|
+
// Requires the ee cron modules (RunCron registers at import time).
|
|
116
|
+
registerWorkerJobs(): Promise<void>;
|
|
117
|
+
|
|
118
|
+
getAuditLogRecorder(): AuditLogRecorder | null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const REQUIRED_MODULE_FUNCTIONS: ReadonlyArray<string> = [
|
|
122
|
+
"init",
|
|
123
|
+
"getIdentityRouters",
|
|
124
|
+
"getApiRouters",
|
|
125
|
+
"getAdminHealthRouter",
|
|
126
|
+
"registerWorkerJobs",
|
|
127
|
+
"getAuditLogRecorder",
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
const REQUIRED_LICENSING_FUNCTIONS: ReadonlyArray<string> = [
|
|
131
|
+
"getSnapshot",
|
|
132
|
+
"getCachedSnapshot",
|
|
133
|
+
"refresh",
|
|
134
|
+
"invalidate",
|
|
135
|
+
"getSeatUsage",
|
|
136
|
+
"assertSeatAvailableForNewUser",
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
type LooseRecord = Record<string, unknown>;
|
|
140
|
+
|
|
141
|
+
const isRecord: (value: unknown) => value is LooseRecord = (
|
|
142
|
+
value: unknown,
|
|
143
|
+
): value is LooseRecord => {
|
|
144
|
+
return typeof value === "object" && value !== null;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export class EnterpriseServerModuleShape {
|
|
148
|
+
/*
|
|
149
|
+
* Every way `candidate` falls short of EnterpriseServerModule, as readable
|
|
150
|
+
* sentences. Empty means the shape is right. Used by the loader (a wrong
|
|
151
|
+
* shape is a broken build: fail fast) and by ee's own shape test.
|
|
152
|
+
*/
|
|
153
|
+
public static findProblems(candidate: unknown): Array<string> {
|
|
154
|
+
const problems: Array<string> = [];
|
|
155
|
+
|
|
156
|
+
if (!isRecord(candidate)) {
|
|
157
|
+
problems.push(
|
|
158
|
+
`the module must export an object, but it exported ${candidate === null ? "null" : typeof candidate}`,
|
|
159
|
+
);
|
|
160
|
+
return problems;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (candidate["name"] !== ENTERPRISE_SERVER_MODULE_NAME) {
|
|
164
|
+
problems.push(
|
|
165
|
+
`"name" must be "${ENTERPRISE_SERVER_MODULE_NAME}", but it is ${JSON.stringify(candidate["name"]) ?? "undefined"}`,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (
|
|
170
|
+
typeof candidate["version"] !== "string" ||
|
|
171
|
+
candidate["version"].trim().length === 0
|
|
172
|
+
) {
|
|
173
|
+
problems.push(`"version" must be a non-empty string`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
for (const functionName of REQUIRED_MODULE_FUNCTIONS) {
|
|
177
|
+
if (typeof candidate[functionName] !== "function") {
|
|
178
|
+
problems.push(`"${functionName}" must be a function`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const licensing: unknown = candidate["licensing"];
|
|
183
|
+
|
|
184
|
+
if (!isRecord(licensing)) {
|
|
185
|
+
problems.push(`"licensing" must be an object`);
|
|
186
|
+
return problems;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
for (const functionName of REQUIRED_LICENSING_FUNCTIONS) {
|
|
190
|
+
if (typeof licensing[functionName] !== "function") {
|
|
191
|
+
problems.push(`"licensing.${functionName}" must be a function`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return problems;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* The router-contract check: describes every layer of `router` that is not a
|
|
200
|
+
* route (a router.use middleware or sub-router). Empty means the router
|
|
201
|
+
* cannot shadow a core route.
|
|
202
|
+
*/
|
|
203
|
+
public static findLayersWithoutRoute(router: ExpressRouter): Array<string> {
|
|
204
|
+
const stack: unknown = (router as unknown as LooseRecord)["stack"];
|
|
205
|
+
|
|
206
|
+
if (!Array.isArray(stack)) {
|
|
207
|
+
return ["the router has no layer stack (is it an express Router?)"];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const problems: Array<string> = [];
|
|
211
|
+
|
|
212
|
+
stack.forEach((layer: unknown, index: number): void => {
|
|
213
|
+
if (isRecord(layer) && layer["route"]) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const name: string =
|
|
218
|
+
isRecord(layer) && typeof layer["name"] === "string"
|
|
219
|
+
? layer["name"]
|
|
220
|
+
: "<unknown>";
|
|
221
|
+
const pattern: string =
|
|
222
|
+
isRecord(layer) && layer["regexp"] instanceof RegExp
|
|
223
|
+
? layer["regexp"].toString()
|
|
224
|
+
: "<no pattern>";
|
|
225
|
+
|
|
226
|
+
problems.push(
|
|
227
|
+
`layer ${index} ("${name}", ${pattern}) is a router.use() layer, not a route`,
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
return problems;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -1059,6 +1059,95 @@ export const EnableProfiling: boolean =
|
|
|
1059
1059
|
export const IsEnterpriseEdition: boolean =
|
|
1060
1060
|
process.env["IS_ENTERPRISE_EDITION"] === "true";
|
|
1061
1061
|
|
|
1062
|
+
/*
|
|
1063
|
+
* Which edition this process should run (ONEUPTIME_EDITION):
|
|
1064
|
+
* auto (default) load the enterprise module from ee/ when it is present
|
|
1065
|
+
* community never load it, even when ee/ is present
|
|
1066
|
+
* enterprise it MUST load; a missing or broken ee/ stops the boot (the
|
|
1067
|
+
* Enterprise image sets this, so a broken image never silently
|
|
1068
|
+
* runs as the Community Edition)
|
|
1069
|
+
*
|
|
1070
|
+
* The effective edition is EnterpriseEdition.isLoaded(), decided at boot by
|
|
1071
|
+
* packages/App/Utils/EnterpriseLoader.ts. IS_ENTERPRISE_EDITION above turns
|
|
1072
|
+
* nothing on: it only says the Enterprise Edition is expected (see
|
|
1073
|
+
* isEnterpriseEditionRequested below), and the boot stops when it is expected
|
|
1074
|
+
* but the enterprise module did not load.
|
|
1075
|
+
*/
|
|
1076
|
+
export type OneUptimeEditionSetting = "auto" | "community" | "enterprise";
|
|
1077
|
+
|
|
1078
|
+
export const ONEUPTIME_EDITION_SETTINGS: ReadonlyArray<OneUptimeEditionSetting> =
|
|
1079
|
+
["auto", "community", "enterprise"];
|
|
1080
|
+
|
|
1081
|
+
// Unset or blank reads as "auto"; an unrecognised value is null.
|
|
1082
|
+
export const parseOneUptimeEdition: (
|
|
1083
|
+
rawValue: string | undefined,
|
|
1084
|
+
) => OneUptimeEditionSetting | null = (
|
|
1085
|
+
rawValue: string | undefined,
|
|
1086
|
+
): OneUptimeEditionSetting | null => {
|
|
1087
|
+
const value: string = (rawValue || "").trim().toLowerCase();
|
|
1088
|
+
|
|
1089
|
+
if (!value) {
|
|
1090
|
+
return "auto";
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
return (
|
|
1094
|
+
ONEUPTIME_EDITION_SETTINGS.find(
|
|
1095
|
+
(setting: OneUptimeEditionSetting): boolean => {
|
|
1096
|
+
return setting === value;
|
|
1097
|
+
},
|
|
1098
|
+
) || null
|
|
1099
|
+
);
|
|
1100
|
+
};
|
|
1101
|
+
|
|
1102
|
+
/*
|
|
1103
|
+
* Null when ONEUPTIME_EDITION holds something unrecognised: the loader refuses
|
|
1104
|
+
* to boot rather than guess which edition a typo meant.
|
|
1105
|
+
*/
|
|
1106
|
+
export const OneUptimeEdition: OneUptimeEditionSetting | null =
|
|
1107
|
+
parseOneUptimeEdition(process.env["ONEUPTIME_EDITION"]);
|
|
1108
|
+
|
|
1109
|
+
/*
|
|
1110
|
+
* Whether this install asks for the Enterprise Edition: IS_ENTERPRISE_EDITION
|
|
1111
|
+
* is exactly "true", unless ONEUPTIME_EDITION=community explicitly chooses the
|
|
1112
|
+
* Community Edition. The Enterprise image bakes IS_ENTERPRISE_EDITION=true, and
|
|
1113
|
+
* ONEUPTIME_EDITION=community is the documented way to run that image as the
|
|
1114
|
+
* Community Edition, so that combination is a deliberate choice, not a
|
|
1115
|
+
* mismatch.
|
|
1116
|
+
*
|
|
1117
|
+
* This is the one definition behind both the App's boot guard
|
|
1118
|
+
* (packages/App/Utils/EnterpriseLoader.ts: requested but not loaded stops the
|
|
1119
|
+
* boot) and the frontends' ENTERPRISE_EDITION_REQUESTED_BUT_NOT_LOADED notice
|
|
1120
|
+
* (Server/Utils/FrontendEnvironment.ts), so the two never disagree. It takes
|
|
1121
|
+
* the environment as an argument, so a caller can read it when it needs to.
|
|
1122
|
+
*/
|
|
1123
|
+
export const isEnterpriseEditionRequested: (
|
|
1124
|
+
environment: Record<string, string | undefined>,
|
|
1125
|
+
) => boolean = (environment: Record<string, string | undefined>): boolean => {
|
|
1126
|
+
return (
|
|
1127
|
+
environment["IS_ENTERPRISE_EDITION"] === "true" &&
|
|
1128
|
+
parseOneUptimeEdition(environment["ONEUPTIME_EDITION"]) !== "community"
|
|
1129
|
+
);
|
|
1130
|
+
};
|
|
1131
|
+
|
|
1132
|
+
export const IsEnterpriseEditionRequested: boolean =
|
|
1133
|
+
isEnterpriseEditionRequested(process.env);
|
|
1134
|
+
|
|
1135
|
+
/*
|
|
1136
|
+
* Overrides where the loader looks for the ee/ directory (tests and fixtures).
|
|
1137
|
+
* Unset: the repo layout <root>/ee, then the container layout /usr/src/ee.
|
|
1138
|
+
*/
|
|
1139
|
+
export const OneUptimeEnterpriseDirectory: string | undefined =
|
|
1140
|
+
process.env["ONEUPTIME_EE_DIR"]?.trim() || undefined;
|
|
1141
|
+
|
|
1142
|
+
/*
|
|
1143
|
+
* The hosted oneuptime.com (billing enabled) must run the Enterprise image:
|
|
1144
|
+
* on the Community image paid SSO and audit logging would silently stop, and
|
|
1145
|
+
* the license server self-hosted customers activate against would be gone. The
|
|
1146
|
+
* boot refuses that combination unless this development escape hatch is set.
|
|
1147
|
+
*/
|
|
1148
|
+
export const AllowBillingWithoutEnterprise: boolean =
|
|
1149
|
+
process.env["ALLOW_BILLING_WITHOUT_ENTERPRISE"] === "true";
|
|
1150
|
+
|
|
1062
1151
|
export const AverageSpanRowSizeInBytes: number = parsePositiveNumberFromEnv(
|
|
1063
1152
|
"AVERAGE_SPAN_ROW_SIZE_IN_BYTES",
|
|
1064
1153
|
1024,
|
|
@@ -1182,12 +1271,68 @@ export const PushNotificationRelayUrl: string =
|
|
|
1182
1271
|
process.env["PUSH_NOTIFICATION_RELAY_URL"] ||
|
|
1183
1272
|
"https://oneuptime.com/api/notification/push-relay/send";
|
|
1184
1273
|
|
|
1274
|
+
export const DEFAULT_ENTERPRISE_LICENSE_SERVER_URL: string =
|
|
1275
|
+
"https://oneuptime.com";
|
|
1276
|
+
|
|
1277
|
+
const TRAILING_SLASHES_PATTERN: RegExp = /\/+$/;
|
|
1278
|
+
|
|
1279
|
+
/*
|
|
1280
|
+
* The license server self-hosted Enterprise installs activate against and
|
|
1281
|
+
* report seat usage to. Overridable for a staging license server or an
|
|
1282
|
+
* internal relay. The license key travels in these requests, so plain http is
|
|
1283
|
+
* accepted only when `allowInsecure` (development and test environments);
|
|
1284
|
+
* anything else unusable - empty, unparseable, another scheme, or http in
|
|
1285
|
+
* production - falls back to the default rather than sending the key in the
|
|
1286
|
+
* clear.
|
|
1287
|
+
*/
|
|
1288
|
+
export const resolveEnterpriseLicenseServerUrl: (
|
|
1289
|
+
rawValue: string | undefined,
|
|
1290
|
+
allowInsecure: boolean,
|
|
1291
|
+
) => string = (
|
|
1292
|
+
rawValue: string | undefined,
|
|
1293
|
+
allowInsecure: boolean,
|
|
1294
|
+
): string => {
|
|
1295
|
+
const value: string = (rawValue || "")
|
|
1296
|
+
.trim()
|
|
1297
|
+
.replace(TRAILING_SLASHES_PATTERN, "");
|
|
1298
|
+
|
|
1299
|
+
if (!value) {
|
|
1300
|
+
return DEFAULT_ENTERPRISE_LICENSE_SERVER_URL;
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
const lowerCasedValue: string = value.toLowerCase();
|
|
1304
|
+
const isHttps: boolean = lowerCasedValue.startsWith("https://");
|
|
1305
|
+
const isHttp: boolean = lowerCasedValue.startsWith("http://");
|
|
1306
|
+
|
|
1307
|
+
if (!isHttps && !(isHttp && allowInsecure)) {
|
|
1308
|
+
return DEFAULT_ENTERPRISE_LICENSE_SERVER_URL;
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
try {
|
|
1312
|
+
URL.fromString(value);
|
|
1313
|
+
} catch {
|
|
1314
|
+
return DEFAULT_ENTERPRISE_LICENSE_SERVER_URL;
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
return value;
|
|
1318
|
+
};
|
|
1319
|
+
|
|
1320
|
+
const enterpriseLicenseServerUrlValue: string =
|
|
1321
|
+
resolveEnterpriseLicenseServerUrl(
|
|
1322
|
+
process.env["ENTERPRISE_LICENSE_SERVER_URL"],
|
|
1323
|
+
IsDevelopment || IsTest,
|
|
1324
|
+
);
|
|
1325
|
+
|
|
1326
|
+
export const EnterpriseLicenseServerUrl: URL = URL.fromString(
|
|
1327
|
+
enterpriseLicenseServerUrlValue,
|
|
1328
|
+
);
|
|
1329
|
+
|
|
1185
1330
|
export const EnterpriseLicenseValidationUrl: URL = URL.fromString(
|
|
1186
|
-
|
|
1331
|
+
`${enterpriseLicenseServerUrlValue}/api/enterprise-license/validate`,
|
|
1187
1332
|
);
|
|
1188
1333
|
|
|
1189
1334
|
export const EnterpriseLicenseUserCountReportUrl: URL = URL.fromString(
|
|
1190
|
-
|
|
1335
|
+
`${enterpriseLicenseServerUrlValue}/api/enterprise-license/report-user-count`,
|
|
1191
1336
|
);
|
|
1192
1337
|
|
|
1193
1338
|
/*
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Generated with npm run generate-postgres-migration. GlobalConfig gains the
|
|
5
|
+
* moment this installation first booted the Enterprise Edition; an unlicensed
|
|
6
|
+
* Enterprise install gets its 14-day trial counted from it. Nullable with no
|
|
7
|
+
* default: the enterprise module stamps it on its own first boot.
|
|
8
|
+
*/
|
|
9
|
+
export class AddEnterpriseEditionFirstSeenAt1793900000000
|
|
10
|
+
implements MigrationInterface
|
|
11
|
+
{
|
|
12
|
+
public name: string = "AddEnterpriseEditionFirstSeenAt1793900000000";
|
|
13
|
+
|
|
14
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
15
|
+
await queryRunner.query(
|
|
16
|
+
`ALTER TABLE "GlobalConfig" ADD "enterpriseEditionFirstSeenAt" TIMESTAMP WITH TIME ZONE`,
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`ALTER TABLE "GlobalConfig" DROP COLUMN "enterpriseEditionFirstSeenAt"`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|