@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.
Files changed (514) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Index.ts +4 -0
  4. package/Models/DatabaseModels/Monitor.ts +3 -2
  5. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  6. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  7. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  8. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  9. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  10. package/Scripts/generate-service-worker.js +65 -4
  11. package/Server/API/BaseAPI.ts +26 -5
  12. package/Server/API/GlobalConfigAPI.ts +228 -462
  13. package/Server/API/ProjectOIDC.ts +25 -16
  14. package/Server/API/ProjectSSO.ts +24 -16
  15. package/Server/API/StatusPageAPI.ts +100 -42
  16. package/Server/API/TeamMemberAPI.ts +10 -1
  17. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  18. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  19. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  20. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  21. package/Server/EnvironmentConfig.ts +147 -2
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  26. package/Server/Middleware/UserAuthorization.ts +38 -16
  27. package/Server/Services/AuditLogService.ts +84 -1079
  28. package/Server/Services/DatabaseService.ts +10 -0
  29. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  30. package/Server/Services/GlobalConfigService.ts +80 -1
  31. package/Server/Services/Index.ts +4 -0
  32. package/Server/Services/MonitorProbeService.ts +116 -20
  33. package/Server/Services/MonitorService.ts +59 -6
  34. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  35. package/Server/Services/MonitorTemplateService.ts +26 -0
  36. package/Server/Services/ProjectService.ts +284 -0
  37. package/Server/Services/RumSessionPinService.ts +25 -6
  38. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  39. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  40. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  41. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  42. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  43. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  44. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  45. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  46. package/Server/Services/StatusPageService.ts +78 -1
  47. package/Server/Services/TeamMemberService.ts +11 -0
  48. package/Server/Services/TeamService.ts +10 -0
  49. package/Server/Services/UserService.ts +10 -17
  50. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  51. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  52. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  53. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  54. package/Server/Types/Markdown.ts +41 -0
  55. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  56. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  57. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  58. package/Server/Utils/EditionEnforcement.ts +233 -0
  59. package/Server/Utils/FrontendEnvironment.ts +41 -2
  60. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  61. package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
  62. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  63. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  64. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
  66. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  67. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  69. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  70. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  71. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  72. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  73. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  74. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  75. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  76. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  77. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  78. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  79. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  80. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  81. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  82. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  83. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  84. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  85. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  86. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  87. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  88. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  89. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  90. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  91. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  92. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  93. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  94. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  95. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  96. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  97. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  98. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  99. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  100. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  101. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  102. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  103. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  104. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  105. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  106. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  107. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  108. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  109. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  110. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  111. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  112. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  113. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  114. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  115. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  116. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  117. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  118. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  119. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  120. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  121. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  122. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  123. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  124. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  125. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  126. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  127. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  128. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  129. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  130. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  131. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  133. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  134. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  135. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  136. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  137. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  138. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  139. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  140. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  141. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  142. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  143. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  144. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  145. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  146. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  147. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  148. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  149. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  150. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  151. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  152. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  153. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  154. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  155. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  156. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  157. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  158. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  159. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  160. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  161. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  162. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  163. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  164. package/Tests/Server/Types/Markdown.test.ts +183 -1
  165. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  166. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  167. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  168. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  169. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  170. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  171. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  172. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  175. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
  176. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  177. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  178. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  179. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  180. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  181. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  182. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  183. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  184. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  185. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  186. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  187. package/Tests/Types/API/Route.test.ts +56 -0
  188. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  189. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  190. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  191. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  192. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  193. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  194. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  195. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  196. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  197. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  198. package/Tests/UI/Components/Icon.test.tsx +26 -0
  199. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  200. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  201. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  202. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  203. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  204. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  205. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  206. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  207. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  208. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  209. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  210. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  211. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  212. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  213. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  214. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  215. package/Types/API/Hostname.ts +63 -16
  216. package/Types/API/Route.ts +19 -2
  217. package/Types/API/URL.ts +26 -2
  218. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  219. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  220. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  221. package/Types/Database/CanonicalModelInstance.ts +102 -0
  222. package/Types/Database/TableColumn.ts +20 -6
  223. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  224. package/Types/IP/IPv6.ts +6 -1
  225. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  226. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  227. package/Types/Monitor/MonitorStep.ts +6 -1
  228. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  229. package/Types/Permission.ts +90 -0
  230. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  231. package/Types/Rules/RuleRun.ts +4 -0
  232. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  233. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  234. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  235. package/UI/Components/Feed/FeedOptions.ts +427 -0
  236. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  237. package/UI/Components/Feed/useFeedItems.ts +28 -9
  238. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  239. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  240. package/UI/Components/Icon/Icon.tsx +1 -1
  241. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  242. package/UI/Components/ModelList/ModelList.tsx +11 -1
  243. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  244. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  245. package/UI/esbuild-enterprise.js +263 -0
  246. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  247. package/Utils/HostAddressUtil.ts +94 -0
  248. package/Utils/LabelRuleImportExport.ts +27 -9
  249. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  250. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  251. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  252. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  253. package/Utils/Slo/SloDuration.ts +22 -6
  254. package/Utils/Slo/SloHealth.ts +8 -7
  255. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  256. package/Utils/Slo/SloOverviewText.ts +33 -0
  257. package/Utils/Slo/SloProjection.ts +4 -3
  258. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  259. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  260. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  262. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  264. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  266. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  268. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  270. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  272. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  273. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  274. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  276. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  277. package/build/dist/Server/API/BaseAPI.js +26 -5
  278. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  279. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  280. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  281. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  282. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  283. package/build/dist/Server/API/ProjectSSO.js +24 -16
  284. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  285. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  286. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  287. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  288. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  289. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  290. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  291. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  292. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  293. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  294. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  295. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  296. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  297. package/build/dist/Server/EnvironmentConfig.js +84 -2
  298. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  307. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  308. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  309. package/build/dist/Server/Services/AuditLogService.js +71 -740
  310. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  311. package/build/dist/Server/Services/DatabaseService.js +7 -0
  312. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  313. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  314. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  315. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  316. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  317. package/build/dist/Server/Services/Index.js +4 -0
  318. package/build/dist/Server/Services/Index.js.map +1 -1
  319. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  320. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  321. package/build/dist/Server/Services/MonitorService.js +48 -6
  322. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  323. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  324. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  325. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  326. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  327. package/build/dist/Server/Services/ProjectService.js +214 -0
  328. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  329. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  330. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  331. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  332. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  333. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  334. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  335. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  336. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  337. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  338. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  339. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  340. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  341. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  342. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  343. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  344. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  345. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  346. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  347. package/build/dist/Server/Services/StatusPageService.js +71 -0
  348. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  349. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  350. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  351. package/build/dist/Server/Services/TeamService.js +9 -0
  352. package/build/dist/Server/Services/TeamService.js.map +1 -1
  353. package/build/dist/Server/Services/UserService.js +10 -16
  354. package/build/dist/Server/Services/UserService.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  356. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  358. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  360. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  361. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  362. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  363. package/build/dist/Server/Types/Markdown.js +31 -0
  364. package/build/dist/Server/Types/Markdown.js.map +1 -1
  365. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  366. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  368. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  369. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  370. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  371. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  372. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  373. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  374. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  375. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  376. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  377. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
  378. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  379. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  380. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  381. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  382. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
  384. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  385. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  386. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  387. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  388. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  389. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  390. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  391. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  392. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  393. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  394. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  395. package/build/dist/Types/API/Hostname.js +59 -11
  396. package/build/dist/Types/API/Hostname.js.map +1 -1
  397. package/build/dist/Types/API/Route.js +18 -2
  398. package/build/dist/Types/API/Route.js.map +1 -1
  399. package/build/dist/Types/API/URL.js +23 -2
  400. package/build/dist/Types/API/URL.js.map +1 -1
  401. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  402. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  403. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  404. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  405. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  406. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  407. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  408. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  409. package/build/dist/Types/Database/TableColumn.js +19 -6
  410. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  411. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  412. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  413. package/build/dist/Types/IP/IPv6.js +6 -1
  414. package/build/dist/Types/IP/IPv6.js.map +1 -1
  415. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  416. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  417. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  418. package/build/dist/Types/Permission.js +84 -0
  419. package/build/dist/Types/Permission.js.map +1 -1
  420. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  421. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  422. package/build/dist/Types/Rules/RuleRun.js +4 -0
  423. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  424. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  425. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  426. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  427. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  428. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  429. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  430. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  431. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  432. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  433. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  434. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  435. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  436. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  437. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  438. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  439. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  440. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  441. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  442. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  443. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  444. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  445. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  446. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  447. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  448. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  450. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  451. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  452. package/build/dist/Utils/HostAddressUtil.js +80 -0
  453. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  454. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  455. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  456. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  457. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  458. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  459. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  460. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  461. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  462. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  463. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  464. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  465. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  466. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  467. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  468. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  469. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  470. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  471. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  472. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  473. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  474. package/jest.config.json +3 -1
  475. package/package.json +1 -1
  476. package/test-setup.sh +103 -34
  477. package/tsconfig.json +13 -0
  478. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  479. package/Server/API/TeamComplianceAPI.ts +0 -158
  480. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  481. package/Server/Services/TeamComplianceService.ts +0 -733
  482. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  483. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  484. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  485. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  486. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  487. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  488. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  489. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  490. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  491. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  492. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  493. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  494. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  495. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  496. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  497. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  498. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  499. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  500. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  501. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  502. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  503. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  504. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  505. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  506. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  507. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  508. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  509. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  510. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  511. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  512. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  513. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  514. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,565 @@
