@oneuptime/common 12.0.30 → 12.0.31

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 (489) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  5. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  6. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  7. package/Models/DatabaseModels/Index.ts +2 -0
  8. package/Models/DatabaseModels/NetworkDevice.ts +113 -3
  9. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  10. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  11. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
  12. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  13. package/Server/API/GlobalConfigAPI.ts +362 -183
  14. package/Server/API/TelemetryAPI.ts +42 -4
  15. package/Server/EnvironmentConfig.ts +112 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  19. package/Server/Middleware/MultipartFormData.ts +118 -32
  20. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  21. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  22. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  23. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  24. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  25. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  26. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  27. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  28. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  29. package/Server/Services/AlertReminderRuleService.ts +9 -1
  30. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  31. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  32. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  33. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  34. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  35. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  36. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  37. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  38. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  40. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  41. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  43. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  44. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  45. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  46. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  47. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  48. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  49. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  50. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  52. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  53. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  54. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/Index.ts +2 -0
  57. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  58. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  59. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  60. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  61. package/Server/Services/KubernetesResourceService.ts +5 -1
  62. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  63. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  64. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  65. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  66. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  67. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  68. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  69. package/Server/Services/NetworkDeviceService.ts +209 -1
  70. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  71. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  72. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  73. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  74. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  79. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  80. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  81. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  82. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  83. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  85. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  86. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  87. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  88. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  92. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  93. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  94. package/Server/Services/UserService.ts +27 -0
  95. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  97. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  98. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  99. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  100. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  101. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  102. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  103. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  104. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  105. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  106. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  107. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  108. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  109. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  110. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  111. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  112. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  113. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  114. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  115. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  116. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  117. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
  118. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  119. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  120. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  121. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  122. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  123. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  124. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  125. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  126. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  127. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  128. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  129. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  130. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  131. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  132. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  133. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  134. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  135. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  136. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  137. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  138. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  139. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  140. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  141. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  142. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  143. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  144. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  145. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  146. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  147. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  148. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  149. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  150. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  151. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  152. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  153. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  154. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  155. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  156. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  157. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  158. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  159. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  160. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  161. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  162. package/Tests/UI/Components/XAxis.test.ts +270 -5
  163. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  164. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  165. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  166. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  167. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  168. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  169. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  170. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  171. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  172. package/Types/Date.ts +39 -0
  173. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  174. package/Types/Permission.ts +96 -0
  175. package/Types/Rum/SessionReplay.ts +21 -0
  176. package/Types/Telemetry/SourceMap.ts +8 -0
  177. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  178. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  179. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  180. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  181. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
  182. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
  183. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
  184. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  185. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  186. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  187. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  188. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  189. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  190. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  191. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  192. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  193. package/UI/Components/Feed/FeedItem.tsx +4 -5
  194. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  195. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  196. package/UI/Components/Image/Image.tsx +20 -3
  197. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  198. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  199. package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
  200. package/UI/Components/Table/TableHeader.tsx +64 -48
  201. package/UI/Components/Table/TableRow.tsx +13 -3
  202. package/UI/Styles/Theme.css +38 -0
  203. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  204. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  205. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  206. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  207. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  208. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  209. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  210. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  211. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  212. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  214. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  216. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  218. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  220. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  221. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  222. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
  224. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  225. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  226. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  227. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  228. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
  229. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  230. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  231. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  232. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  233. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  234. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  235. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  236. package/build/dist/Server/EnvironmentConfig.js +83 -0
  237. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  245. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  246. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  247. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  248. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  249. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  250. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  251. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  252. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  253. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  254. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  255. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  256. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  257. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  258. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  259. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  260. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  261. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  262. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  263. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  264. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  265. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  266. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  267. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  268. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  269. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  270. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  271. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  272. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  273. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  274. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  275. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  276. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  277. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  278. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  279. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  280. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  281. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  282. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  283. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  284. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  285. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  286. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  287. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  288. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  289. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  290. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  291. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  292. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  293. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  294. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  295. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  297. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  299. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  300. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  301. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  302. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  303. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  304. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  305. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  306. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  307. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  308. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  309. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  310. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  311. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  312. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  313. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  314. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  315. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  316. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  317. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  318. package/build/dist/Server/Services/Index.js +2 -0
  319. package/build/dist/Server/Services/Index.js.map +1 -1
  320. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  321. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  322. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  323. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  324. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  325. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  326. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  327. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  328. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  329. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  330. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  331. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  332. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  333. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  334. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  335. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  336. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  337. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  338. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  339. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  340. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  341. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  342. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  343. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  344. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  345. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  346. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  347. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  348. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  349. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  350. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  351. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  352. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  353. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  354. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  355. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  356. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  357. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  358. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  359. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  360. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  361. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  362. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  363. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  364. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  365. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  367. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  368. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  369. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  370. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  371. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  372. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  373. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  374. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  375. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  376. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  377. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  378. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  379. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  380. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  381. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  382. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  383. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  384. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  385. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  386. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  387. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  388. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  389. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  390. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  391. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  392. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  393. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  394. package/build/dist/Server/Services/UserService.js +25 -0
  395. package/build/dist/Server/Services/UserService.js.map +1 -1
  396. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  397. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  398. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  399. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  400. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  401. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  402. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  403. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  404. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  405. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  406. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  407. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  408. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  409. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  410. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  411. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  412. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  413. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  414. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  415. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  416. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  417. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  418. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  419. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  420. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  421. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  422. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  423. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  424. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  425. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  426. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  427. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  428. package/build/dist/Types/Date.js +27 -0
  429. package/build/dist/Types/Date.js.map +1 -1
  430. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  431. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  432. package/build/dist/Types/Permission.js +86 -0
  433. package/build/dist/Types/Permission.js.map +1 -1
  434. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  435. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  436. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  437. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  438. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  439. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  440. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  441. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  442. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  443. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  444. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
  445. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  446. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
  447. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  448. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
  449. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  450. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  451. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  452. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  453. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  454. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  455. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  456. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  457. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  458. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  459. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  460. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  461. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  462. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  463. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  464. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  465. package/build/dist/UI/Components/Image/Image.js +6 -1
  466. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  467. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  468. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  469. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  470. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  471. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
  472. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  473. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  474. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  475. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  476. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  477. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  478. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  479. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  480. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  481. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  482. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  483. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  484. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  485. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  486. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  487. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  488. package/jest.config.json +1 -0
  489. package/package.json +2 -2
