@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
@@ -0,0 +1,419 @@
1
+ import ProjectService from "../../../Server/Services/ProjectService";
2
+ import StatusPageService from "../../../Server/Services/StatusPageService";
3
+ import ModelPermission from "../../../Server/Types/Database/Permissions/Index";
4
+ import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
5
+ import ObjectID from "../../../Types/ObjectID";
6
+ import { UserGlobalAccessPermission } from "../../../Types/Permission";
7
+ import Project from "../../../Models/DatabaseModels/Project";
8
+ import StatusPage from "../../../Models/DatabaseModels/StatusPage";
9
+ import FakeEnterpriseModule, {
10
+ createEditionStateCases,
11
+ createLicenseSnapshotWithStatus,
12
+ EditionStateCase,
13
+ installFakeEnterpriseModule,
14
+ uninstallEnterpriseModule,
15
+ } from "../Enterprise/FakeEnterpriseModule";
16
+ import logger from "../../../Server/Utils/Logger";
17
+ import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
18
+ import { getJestSpyOn } from "../../Spy";
19
+ import {
20
+ afterEach,
21
+ beforeEach,
22
+ describe,
23
+ expect,
24
+ jest,
25
+ test,
26
+ } from "@jest/globals";
27
+
28
+ jest.mock("../../../Server/EnvironmentConfig", () => {
29
+ const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
30
+ jest.requireActual(
31
+ "../Enterprise/TestBillingFlag",
32
+ ) as typeof import("../Enterprise/TestBillingFlag");
33
+
34
+ return billingFlag.withLiveBillingFlag(
35
+ jest.requireActual("../../../Server/EnvironmentConfig") as Record<
36
+ string,
37
+ unknown
38
+ >,
39
+ );
40
+ });
41
+
42
+ /*
43
+ * While SSO is not active - the Community Edition, where the SSO login routes
44
+ * do not exist, or an Enterprise install whose license lapsed, where they
45
+ * refuse - SSO requirements are not enforced. Clients decide from the stored
46
+ * columns whether to start an SSO flow - the mobile app hides a project's
47
+ * on-call pages and schedules behind an SSO login when Project.requireSsoForLogin
48
+ * is true, and app-store builds cannot be patched - so reads made for a caller
49
+ * report the EFFECTIVE value instead (EditionEnforcement.shouldMaskSsoRequirementOnRead):
50
+ *
51
+ * Project.requireSsoForLogin -> false
52
+ * Project.requireSsoWithSsoProviderId -> null
53
+ * StatusPage.requireSsoForLogin -> false
54
+ *
55
+ * and nothing else changes:
56
+ * - internal reads (root, and the ignoreHooks lookups the write path uses)
57
+ * see the stored value,
58
+ * - while SSO is active (the Enterprise Edition with billing on, or a
59
+ * license that covers SSO, or an unknown license state) nothing is masked,
60
+ * - the stored row is never written, so moving back to the Enterprise
61
+ * Edition, or renewing the license, restores enforcement exactly as
62
+ * configured, without a restart.
63
+ *
64
+ * These tests run the real DatabaseService read path; only the repository and
65
+ * the read-permission check (not under test) are stubbed.
66
+ */
67
+
68
+ const PROJECT_ID: ObjectID = new ObjectID(
69
+ "11111111-1111-4111-8111-111111111111",
70
+ );
71
+ const STATUS_PAGE_ID: ObjectID = new ObjectID(
72
+ "77777777-7777-4777-8777-777777777777",
73
+ );
74
+ const PROVIDER_ID: ObjectID = new ObjectID(
75
+ "88888888-8888-4888-8888-888888888888",
76
+ );
77
+ const USER_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
78
+
79
+ // Every Enterprise state (CE is covered by its own tests below).
80
+ const ENTERPRISE_STATES: Array<EditionStateCase> =
81
+ createEditionStateCases().filter((state: EditionStateCase): boolean => {
82
+ return state.isLoaded;
83
+ });
84
+
85
+ // What the database holds. Each read builds fresh entities from it.
86
+ type StoredProjectRow = {
87
+ name: string;
88
+ requireSsoForLogin: boolean;
89
+ requireSsoWithSsoProviderId: ObjectID | null;
90
+ };
91
+
92
+ type StoredStatusPageRow = {
93
+ name: string;
94
+ requireSsoForLogin: boolean;
95
+ };
96
+
97
+ let storedProject: StoredProjectRow;
98
+ let storedStatusPage: StoredStatusPageRow;
99
+ let projectRepositoryWrites: Array<string>;
100
+
101
+ const userProps: () => DatabaseCommonInteractionProps =
102
+ (): DatabaseCommonInteractionProps => {
103
+ return {
104
+ userId: USER_ID,
105
+ tenantId: PROJECT_ID,
106
+ userGlobalAccessPermission: {
107
+ projectIds: [PROJECT_ID],
108
+ } as unknown as UserGlobalAccessPermission,
109
+ };
110
+ };
111
+
112
+ const masterAdminProps: () => DatabaseCommonInteractionProps =
113
+ (): DatabaseCommonInteractionProps => {
114
+ return { userId: USER_ID, isMasterAdmin: true };
115
+ };
116
+
117
+ const readProject: (
118
+ props: DatabaseCommonInteractionProps,
119
+ ) => Promise<Project> = async (
120
+ props: DatabaseCommonInteractionProps,
121
+ ): Promise<Project> => {
122
+ const projects: Array<Project> = await ProjectService.findBy({
123
+ query: { _id: PROJECT_ID.toString() },
124
+ select: {
125
+ _id: true,
126
+ name: true,
127
+ requireSsoForLogin: true,
128
+ requireSsoWithSsoProviderId: true,
129
+ },
130
+ limit: 10,
131
+ skip: 0,
132
+ props,
133
+ });
134
+
135
+ expect(projects).toHaveLength(1);
136
+
137
+ return projects[0]!;
138
+ };
139
+
140
+ const readStatusPage: (
141
+ props: DatabaseCommonInteractionProps,
142
+ ) => Promise<StatusPage> = async (
143
+ props: DatabaseCommonInteractionProps,
144
+ ): Promise<StatusPage> => {
145
+ const statusPages: Array<StatusPage> = await StatusPageService.findBy({
146
+ query: { _id: STATUS_PAGE_ID.toString() },
147
+ select: { _id: true, name: true, requireSsoForLogin: true },
148
+ limit: 10,
149
+ skip: 0,
150
+ props,
151
+ });
152
+
153
+ expect(statusPages).toHaveLength(1);
154
+
155
+ return statusPages[0]!;
156
+ };
157
+
158
+ const expectProjectMasked: (project: Project) => void = (
159
+ project: Project,
160
+ ): void => {
161
+ expect(project.requireSsoForLogin).toBe(false);
162
+ expect(project.requireSsoWithSsoProviderId).toBeNull();
163
+ // Everything else is untouched.
164
+ expect(project.name).toBe("Acme");
165
+ expect(project.id?.toString()).toBe(PROJECT_ID.toString());
166
+ };
167
+
168
+ const expectProjectRaw: (project: Project) => void = (
169
+ project: Project,
170
+ ): void => {
171
+ expect(project.requireSsoForLogin).toBe(true);
172
+ expect(project.requireSsoWithSsoProviderId?.toString()).toBe(
173
+ PROVIDER_ID.toString(),
174
+ );
175
+ expect(project.name).toBe("Acme");
176
+ };
177
+
178
+ describe("SSO requirement columns are read as their effective value on the Community Edition", () => {
179
+ beforeEach(() => {
180
+ setTestBillingEnabled(false);
181
+ uninstallEnterpriseModule();
182
+
183
+ storedProject = {
184
+ name: "Acme",
185
+ requireSsoForLogin: true,
186
+ requireSsoWithSsoProviderId: PROVIDER_ID,
187
+ };
188
+ storedStatusPage = { name: "Customer Status", requireSsoForLogin: true };
189
+ projectRepositoryWrites = [];
190
+
191
+ // The read-permission check is not under test; let the query through.
192
+ getJestSpyOn(
193
+ ModelPermission,
194
+ "checkReadQueryPermission",
195
+ ).mockImplementation(
196
+ async (
197
+ _modelType: unknown,
198
+ query: unknown,
199
+ select: unknown,
200
+ ): Promise<unknown> => {
201
+ return { query, select, relationSelect: null };
202
+ },
203
+ );
204
+
205
+ const writeTrap: (name: string) => () => never = (
206
+ name: string,
207
+ ): (() => never) => {
208
+ return (): never => {
209
+ projectRepositoryWrites.push(name);
210
+ throw new Error(`a read must not write (${name})`);
211
+ };
212
+ };
213
+
214
+ getJestSpyOn(ProjectService, "getRepository").mockReturnValue({
215
+ find: async (): Promise<Array<Project>> => {
216
+ const project: Project = new Project();
217
+ project._id = PROJECT_ID.toString();
218
+ project.name = storedProject.name;
219
+ project.requireSsoForLogin = storedProject.requireSsoForLogin;
220
+
221
+ if (storedProject.requireSsoWithSsoProviderId) {
222
+ project.requireSsoWithSsoProviderId =
223
+ storedProject.requireSsoWithSsoProviderId;
224
+ }
225
+
226
+ return [project];
227
+ },
228
+ update: writeTrap("update"),
229
+ save: writeTrap("save"),
230
+ insert: writeTrap("insert"),
231
+ delete: writeTrap("delete"),
232
+ });
233
+
234
+ getJestSpyOn(StatusPageService, "getRepository").mockReturnValue({
235
+ find: async (): Promise<Array<StatusPage>> => {
236
+ const statusPage: StatusPage = new StatusPage();
237
+ statusPage._id = STATUS_PAGE_ID.toString();
238
+ statusPage.name = storedStatusPage.name;
239
+ statusPage.requireSsoForLogin = storedStatusPage.requireSsoForLogin;
240
+ return [statusPage];
241
+ },
242
+ update: writeTrap("update"),
243
+ save: writeTrap("save"),
244
+ });
245
+ });
246
+
247
+ afterEach(() => {
248
+ uninstallEnterpriseModule();
249
+ setTestBillingEnabled(false);
250
+ jest.restoreAllMocks();
251
+ });
252
+
253
+ describe("Project", () => {
254
+ for (const billing of [false, true]) {
255
+ test(`Community Edition (billing=${billing}): a user's read is masked`, async () => {
256
+ setTestBillingEnabled(billing);
257
+
258
+ expectProjectMasked(await readProject(userProps()));
259
+ });
260
+
261
+ test(`Community Edition (billing=${billing}): a master admin's read is masked`, async () => {
262
+ setTestBillingEnabled(billing);
263
+
264
+ expectProjectMasked(await readProject(masterAdminProps()));
265
+ });
266
+ }
267
+
268
+ for (const state of ENTERPRISE_STATES) {
269
+ test(`${state.label}: reads are ${state.isActive ? "not masked (SSO active)" : "masked (license lapsed, SSO stopped)"}`, async () => {
270
+ state.apply();
271
+
272
+ if (state.isActive) {
273
+ expectProjectRaw(await readProject(userProps()));
274
+ expectProjectRaw(await readProject(masterAdminProps()));
275
+ } else {
276
+ expectProjectMasked(await readProject(userProps()));
277
+ expectProjectMasked(await readProject(masterAdminProps()));
278
+ expectProjectRaw(await readProject({ isRoot: true }));
279
+ }
280
+ });
281
+ }
282
+
283
+ test("a lapse masks reads and a renewal unmasks them, with the stored row untouched", async () => {
284
+ getJestSpyOn(logger, "warn").mockImplementation((): void => {
285
+ return undefined;
286
+ });
287
+ getJestSpyOn(logger, "info").mockImplementation((): void => {
288
+ return undefined;
289
+ });
290
+
291
+ const fake: FakeEnterpriseModule = installFakeEnterpriseModule({
292
+ snapshot: createLicenseSnapshotWithStatus("valid"),
293
+ });
294
+
295
+ expectProjectRaw(await readProject(userProps()));
296
+
297
+ fake.setSnapshot(createLicenseSnapshotWithStatus("expired"));
298
+ expectProjectMasked(await readProject(userProps()));
299
+
300
+ fake.setSnapshot(createLicenseSnapshotWithStatus("valid"));
301
+ expectProjectRaw(await readProject(userProps()));
302
+
303
+ expect(projectRepositoryWrites).toEqual([]);
304
+ expect(storedProject.requireSsoForLogin).toBe(true);
305
+ });
306
+
307
+ test("internal root reads see the stored value on the Community Edition", async () => {
308
+ expectProjectRaw(await readProject({ isRoot: true }));
309
+ });
310
+
311
+ test("the write path's internal lookups (root + ignoreHooks) see the stored value", async () => {
312
+ expectProjectRaw(await readProject({ isRoot: true, ignoreHooks: true }));
313
+ });
314
+
315
+ test("a masked read leaves the stored row alone, and the Enterprise Edition sees it again", async () => {
316
+ expectProjectMasked(await readProject(userProps()));
317
+
318
+ expect(projectRepositoryWrites).toEqual([]);
319
+ expect(storedProject.requireSsoForLogin).toBe(true);
320
+ expect(storedProject.requireSsoWithSsoProviderId).toBe(PROVIDER_ID);
321
+
322
+ installFakeEnterpriseModule();
323
+
324
+ expectProjectRaw(await readProject(userProps()));
325
+ });
326
+
327
+ test("a project that does not require SSO reads the same on both editions", async () => {
328
+ storedProject.requireSsoForLogin = false;
329
+ storedProject.requireSsoWithSsoProviderId = null;
330
+
331
+ const onCommunity: Project = await readProject(userProps());
332
+
333
+ installFakeEnterpriseModule();
334
+
335
+ const onEnterprise: Project = await readProject(userProps());
336
+
337
+ expect(onCommunity.requireSsoForLogin).toBe(false);
338
+ expect(onEnterprise.requireSsoForLogin).toBe(false);
339
+ });
340
+ });
341
+
342
+ describe("StatusPage", () => {
343
+ for (const billing of [false, true]) {
344
+ test(`Community Edition (billing=${billing}): a caller's read is masked`, async () => {
345
+ setTestBillingEnabled(billing);
346
+
347
+ const statusPage: StatusPage = await readStatusPage(userProps());
348
+
349
+ expect(statusPage.requireSsoForLogin).toBe(false);
350
+ expect(statusPage.name).toBe("Customer Status");
351
+ });
352
+ }
353
+
354
+ for (const state of ENTERPRISE_STATES) {
355
+ test(`${state.label}: a caller's read is ${state.isActive ? "not masked" : "masked"}`, async () => {
356
+ state.apply();
357
+
358
+ expect((await readStatusPage(userProps())).requireSsoForLogin).toBe(
359
+ state.isActive,
360
+ );
361
+ });
362
+ }
363
+
364
+ test("internal root reads see the stored value on the Community Edition", async () => {
365
+ expect((await readStatusPage({ isRoot: true })).requireSsoForLogin).toBe(
366
+ true,
367
+ );
368
+ });
369
+
370
+ test("a masked read leaves the stored row alone", async () => {
371
+ await readStatusPage(userProps());
372
+
373
+ expect(storedStatusPage.requireSsoForLogin).toBe(true);
374
+
375
+ installFakeEnterpriseModule();
376
+
377
+ expect((await readStatusPage(userProps())).requireSsoForLogin).toBe(true);
378
+ });
379
+ });
380
+
381
+ describe("the hooks themselves", () => {
382
+ test("ProjectService.onFindSuccess only rewrites values that are present", async () => {
383
+ const selected: Project = new Project();
384
+ selected.requireSsoForLogin = true;
385
+ selected.requireSsoWithSsoProviderId = PROVIDER_ID;
386
+
387
+ const unselected: Project = new Project();
388
+ unselected.name = "Other";
389
+
390
+ const result: { carryForward: Array<Project> } = await (
391
+ ProjectService as any
392
+ ).onFindSuccess(
393
+ { findBy: { query: {}, props: userProps() }, carryForward: null },
394
+ [selected, unselected],
395
+ );
396
+
397
+ expect(result.carryForward).toEqual([selected, unselected]);
398
+ expect(selected.requireSsoForLogin).toBe(false);
399
+ expect(selected.requireSsoWithSsoProviderId).toBeNull();
400
+ expect(unselected.requireSsoForLogin).toBeUndefined();
401
+ expect(unselected.requireSsoWithSsoProviderId).toBeUndefined();
402
+ });
403
+
404
+ test("StatusPageService.onFindSuccess only rewrites values that are present", async () => {
405
+ const selected: StatusPage = new StatusPage();
406
+ selected.requireSsoForLogin = true;
407
+
408
+ const unselected: StatusPage = new StatusPage();
409
+
410
+ await (StatusPageService as any).onFindSuccess(
411
+ { findBy: { query: {}, props: userProps() }, carryForward: null },
412
+ [selected, unselected],
413
+ );
414
+
415
+ expect(selected.requireSsoForLogin).toBe(false);
416
+ expect(unselected.requireSsoForLogin).toBeUndefined();
417
+ });
418
+ });
419
+ });