1
+ import CommunityEditionSsoReport, {
2
+ MAX_IDS_LISTED_PER_KIND,
3
+ RelaxedEnforcementSummary,
4
+ } from "../../../Server/Utils/CommunityEditionSsoReport";
5
+ import EnterpriseEdition from "../../../Server/Enterprise/EnterpriseEdition";
6
+ import EnterpriseFeature from "../../../Server/Enterprise/EnterpriseFeature";
7
+ import {
8
+ ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS,
9
+ ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS,
10
+ } from "../../../Server/Enterprise/EnterpriseLicenseSnapshot";
11
+ import GlobalConfigService from "../../../Server/Services/GlobalConfigService";
12
+ import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
13
+ import ProjectService from "../../../Server/Services/ProjectService";
14
+ import StatusPageService from "../../../Server/Services/StatusPageService";
15
+ import logger from "../../../Server/Utils/Logger";
16
+ import ObjectID from "../../../Types/ObjectID";
17
+ import PositiveNumber from "../../../Types/PositiveNumber";
18
+ import Project from "../../../Models/DatabaseModels/Project";
19
+ import ProjectSCIM from "../../../Models/DatabaseModels/ProjectSCIM";
20
+ import StatusPage from "../../../Models/DatabaseModels/StatusPage";
21
+ import FakeEnterpriseModule, {
22
+ createLicenseSnapshot,
23
+ createLicenseSnapshotWithStatus,
24
+ installFakeEnterpriseModule,
25
+ uninstallEnterpriseModule,
26
+ } from "../Enterprise/FakeEnterpriseModule";
27
+ import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
28
+ import { getJestSpyOn } from "../../Spy";
29
+ import {
30
+ afterEach,
31
+ beforeEach,
32
+ describe,
33
+ expect,
34
+ jest,
35
+ test,
36
+ } from "@jest/globals";
37
+
38
+ type SpyInstance = ReturnType<typeof getJestSpyOn>;
39
+
40
+ jest.mock("../../../Server/EnvironmentConfig", () => {
41
+ const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
42
+ jest.requireActual(
43
+ "../Enterprise/TestBillingFlag",
44
+ ) as typeof import("../Enterprise/TestBillingFlag");
45
+
46
+ return billingFlag.withLiveBillingFlag(
47
+ jest.requireActual("../../../Server/EnvironmentConfig") as Record<
48
+ string,
49
+ unknown
50
+ >,
51
+ );
52
+ });
53
+
54
+ /*
55
+ * Moving an install from the Enterprise image to the Community one keeps its
56
+ * database, so projects and status pages that required SSO still say so - and
57
+ * the Community Edition relaxes those requirements (it has no SSO login). The
58
+ * same happens on an Enterprise install whose license lapses: SSO and SCIM
59
+ * stop, and their requirements and locks are relaxed until a license is
60
+ * activated. Neither may happen silently:
61
+ *
62
+ * - a Community Edition process logs, once at boot, which settings it is
63
+ * not enforcing;
64
+ * - an Enterprise process watches the license and logs the same report
65
+ * each time SSO or SCIM stops (a license already lapsed at boot
66
+ * included), naming only what stopped.
67
+ *
68
+ * It never throws, and it reads nothing while the license covers SSO and SCIM.
69
+ */
70
+
71
+ const LAPSE_REPORT_PREFIX: string = "OneUptime Enterprise license lapsed:";
72
+
73
+ // Lets the fire-and-forget report triggered by a license change finish.
74
+ const flush: () => Promise<void> = async (): Promise<void> => {
75
+ await new Promise<void>((resolve: () => void) => {
76
+ setTimeout(resolve, 0);
77
+ });
78
+ };
79
+
80
+ const PROJECT_A: ObjectID = new ObjectID(
81
+ "11111111-1111-4111-8111-111111111111",
82
+ );
83
+ const PROJECT_B: ObjectID = new ObjectID(
84
+ "12222222-2222-4222-8222-222222222222",
85
+ );
86
+ const STATUS_PAGE_A: ObjectID = new ObjectID(
87
+ "77777777-7777-4777-8777-777777777777",
88
+ );
89
+
90
+ const project: (id: ObjectID) => Project = (id: ObjectID): Project => {
91
+ const model: Project = new Project();
92
+ model._id = id.toString();
93
+ return model;
94
+ };
95
+
96
+ const statusPage: (id: ObjectID) => StatusPage = (id: ObjectID): StatusPage => {
97
+ const model: StatusPage = new StatusPage();
98
+ model._id = id.toString();
99
+ return model;
100
+ };
101
+
102
+ const scim: (projectId: ObjectID) => ProjectSCIM = (
103
+ projectId: ObjectID,
104
+ ): ProjectSCIM => {
105
+ const model: ProjectSCIM = new ProjectSCIM();
106
+ model.projectId = projectId;
107
+ return model;
108
+ };
109
+
110
+ let instanceRequiresSso: SpyInstance;
111
+ let projectCount: SpyInstance;
112
+ let projectFind: SpyInstance;
113
+ let statusPageCount: SpyInstance;
114
+ let statusPageFind: SpyInstance;
115
+ let scimCount: SpyInstance;
116
+ let scimFind: SpyInstance;
117
+ let warn: SpyInstance;
118
+ let error: SpyInstance;
119
+
120
+ const allQuerySpies: () => Array<SpyInstance> = (): Array<SpyInstance> => {
121
+ return [
122
+ instanceRequiresSso,
123
+ projectCount,
124
+ projectFind,
125
+ statusPageCount,
126
+ statusPageFind,
127
+ scimCount,
128
+ scimFind,
129
+ ];
130
+ };
131
+
132
+ describe("CommunityEditionSsoReport", () => {
133
+ beforeEach(() => {
134
+ setTestBillingEnabled(false);
135
+ uninstallEnterpriseModule();
136
+ CommunityEditionSsoReport.resetForTests();
137
+
138
+ instanceRequiresSso = getJestSpyOn(
139
+ GlobalConfigService,
140
+ "getRequireSsoForLogin",
141
+ ).mockResolvedValue(true);
142
+ projectCount = getJestSpyOn(ProjectService, "countBy").mockResolvedValue(
143
+ new PositiveNumber(3),
144
+ );
145
+ projectFind = getJestSpyOn(ProjectService, "findBy").mockResolvedValue([
146
+ project(PROJECT_A),
147
+ project(PROJECT_B),
148
+ ]);
149
+ statusPageCount = getJestSpyOn(
150
+ StatusPageService,
151
+ "countBy",
152
+ ).mockResolvedValue(new PositiveNumber(1));
153
+ statusPageFind = getJestSpyOn(
154
+ StatusPageService,
155
+ "findBy",
156
+ ).mockResolvedValue([statusPage(STATUS_PAGE_A)]);
157
+ scimCount = getJestSpyOn(ProjectSCIMService, "countBy").mockResolvedValue(
158
+ new PositiveNumber(1),
159
+ );
160
+ scimFind = getJestSpyOn(ProjectSCIMService, "findBy").mockResolvedValue([
161
+ scim(PROJECT_B),
162
+ ]);
163
+ warn = getJestSpyOn(logger, "warn").mockImplementation((): void => {
164
+ return undefined;
165
+ });
166
+ error = getJestSpyOn(logger, "error").mockImplementation((): void => {
167
+ return undefined;
168
+ });
169
+ });
170
+
171
+ afterEach(() => {
172
+ uninstallEnterpriseModule();
173
+ setTestBillingEnabled(false);
174
+ CommunityEditionSsoReport.resetForTests();
175
+ jest.restoreAllMocks();
176
+ });
177
+
178
+ test.each([false, true])(
179
+ "does nothing on the Enterprise Edition while the license covers SSO and SCIM (billing=%p)",
180
+ async (billing: boolean) => {
181
+ setTestBillingEnabled(billing);
182
+ installFakeEnterpriseModule();
183
+
184
+ await expect(
185
+ CommunityEditionSsoReport.logRelaxedEnforcementOnce(),
186
+ ).resolves.toBeNull();
187
+ await flush();
188
+
189
+ for (const spy of allQuerySpies()) {
190
+ expect(spy).not.toHaveBeenCalled();
191
+ }
192
+ expect(warn).not.toHaveBeenCalled();
193
+ },
194
+ );
195
+
196
+ test("billing on never reports a lapse, whatever the license says", async () => {
197
+ setTestBillingEnabled(true);
198
+ installFakeEnterpriseModule({
199
+ snapshot: createLicenseSnapshotWithStatus("expired"),
200
+ });
201
+
202
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
203
+ await flush();
204
+
205
+ for (const spy of allQuerySpies()) {
206
+ expect(spy).not.toHaveBeenCalled();
207
+ }
208
+ expect(warn).not.toHaveBeenCalled();
209
+ });
210
+
211
+ describe("on an Enterprise install whose license lapses", () => {
212
+ const lapseReports: () => Array<string> = (): Array<string> => {
213
+ return warn.mock.calls
214
+ .map((call: Array<unknown>): unknown => {
215
+ return call[0];
216
+ })
217
+ .filter((message: unknown): message is string => {
218
+ return (
219
+ typeof message === "string" &&
220
+ message.startsWith(LAPSE_REPORT_PREFIX)
221
+ );
222
+ });
223
+ };
224
+
225
+ test("a license already lapsed at boot is reported at boot, once", async () => {
226
+ installFakeEnterpriseModule({
227
+ snapshot: createLicenseSnapshotWithStatus("expired"),
228
+ });
229
+
230
+ await expect(
231
+ CommunityEditionSsoReport.logRelaxedEnforcementOnce(),
232
+ ).resolves.toBeNull();
233
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
234
+ await flush();
235
+
236
+ // Later checks by requests see no new change, so no new report.
237
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
238
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SCIM);
239
+ await flush();
240
+
241
+ expect(lapseReports()).toHaveLength(1);
242
+
243
+ const message: string = lapseReports()[0]!;
244
+
245
+ expect(message).toContain(
246
+ "because SSO login and SCIM provisioning have stopped until a license that includes them is activated",
247
+ );
248
+ expect(message).toContain('"Require SSO for Login"');
249
+ expect(message).toContain(
250
+ `3 project(s) that require SSO for login (ids: ${PROJECT_A.toString()}, ${PROJECT_B.toString()} and 1 more)`,
251
+ );
252
+ expect(message).toContain(
253
+ `1 SCIM configuration(s) with Push Groups on, whose teams can be edited in OneUptime again (project ids: ${PROJECT_B.toString()})`,
254
+ );
255
+ expect(message).toContain("reset their password");
256
+ expect(message).toContain("without a restart");
257
+ expect(message).not.toContain("Community Edition");
258
+ });
259
+
260
+ test("a lapse at runtime is reported when it is first noticed, and again after a renewal and a new lapse", async () => {
261
+ const fake: FakeEnterpriseModule = installFakeEnterpriseModule();
262
+
263
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
264
+ await flush();
265
+ expect(lapseReports()).toHaveLength(0);
266
+
267
+ fake.setSnapshot(createLicenseSnapshotWithStatus("missing"));
268
+ // A request asks, e.g. UserAuthorization through EditionEnforcement.
269
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
270
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
271
+ await flush();
272
+ expect(lapseReports()).toHaveLength(1);
273
+
274
+ fake.setSnapshot(createLicenseSnapshotWithStatus("valid"));
275
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
276
+ await flush();
277
+ expect(lapseReports()).toHaveLength(1);
278
+
279
+ fake.setSnapshot(createLicenseSnapshotWithStatus("invalid"));
280
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SCIM);
281
+ await flush();
282
+ expect(lapseReports()).toHaveLength(2);
283
+ });
284
+
285
+ test("a license without SCIM reports the SCIM locks only, not the SSO requirements", async () => {
286
+ installFakeEnterpriseModule({
287
+ snapshot: createLicenseSnapshot({
288
+ features: [EnterpriseFeature.SSO, EnterpriseFeature.AuditLogs],
289
+ }),
290
+ });
291
+
292
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
293
+ await flush();
294
+
295
+ expect(lapseReports()).toHaveLength(1);
296
+
297
+ const message: string = lapseReports()[0]!;
298
+
299
+ expect(message).toContain("because SCIM provisioning has stopped");
300
+ expect(message).toContain("SCIM configuration(s) with Push Groups on");
301
+ expect(message).not.toContain("project(s) that require SSO");
302
+ expect(message).not.toContain("Require SSO for Login");
303
+ expect(message).not.toContain("sign in with email and password");
304
+ });
305
+
306
+ test("a lapse of audit logging alone reads nothing and reports nothing", async () => {
307
+ installFakeEnterpriseModule({
308
+ snapshot: createLicenseSnapshot({
309
+ features: [EnterpriseFeature.SSO, EnterpriseFeature.SCIM],
310
+ }),
311
+ });
312
+
313
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
314
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.AuditLogs);
315
+ await flush();
316
+
317
+ for (const spy of allQuerySpies()) {
318
+ expect(spy).not.toHaveBeenCalled();
319
+ }
320
+ expect(lapseReports()).toHaveLength(0);
321
+ });
322
+
323
+ test("a failed check is logged, never thrown", async () => {
324
+ projectCount.mockRejectedValue(new Error("database unavailable"));
325
+ installFakeEnterpriseModule({
326
+ snapshot: createLicenseSnapshotWithStatus("expired"),
327
+ });
328
+
329
+ await expect(
330
+ CommunityEditionSsoReport.logRelaxedEnforcementOnce(),
331
+ ).resolves.toBeNull();
332
+ await flush();
333
+
334
+ expect(error).toHaveBeenCalledWith(
335
+ "OneUptime Enterprise license lapsed: could not check which SSO requirements and SCIM team locks are no longer enforced.",
336
+ );
337
+ expect(lapseReports()).toHaveLength(0);
338
+ });
339
+
340
+ test("an unknown license state is not a lapse", async () => {
341
+ installFakeEnterpriseModule({ snapshot: null });
342
+
343
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
344
+ await flush();
345
+
346
+ for (const spy of allQuerySpies()) {
347
+ expect(spy).not.toHaveBeenCalled();
348
+ }
349
+ expect(lapseReports()).toHaveLength(0);
350
+ });
351
+
352
+ /*
353
+ * The first boot of an upgraded install whose first-run stamp could not
354
+ * be written: no license, and no known trial start. Not a lapse - and the
355
+ * control below, the same install once the trial is known to be over, is.
356
+ */
357
+ test("no license and an unknown trial start is not a lapse", async () => {
358
+ const fake: FakeEnterpriseModule = installFakeEnterpriseModule({
359
+ snapshot: createLicenseSnapshotWithStatus("missing", {
360
+ graceEndsAt: undefined,
361
+ }),
362
+ });
363
+
364
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
365
+ await flush();
366
+
367
+ for (const spy of allQuerySpies()) {
368
+ expect(spy).not.toHaveBeenCalled();
369
+ }
370
+ expect(lapseReports()).toHaveLength(0);
371
+
372
+ fake.setSnapshot(createLicenseSnapshotWithStatus("missing"));
373
+ EnterpriseEdition.isFeatureActive(EnterpriseFeature.SSO);
374
+ await flush();
375
+
376
+ expect(lapseReports()).toHaveLength(1);
377
+ });
378
+ });
379
+
380
+ test("on the Community Edition, logs every relaxed setting once, with counts and ids", async () => {
381
+ const summary: RelaxedEnforcementSummary | null =
382
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
383
+
384
+ expect(summary).toEqual({
385
+ instanceRequiresSso: true,
386
+ projectsRequiringSso: 3,
387
+ projectIdsRequiringSso: [PROJECT_A.toString(), PROJECT_B.toString()],
388
+ statusPagesRequiringSso: 1,
389
+ statusPageIdsRequiringSso: [STATUS_PAGE_A.toString()],
390
+ scimConfigurationsWithPushGroups: 1,
391
+ projectIdsWithScimPushGroups: [PROJECT_B.toString()],
392
+ });
393
+
394
+ expect(warn).toHaveBeenCalledTimes(1);
395
+
396
+ const message: string = warn.mock.calls[0]![0] as string;
397
+
398
+ expect(message).toContain("Community Edition");
399
+ expect(message).toContain("Enterprise Edition");
400
+ expect(message).toContain('"Require SSO for Login"');
401
+ expect(message).toContain(
402
+ `3 project(s) that require SSO for login (ids: ${PROJECT_A.toString()}, ${PROJECT_B.toString()} and 1 more)`,
403
+ );
404
+ expect(message).toContain(
405
+ `1 private status page(s) that require SSO for login (ids: ${STATUS_PAGE_A.toString()})`,
406
+ );
407
+ expect(message).toContain(
408
+ `1 SCIM configuration(s) with Push Groups on, whose teams can be edited in OneUptime again (project ids: ${PROJECT_B.toString()})`,
409
+ );
410
+ expect(message).toContain("kept unchanged");
411
+ /*
412
+ * Running the Enterprise image is not enough on its own: an Enterprise
413
+ * install enforces them only while its license (or trial, or grace)
414
+ * covers SSO and SCIM. The trial and the grace period are different
415
+ * lengths, and the message names each with its own.
416
+ */
417
+ expect(message).toContain(
418
+ `enforced again when this server runs the Enterprise Edition image with a valid license (or during its ${ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS}-day trial, or the ${ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS}-day grace period after a license expires)`,
419
+ );
420
+ expect(message).toContain("14-day trial");
421
+ expect(message).toContain("30-day grace period");
422
+ expect(message).not.toContain("14-day trial or grace period");
423
+ });
424
+
425
+ test("reads the stored settings as root, with bounded id lists", async () => {
426
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
427
+
428
+ for (const spy of [
429
+ projectCount,
430
+ projectFind,
431
+ statusPageCount,
432
+ statusPageFind,
433
+ scimCount,
434
+ scimFind,
435
+ ]) {
436
+ expect(spy).toHaveBeenCalledWith(
437
+ expect.objectContaining({ props: { isRoot: true } }),
438
+ );
439
+ }
440
+
441
+ expect(projectCount).toHaveBeenCalledWith(
442
+ expect.objectContaining({ query: { requireSsoForLogin: true } }),
443
+ );
444
+ expect(statusPageCount).toHaveBeenCalledWith(
445
+ expect.objectContaining({ query: { requireSsoForLogin: true } }),
446
+ );
447
+ expect(scimCount).toHaveBeenCalledWith(
448
+ expect.objectContaining({ query: { enablePushGroups: true } }),
449
+ );
450
+
451
+ for (const spy of [projectFind, statusPageFind, scimFind]) {
452
+ expect(spy).toHaveBeenCalledWith(
453
+ expect.objectContaining({ limit: MAX_IDS_LISTED_PER_KIND }),
454
+ );
455
+ }
456
+ });
457
+
458
+ test("logs once per process", async () => {
459
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
460
+
461
+ await expect(
462
+ CommunityEditionSsoReport.logRelaxedEnforcementOnce(),
463
+ ).resolves.toBeNull();
464
+
465
+ expect(warn).toHaveBeenCalledTimes(1);
466
+ expect(projectCount).toHaveBeenCalledTimes(1);
467
+ });
468
+
469
+ test("stays quiet when nothing is relaxed", async () => {
470
+ instanceRequiresSso.mockResolvedValue(false);
471
+ projectCount.mockResolvedValue(new PositiveNumber(0));
472
+ projectFind.mockResolvedValue([]);
473
+ statusPageCount.mockResolvedValue(new PositiveNumber(0));
474
+ statusPageFind.mockResolvedValue([]);
475
+ scimCount.mockResolvedValue(new PositiveNumber(0));
476
+ scimFind.mockResolvedValue([]);
477
+
478
+ const summary: RelaxedEnforcementSummary | null =
479
+ await CommunityEditionSsoReport.logRelaxedEnforcementOnce();
480
+
481
+ expect(summary?.projectsRequiringSso).toBe(0);
482
+ expect(warn).not.toHaveBeenCalled();
483
+ });
484
+
485
+ test("never throws: a failed check is logged and boot carries on", async () => {
486
+ projectCount.mockRejectedValue(new Error("database unavailable"));
487
+
488
+ await expect(
489
+ CommunityEditionSsoReport.logRelaxedEnforcementOnce(),
490
+ ).resolves.toBeNull();
491
+
492
+ expect(error).toHaveBeenCalled();
493
+ expect(warn).not.toHaveBeenCalled();
494
+ });
495
+
496
+ describe("describe()", () => {
497
+ const empty: RelaxedEnforcementSummary = {
498
+ instanceRequiresSso: false,
499
+ projectsRequiringSso: 0,
500
+ projectIdsRequiringSso: [],
501
+ statusPagesRequiringSso: 0,
502
+ statusPageIdsRequiringSso: [],
503
+ scimConfigurationsWithPushGroups: 0,
504
+ projectIdsWithScimPushGroups: [],
505
+ };
506
+
507
+ test("returns null when nothing is relaxed", () => {
508
+ expect(CommunityEditionSsoReport.describe(empty)).toBeNull();
509
+ });
510
+
511
+ test("names only what is relaxed", () => {
512
+ const message: string | null = CommunityEditionSsoReport.describe({
513
+ ...empty,
514
+ statusPagesRequiringSso: 2,
515
+ statusPageIdsRequiringSso: ["a", "b"],
516
+ });
517
+
518
+ expect(message).toContain(
519
+ "2 private status page(s) that require SSO for login (ids: a, b)",
520
+ );
521
+ expect(message).not.toContain("project(s) that require SSO");
522
+ expect(message).not.toContain("Require SSO for Login");
523
+ expect(message).not.toContain("SCIM configuration(s)");
524
+ });
525
+
526
+ test("the lapsed-license wording names only what stopped", () => {
527
+ const summary: RelaxedEnforcementSummary = {
528
+ ...empty,
529
+ instanceRequiresSso: true,
530
+ scimConfigurationsWithPushGroups: 1,
531
+ projectIdsWithScimPushGroups: ["p"],
532
+ };
533
+
534
+ const ssoOnly: string | null = CommunityEditionSsoReport.describe(
535
+ summary,
536
+ { reason: "lapsed-license", isSsoRelaxed: true, isScimRelaxed: false },
537
+ );
538
+
539
+ expect(ssoOnly).toContain(LAPSE_REPORT_PREFIX);
540
+ expect(ssoOnly).toContain("because SSO login has stopped");
541
+ expect(ssoOnly).toContain('"Require SSO for Login"');
542
+ expect(ssoOnly).not.toContain("SCIM configuration(s)");
543
+
544
+ expect(
545
+ CommunityEditionSsoReport.describe(
546
+ { ...empty, instanceRequiresSso: true },
547
+ {
548
+ reason: "lapsed-license",
549
+ isSsoRelaxed: false,
550
+ isScimRelaxed: true,
551
+ },
552
+ ),
553
+ ).toBeNull();
554
+ });
555
+
556
+ test("a count without ids still reads well", () => {
557
+ const message: string | null = CommunityEditionSsoReport.describe({
558
+ ...empty,
559
+ projectsRequiringSso: 4,
560
+ });
561
+
562
+ expect(message).toContain("4 project(s) that require SSO for login.");
563
+ });
564
+ });
565
+ });