@oneuptime/common 12.0.30 → 12.0.32

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 (645) 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/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -0,0 +1,413 @@
1
+ import DatabaseRequestType from "../../../../../Server/Types/BaseDatabase/DatabaseRequestType";
2
+ import ColumnPermissions from "../../../../../Server/Types/Database/Permissions/ColumnPermission";
3
+ import TablePermission from "../../../../../Server/Types/Database/Permissions/TablePermission";
4
+ import AlertSeverity from "../../../../../Models/DatabaseModels/AlertSeverity";
5
+ import DetectionRule from "../../../../../Models/DatabaseModels/DetectionRule";
6
+ import GoogleSecOpsConnection from "../../../../../Models/DatabaseModels/GoogleSecOpsConnection";
7
+ import IncidentSeverity from "../../../../../Models/DatabaseModels/IncidentSeverity";
8
+ import Label from "../../../../../Models/DatabaseModels/Label";
9
+ import TableView from "../../../../../Models/DatabaseModels/TableView";
10
+ import Team from "../../../../../Models/DatabaseModels/Team";
11
+ import ThreatIntelFeed from "../../../../../Models/DatabaseModels/ThreatIntelFeed";
12
+ import TelemetryException from "../../../../../Models/DatabaseModels/TelemetryException";
13
+ import DatabaseCommonInteractionProps from "../../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
14
+ import DatabaseCommonInteractionPropsUtil, {
15
+ PermissionType,
16
+ } from "../../../../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
17
+ import ObjectID from "../../../../../Types/ObjectID";
18
+ import Permission, {
19
+ UserPermission,
20
+ UserTenantAccessPermission,
21
+ } from "../../../../../Types/Permission";
22
+ import { describe, expect, test } from "@jest/globals";
23
+
24
+ /*
25
+ * The Security tiers as the API actually sees them.
26
+ *
27
+ * SecurityDomainAccessControl.test.ts reads the access lists off the model
28
+ * classes; this drives the two gates a real request passes through -
29
+ * TablePermission for the table and ColumnPermissions for the fields the page
30
+ * selects - for principals built the way AccessTokenService builds them.
31
+ *
32
+ * The question behind the whole change: an operator asked whether the security
33
+ * side of the product could be kept from people who have the rest of it. Before
34
+ * the Security tiers the answer was no, because ProjectMember was on every SIEM
35
+ * table's read list and every member of a project holds it. The "cannot"
36
+ * assertions below are that answer changing.
37
+ */
38
+
39
+ const projectId: ObjectID = ObjectID.generate();
40
+ const userId: ObjectID = ObjectID.generate();
41
+
42
+ /*
43
+ * The permission set a signed-in member carries: whatever their teams grant,
44
+ * plus the three the platform adds to anyone with a session inside a project.
45
+ * ProjectUser is deliberately included - it is what makes this a fair test.
46
+ * Every principal below is a real project member, so if a SIEM table were
47
+ * readable through ProjectUser these tests would pass for the wrong reason and
48
+ * the isolation would not exist.
49
+ */
50
+ type MakePropsFunction = (
51
+ grantedByTeams: Array<Permission>,
52
+ ) => DatabaseCommonInteractionProps;
53
+
54
+ const makeProps: MakePropsFunction = (
55
+ grantedByTeams: Array<Permission>,
56
+ ): DatabaseCommonInteractionProps => {
57
+ const permissions: Array<Permission> = [
58
+ Permission.CurrentUser,
59
+ Permission.UnAuthorizedSsoUser,
60
+ Permission.ProjectUser,
61
+ ...grantedByTeams,
62
+ ];
63
+
64
+ const tenantPermission: UserTenantAccessPermission = {
65
+ projectId,
66
+ _type: "UserTenantAccessPermission",
67
+ permissions: permissions.map((permission: Permission): UserPermission => {
68
+ return {
69
+ _type: "UserPermission",
70
+ permission,
71
+ labelIds: [],
72
+ isBlockPermission: false,
73
+ };
74
+ }),
75
+ };
76
+
77
+ return {
78
+ userId,
79
+ tenantId: projectId,
80
+ userTenantAccessPermission: {
81
+ [projectId.toString()]: tenantPermission,
82
+ },
83
+ };
84
+ };
85
+
86
+ type ModelType = { new (): any };
87
+
88
+ type CanFunction = (
89
+ modelType: ModelType,
90
+ props: DatabaseCommonInteractionProps,
91
+ requestType: DatabaseRequestType,
92
+ ) => boolean;
93
+
94
+ const can: CanFunction = (
95
+ modelType: ModelType,
96
+ props: DatabaseCommonInteractionProps,
97
+ requestType: DatabaseRequestType,
98
+ ): boolean => {
99
+ try {
100
+ TablePermission.checkTableLevelPermissions(modelType, props, requestType);
101
+ return true;
102
+ } catch {
103
+ return false;
104
+ }
105
+ };
106
+
107
+ type CanReadFunction = (
108
+ modelType: ModelType,
109
+ props: DatabaseCommonInteractionProps,
110
+ ) => boolean;
111
+
112
+ const canRead: CanReadFunction = (
113
+ modelType: ModelType,
114
+ props: DatabaseCommonInteractionProps,
115
+ ): boolean => {
116
+ return can(modelType, props, DatabaseRequestType.Read);
117
+ };
118
+
119
+ type ReadableColumnsFunction = (
120
+ modelType: ModelType,
121
+ props: DatabaseCommonInteractionProps,
122
+ ) => Array<string>;
123
+
124
+ const readableColumns: ReadableColumnsFunction = (
125
+ modelType: ModelType,
126
+ props: DatabaseCommonInteractionProps,
127
+ ): Array<string> => {
128
+ return ColumnPermissions.getModelColumnsByPermissions(
129
+ modelType,
130
+ DatabaseCommonInteractionPropsUtil.getUserPermissions(
131
+ props,
132
+ PermissionType.Allow,
133
+ ),
134
+ DatabaseRequestType.Read,
135
+ ).columns;
136
+ };
137
+
138
+ const SIEM_MODELS: Array<[string, ModelType]> = [
139
+ ["DetectionRule", DetectionRule],
140
+ ["ThreatIntelFeed", ThreatIntelFeed],
141
+ ["GoogleSecOpsConnection", GoogleSecOpsConnection],
142
+ ];
143
+
144
+ describe("Security roles reach the SIEM", () => {
145
+ const securityViewer: DatabaseCommonInteractionProps = makeProps([
146
+ Permission.SecurityViewer,
147
+ ]);
148
+ const securityMember: DatabaseCommonInteractionProps = makeProps([
149
+ Permission.SecurityMember,
150
+ ]);
151
+ const securityAdmin: DatabaseCommonInteractionProps = makeProps([
152
+ Permission.SecurityAdmin,
153
+ ]);
154
+
155
+ test.each(SIEM_MODELS)(
156
+ "Security Viewer can read %s",
157
+ (_name: string, modelType: ModelType) => {
158
+ expect(canRead(modelType, securityViewer)).toBe(true);
159
+ },
160
+ );
161
+
162
+ test.each(SIEM_MODELS)(
163
+ "Security Member can read %s",
164
+ (_name: string, modelType: ModelType) => {
165
+ expect(canRead(modelType, securityMember)).toBe(true);
166
+ },
167
+ );
168
+
169
+ test.each(SIEM_MODELS)(
170
+ "Security Admin can read %s",
171
+ (_name: string, modelType: ModelType) => {
172
+ expect(canRead(modelType, securityAdmin)).toBe(true);
173
+ },
174
+ );
175
+
176
+ /*
177
+ * The columns the Detection Rules page selects. A table gate that passes and
178
+ * a column gate that does not is a page that renders an error over itself,
179
+ * which is how issue #3305 presented.
180
+ */
181
+ test("Security Viewer can select the columns the detection rules table reads", () => {
182
+ const columns: Array<string> = readableColumns(
183
+ DetectionRule,
184
+ securityViewer,
185
+ );
186
+
187
+ for (const column of [
188
+ "name",
189
+ "description",
190
+ "isEnabled",
191
+ "projectId",
192
+ "createdAt",
193
+ ]) {
194
+ expect(columns).toContain(column);
195
+ }
196
+ });
197
+
198
+ test("Security Viewer cannot write anything", () => {
199
+ const writes: Array<string> = [];
200
+
201
+ for (const [name, modelType] of SIEM_MODELS) {
202
+ for (const requestType of [
203
+ DatabaseRequestType.Create,
204
+ DatabaseRequestType.Update,
205
+ DatabaseRequestType.Delete,
206
+ ]) {
207
+ if (can(modelType, securityViewer, requestType)) {
208
+ writes.push(`SecurityViewer can ${requestType} ${name}`);
209
+ }
210
+ }
211
+ }
212
+
213
+ expect(writes).toEqual([]);
214
+ });
215
+
216
+ test("Security Member can author detections and threat intel feeds", () => {
217
+ for (const modelType of [DetectionRule, ThreatIntelFeed]) {
218
+ for (const requestType of [
219
+ DatabaseRequestType.Create,
220
+ DatabaseRequestType.Update,
221
+ DatabaseRequestType.Delete,
222
+ ]) {
223
+ expect(can(modelType, securityMember, requestType)).toBe(true);
224
+ }
225
+ }
226
+ });
227
+
228
+ /*
229
+ * Connecting the project to someone's Chronicle instance, and storing the
230
+ * service-account key that reads it, is administration of the SIEM. A Member
231
+ * uses the SIEM; they do not get to repoint it at another source.
232
+ */
233
+ test("Security Member cannot configure the SecOps connector", () => {
234
+ expect(canRead(GoogleSecOpsConnection, securityMember)).toBe(true);
235
+
236
+ for (const requestType of [
237
+ DatabaseRequestType.Create,
238
+ DatabaseRequestType.Update,
239
+ DatabaseRequestType.Delete,
240
+ ]) {
241
+ expect(can(GoogleSecOpsConnection, securityMember, requestType)).toBe(
242
+ false,
243
+ );
244
+ }
245
+ });
246
+
247
+ test("Security Admin can configure the SecOps connector", () => {
248
+ for (const requestType of [
249
+ DatabaseRequestType.Create,
250
+ DatabaseRequestType.Update,
251
+ DatabaseRequestType.Delete,
252
+ ]) {
253
+ expect(can(GoogleSecOpsConnection, securityAdmin, requestType)).toBe(
254
+ true,
255
+ );
256
+ }
257
+ });
258
+
259
+ /*
260
+ * A Sigma rule and a threat-intel feed each choose the severity of the alert
261
+ * or incident they open, so both forms select from the severity tables. The
262
+ * Security tiers hold no alert or incident permission, so without an explicit
263
+ * read grant the dropdown fails and the rule cannot be configured - the same
264
+ * shape of bug as the saved-views one, reached from a different direction.
265
+ */
266
+ test("Security roles can populate the severity dropdowns their forms use", () => {
267
+ for (const props of [securityViewer, securityMember, securityAdmin]) {
268
+ expect(canRead(AlertSeverity, props)).toBe(true);
269
+ expect(canRead(IncidentSeverity, props)).toBe(true);
270
+
271
+ expect(readableColumns(AlertSeverity, props)).toContain("name");
272
+ expect(readableColumns(IncidentSeverity, props)).toContain("name");
273
+ }
274
+ });
275
+
276
+ /*
277
+ * That grant is read-only and stops at the severity list. A security role
278
+ * must not become a back door into administering the alert domain.
279
+ */
280
+ test("the severity grant does not let a Security role edit severities", () => {
281
+ for (const modelType of [AlertSeverity, IncidentSeverity]) {
282
+ for (const requestType of [
283
+ DatabaseRequestType.Create,
284
+ DatabaseRequestType.Update,
285
+ DatabaseRequestType.Delete,
286
+ ]) {
287
+ expect(can(modelType, securityAdmin, requestType)).toBe(false);
288
+ }
289
+ }
290
+ });
291
+
292
+ /*
293
+ * The Security tiers are a domain scope like any other, so the dashboard
294
+ * furniture every page mounts has to keep working for someone who holds
295
+ * nothing else - otherwise the security pages error the way the monitor pages
296
+ * did in #3305.
297
+ */
298
+ test("a Security-only user can still use the dashboard around the page", () => {
299
+ for (const modelType of [TableView, Label, Team]) {
300
+ expect(canRead(modelType, securityViewer)).toBe(true);
301
+ }
302
+ });
303
+ });
304
+
305
+ describe("Nobody else reaches the SIEM", () => {
306
+ /*
307
+ * The regression guard. Each of these principals could read every security
308
+ * event, detection rule and threat-intel feed in the project before the
309
+ * Security tiers existed, and the request behind this change was to be able
310
+ * to stop that.
311
+ */
312
+ const excluded: Array<[string, Permission]> = [
313
+ ["Project Member", Permission.ProjectMember],
314
+ ["project-wide Viewer", Permission.Viewer],
315
+ ["Telemetry Admin", Permission.TelemetryAdmin],
316
+ ["Telemetry Member", Permission.TelemetryMember],
317
+ ["Telemetry Viewer", Permission.TelemetryViewer],
318
+ ["Monitor Admin", Permission.MonitorAdmin],
319
+ ["Incident Admin", Permission.IncidentAdmin],
320
+ ["Settings Admin", Permission.SettingsAdmin],
321
+ ];
322
+
323
+ test.each(excluded)(
324
+ "a %s cannot read the SIEM",
325
+ (_label: string, permission: Permission) => {
326
+ const props: DatabaseCommonInteractionProps = makeProps([permission]);
327
+ const reachable: Array<string> = [];
328
+
329
+ for (const [name, modelType] of SIEM_MODELS) {
330
+ if (canRead(modelType, props)) {
331
+ reachable.push(name);
332
+ }
333
+ }
334
+
335
+ expect(reachable).toEqual([]);
336
+ },
337
+ );
338
+
339
+ test.each(excluded)(
340
+ "a %s cannot write to the SIEM either",
341
+ (_label: string, permission: Permission) => {
342
+ const props: DatabaseCommonInteractionProps = makeProps([permission]);
343
+ const reachable: Array<string> = [];
344
+
345
+ for (const [name, modelType] of SIEM_MODELS) {
346
+ for (const requestType of [
347
+ DatabaseRequestType.Create,
348
+ DatabaseRequestType.Update,
349
+ DatabaseRequestType.Delete,
350
+ ]) {
351
+ if (can(modelType, props, requestType)) {
352
+ reachable.push(`${requestType} ${name}`);
353
+ }
354
+ }
355
+ }
356
+
357
+ expect(reachable).toEqual([]);
358
+ },
359
+ );
360
+
361
+ /*
362
+ * The exact pairing the operator asked about, stated in one place: the person
363
+ * with the run of every log, metric and trace in the project, and the person
364
+ * with the SIEM, can now be two different people - in both directions.
365
+ */
366
+ test("Telemetry and Security are independent grants", () => {
367
+ const telemetryAdmin: DatabaseCommonInteractionProps = makeProps([
368
+ Permission.TelemetryAdmin,
369
+ ]);
370
+ const securityAdmin: DatabaseCommonInteractionProps = makeProps([
371
+ Permission.SecurityAdmin,
372
+ ]);
373
+
374
+ expect(canRead(TelemetryException, telemetryAdmin)).toBe(true);
375
+ expect(canRead(DetectionRule, telemetryAdmin)).toBe(false);
376
+
377
+ expect(canRead(DetectionRule, securityAdmin)).toBe(true);
378
+ expect(canRead(TelemetryException, securityAdmin)).toBe(false);
379
+ });
380
+
381
+ /*
382
+ * Owner and Admin keep their access: they are who grants the Security tiers,
383
+ * so locking them out would leave a project with a SIEM nobody could open and
384
+ * no way to discover why.
385
+ */
386
+ test("the project's own administrators are not locked out", () => {
387
+ for (const permission of [
388
+ Permission.ProjectOwner,
389
+ Permission.ProjectAdmin,
390
+ ]) {
391
+ const props: DatabaseCommonInteractionProps = makeProps([permission]);
392
+
393
+ for (const [, modelType] of SIEM_MODELS) {
394
+ expect(canRead(modelType, props)).toBe(true);
395
+ }
396
+ }
397
+ });
398
+
399
+ /*
400
+ * An API key scoped to one granular permission is how integrations read the
401
+ * SIEM without holding a role. The tiers were added beside these, not in
402
+ * place of them.
403
+ */
404
+ test("a granular-only principal still reaches the table it was granted", () => {
405
+ const detectionRuleReader: DatabaseCommonInteractionProps = makeProps([
406
+ Permission.ReadProjectDetectionRule,
407
+ ]);
408
+
409
+ expect(canRead(DetectionRule, detectionRuleReader)).toBe(true);
410
+ expect(canRead(ThreatIntelFeed, detectionRuleReader)).toBe(false);
411
+ expect(canRead(GoogleSecOpsConnection, detectionRuleReader)).toBe(false);
412
+ });
413
+ });
@@ -0,0 +1,283 @@
1
+ import { beforeEach, describe, expect, jest, test } from "@jest/globals";
2
+ import cron from "node-cron";
3
+ import logger from "../../../Server/Utils/Logger";
4
+ import BasicCron from "../../../Server/Utils/BasicCron";
5
+
6
+ /*
7
+ * The wrapper every scheduled job in the app is registered through.
8
+ *
9
+ * Its job is not scheduling — node-cron does that — it is making sure one bad
10
+ * run cannot end the schedule. A cron callback that throws takes its timer
11
+ * with it, so a job that failed once at 03:00 would simply never run again,
12
+ * and nothing would say so: the next morning looks exactly like a night with
13
+ * nothing to do. That is why the tick is wrapped, and it is the behaviour
14
+ * worth pinning here.
15
+ *
16
+ * The startup run is deliberately NOT inside that guard, and the asymmetry is
17
+ * the interesting part of this module — see the last block.
18
+ */
19
+
20
+ jest.mock("node-cron", () => {
21
+ return { __esModule: true, default: { schedule: jest.fn() } };
22
+ });
23
+
24
+ jest.mock("../../../Server/Utils/Logger", () => {
25
+ return {
26
+ __esModule: true,
27
+ default: {
28
+ debug: jest.fn(),
29
+ info: jest.fn(),
30
+ warn: jest.fn(),
31
+ error: jest.fn(),
32
+ },
33
+ };
34
+ });
35
+
36
+ const mockedCron: { schedule: jest.Mock } = cron as unknown as {
37
+ schedule: jest.Mock;
38
+ };
39
+
40
+ const mockedLogger: { debug: jest.Mock; error: jest.Mock } =
41
+ logger as unknown as { debug: jest.Mock; error: jest.Mock };
42
+
43
+ const EVERY_FIVE_MINUTES: string = "*/5 * * * *";
44
+
45
+ /*
46
+ * The run function BasicCron is handed. jest.Mock's first type parameter is
47
+ * the RETURN type, so this is "a mock taking no arguments and answering with
48
+ * a promise" - named once here rather than restated at every call site.
49
+ */
50
+ type RunMock = jest.Mock<Promise<void>, []>;
51
+
52
+ function succeedingRun(): RunMock {
53
+ const mock: RunMock = jest.fn() as unknown as RunMock;
54
+ mock.mockImplementation((): Promise<void> => {
55
+ return Promise.resolve();
56
+ });
57
+ return mock;
58
+ }
59
+
60
+ function failingRun(message: string): RunMock {
61
+ const mock: RunMock = jest.fn() as unknown as RunMock;
62
+ mock.mockImplementation((): Promise<void> => {
63
+ return Promise.reject(new Error(message));
64
+ });
65
+ return mock;
66
+ }
67
+
68
+ /*
69
+ * BasicCron is declared as returning void but its implementation is async, so
70
+ * every call site here goes through this. That mismatch is not incidental
71
+ * tidying - it is the reason a startup failure reaches callers as an
72
+ * unhandled rejection rather than a thrown error, which the last test covers.
73
+ */
74
+ function startCron(data: {
75
+ jobName: string;
76
+ schedule: string;
77
+ runOnStartup: boolean;
78
+ runFunction: RunMock;
79
+ }): Promise<void> {
80
+ return BasicCron({
81
+ jobName: data.jobName,
82
+ options: {
83
+ schedule: data.schedule,
84
+ runOnStartup: data.runOnStartup,
85
+ },
86
+ runFunction: data.runFunction as never,
87
+ }) as unknown as Promise<void>;
88
+ }
89
+
90
+ /*
91
+ * The callback node-cron was handed. Invoking it is what "the schedule fired"
92
+ * means, without waiting five real minutes for it.
93
+ */
94
+ function scheduledTick(): () => Promise<void> {
95
+ return mockedCron.schedule.mock.calls[0]![1] as () => Promise<void>;
96
+ }
97
+
98
+ describe("BasicCron", () => {
99
+ beforeEach(() => {
100
+ jest.clearAllMocks();
101
+ });
102
+
103
+ describe("registration", () => {
104
+ test("registers the job on the schedule it was given", async () => {
105
+ const run: RunMock = succeedingRun();
106
+
107
+ await startCron({
108
+ jobName: "TestJob",
109
+ schedule: EVERY_FIVE_MINUTES,
110
+ runOnStartup: false,
111
+ runFunction: run,
112
+ });
113
+
114
+ expect(mockedCron.schedule).toHaveBeenCalledTimes(1);
115
+ expect(mockedCron.schedule.mock.calls[0]![0]).toBe(EVERY_FIVE_MINUTES);
116
+ });
117
+
118
+ /*
119
+ * Registering must not run the job. A job that ran once per process start
120
+ * would fire on every rolling restart and every replica.
121
+ */
122
+ test("registering alone does not run the job", async () => {
123
+ const run: RunMock = succeedingRun();
124
+
125
+ await startCron({
126
+ jobName: "TestJob",
127
+ schedule: EVERY_FIVE_MINUTES,
128
+ runOnStartup: false,
129
+ runFunction: run,
130
+ });
131
+
132
+ expect(run).not.toHaveBeenCalled();
133
+ });
134
+ });
135
+
136
+ describe("a scheduled run", () => {
137
+ test("runs the job when the schedule fires", async () => {
138
+ const run: RunMock = succeedingRun();
139
+
140
+ await startCron({
141
+ jobName: "TestJob",
142
+ schedule: EVERY_FIVE_MINUTES,
143
+ runOnStartup: false,
144
+ runFunction: run,
145
+ });
146
+
147
+ await scheduledTick()();
148
+
149
+ expect(run).toHaveBeenCalledTimes(1);
150
+ });
151
+
152
+ /*
153
+ * The whole point of the wrapper. An unhandled throw inside a node-cron
154
+ * callback ends that timer, so the job silently stops running for the
155
+ * lifetime of the process - and a job that never runs looks identical to
156
+ * a job with nothing to do.
157
+ */
158
+ test("a throwing run is swallowed, so the schedule survives it", async () => {
159
+ const run: RunMock = failingRun("job blew up");
160
+
161
+ await startCron({
162
+ jobName: "TestJob",
163
+ schedule: EVERY_FIVE_MINUTES,
164
+ runOnStartup: false,
165
+ runFunction: run,
166
+ });
167
+
168
+ await expect(scheduledTick()()).resolves.toBeUndefined();
169
+ expect(mockedLogger.error).toHaveBeenCalled();
170
+ });
171
+
172
+ test("a failed run does not stop later runs from firing", async () => {
173
+ const run: RunMock = succeedingRun();
174
+ run.mockImplementationOnce((): Promise<void> => {
175
+ return Promise.reject(new Error("first run blew up"));
176
+ });
177
+
178
+ await startCron({
179
+ jobName: "TestJob",
180
+ schedule: EVERY_FIVE_MINUTES,
181
+ runOnStartup: false,
182
+ runFunction: run,
183
+ });
184
+
185
+ await scheduledTick()();
186
+ await scheduledTick()();
187
+
188
+ expect(run).toHaveBeenCalledTimes(2);
189
+ });
190
+
191
+ /*
192
+ * The job's name is what makes a line in the log attributable to one of
193
+ * many scheduled jobs. Logged without it, a failure says only that
194
+ * something somewhere failed.
195
+ */
196
+ test("the job's name is in what it logs", async () => {
197
+ const run: RunMock = succeedingRun();
198
+
199
+ await startCron({
200
+ jobName: "DistinctiveJobName",
201
+ schedule: EVERY_FIVE_MINUTES,
202
+ runOnStartup: false,
203
+ runFunction: run,
204
+ });
205
+
206
+ await scheduledTick()();
207
+
208
+ const logged: string = mockedLogger.debug.mock.calls
209
+ .map((callArgs: Array<unknown>): string => {
210
+ return String(callArgs[0]);
211
+ })
212
+ .join("\n");
213
+
214
+ expect(logged).toContain("DistinctiveJobName");
215
+ });
216
+ });
217
+
218
+ describe("the startup run", () => {
219
+ test("runs the job immediately when asked to", async () => {
220
+ const run: RunMock = succeedingRun();
221
+
222
+ await startCron({
223
+ jobName: "TestJob",
224
+ schedule: EVERY_FIVE_MINUTES,
225
+ runOnStartup: true,
226
+ runFunction: run,
227
+ });
228
+
229
+ expect(run).toHaveBeenCalledTimes(1);
230
+ });
231
+
232
+ /*
233
+ * The startup run is in addition to the schedule, not instead of it - a
234
+ * job that ran once at boot and was never registered would go quiet after
235
+ * the first tick.
236
+ */
237
+ test("it still registers the recurring schedule", async () => {
238
+ const run: RunMock = succeedingRun();
239
+
240
+ await startCron({
241
+ jobName: "TestJob",
242
+ schedule: EVERY_FIVE_MINUTES,
243
+ runOnStartup: true,
244
+ runFunction: run,
245
+ });
246
+
247
+ expect(mockedCron.schedule).toHaveBeenCalledTimes(1);
248
+
249
+ await scheduledTick()();
250
+
251
+ expect(run).toHaveBeenCalledTimes(2);
252
+ });
253
+
254
+ /*
255
+ * DELIBERATE ASYMMETRY, pinned so a later reader does not "fix" it by
256
+ * reflex: unlike a scheduled tick, a startup failure is NOT swallowed. It
257
+ * rejects out of BasicCron.
258
+ *
259
+ * That is the right way round. A scheduled run fails against a live
260
+ * system and the next tick is a genuine retry, so surviving it is what
261
+ * keeps the job alive. A startup run fails against a process that is
262
+ * still coming up - usually because configuration or a dependency is
263
+ * wrong - and a boot that swallowed that would come up looking healthy
264
+ * with a job that never worked.
265
+ *
266
+ * Note the callers' side of this: BasicCronFunction is typed as returning
267
+ * void, so a caller that does not await gets an unhandled rejection
268
+ * rather than a thrown error. Loud either way, which is the intent.
269
+ */
270
+ test("a startup failure propagates rather than being swallowed", async () => {
271
+ const run: RunMock = failingRun("bad configuration at boot");
272
+
273
+ await expect(
274
+ startCron({
275
+ jobName: "TestJob",
276
+ schedule: EVERY_FIVE_MINUTES,
277
+ runOnStartup: true,
278
+ runFunction: run,
279
+ }),
280
+ ).rejects.toThrow("bad configuration at boot");
281
+ });
282
+ });
283
+ });