@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,263 @@
1
+ import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
2
+ import ProjectSCIM from "../../../Models/DatabaseModels/ProjectSCIM";
3
+ import ProjectSso from "../../../Models/DatabaseModels/ProjectSso";
4
+ import User from "../../../Models/DatabaseModels/User";
5
+ import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
6
+ import ProjectSSOService from "../../../Server/Services/ProjectSsoService";
7
+ import UserService from "../../../Server/Services/UserService";
8
+ import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
9
+ import { JSONArray, JSONObject } from "../../../Types/JSON";
10
+ import ObjectID from "../../../Types/ObjectID";
11
+ import Permission, { UserPermission } from "../../../Types/Permission";
12
+ import UserType from "../../../Types/UserType";
13
+ import { describe, expect, jest, test } from "@jest/globals";
14
+
15
+ /*
16
+ * WHY THIS FILE EXISTS.
17
+ *
18
+ * A project owner's POST /api/project-scim answered 200 with every column of
19
+ * the new row EXCEPT "_id", and the get-list that followed - selecting
20
+ * {_id:true, name:true} - came back as [{name}]. Nothing was wrong with the
21
+ * data or the query: the row carried its real `_id` in memory and `_id`
22
+ * reached TypeORM in the projection. The id was dropped while serializing the
23
+ * response, because DatabaseBaseModel.toJSONObject iterates a column list that
24
+ * is cached per model class, and that cache had been built from the create
25
+ * path's own mutilated model instance - BaseAPI.createItem deleted `_id` off
26
+ * it, and DatabaseService.create asks that instance for its columns
27
+ * (generateDefaultValues) on the way through. One create poisoned the class
28
+ * for the life of the process, for every later caller.
29
+ *
30
+ * These tests drive the real services with a mocked repository - no database -
31
+ * and deliberately delete `_id` off the model handed to create(), which is
32
+ * what the API used to do. They assert the whole round trip keeps its ids
33
+ * anyway. Each test uses a different model because the caches are per class
34
+ * and per process: reusing one would leave a warm cache and pass vacuously.
35
+ *
36
+ * Three callers, because of how the create path's accidental mitigation
37
+ * behaves. enforceTenantRelationMatchesScalar runs two lines before
38
+ * generateDefaultValues and warms the cache from the service's own healthy
39
+ * model, so it hides the bug for some callers and not others:
40
+ * a) a project owner on a tenant-scoped model - COVERED by that mitigation,
41
+ * so this case passes even with the fix reverted. It is here as the
42
+ * shape of the reported incident and to keep it working, not as the
43
+ * test that catches a regression: the live incident needed an earlier
44
+ * poisoning create (b or c) to have happened in the same process first.
45
+ * b) an isRoot caller, which returns before that guard runs - this one
46
+ * fails without the fix
47
+ * c) a REFUSED create on a model with no tenant column - also fails without
48
+ * the fix, and proves that a request nobody was allowed to make cannot
49
+ * poison anything, since the columns are read ~20 lines before the
50
+ * create permission check
51
+ *
52
+ * The instance-independence invariant itself is pinned by
53
+ * Tests/Types/Database/CanonicalModelInstance.test.ts, which fails for every
54
+ * model if the fix regresses. These three are the end-to-end evidence.
55
+ */
56
+
57
+ const PROJECT_ID: ObjectID = new ObjectID(
58
+ "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
59
+ );
60
+ const USER_ID: ObjectID = new ObjectID("bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb");
61
+ const ROW_ID: string = "22222222-2222-4222-8222-222222222222";
62
+
63
+ function ownerProps(): DatabaseCommonInteractionProps {
64
+ const permissions: Array<UserPermission> = [
65
+ Permission.ProjectOwner,
66
+ Permission.ProjectAdmin,
67
+ Permission.ProjectMember,
68
+ ].map((permission: Permission) => {
69
+ return {
70
+ permission: permission,
71
+ labelIds: [],
72
+ isBlockPermission: false,
73
+ _type: "UserPermission" as const,
74
+ };
75
+ });
76
+
77
+ return {
78
+ userId: USER_ID,
79
+ tenantId: PROJECT_ID,
80
+ userType: UserType.User,
81
+ userTenantAccessPermission: {
82
+ [PROJECT_ID.toString()]: {
83
+ projectId: PROJECT_ID,
84
+ permissions: permissions,
85
+ _type: "UserTenantAccessPermission",
86
+ },
87
+ },
88
+ };
89
+ }
90
+
91
+ function loggedInUserProps(): DatabaseCommonInteractionProps {
92
+ return {
93
+ ...ownerProps(),
94
+ userGlobalAccessPermission: {
95
+ projectIds: [PROJECT_ID],
96
+ globalPermissions: [Permission.CurrentUser],
97
+ _type: "UserGlobalAccessPermission",
98
+ },
99
+ };
100
+ }
101
+
102
+ /*
103
+ * Stands in for Postgres: `save` stamps the generated uuid onto the entity the
104
+ * way the driver writes it back, and `find` returns a row that has one.
105
+ */
106
+ function mockRepository(
107
+ service: unknown,
108
+ modelType: { new (): BaseModel },
109
+ rowFields: JSONObject,
110
+ ): void {
111
+ const repository: Record<string, unknown> = {
112
+ save: async (entity: BaseModel): Promise<BaseModel> => {
113
+ entity._id = ROW_ID;
114
+ return entity;
115
+ },
116
+ find: async (): Promise<Array<BaseModel>> => {
117
+ const row: BaseModel = new modelType();
118
+ row._id = ROW_ID;
119
+ Object.assign(row, rowFields);
120
+ return [row];
121
+ },
122
+ findOneBy: async (): Promise<null> => {
123
+ return null;
124
+ },
125
+ count: async (): Promise<number> => {
126
+ return 0;
127
+ },
128
+ };
129
+
130
+ jest
131
+ .spyOn(service as never, "getRepository" as never)
132
+ .mockReturnValue(repository as never);
133
+ }
134
+
135
+ /* What BaseAPI.createItem used to hand the service: `_id` deleted outright. */
136
+ function payloadWithIdDeleted<T extends BaseModel>(
137
+ json: JSONObject,
138
+ modelType: { new (): T },
139
+ ): T {
140
+ const item: T = BaseModel.fromJSON<T>(json, modelType) as T;
141
+ delete (item as unknown as Record<string, unknown>)["_id"];
142
+
143
+ return item;
144
+ }
145
+
146
+ describe("create and read responses keep their _id", () => {
147
+ test("a project owner creating and then listing a tenant-scoped model (the incident's shape; the create path's tenant guard already covered this one)", async () => {
148
+ mockRepository(ProjectSCIMService, ProjectSCIM, { name: "listed scim" });
149
+
150
+ const savedItem: ProjectSCIM = await ProjectSCIMService.create({
151
+ data: payloadWithIdDeleted<ProjectSCIM>(
152
+ {
153
+ name: "created scim",
154
+ projectId: PROJECT_ID.toString(),
155
+ bearerToken: "scim-token",
156
+ },
157
+ ProjectSCIM,
158
+ ),
159
+ props: ownerProps(),
160
+ });
161
+
162
+ const createResponse: JSONObject = BaseModel.toJSON(savedItem, ProjectSCIM);
163
+
164
+ expect(savedItem._id).toBe(ROW_ID);
165
+ expect(createResponse["_id"]).toBe(ROW_ID);
166
+
167
+ const rows: Array<ProjectSCIM> = await ProjectSCIMService.findBy({
168
+ query: { projectId: PROJECT_ID },
169
+ select: { _id: true, name: true } as never,
170
+ limit: 50,
171
+ skip: 0,
172
+ props: ownerProps(),
173
+ });
174
+
175
+ const listResponse: JSONArray = BaseModel.toJSONObjectArray(
176
+ rows,
177
+ ProjectSCIM,
178
+ );
179
+
180
+ expect(rows[0]?._id).toBe(ROW_ID);
181
+ expect((listResponse[0] as JSONObject)["_id"]).toBe(ROW_ID);
182
+ expect((listResponse[0] as JSONObject)["name"]).toBe("listed scim");
183
+ });
184
+
185
+ test("an isRoot caller creating, then a project owner listing", async () => {
186
+ /*
187
+ * isRoot returns from enforceTenantRelationMatchesScalar before it can
188
+ * warm the column cache, so on master this create was the first thing to
189
+ * describe the class - and it described it without an id.
190
+ */
191
+ mockRepository(ProjectSSOService, ProjectSso, { name: "listed sso" });
192
+
193
+ const savedItem: ProjectSso = await ProjectSSOService.create({
194
+ data: payloadWithIdDeleted<ProjectSso>(
195
+ {
196
+ name: "created sso",
197
+ description: "created by the root caller",
198
+ projectId: PROJECT_ID.toString(),
199
+ signatureMethod: "RSA-SHA256",
200
+ digestMethod: "SHA256",
201
+ signOnURL: "https://example.com/sso",
202
+ issuerURL: "https://example.com",
203
+ publicCertificate: "a-certificate",
204
+ },
205
+ ProjectSso,
206
+ ),
207
+ props: { isRoot: true },
208
+ });
209
+
210
+ expect(BaseModel.toJSON(savedItem, ProjectSso)["_id"]).toBe(ROW_ID);
211
+
212
+ const rows: Array<ProjectSso> = await ProjectSSOService.findBy({
213
+ query: { projectId: PROJECT_ID },
214
+ select: { _id: true, name: true } as never,
215
+ limit: 50,
216
+ skip: 0,
217
+ props: ownerProps(),
218
+ });
219
+
220
+ const listResponse: JSONArray = BaseModel.toJSONObjectArray(
221
+ rows,
222
+ ProjectSso,
223
+ );
224
+
225
+ expect((listResponse[0] as JSONObject)["_id"]).toBe(ROW_ID);
226
+ });
227
+
228
+ test("a REFUSED create on a model with no tenant column cannot strip ids from later reads", async () => {
229
+ /*
230
+ * User.create is `[]` - nobody may POST /api/user - and User has no
231
+ * @TenantColumn, so neither the permission check nor the tenant guard
232
+ * stood between the request and the column cache. One authenticated POST
233
+ * that always 4xxs was enough to strip `_id` from every User response the
234
+ * process served afterwards.
235
+ */
236
+ mockRepository(UserService, User, {
237
+ email: { _type: "Email", value: "someone@example.com" },
238
+ });
239
+
240
+ await expect(
241
+ UserService.create({
242
+ data: payloadWithIdDeleted<User>(
243
+ { email: "attacker@example.com" },
244
+ User,
245
+ ),
246
+ props: loggedInUserProps(),
247
+ }),
248
+ ).rejects.toThrow(/not allowed/i);
249
+
250
+ const rows: Array<User> = await UserService.findBy({
251
+ query: { _id: USER_ID.toString() } as never,
252
+ select: { _id: true, email: true } as never,
253
+ limit: 10,
254
+ skip: 0,
255
+ props: loggedInUserProps(),
256
+ });
257
+
258
+ const listResponse: JSONArray = BaseModel.toJSONObjectArray(rows, User);
259
+
260
+ expect(rows[0]?._id).toBe(ROW_ID);
261
+ expect((listResponse[0] as JSONObject)["_id"]).toBe(ROW_ID);
262
+ });
263
+ });
@@ -1,5 +1,7 @@
1
1
  import AlertReminderRule from "../../../Models/DatabaseModels/AlertReminderRule";
