@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
@@ -76,6 +76,7 @@ import Typeof from "../../Types/Typeof";
76
76
  import API from "../../Utils/API";
77
77
  import Slug from "../../Utils/Slug";
78
78
  import { getRuleCriteriaValidationError } from "../../Utils/Rules/RuleCriteriaMatcher";
79
+ import { getMonitorTypeCriteriaValidationError } from "../../Utils/Rules/MonitorTypeRuleCriteria";
79
80
  import RuleCriteria, {
80
81
  RULE_CRITERIA_LEGACY_NEVER_MATCH_PATTERN,
81
82
  RuleCriteriaOperator,
@@ -852,6 +853,15 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
852
853
  );
853
854
  }
854
855
 
856
+ if (metadata.type === TableColumnType.MonitorType) {
857
+ const validationError: string | null =
858
+ getMonitorTypeCriteriaValidationError(filter);
859
+
860
+ if (validationError) {
861
+ throw new BadDataException(validationError);
862
+ }
863
+ }
864
+
855
865
  const isRelationField: boolean =
856
866
  metadata.type === TableColumnType.EntityArray;
857
867
  const isRelationOperator: boolean = RULE_CRITERIA_RELATION_OPERATORS.has(
@@ -3,11 +3,26 @@ import EnterpriseLicense from "../../Models/DatabaseModels/EnterpriseLicense";
3
3
  import MarketingEventUtil from "../Utils/Marketing/MarketingEventUtil";
4
4
  import { MarketingEventType } from "../../Types/Marketing/MarketingEvent";
5
5
  import { OnCreate } from "../Types/Database/Hooks";
6
+ import CreateBy from "../Types/Database/CreateBy";
6
7
  import OneUptimeDate from "../../Types/Date";
7
8
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
8
9
  import ObjectID from "../../Types/ObjectID";
9
10
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
10
11
  import logger from "../Utils/Logger";
12
+ import crypto from "crypto";
13
+
14
+ /*
15
+ * Random bytes in a license key generated by the server: 256 bits, written as
16
+ * 64 hex characters (the column holds 100). Keys issued before server-side
17
+ * generation are browser-made UUIDs and keep working unchanged.
18
+ */
19
+ export const ENTERPRISE_LICENSE_KEY_RANDOM_BYTES: number = 32;
20
+
21
+ export const generateEnterpriseLicenseKey: () => string = (): string => {
22
+ return crypto
23
+ .randomBytes(ENTERPRISE_LICENSE_KEY_RANDOM_BYTES)
24
+ .toString("hex");
25
+ };
11
26
 
12
27
  export const ENTERPRISE_LICENSE_USAGE_AGGREGATION_LOCK_NAMESPACE: string =
13
28
  "EnterpriseLicenseService.usageAggregation";
@@ -66,6 +81,29 @@ export class Service extends DatabaseService<EnterpriseLicense> {
66
81
  }
67
82
  }
68
83
 
84
+ /*
85
+ * A license created with no key (the Admin Dashboard's "leave blank to
86
+ * auto-generate") gets one from the server's CSPRNG here, instead of from
87
+ * the browser. A key typed by the admin is kept, trimmed: installations
88
+ * trim the key they send, so stored whitespace would make it unmatchable.
89
+ */
90
+ @CaptureSpan()
91
+ protected override async onBeforeCreate(
92
+ createBy: CreateBy<EnterpriseLicense>,
93
+ ): Promise<OnCreate<EnterpriseLicense>> {
94
+ const providedKey: string =
95
+ typeof createBy.data.licenseKey === "string"
96
+ ? createBy.data.licenseKey.trim()
97
+ : "";
98
+
99
+ createBy.data.licenseKey = providedKey || generateEnterpriseLicenseKey();
100
+
101
+ return {
102
+ createBy,
103
+ carryForward: undefined,
104
+ };
105
+ }
106
+
69
107
  @CaptureSpan()