@@ -0,0 +1,182 @@
1
+ import UserService from "../../../Server/Services/UserService";
2
+ import EnterpriseLicenseSeatUtil from "../../../Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil";
3
+ import CreateBy from "../../../Server/Types/Database/CreateBy";
4
+ import User from "../../../Models/DatabaseModels/User";
5
+ import Email from "../../../Types/Email";
6
+ import BadDataException from "../../../Types/Exception/BadDataException";
7
+ import ObjectID from "../../../Types/ObjectID";
8
+ import PositiveNumber from "../../../Types/PositiveNumber";
9
+ import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
10
+
11
+ /*
12
+ * Where the enterprise seat limit is actually enforced.
13
+ *
14
+ * The limit is bought per user and shared by every instance on the licence,
15
+ * and a seat is consumed by a person EXISTING on the installation — not by the
16
+ * particular door they walked through. There are eight of those doors: team
17
+ * invitations, self-service signup, SAML and OIDC just-in-time provisioning
18
+ * (project-level and global), three SCIM routes, the Admin Dashboard user
19
+ * form, and the master API key posting to /api/user. Every one of them ends up
20
+ * in UserService.create, so the check belongs in its create hook and nowhere
21
+ * else; a check on the invitation would have left signup and SSO as open doors
22
+ * beside it.
23
+ *
24
+ * The single most important assertion in this file is the isRoot one. Team
25
+ * invitations create the invited user with `props: { isRoot: true }`
26
+ * (TeamMemberService.onBeforeCreate), so the usual "internal writes bypass
27
+ * this" instinct would exempt invitations — the exact path this feature was
28
+ * asked for.
29
+ */
30
+
31
+ jest.mock(
32
+ "../../../Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil",
33
+ () => {
34
+ return {
35
+ __esModule: true,
36
+ default: {
37
+ assertSeatAvailableForNewUser: jest.fn(),
38
+ },
39
+ };
40
+ },
41
+ );
42
+
43
+ type OnBeforeCreateFunction = (createBy: CreateBy<User>) => Promise<unknown>;
44
+
45
+ /*
46
+ * onBeforeCreate is protected, which is exactly the right shape for it and
47
+ * exactly the wrong shape for a test. Reached through the instance rather than
48
+ * re-implemented, so this suite breaks if the hook is renamed or removed.
49
+ */
50
+ const onBeforeCreate: OnBeforeCreateFunction = (
51
+ createBy: CreateBy<User>,
52
+ ): Promise<unknown> => {
53
+ return (
54
+ UserService as unknown as {
55
+ onBeforeCreate: OnBeforeCreateFunction;
56
+ }
57
+ ).onBeforeCreate(createBy);
58
+ };
59
+
60
+ type MakeCreateByFunction = (props?: Record<string, unknown>) => CreateBy<User>;
61
+
62
+ const makeCreateBy: MakeCreateByFunction = (
63
+ props?: Record<string, unknown>,
64
+ ): CreateBy<User> => {
65
+ const user: User = new User();
66
+ user.email = new Email("someone@acme.com");
67
+
68
+ return {
69
+ data: user,
70
+ props: props || {},
71
+ } as unknown as CreateBy<User>;
72
+ };
73
+
74
+ type AssertSeatMockFunction = () => jest.Mock;
75
+
76
+ const assertSeatMock: AssertSeatMockFunction = (): jest.Mock => {
77
+ return EnterpriseLicenseSeatUtil.assertSeatAvailableForNewUser as unknown as jest.Mock;
78
+ };
79
+
80
+ describe("UserService - the enterprise seat limit", () => {
81
+ beforeEach(() => {
82
+ jest.clearAllMocks();
83
+ assertSeatMock().mockResolvedValue(undefined);
84
+ UserService.countBy = jest.fn().mockResolvedValue(new PositiveNumber(7));
85
+ });
86
+
87
+ afterEach(() => {
88
+ jest.restoreAllMocks();
89
+ });
90
+
91
+ it("checks the seat limit before creating a user", async () => {
92
+ await onBeforeCreate(makeCreateBy());
93
+
94
+ expect(assertSeatMock()).toHaveBeenCalledTimes(1);
95
+ });
96
+
97
+ it("refuses the create when there is no seat for the new user", async () => {
98
+ assertSeatMock().mockRejectedValue(new BadDataException("No seats left"));
99
+
100
+ await expect(onBeforeCreate(makeCreateBy())).rejects.toBeInstanceOf(
101
+ BadDataException,
102
+ );
103
+ });
104
+
105
+ /*
106
+ * The one that matters. TeamMemberService creates the invited user as root,
107
+ * so an isRoot exemption would exempt invitations — and inviting users past
108
+ * the licence is the thing being prevented.
109
+ */
110
+ it.each([
111
+ ["a root write, which is how invitations create users", { isRoot: true }],
112
+ ["a master admin acting from the Admin Dashboard", { isMasterAdmin: true }],
113
+ ["an ordinary tenant write", { userId: ObjectID.generate() }],
114
+ ])(
115
+ "still checks the limit for %s",
116
+ async (_label: string, props: Record<string, unknown>) => {
117
+ await onBeforeCreate(makeCreateBy(props));
118
+
119
+ expect(assertSeatMock()).toHaveBeenCalledTimes(1);
120
+ },
121
+ );
122
+
123
+ it("checks the limit before anything else the hook does", async () => {
124
+ /*
125
+ * The hook also sanitizes attribution columns. If a refusal came after
126
+ * that, a rejected create would still have done work; more importantly the
127
+ * ordering pins that nothing was inserted ahead of the check later on.
128
+ */
129
+ assertSeatMock().mockRejectedValue(new BadDataException("No seats left"));
130
+
131
+ const createBy: CreateBy<User> = makeCreateBy();
132
+ (createBy.data as unknown as Record<string, unknown>)["clickIds"] = {
133
+ gclid: "abc",
134
+ };
135
+
136
+ await expect(onBeforeCreate(createBy)).rejects.toBeInstanceOf(
137
+ BadDataException,
138
+ );
139
+ });
140
+
141
+ describe("the user count it enforces against", () => {
142
+ type GetLocalUserCountFunction = () => Promise<number>;
143
+
144
+ type CapturedCallbackFunction = () => GetLocalUserCountFunction;
145
+
146
+ const capturedCallback: CapturedCallbackFunction =
147
+ (): GetLocalUserCountFunction => {
148
+ const call: Record<string, unknown> = assertSeatMock().mock
149
+ .calls[0]![0] as Record<string, unknown>;
150
+
151
+ return call["getLocalUserCount"] as GetLocalUserCountFunction;
152
+ };
153
+
154
+ it("counts every user on this installation, not just the caller's project", async () => {
155
+ await onBeforeCreate(makeCreateBy());
156
+
157
+ const count: number = await capturedCallback()();
158
+
159
+ expect(count).toBe(7);
160
+
161
+ const countCall: Record<string, unknown> = (
162
+ UserService.countBy as unknown as jest.Mock
163
+ ).mock.calls[0]![0] as Record<string, unknown>;
164
+
165
+ expect(countCall["query"]).toEqual({});
166
+ expect((countCall["props"] as Record<string, unknown>)["isRoot"]).toBe(
167
+ true,
168
+ );
169
+ });
170
+
171
+ /*
172
+ * The count is deliberately behind a callback rather than passed in: on
173
+ * Community Edition, and on a licence with no seat limit, it must never
174
+ * run at all. This is the create path of every user on the installation.
175
+ */
176
+ it("does not count users unless the seat check asks for it", async () => {
177
+ await onBeforeCreate(makeCreateBy());
178
+
179
+ expect(UserService.countBy).not.toHaveBeenCalled();
180
+ });
181
+ });
182
+ });
@@ -0,0 +1,255 @@
1
+ import ModelPermission from "../../../../Server/Types/AnalyticsDatabase/ModelPermission";
2
+ import DatabaseRequestType from "../../../../Server/Types/BaseDatabase/DatabaseRequestType";
3
+ import Log from "../../../../Models/AnalyticsModels/Log";
4
+ import SecurityEvent from "../../../../Models/AnalyticsModels/SecurityEvent";
5
+ import ThreatIntelIndicator from "../../../../Models/AnalyticsModels/ThreatIntelIndicator";
6
+ import DatabaseCommonInteractionProps from "../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
7
+ import ObjectID from "../../../../Types/ObjectID";
8
+ import Permission, {
9
+ UserPermission,
10
+ UserTenantAccessPermission,
11
+ } from "../../../../Types/Permission";
12
+ import { describe, expect, test } from "@jest/globals";
13
+
14
+ /*
15
+ * The SIEM's ClickHouse tables go through a different gate from the Postgres
16
+ * ones - AnalyticsDatabase/ModelPermission rather than TablePermission - and it
17
+ * is the gate the /security-events CRUD API and the AI security tools both run
18
+ * through. The Security tiers have to hold on this path too, and one thing that
19
+ * only exists on this path has to be checked here: the
20
+ * *AllOperationalResources wildcards.
21
+ */
22
+
23
+ const projectId: ObjectID = ObjectID.generate();
24
+ const userId: ObjectID = ObjectID.generate();
25
+
26
+ type MakePropsFunction = (
27
+ grantedByTeams: Array<Permission>,
28
+ ) => DatabaseCommonInteractionProps;
29
+
30
+ const makeProps: MakePropsFunction = (
31
+ grantedByTeams: Array<Permission>,
32
+ ): DatabaseCommonInteractionProps => {
33
+ const permissions: Array<Permission> = [
34
+ Permission.CurrentUser,
35
+ Permission.UnAuthorizedSsoUser,
36
+ Permission.ProjectUser,
37
+ ...grantedByTeams,
38
+ ];
39
+
40
+ const tenantPermission: UserTenantAccessPermission = {
41
+ projectId,
42
+ _type: "UserTenantAccessPermission",
43
+ permissions: permissions.map((permission: Permission): UserPermission => {
44
+ return {
45
+ _type: "UserPermission",
46
+ permission,
47
+ labelIds: [],
48
+ isBlockPermission: false,
49
+ };
50
+ }),
51
+ };
52
+
53
+ return {
54
+ userId,
55
+ tenantId: projectId,
56
+ userTenantAccessPermission: {
57
+ [projectId.toString()]: tenantPermission,
58
+ },
59
+ };
60
+ };
61
+
62
+ type ModelType = { new (): any };
63
+
64
+ type CanFunction = (
65
+ modelType: ModelType,
66
+ props: DatabaseCommonInteractionProps,
67
+ requestType: DatabaseRequestType,
68
+ ) => boolean;
69
+
70
+ const can: CanFunction = (
71
+ modelType: ModelType,
72
+ props: DatabaseCommonInteractionProps,
73
+ requestType: DatabaseRequestType,
74
+ ): boolean => {
75
+ try {
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ (ModelPermission as any).checkModelLevelPermissions(
78
+ modelType,
79
+ props,
80
+ requestType,
81
+ );
82
+ return true;
83
+ } catch {
84
+ return false;
85
+ }
86
+ };
87
+
88
+ type CanReadFunction = (
89
+ modelType: ModelType,
90
+ props: DatabaseCommonInteractionProps,
91
+ ) => boolean;
92
+
93
+ const canRead: CanReadFunction = (
94
+ modelType: ModelType,
95
+ props: DatabaseCommonInteractionProps,
96
+ ): boolean => {
97
+ return can(modelType, props, DatabaseRequestType.Read);
98
+ };
99
+
100
+ const ANALYTICS_SIEM_MODELS: Array<[string, ModelType]> = [
101
+ ["SecurityEvent", SecurityEvent],
102
+ ["ThreatIntelIndicator", ThreatIntelIndicator],
103
+ ];
104
+
105
+ describe("Security events through the analytics permission gate", () => {
106
+ test.each(ANALYTICS_SIEM_MODELS)(
107
+ "a Security Viewer can read %s",
108
+ (_name: string, modelType: ModelType) => {
109
+ expect(canRead(modelType, makeProps([Permission.SecurityViewer]))).toBe(
110
+ true,
111
+ );
112
+ },
113
+ );
114
+
115
+ test.each(ANALYTICS_SIEM_MODELS)(
116
+ "a Telemetry Admin cannot read %s",
117
+ (_name: string, modelType: ModelType) => {
118
+ expect(canRead(modelType, makeProps([Permission.TelemetryAdmin]))).toBe(
119
+ false,
120
+ );
121
+ },
122
+ );
123
+
124
+ test.each(ANALYTICS_SIEM_MODELS)(
125
+ "a plain project member cannot read %s",
126
+ (_name: string, modelType: ModelType) => {
127
+ expect(canRead(modelType, makeProps([Permission.ProjectMember]))).toBe(
128
+ false,
129
+ );
130
+ },
131
+ );
132
+
133
+ test.each(ANALYTICS_SIEM_MODELS)(
134
+ "the project-wide Viewer cannot read %s",
135
+ (_name: string, modelType: ModelType) => {
136
+ expect(canRead(modelType, makeProps([Permission.Viewer]))).toBe(false);
137
+ },
138
+ );
139
+
140
+ /*
141
+ * The pairing the split exists for, on the analytics path: the same principal
142
+ * that reads every log in the project reads no security events, and the
143
+ * security principal reads no logs.
144
+ */
145
+ test("logs and security events are separate grants", () => {
146
+ const telemetryViewer: DatabaseCommonInteractionProps = makeProps([
147
+ Permission.TelemetryViewer,
148
+ ]);
149
+ const securityViewer: DatabaseCommonInteractionProps = makeProps([
150
+ Permission.SecurityViewer,
151
+ ]);
152
+
153
+ expect(canRead(Log, telemetryViewer)).toBe(true);
154
+ expect(canRead(SecurityEvent, telemetryViewer)).toBe(false);
155
+
156
+ expect(canRead(SecurityEvent, securityViewer)).toBe(true);
157
+ expect(canRead(Log, securityViewer)).toBe(false);
158
+ });
159
+
160
+ /*
161
+ * The wildcard door.
162
+ *
163
+ * @OperationalResource() widens an analytics table's permission list with
164
+ * ReadAllOperationalResources and its siblings, and SecurityEvent carried the
165
+ * decorator because it was written as a copy of Log. That grant's own
166
+ * description is "all operational resources in this project (Monitor,
167
+ * Incident, Alert, StatusPage, etc.)" - somebody handing it to an integration
168
+ * is not deciding to hand over the SIEM, and it is a granular permission
169
+ * rather than a role, so none of the role-level assertions elsewhere would
170
+ * have noticed it staying open.
171
+ *
172
+ * Log keeps the decorator, which is what makes this a real assertion rather
173
+ * than a check that the wildcard mechanism is broken.
174
+ */
175
+ test("the operational-resource wildcards do not reach security events", () => {
176
+ const wildcardHolder: DatabaseCommonInteractionProps = makeProps([
177
+ Permission.ReadAllOperationalResources,
178
+ Permission.EditAllOperationalResources,
179
+ Permission.DeleteAllOperationalResources,
180
+ Permission.CreateAllOperationalResources,
181
+ ]);
182
+
183
+ expect(canRead(Log, wildcardHolder)).toBe(true);
184
+
185
+ for (const requestType of [
186
+ DatabaseRequestType.Read,
187
+ DatabaseRequestType.Update,
188
+ DatabaseRequestType.Delete,
189
+ DatabaseRequestType.Create,
190
+ ]) {
191
+ expect(can(SecurityEvent, wildcardHolder, requestType)).toBe(false);
192
+ }
193
+ });
194
+
195
+ /*
196
+ * Owned-scope filtering keys off @OwnedThrough, not @OperationalResource, so
197
+ * dropping the latter must not have taken "this team only sees the services
198
+ * it owns" with it.
199
+ */
200
+ test("security events are still ownable through their primary entity", () => {
201
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
202
+ expect((new SecurityEvent() as any).ownedThrough).toBeTruthy();
203
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
204
+ expect((new SecurityEvent() as any).isOperationalResource).toBeFalsy();
205
+ });
206
+
207
+ test("Security Viewer is read-only on the analytics tables too", () => {
208
+ const securityViewer: DatabaseCommonInteractionProps = makeProps([
209
+ Permission.SecurityViewer,
210
+ ]);
211
+
212
+ for (const requestType of [
213
+ DatabaseRequestType.Create,
214
+ DatabaseRequestType.Update,
215
+ DatabaseRequestType.Delete,
216
+ ]) {
217
+ expect(can(SecurityEvent, securityViewer, requestType)).toBe(false);
218
+ }
219
+ });
220
+
221
+ test("Security Admin can purge security events, Security Member cannot", () => {
222
+ expect(
223
+ can(
224
+ SecurityEvent,
225
+ makeProps([Permission.SecurityAdmin]),
226
+ DatabaseRequestType.Delete,
227
+ ),
228
+ ).toBe(true);
229
+
230
+ expect(
231
+ can(
232
+ SecurityEvent,
233
+ makeProps([Permission.SecurityMember]),
234
+ DatabaseRequestType.Delete,
235
+ ),
236
+ ).toBe(false);
237
+ });
238
+
239
+ test("the project's own administrators still reach the analytics tables", () => {
240
+ for (const permission of [
241
+ Permission.ProjectOwner,
242
+ Permission.ProjectAdmin,
243
+ ]) {
244
+ for (const [, modelType] of ANALYTICS_SIEM_MODELS) {
245
+ expect(canRead(modelType, makeProps([permission]))).toBe(true);
246
+ }
247
+ }
248
+ });
249
+
250
+ test("a granular ReadSecurityEvent key still works on its own", () => {
251
+ expect(
252
+ canRead(SecurityEvent, makeProps([Permission.ReadSecurityEvent])),
253
+ ).toBe(true);
254
+ });
255
+ });
@@ -0,0 +1,212 @@
1
+ import ReadPermission from "../../../../../Server/Types/Database/Permissions/ReadPermission";
2
+ import Incident from "../../../../../Models/DatabaseModels/Incident";
3
+ import Monitor from "../../../../../Models/DatabaseModels/Monitor";
4
+ import DatabaseCommonInteractionProps from "../../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
5
+ import NotAuthorizedException from "../../../../../Types/Exception/NotAuthorizedException";
6
+ import ObjectID from "../../../../../Types/ObjectID";
7
+ import Permission, {
8
+ UserPermission,
9
+ UserTenantAccessPermission,
10
+ } from "../../../../../Types/Permission";
11
+ import { FindOperator } from "typeorm";
12
+
13
+ describe("ReadPermission.checkReadBlockPermission", () => {
14
+ const projectId: ObjectID = ObjectID.generate();
15
+ const userId: ObjectID = ObjectID.generate();
16
+ const blockedLabelA: ObjectID = ObjectID.generate();
17
+ const blockedLabelB: ObjectID = ObjectID.generate();
18
+
19
+ function makeProps(
20
+ permissions: Array<UserPermission>,
21
+ ): DatabaseCommonInteractionProps {
22
+ const tenantPermission: UserTenantAccessPermission = {
23
+ projectId,
24
+ _type: "UserTenantAccessPermission",
25
+ permissions,
26
+ };
27
+
28
+ return {
29
+ userId,
30
+ tenantId: projectId,
31
+ userTenantAccessPermission: {
32
+ [projectId.toString()]: tenantPermission,
33
+ },
34
+ };
35
+ }
36
+
37
+ function blockPermission(
38
+ permission: Permission,
39
+ labelIds: Array<ObjectID>,
40
+ ): UserPermission {
41
+ return {
42
+ _type: "UserPermission",
43
+ permission,
44
+ labelIds,
45
+ isBlockPermission: true,
46
+ };
47
+ }
48
+
49
+ function allowPermission(
50
+ permission: Permission,
51
+ labelIds: Array<ObjectID>,
52
+ ): UserPermission {
53
+ return {
54
+ _type: "UserPermission",
55
+ permission,
56
+ labelIds,
57
+ isBlockPermission: false,
58
+ };
59
+ }
60
+
61
+ /*
62
+ * The rewrite has to SUBTRACT the blocked labels, not restrict the read to
63
+ * them. Asserting only that some FindOperator landed on the column would
64
+ * pass just as happily if notInOrNull() were swapped for its including
65
+ * counterpart, so read the rendered SQL back and return the ids it denies.
66
+ */
67
+ function deniedLabelIds(operator: any): Array<string> {
68
+ expect(operator).toBeInstanceOf(FindOperator);
69
+ expect(operator.type).toBe("raw");
70
+
71
+ const sql: string = operator.getSql("labelId");
72
+ expect(sql).toContain("NOT IN");
73
+ expect(sql).toContain("IS NULL");
74
+
75
+ return Object.values(
76
+ operator.objectLiteralParameters as Record<string, Array<string>>,
77
+ )[0] as Array<string>;
78
+ }
79
+
80
+ it("leaves the query untouched for a root request", async () => {
81
+ const query: any = { projectId };
82
+
83
+ const result: any = await ReadPermission.checkReadBlockPermission(
84
+ Incident,
85
+ query,
86
+ {
87
+ isRoot: true,
88
+ ...makeProps([
89
+ blockPermission(Permission.ProjectMember, [blockedLabelA]),
90
+ ]),
91
+ },
92
+ );
93
+
94
+ expect(result.query.labels).toBeUndefined();
95
+ });
96
+
97
+ it("leaves the query untouched for a master admin request", async () => {
98
+ const query: any = { projectId };
99
+
100
+ const result: any = await ReadPermission.checkReadBlockPermission(
101
+ Incident,
102
+ query,
103
+ {
104
+ isMasterAdmin: true,
105
+ ...makeProps([
106
+ blockPermission(Permission.ProjectMember, [blockedLabelA]),
107
+ ]),
108
+ },
109
+ );
110
+
111
+ expect(result.query.labels).toBeUndefined();
112
+ });
113
+
114
+ it("throws when a block permission on this model carries no labels", async () => {
115
+ /*
116
+ * A block row without labels is a table-level deny: there is no subset of
117
+ * rows left to read, so the request is refused rather than filtered.
118
+ */
119
+ const query: any = { projectId };
120
+
121
+ await expect(
122
+ ReadPermission.checkReadBlockPermission(
123
+ Incident,
124
+ query,
125
+ makeProps([blockPermission(Permission.ProjectMember, [])]),
126
+ ),
127
+ ).rejects.toThrow(NotAuthorizedException);
128
+ });
129
+
130
+ it("filters the blocked labels out of the query when the block carries labels", async () => {
131
+ const query: any = { projectId };
132
+
133
+ const result: any = await ReadPermission.checkReadBlockPermission(
134
+ Incident,
135
+ query,
136
+ makeProps([blockPermission(Permission.ProjectMember, [blockedLabelA])]),
137
+ );
138
+
139
+ expect(result.query.labels).toBeDefined();
140
+ expect(deniedLabelIds(result.query.labels._id)).toEqual([
141
+ blockedLabelA.toString(),
142
+ ]);
143
+ // The caller's own filters survive the rewrite.
144
+ expect(result.query.projectId).toEqual(projectId);
145
+ });
146
+
147
+ it("merges the labels of every block permission that belongs to the model", async () => {
148
+ const query: any = { projectId };
149
+
150
+ const result: any = await ReadPermission.checkReadBlockPermission(
151
+ Incident,
152
+ query,
153
+ makeProps([
154
+ blockPermission(Permission.ProjectMember, [blockedLabelA]),
155
+ blockPermission(Permission.IncidentViewer, [blockedLabelB]),
156
+ ]),
157
+ );
158
+
159
+ expect(deniedLabelIds(result.query.labels._id)).toEqual([
160
+ blockedLabelA.toString(),
161
+ blockedLabelB.toString(),
162
+ ]);
163
+ });
164
+
165
+ it("ignores a block permission that does not belong to this model", async () => {
166
+ /*
167
+ * Monitor-only permissions must not narrow an Incident read, otherwise a
168
+ * block on one resource would silently hide rows of another.
169
+ */
170
+ const query: any = { projectId };
171
+
172
+ const result: any = await ReadPermission.checkReadBlockPermission(
173
+ Incident,
174
+ query,
175
+ makeProps([blockPermission(Permission.MonitorViewer, [blockedLabelA])]),
176
+ );
177
+
178
+ expect(result.query.labels).toBeUndefined();
179
+ });
180
+
181
+ it("ignores labels carried by an allow permission", async () => {
182
+ /*
183
+ * Labels on an allow row scope what the user can see; only a block row
184
+ * subtracts from it. Reading the flag the wrong way round would turn a
185
+ * grant into a deny.
186
+ */
187
+ const query: any = { projectId };
188
+
189
+ const result: any = await ReadPermission.checkReadBlockPermission(
190
+ Incident,
191
+ query,
192
+ makeProps([allowPermission(Permission.ProjectMember, [blockedLabelA])]),
193
+ );
194
+
195
+ expect(result.query.labels).toBeUndefined();
196
+ });
197
+
198
+ it("applies the same filtering to another labelled model", async () => {
199
+ const query: any = { projectId };
200
+
201
+ const result: any = await ReadPermission.checkReadBlockPermission(
202
+ Monitor,
203
+ query,
204
+ makeProps([blockPermission(Permission.ProjectMember, [blockedLabelA])]),
205
+ );
206
+
207
+ expect(result.query.labels).toBeDefined();
208
+ expect(deniedLabelIds(result.query.labels._id)).toEqual([
209
+ blockedLabelA.toString(),
210
+ ]);
211
+ });
212
+ });