2
2
  import StatusPageMonitorRule from "../../../Models/DatabaseModels/StatusPageMonitorRule";
3
+ import ServiceLevelObjectiveMonitorRule from "../../../Models/DatabaseModels/ServiceLevelObjectiveMonitorRule";
4
+ import MonitorType from "../../../Types/Monitor/MonitorType";
3
5
  import DatabaseService from "../../../Server/Services/DatabaseService";
4
6
  import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
5
7
  import FilterCondition from "../../../Types/Filter/FilterCondition";
@@ -520,3 +522,105 @@ describe("DatabaseService rule criteria validation", () => {
520
522
  );
521
523
  });
522
524
  });
525
+
526
+ describe("DatabaseService SLO monitor type criteria validation", () => {
527
+ const sloService: DatabaseService<ServiceLevelObjectiveMonitorRule> =
528
+ new DatabaseService<ServiceLevelObjectiveMonitorRule>(
529
+ ServiceLevelObjectiveMonitorRule,
530
+ );
531
+ const sanitizeSlo: SanitizeFunction = async (
532
+ data: unknown,
533
+ props: DatabaseCommonInteractionProps = { isRoot: true },
534
+ isUpdate: boolean = true,
535
+ ): Promise<JSONObject> => {
536
+ return (await (
537
+ sloService as unknown as { sanitizeCreateOrUpdate: SanitizeFunction }
538
+ ).sanitizeCreateOrUpdate(data, props, isUpdate)) as JSONObject;
539
+ };
540
+
541
+ it.each([true, false])(
542
+ "persists valid type criteria with a fail-closed compatibility shadow on update=%p",
543
+ async (isUpdate: boolean) => {
544
+ const criteria: JSONObject = criteriaFor({
545
+ field: "monitorType",
546
+ operator: RuleCriteriaOperator.Equals,
547
+ value: MonitorType.Docker,
548
+ });
549
+ const result: JSONObject = await sanitizeSlo(
550
+ {
551
+ criteria,
552
+ monitorType: MonitorType.API,
553
+ monitorNamePattern: ".*",
554
+ monitorLabels: ["11111111-1111-4111-8111-111111111111"],
555
+ },
556
+ { isRoot: true },
557
+ isUpdate,
558
+ );
559
+ expect(result).toMatchObject({
560
+ criteria,
561
+ monitorType: null,
562
+ monitorNamePattern: "(?!)",
563
+ });
564
+ expect(result["monitorLabels"]).toBeUndefined();
565
+ },
566
+ );
567
+
568
+ it.each(Object.values(MonitorType))(
569
+ "accepts equality and inequality for %s",
570
+ async (monitorType: MonitorType) => {
571
+ for (const operator of [
572
+ RuleCriteriaOperator.Equals,
573
+ RuleCriteriaOperator.NotEquals,
574
+ ]) {
575
+ await expect(
576
+ sanitizeSlo({
577
+ criteria: criteriaFor({
578
+ field: "monitorType",
579
+ operator,
580
+ value: monitorType,
581
+ }),
582
+ }),
583
+ ).resolves.toBeDefined();
584
+ }
585
+ },
586
+ );
587
+
588
+ it.each(["Unknown", "api", "API.*", 1, true])(
589
+ "rejects invalid type value %p",
590
+ async (value: string | number | boolean) => {
591
+ await expect(
592
+ sanitizeSlo({
593
+ criteria: criteriaFor({
594
+ field: "monitorType",
595
+ operator: RuleCriteriaOperator.NotEquals,
596
+ value,
597
+ }),
598
+ }),
599
+ ).rejects.toThrow("valid monitor type");
600
+ },
601
+ );
602
+
603
+ it.each([
604
+ RuleCriteriaOperator.Contains,
605
+ RuleCriteriaOperator.DoesNotContain,
606
+ RuleCriteriaOperator.StartsWith,
607
+ RuleCriteriaOperator.EndsWith,
608
+ RuleCriteriaOperator.MatchesPattern,
609
+ RuleCriteriaOperator.DoesNotMatchPattern,
610
+ RuleCriteriaOperator.HasAnyOf,
611
+ RuleCriteriaOperator.HasAllOf,
612
+ RuleCriteriaOperator.HasNoneOf,
613
+ ])(
614
+ "rejects unsupported type operator %s",
615
+ async (operator: RuleCriteriaOperator) => {
616
+ const value: string | Array<string> = operator.startsWith("Has")
617
+ ? [MonitorType.API]
618
+ : MonitorType.API;
619
+ await expect(
620
+ sanitizeSlo({
621
+ criteria: criteriaFor({ field: "monitorType", operator, value }),
622
+ }),
623
+ ).rejects.toThrow("only support Equals");
624
+ },
625
+ );
626
+ });
@@ -0,0 +1,151 @@
1
+ import EnterpriseLicenseService, {
2
+ ENTERPRISE_LICENSE_KEY_RANDOM_BYTES,
3
+ generateEnterpriseLicenseKey,
4
+ } from "../../../Server/Services/EnterpriseLicenseService";
5
+ import { OnCreate } from "../../../Server/Types/Database/Hooks";
6
+ import EnterpriseLicense from "../../../Models/DatabaseModels/EnterpriseLicense";
7
+ import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
8
+ import ColumnLength from "../../../Types/Database/ColumnLength";
9
+ import crypto from "crypto";
10
+ import { afterEach, describe, expect, it, jest } from "@jest/globals";
11
+
12
+ /*
13
+ * License keys are generated on the SERVER when the admin leaves the field
14
+ * blank. They used to be made in the browser (UUID.generate() in the Admin
15
+ * Dashboard's create form), so the only randomness guarding a customer's
16
+ * license came from whatever the admin's browser supplied.
17
+ *
18
+ * Pinned: a blank key becomes 32 CSPRNG bytes (64 hex characters, within the
19
+ * ShortText column), a typed key is kept (trimmed - installations trim what
20
+ * they send, so stored whitespace would make a key unmatchable), and the hook
21
+ * runs in onBeforeCreate - before DatabaseService's required-column check,
22
+ * which would otherwise reject the blank key.
23
+ */
24
+
25
+ type RunBeforeCreateFunction = (
26
+ license: EnterpriseLicense,
27
+ ) => Promise<EnterpriseLicense>;
28
+
29
+ const runBeforeCreate: RunBeforeCreateFunction = async (
30
+ license: EnterpriseLicense,
31
+ ): Promise<EnterpriseLicense> => {
32
+ const result: OnCreate<EnterpriseLicense> = await (
33
+ EnterpriseLicenseService as unknown as {
34
+ onBeforeCreate: (
35
+ createBy: unknown,
36
+ ) => Promise<OnCreate<EnterpriseLicense>>;
37
+ }
38
+ ).onBeforeCreate({
39
+ data: license,
40
+ props: { isRoot: true },
41
+ });
42
+
43
+ return result.createBy.data;
44
+ };
45
+
46
+ const HEX_KEY: RegExp = /^[0-9a-f]{64}$/;
47
+
48
+ describe("EnterpriseLicenseService license key generation", () => {
49
+ afterEach(() => {
50
+ jest.restoreAllMocks();
51
+ });
52
+
53
+ describe("generateEnterpriseLicenseKey", () => {
54
+ it("is 32 random bytes written as 64 lower-case hex characters", () => {
55
+ expect(ENTERPRISE_LICENSE_KEY_RANDOM_BYTES).toBe(32);
56
+ expect(generateEnterpriseLicenseKey()).toMatch(HEX_KEY);
57
+ });
58
+
59
+ it("fits the licenseKey column", () => {
60
+ expect(generateEnterpriseLicenseKey().length).toBeLessThanOrEqual(
61
+ ColumnLength.ShortText,
62
+ );
63
+ });
64
+
65
+ it("comes from crypto.randomBytes", () => {
66
+ const randomBytes: ReturnType<typeof jest.spyOn> = jest.spyOn(
67
+ crypto,
68
+ "randomBytes",
69
+ );
70
+
71
+ generateEnterpriseLicenseKey();
72
+
73
+ expect(randomBytes).toHaveBeenCalledWith(32);
74
+ });
75
+
76
+ it("never repeats", () => {
77
+ const keys: Set<string> = new Set<string>();
78
+
79
+ for (let index: number = 0; index < 500; index++) {
80
+ keys.add(generateEnterpriseLicenseKey());
81
+ }
82
+
83
+ expect(keys.size).toBe(500);
84
+ });
85
+ });
86
+
87
+ describe("onBeforeCreate", () => {
88
+ it("generates a key when the admin left it out entirely", async () => {
89
+ const license: EnterpriseLicense = BaseModel.fromJSON(
90
+ { companyName: "Acme, Inc.", expiresAt: "2027-01-01" },
91
+ EnterpriseLicense,
92
+ ) as EnterpriseLicense;
93
+
94
+ expect((await runBeforeCreate(license)).licenseKey).toMatch(HEX_KEY);
95
+ });
96
+
97
+ it.each([
98
+ ["an empty string", ""],
99
+ ["whitespace", " \t "],
100
+ ])(
101
+ "generates a key when the admin submitted %s",
102
+ async (_label: string, licenseKey: string) => {
103
+ const license: EnterpriseLicense = new EnterpriseLicense();
104
+ license.companyName = "Acme, Inc.";
105
+ license.licenseKey = licenseKey;
106
+
107
+ expect((await runBeforeCreate(license)).licenseKey).toMatch(HEX_KEY);
108
+ },
109
+ );
110
+
111
+ it("keeps a key the admin typed, trimmed", async () => {
112
+ const license: EnterpriseLicense = new EnterpriseLicense();
113
+ license.companyName = "Acme, Inc.";
114
+ license.licenseKey = " b6f4c1a2-1111-2222-3333-444455556666\n";
115
+
116
+ expect((await runBeforeCreate(license)).licenseKey).toBe(
117
+ "b6f4c1a2-1111-2222-3333-444455556666",
118
+ );
119
+ });
120
+
121
+ it("gives two blank-key licenses different keys", async () => {
122
+ const first: EnterpriseLicense = new EnterpriseLicense();
123
+ const second: EnterpriseLicense = new EnterpriseLicense();
124
+
125
+ expect((await runBeforeCreate(first)).licenseKey).not.toBe(
126
+ (await runBeforeCreate(second)).licenseKey,
127
+ );
128
+ });
129
+
130
+ it("hands the same create request on, with nothing carried forward", async () => {
131
+ const license: EnterpriseLicense = new EnterpriseLicense();
132
+ const createBy: { data: EnterpriseLicense; props: { isRoot: boolean } } =
133
+ {
134
+ data: license,
135
+ props: { isRoot: true },
136
+ };
137
+
138
+ const result: OnCreate<EnterpriseLicense> = await (
139
+ EnterpriseLicenseService as unknown as {
140
+ onBeforeCreate: (
141
+ createBy: unknown,
142
+ ) => Promise<OnCreate<EnterpriseLicense>>;
143
+ }
144
+ ).onBeforeCreate(createBy);
145
+
146
+ expect(result.createBy).toBe(createBy);
147
+ expect(result.createBy.data).toBe(license);
148
+ expect(result.carryForward).toBeUndefined();
149
+ });
150
+ });
151
+ });