70
108
  protected override async onCreateSuccess(
71
109
  _onCreate: OnCreate<EnterpriseLicense>,
@@ -2,13 +2,45 @@ import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/GlobalConfig";
3
3
  import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
4
4
  import ObjectID from "../../Types/ObjectID";
5
- import { OnUpdate } from "../Types/Database/Hooks";
5
+ import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
6
6
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
7
+ import CreateBy from "../Types/Database/CreateBy";
7
8
  import UpdateBy from "../Types/Database/UpdateBy";
8
9
  import BadDataException from "../../Types/Exception/BadDataException";
10
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
11
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
9
12
  import TelegramVerificationToken from "../Utils/TelegramVerificationToken";
10
13
  import GlobalCache from "../Infrastructure/GlobalCache";
11
14
 
15
+ /*
16
+ * The columns that hold this installation's license state and identity. They
17
+ * are written only by OneUptime itself - the license client (activation,
18
+ * refresh, the daily usage report), the first-boot stamp of the Enterprise
19
+ * Edition and the data migrations - and every one of those writes runs with
20
+ * isRoot. A master admin reaches GlobalConfig through the generic CRUD API
21
+ * too, and master admins bypass the (empty) column ACLs, so without this list
22
+ * one PUT could forge a license expiry, raise the seat limit, restart the
23
+ * unlicensed trial or swap the instance id an instance-bound license
24
+ * is checked against.
25
+ *
26
+ * enterpriseLicenseNotificationEmail and enterpriseLicenseExpiryReminderDays
27
+ * are deliberately NOT here: they are settings the oneuptime.com admin edits
28
+ * from the Admin Dashboard.
29
+ */
30
+ export const ROOT_ONLY_LICENSE_COLUMNS: ReadonlyArray<keyof Model> = [
31
+ "instanceId",
32
+ "enterpriseCompanyName",
33
+ "enterpriseLicenseKey",
34
+ "enterpriseLicenseExpiresAt",
35
+ "enterpriseLicenseToken",
36
+ "enterpriseLicenseIsEvaluation",
37
+ "enterpriseLicenseUserLimit",
38
+ "enterpriseLicenseCurrentUserCount",
39
+ "enterpriseLicenseUserCountUpdatedAt",
40
+ "enterpriseLicenseInstances",
41
+ "enterpriseEditionFirstSeenAt",
42
+ ];
43
+
12
44
  const TELEGRAM_WEBHOOK_SECRET_CACHE_NAMESPACE: string =
13
45
  "global-config-security";
14
46
  const TELEGRAM_WEBHOOK_SECRET_GENERATION_KEY: string =
@@ -203,10 +235,57 @@ export class Service extends DatabaseService<Model> {
203
235
  );
204
236
  }
205
237
 
238
+ /*
239
+ * Refuses any write to ROOT_ONLY_LICENSE_COLUMNS that does not come from
240
+ * OneUptime itself. An explicit null counts as a write: clearing the license
241
+ * token is as much a forgery as setting one.
242
+ */
243
+ public assertLicenseColumnsWrittenByRootOnly(
244
+ data: unknown,
245
+ props: DatabaseCommonInteractionProps,
246
+ ): void {
247
+ if (props.isRoot) {
248
+ return;
249
+ }
250
+
251
+ const writtenColumns: Array<string> = ROOT_ONLY_LICENSE_COLUMNS.filter(
252
+ (column: keyof Model): boolean => {
253
+ return (
254
+ (data as Record<string, unknown>)[column as string] !== undefined
255
+ );
256
+ },
257
+ ).map((column: keyof Model): string => {
258
+ return column as string;
259
+ });
260
+
261
+ if (writtenColumns.length === 0) {
262
+ return;
263
+ }
264
+
265
+ throw new NotAuthorizedException(
266
+ `${writtenColumns.join(", ")} can only be changed by OneUptime itself. ` +
267
+ "Use the license dialog in the Admin Dashboard to activate or refresh the Enterprise license.",
268
+ );
269
+ }
270
+
271
+ @CaptureSpan()
272
+ protected override async onBeforeCreate(
273
+ createBy: CreateBy<Model>,
274
+ ): Promise<OnCreate<Model>> {
275
+ this.assertLicenseColumnsWrittenByRootOnly(createBy.data, createBy.props);
276
+
277
+ return {
278
+ createBy,
279
+ carryForward: null,
280
+ };
281
+ }
282
+
206
283
  @CaptureSpan()
