@oneuptime/common 13.0.8 → 14.0.0

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 (333) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Scripts/generate-service-worker.js +65 -4
  6. package/Server/API/BaseAPI.ts +26 -5
  7. package/Server/API/GlobalConfigAPI.ts +228 -462
  8. package/Server/API/ProjectOIDC.ts +25 -16
  9. package/Server/API/ProjectSSO.ts +24 -16
  10. package/Server/API/StatusPageAPI.ts +100 -42
  11. package/Server/API/TeamMemberAPI.ts +10 -1
  12. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  13. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  14. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  15. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  16. package/Server/EnvironmentConfig.ts +147 -2
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  19. package/Server/Middleware/UserAuthorization.ts +38 -16
  20. package/Server/Services/AuditLogService.ts +84 -1079
  21. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  22. package/Server/Services/GlobalConfigService.ts +80 -1
  23. package/Server/Services/MonitorProbeService.ts +116 -20
  24. package/Server/Services/MonitorService.ts +56 -4
  25. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  26. package/Server/Services/MonitorTemplateService.ts +26 -0
  27. package/Server/Services/ProjectService.ts +284 -0
  28. package/Server/Services/RumSessionPinService.ts +25 -6
  29. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  30. package/Server/Services/StatusPageService.ts +78 -1
  31. package/Server/Services/TeamMemberService.ts +11 -0
  32. package/Server/Services/TeamService.ts +10 -0
  33. package/Server/Services/UserService.ts +10 -17
  34. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  35. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  36. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  37. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  38. package/Server/Types/Markdown.ts +41 -0
  39. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  40. package/Server/Utils/EditionEnforcement.ts +233 -0
  41. package/Server/Utils/FrontendEnvironment.ts +41 -2
  42. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  43. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  44. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  45. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  46. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  47. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  48. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  49. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  50. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  51. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  52. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  53. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  54. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  55. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  56. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  57. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  58. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  59. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  60. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  61. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  62. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  63. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  64. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  65. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  66. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  67. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  68. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  69. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  70. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  71. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  72. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  73. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  74. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  75. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  76. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  77. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  78. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  79. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  80. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  81. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  82. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  83. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  84. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  85. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  86. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  87. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  88. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  89. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  90. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  91. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  92. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  93. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  95. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  96. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  97. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  98. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  99. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  100. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  101. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  102. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  103. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  104. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  105. package/Tests/Server/Types/Markdown.test.ts +181 -0
  106. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  107. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  108. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  109. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  110. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  111. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  112. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  113. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  114. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  115. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  116. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  117. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  118. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  119. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  120. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  121. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  122. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  123. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  124. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  125. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  126. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  127. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  128. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  129. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  130. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  131. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  132. package/Types/API/Hostname.ts +63 -16
  133. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  134. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  135. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  136. package/Types/Database/CanonicalModelInstance.ts +102 -0
  137. package/Types/Database/TableColumn.ts +20 -6
  138. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  139. package/Types/IP/IPv6.ts +6 -1
  140. package/Types/Monitor/MonitorStep.ts +6 -1
  141. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  142. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  143. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  144. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  145. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  146. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  147. package/UI/Components/ModelList/ModelList.tsx +11 -1
  148. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  149. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  150. package/UI/esbuild-enterprise.js +263 -0
  151. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  152. package/Utils/HostAddressUtil.ts +94 -0
  153. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  154. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  155. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  156. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  157. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  158. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  159. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  160. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  161. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  162. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  163. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  164. package/build/dist/Server/API/BaseAPI.js +26 -5
  165. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  166. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  167. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  168. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  169. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  170. package/build/dist/Server/API/ProjectSSO.js +24 -16
  171. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  172. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  173. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  174. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  175. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  176. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  177. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  178. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  179. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  180. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  181. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  182. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  183. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  184. package/build/dist/Server/EnvironmentConfig.js +84 -2
  185. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  189. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  190. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  191. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  192. package/build/dist/Server/Services/AuditLogService.js +71 -740
  193. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  194. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  195. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  196. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  197. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  198. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  199. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  200. package/build/dist/Server/Services/MonitorService.js +45 -4
  201. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  202. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  203. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  204. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  205. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  206. package/build/dist/Server/Services/ProjectService.js +214 -0
  207. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  208. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  209. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  210. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  211. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  212. package/build/dist/Server/Services/StatusPageService.js +71 -0
  213. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  214. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  215. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  216. package/build/dist/Server/Services/TeamService.js +9 -0
  217. package/build/dist/Server/Services/TeamService.js.map +1 -1
  218. package/build/dist/Server/Services/UserService.js +10 -16
  219. package/build/dist/Server/Services/UserService.js.map +1 -1
  220. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  221. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  222. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  223. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  224. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  225. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  226. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  227. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  228. package/build/dist/Server/Types/Markdown.js +31 -0
  229. package/build/dist/Server/Types/Markdown.js.map +1 -1
  230. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  231. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  232. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  233. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  234. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  235. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  236. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  237. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  238. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  239. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  240. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  241. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  242. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  243. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  244. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  245. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  246. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  247. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  248. package/build/dist/Types/API/Hostname.js +59 -11
  249. package/build/dist/Types/API/Hostname.js.map +1 -1
  250. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  251. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  252. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  253. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  254. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  255. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  256. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  257. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  258. package/build/dist/Types/Database/TableColumn.js +19 -6
  259. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  260. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  261. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  262. package/build/dist/Types/IP/IPv6.js +6 -1
  263. package/build/dist/Types/IP/IPv6.js.map +1 -1
  264. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  265. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  266. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  267. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  268. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  269. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  270. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  271. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  272. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  273. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  274. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  275. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  276. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  277. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  278. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  279. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  280. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  281. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  282. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  283. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  284. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  285. package/build/dist/Utils/HostAddressUtil.js +80 -0
  286. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  287. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  288. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  289. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  290. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  291. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  292. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  293. package/jest.config.json +3 -1
  294. package/package.json +1 -1
  295. package/test-setup.sh +103 -34
  296. package/tsconfig.json +13 -0
  297. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  298. package/Server/API/TeamComplianceAPI.ts +0 -158
  299. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  300. package/Server/Services/TeamComplianceService.ts +0 -733
  301. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  302. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  303. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  304. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  305. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  306. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  307. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  308. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  309. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  310. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  311. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  312. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  313. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  314. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  315. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  316. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  317. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  318. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  319. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  320. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  321. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  322. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  323. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  324. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  325. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  326. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  327. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  328. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  329. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  330. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  331. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  332. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  333. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -20,7 +20,7 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
