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