207
284
  protected override async onBeforeUpdate(
208
285
  updateBy: UpdateBy<Model>,
209
286
  ): Promise<OnUpdate<Model>> {
287
+ this.assertLicenseColumnsWrittenByRootOnly(updateBy.data, updateBy.props);
288
+
210
289
  if (updateBy.data.telegramWebhookSecretToken !== undefined) {
211
290
  const secret: unknown = updateBy.data.telegramWebhookSecretToken;
212
291
 
@@ -384,6 +384,8 @@ import ServiceLevelObjectiveOwnerUserService from "./ServiceLevelObjectiveOwnerU
384
384
  import ServiceLevelObjectiveOwnerTeamService from "./ServiceLevelObjectiveOwnerTeamService";
385
385
  import ServiceLevelObjectiveMonitorRuleService from "./ServiceLevelObjectiveMonitorRuleService";
386
386
  import ServiceLevelObjectiveFeedService from "./ServiceLevelObjectiveFeedService";
387
+ import ServiceLevelObjectiveOwnerRuleService from "./ServiceLevelObjectiveOwnerRuleService";
388
+ import ServiceLevelObjectiveLabelRuleService from "./ServiceLevelObjectiveLabelRuleService";
387
389
  import SloHistoryService from "./SloHistoryService";
388
390
  import IncidentReminderRuleService from "./IncidentReminderRuleService";
389
391
  import AlertReminderRuleService from "./AlertReminderRuleService";
@@ -818,6 +820,8 @@ const services: Array<BaseService> = [
818
820
  ServiceLevelObjectiveOwnerTeamService,
819
821
  ServiceLevelObjectiveMonitorRuleService,
820
822
  ServiceLevelObjectiveFeedService,
823
+ ServiceLevelObjectiveOwnerRuleService,
824
+ ServiceLevelObjectiveLabelRuleService,
821
825
  IncidentReminderRuleService,
822
826
  AlertReminderRuleService,
823
827
  ScheduledMaintenanceReminderRuleService,
@@ -13,14 +13,66 @@ import MonitorService from "./MonitorService";
13
13
  import ProbeService from "./ProbeService";
14
14
  import { MonitorTypeHelper } from "../../Types/Monitor/MonitorType";
15
15
  import CronTab from "../Utils/CronTab";
16
- import logger, { LogAttributes } from "../Utils/Logger";
16
+ import logger, { EXTERNAL_FAULT, LogAttributes } from "../Utils/Logger";
17
17
  import { SubscriptionStatusUtil } from "../../Types/Billing/SubscriptionStatus";
18
+ import MonitoringIntervalValidator from "../Utils/Monitor/MonitoringIntervalValidator";
18
19
 
19
20
  export class Service extends DatabaseService<MonitorProbe> {
20
21
  public constructor() {
21
22
  super(MonitorProbe);
22
23
  }
23
24
 
25
+ /**
26
+ * The next time a monitor with this interval is due, or `fallback`.
27
+ *
28
+ * Exported on the class (and covered directly by tests) because both
29
+ * scheduling paths — the batch claim query and the single-monitor refresh
30
+ * after an edit — have to agree about what a stored interval means. They
31
+ * did not before: the claim query swallowed a parse failure silently and
32
+ * fell back to one minute, so a monitor asking for five minutes was probed
33
+ * four times more often than requested, indefinitely and invisibly.
34
+ *
35
+ * Order is load-bearing. cron-parser gets the RAW value first, so the
36
+ * thousands of rows that were always valid take a byte-identical path and
37
+ * anything the parser understands but our grammar does not ("@hourly") is
38
+ * still honoured. Only when that fails do we try to read the value as a
39
+ * human cadence ("5m", "Every 5 minutes"), which is what makes those rows
40
+ * schedule correctly on deploy — before the data migration has run, and
41
+ * for any row that later arrives through a hook-free write or a restore.
42
+ */
43
+ public static resolveNextPingAt(data: {
44
+ monitoringInterval: string | null | undefined;
45
+ fallback: Date;
46
+ onUnreadable?: (() => void) | undefined;
47
+ }): Date {
48
+ if (!data.monitoringInterval) {
49
+ return data.fallback;
50
+ }
51
+
52
+ try {
53
+ return CronTab.getNextExecutionTime(data.monitoringInterval);
54
+ } catch {
55
+ // Not a cron expression. Try to read it as a human cadence instead.
56
+ }
57
+
58
+ const normalizedCron: string | null =
59
+ MonitoringIntervalValidator.normalizeForRead(data.monitoringInterval);
60
+
61
+ if (normalizedCron) {
62
+ try {
63
+ return CronTab.getNextExecutionTime(normalizedCron);
64
+ } catch {
65
+ // Normalizer produced something cron-parser rejects. Report it.
66
+ }
67
+ }
68
+
69
+ if (data.onUnreadable) {
70
+ data.onUnreadable();
71
+ }
72
+
73
+ return data.fallback;
74
+ }
75
+
24
76
  public async pruneStaleLastMonitoringLogEntries(data: {
25
77
  monitorId: ObjectID;
26
78
  validMonitorStepIds: Array<string>;
@@ -103,20 +155,28 @@ export class Service extends DatabaseService<MonitorProbe> {
103
155
  continue;
104
156
  }
105
157
 
106
- let nextPing: Date = OneUptimeDate.addRemoveMinutes(
107
- OneUptimeDate.getCurrentDate(),
108
- 1,
109
- );
110
-
111
- try {
112
- nextPing = CronTab.getNextExecutionTime(
113
- monitorProbe?.monitor?.monitoringInterval as string,
114
- );
115
- } catch (err) {
116
- logger.error(err, {
117
- monitorId: data.monitorId?.toString(),
118
- } as LogAttributes);
119
- }
158
+ /*
159
+ * The falsy guard matters: a Manual monitor (and every other row with
160
+ * no interval) reaches here with undefined, and the old unguarded call
161
+ * handed that straight to cron-parser, which threw and logged an error
162
+ * for a perfectly ordinary row on every single interval edit.
163
+ */
164
+ const nextPing: Date = Service.resolveNextPingAt({
165
+ monitoringInterval: monitorProbe?.monitor?.monitoringInterval,
166
+ fallback: OneUptimeDate.addRemoveMinutes(
167
+ OneUptimeDate.getCurrentDate(),
168
+ 1,
169
+ ),
170
+ onUnreadable: () => {
171
+ logger.error(
172
+ `updateNextPingAtForMonitor: monitoringInterval "${monitorProbe?.monitor?.monitoringInterval}" cannot be read as a schedule; falling back to a 1-minute cadence.`,
173
+ {
174
+ ...EXTERNAL_FAULT,
175
+ monitorId: data.monitorId?.toString(),
176
+ } as LogAttributes,
177
+ );
178
+ },
179
+ });
120
180
 
121
181
  if (nextPing && monitorProbe.id) {
122
182
  await this.updateOneById({
@@ -223,6 +283,17 @@ export class Service extends DatabaseService<MonitorProbe> {
223
283
  const nextPingDates: Array<Date> = [];
224
284
  const caseFragments: Array<string> = [];
225
285
 
286
+ /*
287
+ * Rows whose interval neither cron-parser nor the normalizer could
288
+ * read. Collected and logged ONCE per batch below rather than per
289
+ * row: this loop runs for every claimed monitor, every minute, on
290
+ * every probe-ingest instance, so a per-row log line would flood.
291
+ */
292
+ const unreadableIntervals: Array<{
293
+ monitorProbeId: string;
294
+ monitoringInterval: string;
295
+ }> = [];
296
+
226
297
  for (let i: number = 0; i < selectedRows.length; i++) {
227
298
  const row: { _id: string; monitoringInterval: string | null } =
228
299
  selectedRows[i]!;
@@ -230,11 +301,16 @@ export class Service extends DatabaseService<MonitorProbe> {
230
301
 
231
302
  let nextPing: Date = defaultNextPing;
232
303
  if (row.monitoringInterval) {
233
- try {
234
- nextPing = CronTab.getNextExecutionTime(row.monitoringInterval);
235
- } catch {
236
- // fall back to default 1 minute
237
- }
304
+ nextPing = Service.resolveNextPingAt({
305
+ monitoringInterval: row.monitoringInterval,
306
+ fallback: defaultNextPing,
307
+ onUnreadable: () => {
308
+ unreadableIntervals.push({
309
+ monitorProbeId: row._id,
310
+ monitoringInterval: row.monitoringInterval as string,
311
+ });
312
+ },
313
+ });
238
314
  }
239
315
 
240
316
  nextPingDates.push(nextPing);
@@ -243,6 +319,26 @@ export class Service extends DatabaseService<MonitorProbe> {
243
319
  );
244
320
  }
245
321
 
322
+ /*
323
+ * One aggregated line per batch, at error level with EXTERNAL_FAULT.
324
+ *
325
+ * Not debug: LOG_LEVEL=ERROR is what ships, so a debug or warn line
326
+ * here is deleted from stdout on exactly the installs where an
327
+ * operator would go looking. This condition used to be swallowed by
328
+ * a bare `catch {}`, which is why a monitor storing "5m" was probed
329
+ * every minute instead of every five for as long as the row existed,
330
+ * with nothing anywhere to grep for. EXTERNAL_FAULT marks it as
331
+ * tenant data rather than our own failure, so it does not page us.
332
+ */
333
+ if (unreadableIntervals.length > 0) {
334
+ logger.error(
335
+ `claimMonitorProbesForProbing: ${unreadableIntervals.length} monitor(s) have a monitoringInterval that cannot be read as a schedule and are falling back to a 1-minute cadence. Fix the stored value - "*/5 * * * *" means every 5 minutes. Offenders: ${JSON.stringify(
336
+ unreadableIntervals.slice(0, 20),
337
+ )}`,
338
+ EXTERNAL_FAULT,
339
+ );
340
+ }
341
+
246
342
  const updateQuery: string = `
247
343
  UPDATE "MonitorProbe"
248
344
  SET "lastPingAt" = $1,
@@ -39,6 +39,7 @@ import SortOrder from "../../Types/BaseDatabase/SortOrder";
39
39
  import { PlanType } from "../../Types/Billing/SubscriptionPlan";
40
40
  import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
41
41
  import BadDataException from "../../Types/Exception/BadDataException";
42
+ import MonitoringIntervalValidator from "../Utils/Monitor/MonitoringIntervalValidator";
42
43
  import { JSONObject, JSONValue } from "../../Types/JSON";
43
44
  import MonitorType, {
44
45
  MonitorTypeHelper,
@@ -97,6 +98,7 @@ import { WhatsAppMessagePayload } from "../../Types/WhatsApp/WhatsAppMessage";
97
98
  import MonitorTemplateService from "./MonitorTemplateService";
98
99
  import RelationIdUtil from "../Utils/Database/RelationIdUtil";
99
100
  import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
101
+ import HostAddressUtil from "../../Utils/HostAddressUtil";
100
102
  import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
101
103
 
102
104
  const MONITOR_TEMPLATE_RELATION_KEYS: Array<string> = [
@@ -195,7 +197,17 @@ export class Service extends DatabaseService<Model> {
195
197
  ) {
196
198
  const port: string = firstStep.data.monitorDestinationPort.toString();
197
199
  if (monitorDestination && port) {
198
- monitorDestination = `${monitorDestination}:${port}`;
200
+ /*
201
+ * Bracketed when the host is an IPv6 literal. Plain
202
+ * concatenation there does not merely look odd: "2001:db8::1" +
203
+ * ":179" is "2001:db8::1:179", which is itself a valid IPv6
204
+ * address — a DIFFERENT host from the one being monitored, named
205
+ * in an alert somebody is about to act on.
206
+ */
207
+ monitorDestination = HostAddressUtil.formatHostAndPort({
208
+ host: monitorDestination,
209
+ port: port,
210
+ });
199
211
  }
200
212
  }
201
213
 
@@ -207,7 +219,10 @@ export class Service extends DatabaseService<Model> {
207
219
  monitorDestination = firstStep.data.snmpMonitor.hostname || "";
208
220
  const port: number = firstStep.data.snmpMonitor.port || 161;
209
221
  if (monitorDestination && port) {
210
- monitorDestination = `${monitorDestination}:${port}`;
222
+ monitorDestination = HostAddressUtil.formatHostAndPort({
223
+ host: monitorDestination,
224
+ port: port,
225
+ });
211
226
  }
212
227
  }
213
228
 
@@ -239,7 +254,10 @@ export class Service extends DatabaseService<Model> {
239
254
  databaseName: string;
240
255
  } = firstStep.data.sqlMonitor;
241
256
  if (sql.host) {
242
- monitorDestination = `${sql.host}:${sql.port}/${sql.databaseName}`;
257
+ monitorDestination = `${HostAddressUtil.formatHostAndPort({
258
+ host: sql.host,
259
+ port: sql.port,
260
+ })}/${sql.databaseName}`;
243
261
  }
244
262
  }
245
263
 
@@ -254,7 +272,10 @@ export class Service extends DatabaseService<Model> {
254
272
  databaseName: string;
255
273
  } = firstStep.data.databaseMonitor;
256
274
  if (database.host) {
257
- monitorDestination = `${database.host}:${database.port}/${database.databaseName}`;
275
+ monitorDestination = `${HostAddressUtil.formatHostAndPort({
276
+ host: database.host,
277
+ port: database.port,
278
+ })}/${database.databaseName}`;
258
279
  }
259
280
  }
260
281
  }
@@ -604,6 +625,21 @@ export class Service extends DatabaseService<Model> {
604
625
  resolveReferenceId(updateBy.data.currentMonitorStatus);
605
626
 
606
627
  const updateDataKeys: Array<string> = Object.keys(updateBy.data || {});
628
+
629
+ /*
630
+ * Key presence, never truthiness or the stored value: renaming one of
631
+ * the monitors that already holds a broken interval sends only {name},
632
+ * and gating on the stored value would make those monitors un-editable
633
+ * — punishing the customer for our validation gap.
634
+ */
635
+ if (updateDataKeys.includes("monitoringInterval")) {
636
+ (updateBy.data as unknown as Record<string, unknown>)[
637
+ "monitoringInterval"
638
+ ] = MonitoringIntervalValidator.validateAndNormalize(
639
+ updateBy.data.monitoringInterval as string | null | undefined,
640
+ );
641
+ }
642
+
607
643
  const isMonitorStepsWritten: boolean =
608
644
  updateDataKeys.includes("monitorSteps");
609
645
  const isMonitorTemplateWritten: boolean = RelationIdUtil.isWritten(
@@ -1265,14 +1301,15 @@ export class Service extends DatabaseService<Model> {
1265
1301
  }
1266
1302
 
1267
1303
  /*
1268
- * SLO monitor rules match on labels, name and description, so an edit to
1269
- * any of the three can pull this monitor into an SLO's error budget or
1304
+ * SLO monitor rules match on labels, type, name and description, so an edit to
1305
+ * any of those fields can pull this monitor into an SLO's error budget or
1270
1306
  * push it out of one. Keyed on `!== undefined` rather than on a non-empty
1271
1307
  * value: clearing every label arrives as `[]`, and that is precisely the
1272
1308
  * edit that should detach the monitor from every rule-driven SLO.
1273
1309
  */
1274
1310
  if (
1275
1311
  (onUpdate.updateBy.data.labels !== undefined ||
1312
+ onUpdate.updateBy.data.monitorType !== undefined ||
1276
1313
  onUpdate.updateBy.data.name !== undefined ||
1277
1314
  onUpdate.updateBy.data.description !== undefined) &&
1278
1315
  updatedItemIds.length > 0
@@ -1359,6 +1396,22 @@ export class Service extends DatabaseService<Model> {
1359
1396
  throw new BadDataException("ProjectId required to create monitor.");
1360
1397
  }
1361
1398
 
1399
+ /*
1400
+ * Canonicalize the monitoring interval before anything is persisted.
1401
+ *
1402
+ * Gated on key presence, not truthiness: createBy.data is a model
1403
+ * INSTANCE whose columns are all declared `= undefined`, and null is a
1404
+ * meaningful value here ("no schedule"), so a truthiness test would skip
1405
+ * exactly the writes that need checking.
1406
+ */
1407
+ if (createBy.data.monitoringInterval !== undefined) {
1408
+ (createBy.data as unknown as Record<string, unknown>)[
1409
+ "monitoringInterval"
1410
+ ] = MonitoringIntervalValidator.validateAndNormalize(
1411
+ createBy.data.monitoringInterval,
1412
+ );
1413
+ }
1414
+
1362
1415
  /*
1363
1416
  * Validate the request's shape before consulting billing. A conflicting
1364
1417
  * Monitor Template reference, or one hidden by the caller's read scope, is