@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
@@ -1,5 +1,5 @@
1
1
  import "@testing-library/jest-dom";
2
- import { render, screen, waitFor } from "@testing-library/react";
2
+ import { render, screen } from "@testing-library/react";
3
3
  import React, { ReactElement } from "react";
4
4
  import {
5
5
  afterEach,
@@ -12,19 +12,18 @@ import {
12
12
 
13
13
  /*
14
14
  * UserElement can only show an email the caller actually asked the API for,
15
- * and an avatar it was given an id for. Two families of call sites failed one
16
- * of those and would have kept rendering a bare name after the component
17
- * change:
15
+ * and an avatar it was given an id for. The notification-log tables passed
16
+ * `selectMoreFields={{user: {name}}}`: BaseModelTable's getSelectFields
17
+ * ASSIGNS selectMoreFields over the select the columns built, rather than
18
+ * merging into it, so the narrower one won and only the name was ever fetched.
18
19
  *
19
- * - the notification-log tables passed `selectMoreFields={{user: {name}}}`.
20
- * BaseModelTable's getSelectFields ASSIGNS selectMoreFields over the
21
- * select the columns built, rather than merging into it, so the narrower
22
- * one won and only the name was ever fetched.
23
- * - the team compliance table hand-builds its user object and left out the
24
- * id, so the avatar route could not be built at all.
20
+ * That is invisible in a screenshot of a seeded dev project (short names, a
21
+ * default avatar) and silent in every other suite, so it is pinned here.
25
22
  *
26
- * Both are invisible in a screenshot of a seeded dev project (short names, a
27
- * default avatar) and silent in every other suite, so they are pinned here.
23
+ * The other call site this suite used to pin - the team compliance status
24
+ * table, which hand-builds its user object - is Enterprise Edition code since
25
+ * the Community / Enterprise split; its tests moved with it to
26
+ * ee/Tests/UI/TeamCompliance/TeamCompliance.test.tsx.
28
27
  */
29
28
 
30
29
  const BLANK_PROFILE_PIC: string = "data:image/svg+xml;base64,////YXZhdGFy";
@@ -84,16 +83,12 @@ import TelegramLogsTable from "../../../../App/FeatureSet/Dashboard/src/Componen
84
83
  import WebhookLogsTable from "../../../../App/FeatureSet/Dashboard/src/Components/NotificationLogs/WebhookLogsTable";
85
84
  import WhatsAppLogsTable from "../../../../App/FeatureSet/Dashboard/src/Components/NotificationLogs/WhatsAppLogsTable";
86
85
  import WorkspaceLogsTable from "../../../../App/FeatureSet/Dashboard/src/Components/NotificationLogs/WorkspaceLogsTable";
87
- import TeamComplianceStatusTable from "../../../../App/FeatureSet/Dashboard/src/Components/Team/TeamComplianceStatusTable";
88
- import API from "../../../UI/Utils/API/API";
89
- import ModelAPI from "../../../UI/Utils/ModelAPI/ModelAPI";
90
86
  import ProjectUtil from "../../../UI/Utils/Project";
91
87
  import ObjectID from "../../../Types/ObjectID";
92
88
 
93
89
  const PROJECT_ID: ObjectID = new ObjectID(
94
90
  "00000000-0000-4000-8000-000000000001",
95
91
  );
96
- const TEAM_ID: ObjectID = new ObjectID("00000000-0000-4000-8000-000000000002");
97
92
  const USER_ID: string = "00000000-0000-4000-8000-000000000003";
98
93
 
99
94
  const NOTIFICATION_LOG_TABLES: Array<{
@@ -207,78 +202,3 @@ describe("notification log tables", () => {
207
202
  },
208
203
  );
209
204
  });
210
-
211
- describe("team compliance status table", () => {
212
- const complianceResponse: {
213
- teamId: string;
214
- teamName: string;
215
- complianceSettings: Array<{ ruleType: string; enabled: boolean }>;
216
- userComplianceStatuses: Array<{
217
- userId: string;
218
- userName: string;
219
- userEmail: string;
220
- isCompliant: boolean;
221
- nonCompliantRules: Array<{ ruleType: string; reason: string }>;
222
- }>;
223
- } = {
224
- teamId: TEAM_ID.toString(),
225
- teamName: "On-Call",
226
- complianceSettings: [
227
- { ruleType: "HasNotificationEmailMethod", enabled: true },
228
- ],
229
- userComplianceStatuses: [
230
- {
231
- userId: USER_ID,
232
- userName: "Jane Doe",
233
- userEmail: "jane@acme.com",
234
- isCompliant: false,
235
- nonCompliantRules: [
236
- {
237
- ruleType: "HasNotificationEmailMethod",
238
- reason: "No email notification method",
239
- },
240
- ],
241
- },
242
- ],
243
- };
244
-
245
- beforeEach(async () => {
246
- jest.spyOn(ModelAPI, "getCommonHeaders").mockReturnValue({});
247
- jest
248
- .spyOn(API, "get")
249
- .mockResolvedValue({ data: complianceResponse } as never);
250
-
251
- render(<TeamComplianceStatusTable teamId={TEAM_ID} />);
252
-
253
- await waitFor(() => {
254
- expect(screen.getByText("Jane Doe")).toBeInTheDocument();
255
- });
256
- });
257
-
258
- afterEach(() => {
259
- jest.restoreAllMocks();
260
- });
261
-
262
- test("shows the member's email beside their name", () => {
263
- expect(screen.getByTestId("user-email")).toHaveTextContent("jane@acme.com");
264
- });
265
-
266
- /*
267
- * The row is hand-built from the compliance payload. Without the id the
268
- * avatar route cannot be built and every member falls back to the blank
269
- * picture, which reads as "nobody has a photo" rather than as a bug.
270
- */
271
- test("builds the avatar from the member's own id", () => {
272
- expect(screen.getAllByRole("img")[0]).toHaveAttribute(
273
- "src",
274
- `/api/user/profile-picture/${USER_ID}`,
275
- );
276
- });
277
-
278
- test("still shows why the member is non-compliant", () => {
279
- expect(screen.getByText("Non-Compliant")).toBeInTheDocument();
280
- expect(
281
- screen.getByText(/No email notification method/),
282
- ).toBeInTheDocument();
283
- });
284
- });
@@ -0,0 +1,319 @@
1
+ import "@testing-library/jest-dom";
2
+ import { act, cleanup, render, screen } from "@testing-library/react";
3
+ import fs from "fs";
4
+ import path from "path";
5
+ import React from "react";
6
+ import {
7
+ afterEach,
8
+ beforeEach,
9
+ describe,
10
+ expect,
11
+ jest,
12
+ test,
13
+ } from "@jest/globals";
14
+ import ObjectID from "../../../Types/ObjectID";
15
+ import HTTPResponse from "../../../Types/API/HTTPResponse";
16
+ import { JSONArray } from "../../../Types/JSON";
17
+ import API from "../../../UI/Utils/API/API";
18
+ import Navigation from "../../../UI/Utils/Navigation";
19
+ import StatusPageUtil from "../../../../App/FeatureSet/StatusPage/src/Utils/StatusPage";
20
+ import UserUtil from "../../../../App/FeatureSet/StatusPage/src/Utils/User";
21
+ import SsoPage from "../../../../App/FeatureSet/StatusPage/src/Pages/Accounts/SSO";
22
+ import { getJestSpyOn } from "../../Spy";
23
+
24
+ /*
25
+ * Status page > "Log in with SSO". It lists the page's SAML and OIDC
26
+ * providers. On the Community Edition status page SSO does not exist and the
27
+ * server lists none (design v2 section 0), and a page can also simply have no
28
+ * enabled provider. When BOTH lists come back empty the page says single
29
+ * sign-on is not available and links back to the password sign-in - and that
30
+ * is the only message it shows: not also the SAML list's "No items found."
31
+ * and the OIDC list's "No SSO Providers Configured or Enabled".
32
+ *
33
+ * The lists are the real ModelList, fetching through a stubbed API.post, so
34
+ * what is asserted is what a visitor would see.
35
+ *
36
+ * Translations resolve against the StatusPage's real en.json and NEVER fall
37
+ * back to a call's defaultValue: a key missing from the locales renders as
38
+ * the bare key, so these tests fail instead of passing on the fallback text.
39
+ */
40
+
41
+ jest.mock("react-i18next", () => {
42
+ const english: Record<string, unknown> = jest.requireActual(
43
+ "../../../../App/FeatureSet/StatusPage/src/Locales/en.json",
44
+ ) as Record<string, unknown>;
45
+
46
+ type TranslateOptions = Record<string, unknown> & {
47
+ keySeparator?: string | false;
48
+ };
49
+
50
+ const translate: (key: string, options?: TranslateOptions) => string = (
51
+ key: string,
52
+ options?: TranslateOptions,
53
+ ): string => {
54
+ const segments: Array<string> =
55
+ options?.keySeparator === false ? [key] : key.split(".");
56
+ let node: unknown = english;
57
+
58
+ for (const part of segments) {
59
+ node =
60
+ node !== null && typeof node === "object"
61
+ ? (node as Record<string, unknown>)[part]
62
+ : undefined;
63
+ }
64
+
65
+ if (typeof node !== "string") {
66
+ return key;
67
+ }
68
+
69
+ return node.replace(
70
+ /\{\{(\w+)\}\}/g,
71
+ (_placeholder: string, name: string): string => {
72
+ return String(options?.[name] ?? "");
73
+ },
74
+ );
75
+ };
76
+
77
+ return {
78
+ useTranslation: () => {
79
+ return { t: translate };
80
+ },
81
+ };
82
+ });
83
+
84
+ type ProviderRow = { _id: string; name: string };
85
+
86
+ const STATUS_PAGE_ID: ObjectID = new ObjectID(
87
+ "11111111-1111-4111-8111-111111111111",
88
+ );
89
+
90
+ const LOCALES_DIR: string = path.resolve(
91
+ __dirname,
92
+ "..",
93
+ "..",
94
+ "..",
95
+ "..",
96
+ "App",
97
+ "FeatureSet",
98
+ "StatusPage",
99
+ "src",
100
+ "Locales",
101
+ );
102
+
103
+ const NOT_AVAILABLE: string =
104
+ "Single sign-on is not available for this status page. Sign in with your email and password instead.";
105
+ const BACK_TO_SIGN_IN: string = "Back to sign in";
106
+ // The two empty states the lists used to add on top of the notice.
107
+ const MODEL_LIST_FALLBACK: string = "No items found.";
108
+ const NO_PROVIDERS: string = "No SSO Providers Configured or Enabled";
109
+
110
+ const OKTA: ProviderRow = {
111
+ _id: "22222222-2222-4222-8222-222222222222",
112
+ name: "Okta",
113
+ };
114
+
115
+ let samlProviders: Array<ProviderRow> | Error = [];
116
+ let oidcProviders: Array<ProviderRow> | Error = [];
117
+ let lookedUp: Array<string> = [];
118
+
119
+ const readLocale: (file: string) => Record<string, any> = (
120
+ file: string,
121
+ ): Record<string, any> => {
122
+ return JSON.parse(
123
+ fs.readFileSync(path.join(LOCALES_DIR, file), "utf8"),
124
+ ) as Record<string, any>;
125
+ };
126
+
127
+ const renderPage: () => Promise<void> = async (): Promise<void> => {
128
+ await act(async () => {
129
+ render(
130
+ <SsoPage
131
+ statusPageName="Customer Status"
132
+ logoFileId={new ObjectID(STATUS_PAGE_ID.toString())}
133
+ />,
134
+ );
135
+ });
136
+ };
137
+
138
+ const providerLists: () => HTMLElement = (): HTMLElement => {
139
+ return screen.getByTestId("status-page-sso-provider-lists");
140
+ };
141
+
142
+ describe("Status page SSO sign-in when no provider can be offered", () => {
143
+ let isPreview: boolean = false;
144
+
145
+ beforeEach(() => {
146
+ isPreview = false;
147
+ samlProviders = [];
148
+ oidcProviders = [];
149
+ lookedUp = [];
150
+
151
+ getJestSpyOn(StatusPageUtil, "getStatusPageId").mockReturnValue(
152
+ STATUS_PAGE_ID,
153
+ );
154
+ getJestSpyOn(StatusPageUtil, "isPrivateStatusPage").mockReturnValue(true);
155
+ getJestSpyOn(StatusPageUtil, "requiresMasterPassword").mockReturnValue(
156
+ false,
157
+ );
158
+ getJestSpyOn(StatusPageUtil, "getSafeRedirectUrl").mockReturnValue(null);
159
+ getJestSpyOn(StatusPageUtil, "isPreviewPage").mockImplementation(
160
+ (): boolean => {
161
+ return isPreview;
162
+ },
163
+ );
164
+ getJestSpyOn(UserUtil, "isLoggedIn").mockReturnValue(false);
165
+ getJestSpyOn(Navigation, "navigate").mockImplementation(() => {});
166
+ getJestSpyOn(API, "getFriendlyMessage").mockReturnValue(
167
+ "Could not load the SAML providers.",
168
+ );
169
+ getJestSpyOn(API, "post").mockImplementation(
170
+ async (options: {
171
+ url: { toString: () => string };
172
+ }): Promise<HTTPResponse<JSONArray>> => {
173
+ const url: string = options.url.toString();
174
+ lookedUp.push(url);
175
+
176
+ const answer: Array<ProviderRow> | Error = url.endsWith(
177
+ `/oidc/${STATUS_PAGE_ID.toString()}`,
178
+ )
179
+ ? oidcProviders
180
+ : samlProviders;
181
+
182
+ if (answer instanceof Error) {
183
+ throw answer;
184
+ }
185
+
186
+ return new HTTPResponse<JSONArray>(200, answer, {});
187
+ },
188
+ );
189
+ });
190
+
191
+ afterEach(() => {
192
+ cleanup();
193
+ jest.restoreAllMocks();
194
+ });
195
+
196
+ test("both lists empty (the Community Edition): explains and links back to sign-in", async () => {
197
+ await renderPage();
198
+
199
+ const notice: HTMLElement = await screen.findByTestId(
200
+ "status-page-sso-unavailable",
201
+ );
202
+
203
+ expect(notice).toHaveTextContent(NOT_AVAILABLE);
204
+ expect(screen.getByText(BACK_TO_SIGN_IN).closest("a")).toHaveAttribute(
205
+ "href",
206
+ "/login",
207
+ );
208
+ });
209
+
210
+ test("both lists empty: the notice is the only message on the page", async () => {
211
+ await renderPage();
212
+
213
+ expect(
214
+ await screen.findByTestId("status-page-sso-unavailable"),
215
+ ).toBeVisible();
216
+ expect(screen.getAllByText(NOT_AVAILABLE)).toHaveLength(1);
217
+ expect(screen.queryByText(MODEL_LIST_FALLBACK)).not.toBeInTheDocument();
218
+ expect(screen.queryByText(NO_PROVIDERS)).not.toBeInTheDocument();
219
+
220
+ // Both lists did load (and stay mounted), but take no room on the page.
221
+ expect(lookedUp).toHaveLength(2);
222
+ expect(providerLists()).toHaveAttribute("hidden");
223
+ expect(providerLists()).not.toBeVisible();
224
+ expect(providerLists()).toHaveTextContent("");
225
+ });
226
+
227
+ test("the notice's strings come from the locale files, not the fallback text", async () => {
228
+ await renderPage();
229
+
230
+ const english: Record<string, any> = readLocale("en.json");
231
+
232
+ expect(english["accounts"]["sso"]["notAvailable"]).toBe(NOT_AVAILABLE);
233
+ expect(english["accounts"]["sso"]["backToLogin"]).toBe(BACK_TO_SIGN_IN);
234
+ // A key missing from en.json would render as the key itself.
235
+ expect(
236
+ screen.queryByText("accounts.sso.notAvailable"),
237
+ ).not.toBeInTheDocument();
238
+ expect(
239
+ screen.queryByText("accounts.sso.backToLogin"),
240
+ ).not.toBeInTheDocument();
241
+ expect(screen.getByText(BACK_TO_SIGN_IN)).toBeInTheDocument();
242
+ });
243
+
244
+ test("every StatusPage locale translates both strings", () => {
245
+ const english: Record<string, any> = readLocale("en.json");
246
+ const locales: Array<string> = fs
247
+ .readdirSync(LOCALES_DIR)
248
+ .filter((file: string) => {
249
+ return file.endsWith(".json") && file !== "en.json";
250
+ });
251
+
252
+ expect(locales).toHaveLength(16);
253
+
254
+ for (const file of locales) {
255
+ const sso: Record<string, unknown> = readLocale(file)["accounts"]["sso"];
256
+
257
+ for (const key of ["notAvailable", "backToLogin"]) {
258
+ const value: unknown = sso[key];
259
+
260
+ expect([file, key, typeof value]).toEqual([file, key, "string"]);
261
+ expect((value as string).trim()).not.toBe("");
262
+ expect([file, key, value]).not.toEqual([
263
+ file,
264
+ key,
265
+ english["accounts"]["sso"][key],
266
+ ]);
267
+ }
268
+ }
269
+ });
270
+
271
+ test("on a preview page the link goes back to the preview's sign-in", async () => {
272
+ isPreview = true;
273
+
274
+ await renderPage();
275
+
276
+ expect(screen.getByText(BACK_TO_SIGN_IN).closest("a")).toHaveAttribute(
277
+ "href",
278
+ `/status-page/${STATUS_PAGE_ID.toString()}/login`,
279
+ );
280
+ });
281
+
282
+ test.each([
283
+ ["a SAML provider", "saml"],
284
+ ["an OIDC provider", "oidc"],
285
+ ])(
286
+ "with %s it lists it and shows no notice, and no empty message for the other list",
287
+ async (_label: string, protocol: string) => {
288
+ if (protocol === "saml") {
289
+ samlProviders = [OKTA];
290
+ } else {
291
+ oidcProviders = [OKTA];
292
+ }
293
+
294
+ await renderPage();
295
+
296
+ expect(await screen.findByText("Okta")).toBeVisible();
297
+ expect(providerLists()).not.toHaveAttribute("hidden");
298
+ expect(
299
+ screen.queryByTestId("status-page-sso-unavailable"),
300
+ ).not.toBeInTheDocument();
301
+ expect(screen.queryByText(MODEL_LIST_FALLBACK)).not.toBeInTheDocument();
302
+ expect(screen.queryByText(NO_PROVIDERS)).not.toBeInTheDocument();
303
+ },
304
+ );
305
+
306
+ test("a list that failed to load is not taken for 'no providers'", async () => {
307
+ samlProviders = new Error("boom");
308
+
309
+ await renderPage();
310
+
311
+ expect(
312
+ await screen.findByText("Could not load the SAML providers."),
313
+ ).toBeVisible();
314
+ expect(providerLists()).not.toHaveAttribute("hidden");
315
+ expect(
316
+ screen.queryByTestId("status-page-sso-unavailable"),
317
+ ).not.toBeInTheDocument();
318
+ });
319
+ });