@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
@@ -57,6 +57,43 @@ function extractMatchFields(source: string): Set<string> {
57
57
  return fields;
58
58
  }
59
59
 
60
+ function extractFormMatchFields(data: {
61
+ filePath: string;
62
+ source: string;
63
+ formSource: string;
64
+ }): Set<string> {
65
+ const fields: Set<string> = extractMatchFields(data.formSource);
66
+ const helperPattern: RegExp = /formFields=\{([A-Za-z][A-Za-z0-9]*)\(\)\}/g;
67
+
68
+ for (const helperMatch of data.formSource.matchAll(helperPattern)) {
69
+ const importMatch: RegExpMatchArray | null = data.source.match(
70
+ new RegExp(`import\\s+${helperMatch[1]}\\s+from\\s+["'](\\.[^"']+)["']`),
71
+ );
72
+ expect(importMatch).not.toBeNull();
73
+
74
+ const helperPath: string = path.resolve(
75
+ path.dirname(data.filePath),
76
+ importMatch![1]!,
77
+ );
78
+ const resolvedPath: string | undefined = [".ts", ".tsx"]
79
+ .map((extension: string): string => {
80
+ return `${helperPath}${extension}`;
81
+ })
82
+ .find((candidate: string): boolean => {
83
+ return fs.existsSync(candidate);
84
+ });
85
+ expect(resolvedPath).toBeDefined();
86
+
87
+ for (const field of extractMatchFields(
88
+ fs.readFileSync(resolvedPath!, "utf8"),
89
+ )) {
90
+ fields.add(field);
91
+ }
92
+ }
93
+
94
+ return fields;
95
+ }
96
+
60
97
  function discoverStaticRuleForms(): {
61
98
  formFiles: Array<string>;
62
99
  formsByModel: Map<string, FormCoverage>;
@@ -92,9 +129,11 @@ function discoverStaticRuleForms(): {
92
129
  const modelName: string = match[1]!;
93
130
  const sourceStart: number = match.index!;
94
131
  const sourceEnd: number = nextMatch?.index || source.length;
95
- const fields: Set<string> = extractMatchFields(
96
- source.slice(sourceStart, sourceEnd),
97
- );
132
+ const fields: Set<string> = extractFormMatchFields({
133
+ filePath: filePath,
134
+ source: source,
135
+ formSource: source.slice(sourceStart, sourceEnd),
136
+ });
98
137
 
99
138
  expect(fields.size).toBeGreaterThan(0);
100
139
  expect(formsByModel.has(modelName)).toBe(false);
@@ -157,9 +196,9 @@ describe("static rule criteria runtime coverage", () => {
157
196
  discoverStaticRuleForms();
158
197
  const inheritedRuleModelNames: Array<string> = getInheritedRuleModelNames();
159
198
 
160
- test("all 62 static match-criteria forms route their 74 rule models through ModelForm", () => {
161
- expect(formFiles).toHaveLength(62);
162
- expect(formsByModel.size).toBe(74);
199
+ test("all 64 static match-criteria forms route their 76 rule models through ModelForm", () => {
200
+ expect(formFiles).toHaveLength(64);
201
+ expect(formsByModel.size).toBe(76);
163
202
  expect([...formsByModel.keys()].sort()).toEqual(inheritedRuleModelNames);
164
203
  expect(Object.keys(RULE_CRITERIA_FIELDS_BY_MODEL).sort()).toEqual(
165
204
  inheritedRuleModelNames,
@@ -12,6 +12,13 @@ import EmailTemplateType from "../../../Types/Email/EmailTemplateType";
12
12
  import HashedString from "../../../Types/HashedString";
13
13
  import ObjectID from "../../../Types/ObjectID";
14
14
  import { getJestSpyOn } from "../../Spy";
15
+ import {
16
+ createLicenseSnapshotWithStatus,
17
+ installFakeEnterpriseModule,
18
+ uninstallEnterpriseModule,
19
+ } from "../Enterprise/FakeEnterpriseModule";
20
+ import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
21
+ import logger from "../../../Server/Utils/Logger";
15
22
  import {
16
23
  afterEach,
17
24
  beforeEach,
@@ -21,6 +28,28 @@ import {
21
28
  test,
22
29
  } from "@jest/globals";
23
30
 
31
+ /*
32
+ * A status page's "require SSO" is an Enterprise Edition control: honoured
33
+ * while SSO is active (EnterpriseEdition.isFeatureActive(SSO)), relaxed on the
34
+ * Community Edition and on an Enterprise install whose license lapsed, where
35
+ * status page SSO login does not exist or refuses. Billing and the edition are
36
+ * pinned so the suite tests the same thing locally and in CI (whose
37
+ * config.env sets BILLING_ENABLED=true).
38
+ */
39
+ jest.mock("../../../Server/EnvironmentConfig", () => {
40
+ const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
41
+ jest.requireActual(
42
+ "../Enterprise/TestBillingFlag",
43
+ ) as typeof import("../Enterprise/TestBillingFlag");
44
+
45
+ return billingFlag.withLiveBillingFlag(
46
+ jest.requireActual("../../../Server/EnvironmentConfig") as Record<
47
+ string,
48
+ unknown
49
+ >,
50
+ );
51
+ });
52
+
24
53
  class TestService extends Service {
25
54
  public async completeCreation(
26
55
  user: StatusPagePrivateUser,
@@ -49,6 +78,8 @@ describe("StatusPagePrivateUserService invitation login policy", () => {
49
78
  beforeEach(() => {
50
79
  jest.useFakeTimers();
51
80
  jest.setSystemTime(FROZEN_NOW);
81
+ setTestBillingEnabled(false);
82
+ installFakeEnterpriseModule();
52
83
 
53
84
  service = new TestService();
54
85
  statusPage = new StatusPage();
@@ -86,6 +117,8 @@ describe("StatusPagePrivateUserService invitation login policy", () => {
86
117
  afterEach(() => {
87
118
  jest.useRealTimers();
88
119
  jest.restoreAllMocks();
120
+ uninstallEnterpriseModule();
121
+ setTestBillingEnabled(false);
89
122
  });
90
123
 
91
124
  test.each([false, undefined])(
@@ -112,6 +145,67 @@ describe("StatusPagePrivateUserService invitation login policy", () => {
112
145
  },
113
146
  );
114
147
 
148
+ test("the requirement still holds on the Enterprise Edition during the grace period", async () => {
149
+ installFakeEnterpriseModule({
150
+ snapshot: createLicenseSnapshotWithStatus("grace"),
151
+ });
152
+ statusPage.requireSsoForLogin = true;
153
+
154
+ await expect(service.completeCreation(user)).resolves.toBe(user);
155
+
156
+ expect(update).not.toHaveBeenCalled();
157
+ expect(sendMail).not.toHaveBeenCalled();
158
+ });
159
+
160
+ test.each(["expired", "missing", "invalid"] as const)(
161
+ "with a lapsed (%s) license a page that required SSO gets a usable password invitation, as on the Community Edition",
162
+ async (status: "expired" | "missing" | "invalid") => {
163
+ getJestSpyOn(logger, "warn").mockImplementation((): void => {
164
+ return undefined;
165
+ });
166
+ installFakeEnterpriseModule({
167
+ snapshot: createLicenseSnapshotWithStatus(status),
168
+ });
169
+ statusPage.requireSsoForLogin = true;
170
+
171
+ await expect(service.completeCreation(user)).resolves.toBe(user);
172
+
173
+ // Status page SSO refuses while the license is lapsed: without a password link the user could not sign in.
174
+ expect(update).toHaveBeenCalledTimes(1);
175
+ expect(sendMail).toHaveBeenCalledTimes(1);
176
+ expect(sendMail).toHaveBeenCalledWith(
177
+ expect.objectContaining({
178
+ templateType: EmailTemplateType.StatusPageWelcomeEmail,
179
+ }),
180
+ expect.anything(),
181
+ );
182
+ },
183
+ );
184
+
185
+ test.each([false, true])(
186
+ "on the Community Edition (billing=%p) a page that required SSO still gets a usable password invitation",
187
+ async (billing: boolean) => {
188
+ setTestBillingEnabled(billing);
189
+ uninstallEnterpriseModule();
190
+ statusPage.requireSsoForLogin = true;
191
+
192
+ await expect(service.completeCreation(user)).resolves.toBe(user);
193
+
194
+ /*
195
+ * Status page SSO does not exist on the Community Edition, so without a
196
+ * password link the invited user would have no way to sign in at all.
197
+ */
198
+ expect(update).toHaveBeenCalledTimes(1);
199
+ expect(sendMail).toHaveBeenCalledTimes(1);
200
+ expect(sendMail).toHaveBeenCalledWith(
201
+ expect.objectContaining({
202
+ templateType: EmailTemplateType.StatusPageWelcomeEmail,
203
+ }),
204
+ expect.anything(),
205
+ );
206
+ },
207
+ );
208
+
115
209
  test("SSO sign-ups do not create an unused password-reset credential", async () => {
116
210
  user.isSsoUser = true;
117
211
 
@@ -1,3 +1,4 @@
1
+ import crypto from "crypto";
1
2
  import DatabaseConfig from "../../../Server/DatabaseConfig";
2
3
  import { EncryptionSecret } from "../../../Server/EnvironmentConfig";
3
4
  import MailService from "../../../Server/Services/MailService";
@@ -928,6 +929,40 @@ describe("UserService -- master-admin authentication management", () => {
928
929
  expect(first).not.toBe(second);
929
930
  });
930
931
 
932
+ test("mints the token from the CSPRNG, never ObjectID's non-crypto fallback", async () => {
933
+ /*
934
+ * The token is a bearer secret: whoever holds it can set the password.
935
+ * ObjectID.generate() falls back to Math.random() when no Web Crypto
936
+ * API is present, so the token comes from node:crypto directly.
937
+ */
938
+ const randomUUIDSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
939
+ crypto,
940
+ "randomUUID",
941
+ );
942
+ const objectIdSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
943
+ ObjectID,
944
+ "generate",
945
+ );
946
+
947
+ resolveUser(buildUser({ id: userId, email: "user@example.com" }));
948
+
949
+ try {
950
+ await UserService.sendPasswordResetLink({ userId: userId });
951
+
952
+ const tokenInEmail: string = sentLink().split("/reset-password/")[1]!;
953
+
954
+ expect(randomUUIDSpy).toHaveBeenCalledTimes(1);
955
+ expect(tokenInEmail).toBe(randomUUIDSpy.mock.results[0]!.value);
956
+ expect(tokenInEmail).toMatch(
957
+ /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,
958
+ );
959
+ expect(objectIdSpy).not.toHaveBeenCalled();
960
+ } finally {
961
+ randomUUIDSpy.mockRestore();
962
+ objectIdSpy.mockRestore();
963
+ }
964
+ });
965
+
931
966
  test("the link points at the ordinary /accounts/reset-password page", async () => {
932
967
  /*
933
968
  * There is deliberately no admin-specific redemption route: the link an
@@ -1,11 +1,16 @@
1
1
  import UserService from "../../../Server/Services/UserService";
2
- import EnterpriseLicenseSeatUtil from "../../../Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil";
2
+ import EnterpriseEdition from "../../../Server/Enterprise/EnterpriseEdition";
3
3
  import CreateBy from "../../../Server/Types/Database/CreateBy";
4
4
  import User from "../../../Models/DatabaseModels/User";
5
5
  import Email from "../../../Types/Email";
6
6
  import BadDataException from "../../../Types/Exception/BadDataException";
7
7
  import ObjectID from "../../../Types/ObjectID";
8
8
  import PositiveNumber from "../../../Types/PositiveNumber";
9
+ import FakeEnterpriseModule, {
10
+ installFakeEnterpriseModule,
11
+ uninstallEnterpriseModule,
12
+ } from "../Enterprise/FakeEnterpriseModule";
13
+ import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
9
14
  import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
10
15
 
11
16
  /*
@@ -21,6 +26,11 @@ import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
21
26
  * else; a check on the invitation would have left signup and SSO as open doors
22
27
  * beside it.
23
28
  *
29
+ * The limit itself is the Enterprise license client's (ee/Server/License); core
30
+ * asks it through EnterpriseEdition.assertSeatAvailableForNewUser, which is a
31
+ * no-op on the Community Edition. What the license client decides (billing,
32
+ * license status, the live user count) is tested in ee/Tests/Server/License.
33
+ *
24
34
  * The single most important assertion in this file is the isRoot one. Team
25
35
  * invitations create the invited user with `props: { isRoot: true }`
26
36
  * (TeamMemberService.onBeforeCreate), so the usual "internal writes bypass
@@ -28,17 +38,20 @@ import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
28
38
  * asked for.
29
39
  */
30
40
 
31
- jest.mock(
32
- "../../../Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil",
33
- () => {
34
- return {
35
- __esModule: true,
36
- default: {
37
- assertSeatAvailableForNewUser: jest.fn(),
38
- },
39
- };
40
- },
41
- );
41
+ // CI's config.env sets BILLING_ENABLED=true; this suite pins it per test.
42
+ jest.mock("../../../Server/EnvironmentConfig", () => {
43
+ const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
44
+ jest.requireActual(
45
+ "../Enterprise/TestBillingFlag",
46
+ ) as typeof import("../Enterprise/TestBillingFlag");
47
+
48
+ return billingFlag.withLiveBillingFlag(
49
+ jest.requireActual("../../../Server/EnvironmentConfig") as Record<
50
+ string,
51
+ unknown
52
+ >,
53
+ );
54
+ });
42
55
 
43
56
  type OnBeforeCreateFunction = (createBy: CreateBy<User>) => Promise<unknown>;
44
57
 
@@ -71,37 +84,53 @@ const makeCreateBy: MakeCreateByFunction = (
71
84
  } as unknown as CreateBy<User>;
72
85
  };
73
86
 
74
- type AssertSeatMockFunction = () => jest.Mock;
75
-
76
- const assertSeatMock: AssertSeatMockFunction = (): jest.Mock => {
77
- return EnterpriseLicenseSeatUtil.assertSeatAvailableForNewUser as unknown as jest.Mock;
78
- };
79
-
80
87
  describe("UserService - the enterprise seat limit", () => {
88
+ let fake: FakeEnterpriseModule;
89
+
81
90
  beforeEach(() => {
82
91
  jest.clearAllMocks();
83
- assertSeatMock().mockResolvedValue(undefined);
92
+ setTestBillingEnabled(false);
93
+ fake = installFakeEnterpriseModule();
84
94
  UserService.countBy = jest.fn().mockResolvedValue(new PositiveNumber(7));
85
95
  });
86
96
 
87
97
  afterEach(() => {
98
+ uninstallEnterpriseModule();
99
+ setTestBillingEnabled(false);
88
100
  jest.restoreAllMocks();
89
101
  });
90
102
 
91
- it("checks the seat limit before creating a user", async () => {
103
+ it("asks the Enterprise license client before creating a user", async () => {
104
+ const assertSpy: jest.SpyInstance = jest.spyOn(
105
+ EnterpriseEdition,
106
+ "assertSeatAvailableForNewUser",
107
+ );
108
+
92
109
  await onBeforeCreate(makeCreateBy());
93
110
 
94
- expect(assertSeatMock()).toHaveBeenCalledTimes(1);
111
+ expect(assertSpy).toHaveBeenCalledTimes(1);
112
+ expect(assertSpy).toHaveBeenCalledWith();
113
+ expect(fake.licensing.seatChecks).toBe(1);
95
114
  });
96
115
 
97
116
  it("refuses the create when there is no seat for the new user", async () => {
98
- assertSeatMock().mockRejectedValue(new BadDataException("No seats left"));
117
+ fake.licensing.seatError = new BadDataException("No seats left");
99
118
 
100
119
  await expect(onBeforeCreate(makeCreateBy())).rejects.toBeInstanceOf(
101
120
  BadDataException,
102
121
  );
103
122
  });
104
123
 
124
+ it("passes the license client's refusal through unchanged", async () => {
125
+ fake.licensing.seatError = new BadDataException(
126
+ "This OneUptime installation has reached the 10-user limit of its enterprise license.",
127
+ );
128
+
129
+ await expect(onBeforeCreate(makeCreateBy())).rejects.toThrow(
130
+ "reached the 10-user limit",
131
+ );
132
+ });
133
+
105
134
  /*
106
135
  * The one that matters. TeamMemberService creates the invited user as root,
107
136
  * so an isRoot exemption would exempt invitations — and inviting users past
@@ -116,7 +145,21 @@ describe("UserService - the enterprise seat limit", () => {
116
145
  async (_label: string, props: Record<string, unknown>) => {
117
146
  await onBeforeCreate(makeCreateBy(props));
118
147
 
119
- expect(assertSeatMock()).toHaveBeenCalledTimes(1);
148
+ expect(fake.licensing.seatChecks).toBe(1);
149
+ },
150
+ );
151
+
152
+ it.each([
153
+ ["a root write", { isRoot: true }],
154
+ ["a master admin", { isMasterAdmin: true }],
155
+ ])(
156
+ "refuses %s when the license is full",
157
+ async (_label: string, props: Record<string, unknown>) => {
158
+ fake.licensing.seatError = new BadDataException("No seats left");
159
+
160
+ await expect(onBeforeCreate(makeCreateBy(props))).rejects.toBeInstanceOf(
161
+ BadDataException,
162
+ );
120
163
  },
121
164
  );
122
165
 
@@ -126,7 +169,7 @@ describe("UserService - the enterprise seat limit", () => {
126
169
  * that, a rejected create would still have done work; more importantly the
127
170
  * ordering pins that nothing was inserted ahead of the check later on.
128
171
  */
129
- assertSeatMock().mockRejectedValue(new BadDataException("No seats left"));
172
+ fake.licensing.seatError = new BadDataException("No seats left");
130
173
 
131
174
  const createBy: CreateBy<User> = makeCreateBy();
132
175
  (createBy.data as unknown as Record<string, unknown>)["clickIds"] = {
@@ -136,47 +179,42 @@ describe("UserService - the enterprise seat limit", () => {
136
179
  await expect(onBeforeCreate(createBy)).rejects.toBeInstanceOf(
137
180
  BadDataException,
138
181
  );
182
+ expect(
183
+ (createBy.data as unknown as Record<string, unknown>)["clickIds"],
184
+ ).toEqual({ gclid: "abc" });
139
185
  });
140
186
 
141
- describe("the user count it enforces against", () => {
142
- type GetLocalUserCountFunction = () => Promise<number>;
143
-
144
- type CapturedCallbackFunction = () => GetLocalUserCountFunction;
145
-
146
- const capturedCallback: CapturedCallbackFunction =
147
- (): GetLocalUserCountFunction => {
148
- const call: Record<string, unknown> = assertSeatMock().mock
149
- .calls[0]![0] as Record<string, unknown>;
150
-
151
- return call["getLocalUserCount"] as GetLocalUserCountFunction;
152
- };
153
-
154
- it("counts every user on this installation, not just the caller's project", async () => {
155
- await onBeforeCreate(makeCreateBy());
187
+ /*
188
+ * Counting users is the license client's business, and only when a limit
189
+ * applies. The create path of every user on the installation must not pay
190
+ * for a count in core.
191
+ */
192
+ it("does not count users itself", async () => {
193
+ await onBeforeCreate(makeCreateBy());
156
194
 
157
- const count: number = await capturedCallback()();
195
+ expect(UserService.countBy).not.toHaveBeenCalled();
196
+ });
158
197
 
159
- expect(count).toBe(7);
198
+ describe("on the Community Edition", () => {
199
+ beforeEach(() => {
200
+ uninstallEnterpriseModule();
201
+ });
160
202
 
161
- const countCall: Record<string, unknown> = (
162
- UserService.countBy as unknown as jest.Mock
163
- ).mock.calls[0]![0] as Record<string, unknown>;
203
+ it("has no seat limit at all", async () => {
204
+ await expect(onBeforeCreate(makeCreateBy())).resolves.toBeDefined();
205
+ expect(UserService.countBy).not.toHaveBeenCalled();
206
+ });
164
207
 
165
- expect(countCall["query"]).toEqual({});
166
- expect((countCall["props"] as Record<string, unknown>)["isRoot"]).toBe(
167
- true,
168
- );
208
+ it("has no seat limit for root writes either", async () => {
209
+ await expect(
210
+ onBeforeCreate(makeCreateBy({ isRoot: true })),
211
+ ).resolves.toBeDefined();
169
212
  });
170
213
 
171
- /*
172
- * The count is deliberately behind a callback rather than passed in: on
173
- * Community Edition, and on a licence with no seat limit, it must never
174
- * run at all. This is the create path of every user on the installation.
175
- */
176
- it("does not count users unless the seat check asks for it", async () => {
177
- await onBeforeCreate(makeCreateBy());
214
+ it("has no seat limit with billing on", async () => {
215
+ setTestBillingEnabled(true);
178
216
 
179
- expect(UserService.countBy).not.toHaveBeenCalled();
217
+ await expect(onBeforeCreate(makeCreateBy())).resolves.toBeDefined();
180
218
  });
181
219
  });
182
220
  });