20
20
  import BadDataException from "../../../../Types/Exception/BadDataException";
21
21
  import WorkspaceProjectAuthTokenService from "../../../Services/WorkspaceProjectAuthTokenService";
22
22
  import SSRFProtection from "../../SSRFProtection";
23
- export default class SlackUtil extends WorkspaceBase {
23
+ class SlackUtil extends WorkspaceBase {
24
24
  static isValidSlackIncomingWebhookUrl(incomingWebhookUrl) {
25
25
  /*
26
26
  * Host AND path prefix. The host check is what stops SSRF; the "/services/"
@@ -874,7 +874,7 @@ export default class SlackUtil extends WorkspaceBase {
874
874
  }
875
875
  }
876
876
  // Slack has a limit of 50 blocks per message. Split into batches if needed.
877
- const maxBlocksPerMessage = 50;
877
+ const maxBlocksPerMessage = SlackUtil.MAX_BLOCKS_PER_MESSAGE;
878
878
  let lastThread;
879
879
  if (blocks.length <= maxBlocksPerMessage) {
880
880
  lastThread = await this.sendPayloadBlocksToChannel({
@@ -1407,28 +1407,311 @@ export default class SlackUtil extends WorkspaceBase {
1407
1407
  },
1408
1408
  blocks: this.getBlocksFromWorkspaceMessagePayload({
1409
1409
  messageBlocks: data.payloadModalBlock.blocks,
1410
+ // A view takes twice as many blocks as a message.
1411
+ maxBlocks: SlackUtil.MAX_BLOCKS_PER_MODAL,
1410
1412
  }),
1411
1413
  };
1412
1414
  logger.debug("Modal block generated:", {});
1413
1415
  logger.debug(modalBlock, {});
1414
1416
  return modalBlock;
1415
1417
  }
1418
+ static getBlocksFromWorkspaceMessagePayload(data) {
1419
+ var _a, _b;
1420
+ const maxBlocks = (_a = data.maxBlocks) !== null && _a !== void 0 ? _a : SlackUtil.MAX_BLOCKS_PER_MESSAGE;
1421
+ /*
1422
+ * A markdown payload is the one block whose size we do not control: it
1423
+ * carries whatever the incident or alert says, root cause included, and
1424
+ * a section holds at most 3000 characters. So here it may expand into
1425
+ * several consecutive sections (see getMarkdownBlocks). Every other
1426
+ * block type still goes through the base class one block at a time, so
1427
+ * it renders exactly as before — one block, or none for an unknown type.
1428
+ *
1429
+ * The extra sections must not take the message past maxBlocks, or Slack
1430
+ * rejects all of it. So the other blocks are rendered first, every
1431
+ * markdown payload is counted for the one section it always had, and
1432
+ * only what is left of the budget is handed out as extra sections, in
1433
+ * message order, so the body a caller puts first is the last thing to
1434
+ * be cut short. A message that is already at the limit keeps one
1435
+ * section per markdown payload, exactly as many blocks as before.
1436
+ */
1437
+ const renderedBlocks = [];
1438
+ let blockCountBeforeSplitting = 0;
1439
+ for (const messageBlock of data.messageBlocks) {
1440
+ if (messageBlock._type === "WorkspacePayloadMarkdown") {
1441
+ // Rendered in the second pass, once the budget is known.
1442
+ renderedBlocks.push(null);
1443
+ blockCountBeforeSplitting += 1;
1444
+ continue;
1445
+ }
1446
+ const otherBlocks = super.getBlocksFromWorkspaceMessagePayload({
1447
+ messageBlocks: [messageBlock],
1448
+ });
1449
+ renderedBlocks.push(otherBlocks);
1450
+ blockCountBeforeSplitting += otherBlocks.length;
1451
+ }
1452
+ let spareBlocks = Math.max(0, maxBlocks - blockCountBeforeSplitting);
1453
+ const blocks = [];
1454
+ for (let index = 0; index < data.messageBlocks.length; index++) {
1455
+ // Empty, not null, for a block of an unknown type — it stays dropped.
1456
+ const rendered = (_b = renderedBlocks[index]) !== null && _b !== void 0 ? _b : null;
1457
+ if (rendered !== null) {
1458
+ blocks.push(...rendered);
1459
+ continue;
1460
+ }
1461
+ const sections = this.getMarkdownBlocks({
1462
+ payloadMarkdownBlock: data.messageBlocks[index],
1463
+ maxSections: 1 +
1464
+ Math.min(spareBlocks, SlackUtil.MAX_SECTIONS_PER_MARKDOWN_BLOCK - 1),
1465
+ });
1466
+ spareBlocks -= sections.length - 1;
1467
+ blocks.push(...sections);
1468
+ }
1469
+ return blocks;
1470
+ }
1471
+ /*
1472
+ * One section block. Text over Slack's limit cannot be split here, so it
1473
+ * is cut short with a note instead of being sent as a block Slack would
1474
+ * reject; messages go through getBlocksFromWorkspaceMessagePayload, which
1475
+ * splits it across sections. Text within the limit renders as it always
1476
+ * has.
1477
+ */
1416
1478
  static getMarkdownBlock(data) {
1417
1479
  logger.debug("Getting markdown block with data:", {});
1418
1480
  logger.debug(data, {});
1419
- const markdownBlock = {
1420
- type: "section",
1421
- text: {
1422
- type: "mrkdwn",
1423
- text: data.payloadMarkdownBlock.text
1424
- ? SlackifyMarkdown(data.payloadMarkdownBlock.text)
1425
- : "",
1426
- },
1427
- };
1481
+ const markdownBlock = this.getMarkdownBlocks({
1482
+ payloadMarkdownBlock: data.payloadMarkdownBlock,
1483
+ maxSections: 1,
1484
+ })[0];
1428
1485
  logger.debug("Markdown block generated:", {});
1429
1486
  logger.debug(markdownBlock, {});
1430
1487
  return markdownBlock;
1431
1488
  }
1489
+ /*
1490
+ * A markdown payload as consecutive section blocks, each within Slack's
1491
+ * 3000-character limit. Text that fits is one section, byte for byte what
1492
+ * a markdown payload has always rendered to (empty text included).
1493
+ */
1494
+ static getMarkdownBlocks(data) {
1495
+ const text = data.payloadMarkdownBlock.text
1496
+ ? SlackifyMarkdown(data.payloadMarkdownBlock.text)
1497
+ : "";
1498
+ const sectionTexts = this.splitSectionText({
1499
+ text: text,
1500
+ maxSections: data.maxSections,
1501
+ });
1502
+ if (sectionTexts.length > 1) {
1503
+ logger.debug(`Markdown block of ${text.length} characters split into ${sectionTexts.length} sections.`, {});
1504
+ }
1505
+ return sectionTexts.map((sectionText) => {
1506
+ return {
1507
+ type: "section",
1508
+ text: {
1509
+ type: "mrkdwn",
1510
+ text: sectionText,
1511
+ },
1512
+ };
1513
+ });
1514
+ }
1515
+ /*
1516
+ * Splits slackified text into section texts of at most
1517
+ * SECTION_TEXT_MAX_LENGTH characters, at the least disruptive places
1518
+ * available:
1519
+ *
1520
+ * 1. between paragraphs (a blank line),
1521
+ * 2. between list items, keeping an item together with the indented
1522
+ * bullets under it,
1523
+ * 3. between lines,
1524
+ * 4. and only inside a line that is on its own longer than the limit,
1525
+ * preferring a space there.
1526
+ *
1527
+ * The text between two sections is the newlines they were split at and
1528
+ * nothing else, so the sections read back in order give every line of the
1529
+ * original. A section that ends inside a ``` code block closes it and the
1530
+ * next one reopens it.
1531
+ *
1532
+ * Beyond maxSections the rest is dropped and the last section ends with
1533
+ * TRUNCATED_SECTION_NOTE. Text that fits is returned as it is.
1534
+ */
1535
+ static splitSectionText(data) {
1536
+ var _a;
1537
+ const maxLength = SlackUtil.SECTION_TEXT_MAX_LENGTH;
1538
+ if (data.text.length <= maxLength) {
1539
+ return [data.text];
1540
+ }
1541
+ const maxSections = Math.max(1, (_a = data.maxSections) !== null && _a !== void 0 ? _a : SlackUtil.MAX_SECTIONS_PER_MARKDOWN_BLOCK);
1542
+ /*
1543
+ * Any piece may need to reopen a code block at its start and close one
1544
+ * at its end, so when the text has code blocks every piece leaves room
1545
+ * for both.
1546
+ */
1547
+ const pieceMaxLength = data.text.includes(SlackUtil.CODE_FENCE)
1548
+ ? maxLength -
1549
+ SlackUtil.CODE_FENCE_REOPEN.length -
1550
+ SlackUtil.CODE_FENCE_CLOSE.length
1551
+ : maxLength;
1552
+ let pieces = this.splitTextAtBoundaries(data.text, pieceMaxLength);
1553
+ if (pieces.length === 0) {
1554
+ // Nothing but whitespace — there is nothing to show.
1555
+ return [""];
1556
+ }
1557
+ const isTruncated = pieces.length > maxSections;
1558
+ if (isTruncated) {
1559
+ pieces = pieces.slice(0, maxSections);
1560
+ /*
1561
+ * Shorten the last piece until the note fits after it, with the same
1562
+ * boundary preferences — whole paragraphs, items or lines where it
1563
+ * can.
1564
+ */
1565
+ const lastPiece = pieces[pieces.length - 1] || "";
1566
+ pieces[pieces.length - 1] =
1567
+ this.splitTextAtBoundaries(lastPiece, pieceMaxLength - SlackUtil.TRUNCATED_SECTION_NOTE.length)[0] || "";
1568
+ }
1569
+ const sections = [];
1570
+ let isInsideCodeBlock = false;
1571
+ for (let index = 0; index < pieces.length; index++) {
1572
+ const piece = pieces[index] || "";
1573
+ const isLastPiece = index === pieces.length - 1;
1574
+ let section = isInsideCodeBlock
1575
+ ? SlackUtil.CODE_FENCE_REOPEN + piece
1576
+ : piece;
1577
+ // An odd number of fences opens or closes a code block.
1578
+ const fenceCount = piece.split(SlackUtil.CODE_FENCE).length - 1;
1579
+ if (fenceCount % 2 === 1) {
1580
+ isInsideCodeBlock = !isInsideCodeBlock;
1581
+ }
1582
+ /*
1583
+ * The last piece of text that was not truncated ends where the
1584
+ * original ends, so a code block still open there was never closed
1585
+ * and is left alone.
1586
+ */
1587
+ if (isInsideCodeBlock && (!isLastPiece || isTruncated)) {
1588
+ section += SlackUtil.CODE_FENCE_CLOSE;
1589
+ }
1590
+ if (isLastPiece && isTruncated) {
1591
+ section += SlackUtil.TRUNCATED_SECTION_NOTE;
1592
+ }
1593
+ sections.push(section);
1594
+ }
1595
+ return sections;
1596
+ }
1597
+ /*
1598
+ * Pieces of at most maxLength characters, split at the boundaries listed
1599
+ * on splitSectionText. Each piece is trimmed of the newlines it was split
1600
+ * at; a piece with nothing but whitespace is dropped.
1601
+ */
1602
+ static splitTextAtBoundaries(text, maxLength) {
1603
+ const pieces = this.packSectionPieces({
1604
+ units: text.split("\n\n"),
1605
+ separator: "\n\n",
1606
+ maxLength: maxLength,
1607
+ splitOversizedUnit: (paragraph) => {
1608
+ return this.packSectionPieces({
1609
+ units: this.groupIndentedLines(paragraph),
1610
+ separator: "\n",
1611
+ maxLength: maxLength,
1612
+ splitOversizedUnit: (lineGroup) => {
1613
+ return this.packSectionPieces({
1614
+ units: lineGroup.split("\n"),
1615
+ separator: "\n",
1616
+ maxLength: maxLength,
1617
+ splitOversizedUnit: (line) => {
1618
+ return this.hardCutLine(line, maxLength);
1619
+ },
1620
+ });
1621
+ },
1622
+ });
1623
+ },
1624
+ });
1625
+ return pieces
1626
+ .map((piece) => {
1627
+ return piece.replace(/^[\r\n]+|[\r\n]+$/g, "");
1628
+ })
1629
+ .filter((piece) => {
1630
+ return piece.trim().length > 0;
1631
+ });
1632
+ }
1633
+ /*
1634
+ * Greedily joins units with the separator into pieces of at most
1635
+ * maxLength. A unit that does not fit next to the piece being built
1636
+ * starts a new piece rather than being broken up; only a unit longer than
1637
+ * maxLength on its own is broken, by splitOversizedUnit. The last of its
1638
+ * parts stays open, so the unit after it can still join it.
1639
+ */
1640
+ static packSectionPieces(data) {
1641
+ var _a;
1642
+ const pieces = [];
1643
+ // null until the first unit, so an empty unit still keeps its separator.
1644
+ let currentPiece = null;
1645
+ for (const unit of data.units) {
1646
+ if (currentPiece !== null) {
1647
+ const joined = currentPiece + data.separator + unit;
1648
+ if (joined.length <= data.maxLength) {
1649
+ currentPiece = joined;
1650
+ continue;
1651
+ }
1652
+ pieces.push(currentPiece);
1653
+ currentPiece = null;
1654
+ }
1655
+ if (unit.length <= data.maxLength) {
1656
+ currentPiece = unit;
1657
+ continue;
1658
+ }
1659
+ const parts = data.splitOversizedUnit(unit);
1660
+ pieces.push(...parts.slice(0, -1));
1661
+ currentPiece = (_a = parts[parts.length - 1]) !== null && _a !== void 0 ? _a : null;
1662
+ }
1663
+ if (currentPiece !== null) {
1664
+ pieces.push(currentPiece);
1665
+ }
1666
+ return pieces;
1667
+ }
1668
+ /*
1669
+ * The lines of a paragraph, with every indented line attached to the line
1670
+ * above it. slackify-markdown indents a nested bullet under its list item
1671
+ * — the Affected Resources list puts a resource's namespace, workload and
1672
+ * node there — so a split between groups never strands those bullets at
1673
+ * the top of the next section, away from the item they describe.
1674
+ */
1675
+ static groupIndentedLines(paragraph) {
1676
+ const groups = [];
1677
+ for (const line of paragraph.split("\n")) {
1678
+ const isIndented = line.startsWith(" ") || line.startsWith("\t");
1679
+ const lastGroupIndex = groups.length - 1;
1680
+ if (isIndented && lastGroupIndex >= 0) {
1681
+ groups[lastGroupIndex] = (groups[lastGroupIndex] || "") + "\n" + line;
1682
+ continue;
1683
+ }
1684
+ groups.push(line);
1685
+ }
1686
+ return groups;
1687
+ }
1688
+ /*
1689
+ * Cuts a single line longer than maxLength. Each cut is made after the
1690
+ * last space that still leaves the piece at least half full, so words stay
1691
+ * whole where the line has spaces, and never between the two halves of a
1692
+ * surrogate pair (an emoji), which would leave both pieces invalid.
1693
+ */
1694
+ static hardCutLine(line, maxLength) {
1695
+ const pieces = [];
1696
+ let rest = line;
1697
+ while (rest.length > maxLength) {
1698
+ let cutAt = maxLength;
1699
+ const lastSpaceIndex = rest.lastIndexOf(" ", maxLength - 1);
1700
+ if (lastSpaceIndex + 1 >= Math.ceil(maxLength / 2)) {
1701
+ cutAt = lastSpaceIndex + 1;
1702
+ }
1703
+ else {
1704
+ const charCodeBeforeCut = rest.charCodeAt(cutAt - 1);
1705
+ if (charCodeBeforeCut >= 0xd800 && charCodeBeforeCut <= 0xdbff) {
1706
+ cutAt -= 1;
1707
+ }
1708
+ }
1709
+ pieces.push(rest.slice(0, cutAt));
1710
+ rest = rest.slice(cutAt);
1711
+ }
1712
+ pieces.push(rest);
1713
+ return pieces;
1714
+ }
1432
1715
  static async isUserInDirectMessageChannel(data) {
1433
1716
  var _a, _b, _c;
1434
1717
  // check of the user id is in the direct message channel id
@@ -1740,6 +2023,31 @@ export default class SlackUtil extends WorkspaceBase {
1740
2023
  return messages;
1741
2024
  }
1742
2025
  }
2026
+ /*
2027
+ * Block Kit limits. A section's text may be at most 3000 characters, a
2028
+ * message may carry at most 50 blocks and a modal view at most 100. Going
2029
+ * over any of them makes Slack reject the whole message (invalid_blocks),
2030
+ * not just the offending block.
2031
+ */
2032
+ SlackUtil.SECTION_TEXT_MAX_LENGTH = 3000;
2033
+ SlackUtil.MAX_BLOCKS_PER_MESSAGE = 50;
2034
+ SlackUtil.MAX_BLOCKS_PER_MODAL = 100;
2035
+ /*
2036
+ * How many sections one markdown payload may expand into — about 30,000
2037
+ * characters, several times the longest incident or alert body we send.
2038
+ * The 50-block ceiling alone would allow 150,000, but Slack also rejects a
2039
+ * message whose blocks are too long overall (msg_blocks_too_long) without
2040
+ * documenting where that starts, and text that long is better read in
2041
+ * OneUptime anyway.
2042
+ */
2043
+ SlackUtil.MAX_SECTIONS_PER_MARKDOWN_BLOCK = 10;
2044
+ // Ends the last section of a markdown payload that did not fit.
2045
+ SlackUtil.TRUNCATED_SECTION_NOTE = "\n\n_… (truncated — see OneUptime for the full text)_";
2046
+ // Closes and reopens a ``` code block that a section boundary cuts through.
2047
+ SlackUtil.CODE_FENCE = "```";
2048
+ SlackUtil.CODE_FENCE_CLOSE = "\n```";
2049
+ SlackUtil.CODE_FENCE_REOPEN = "```\n";
2050
+ export default SlackUtil;
1743
2051
  __decorate([
1744
2052
  CaptureSpan(),
1745
2053
  __metadata("design:type", Function),
@@ -1938,12 +2246,24 @@ __decorate([
1938
2246
  __metadata("design:paramtypes", [Object]),
1939
2247
  __metadata("design:returntype", Object)
1940
2248
  ], SlackUtil, "getModalBlock", null);
2249
+ __decorate([
2250
+ CaptureSpan(),
2251
+ __metadata("design:type", Function),
2252
+ __metadata("design:paramtypes", [Object]),
2253
+ __metadata("design:returntype", Array)
2254
+ ], SlackUtil, "getBlocksFromWorkspaceMessagePayload", null);
1941
2255
  __decorate([
1942
2256
  CaptureSpan(),
1943
2257
  __metadata("design:type", Function),
1944
2258
  __metadata("design:paramtypes", [Object]),
1945
2259
  __metadata("design:returntype", Object)
1946
2260
  ], SlackUtil, "getMarkdownBlock", null);
2261
+ __decorate([
2262
+ CaptureSpan(),
2263
+ __metadata("design:type", Function),
2264
+ __metadata("design:paramtypes", [Object]),
2265
+ __metadata("design:returntype", Array)
2266
+ ], SlackUtil, "getMarkdownBlocks", null);
1947
2267
  __decorate([
1948
2268
  CaptureSpan(),
1949
2269
  __metadata("design:type", Function),