@oneuptime/common 12.0.25 → 12.0.27
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.
- package/Models/AnalyticsModels/Index.ts +2 -0
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
- package/Models/DatabaseModels/AlertSeverity.ts +4 -1
- package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
- package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
- package/Models/DatabaseModels/DetectionRule.ts +9 -3
- package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
- package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
- package/Models/DatabaseModels/HostFeed.ts +625 -0
- package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
- package/Models/DatabaseModels/Index.ts +22 -0
- package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
- package/Models/DatabaseModels/Monitor.ts +87 -0
- package/Models/DatabaseModels/NetworkDevice.ts +96 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
- package/Models/DatabaseModels/NetworkSite.ts +120 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
- package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
- package/Models/DatabaseModels/ServiceFeed.ts +625 -0
- package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
- package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
- package/Server/API/AlertAPI.ts +23 -1
- package/Server/API/BaseAPI.ts +14 -3
- package/Server/API/IncidentAPI.ts +41 -1
- package/Server/API/IncidentEpisodeAPI.ts +23 -1
- package/Server/API/MicrosoftTeamsAPI.ts +31 -2
- package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
- package/Server/API/SlackAPI.ts +48 -0
- package/Server/API/TelemetryAPI.ts +167 -42
- package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
- package/Server/API/UserTotpAuthAPI.ts +67 -1
- package/Server/API/UserWebAuthnAPI.ts +44 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
- package/Server/Middleware/IdentityRateLimit.ts +53 -3
- package/Server/Services/AIService.ts +181 -41
- package/Server/Services/CephClusterFeedService.ts +99 -0
- package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
- package/Server/Services/CephClusterOwnerUserService.ts +123 -0
- package/Server/Services/CephClusterService.ts +223 -2
- package/Server/Services/CloudResourceFeedService.ts +99 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
- package/Server/Services/CloudResourceService.ts +227 -2
- package/Server/Services/DatabaseService.ts +265 -0
- package/Server/Services/DockerHostFeedService.ts +99 -0
- package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
- package/Server/Services/DockerHostOwnerUserService.ts +123 -0
- package/Server/Services/DockerHostService.ts +227 -2
- package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
- package/Server/Services/DockerSwarmClusterService.ts +229 -2
- package/Server/Services/EnterpriseLicenseService.ts +15 -7
- package/Server/Services/ExceptionAggregationService.ts +12 -2
- package/Server/Services/HostFeedService.ts +99 -0
- package/Server/Services/HostLabelRuleEngineService.ts +29 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostOwnerTeamService.ts +129 -0
- package/Server/Services/HostOwnerUserService.ts +123 -0
- package/Server/Services/HostService.ts +215 -2
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterFeedService.ts +99 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
- package/Server/Services/KubernetesClusterService.ts +231 -2
- package/Server/Services/LogAggregationService.ts +23 -280
- package/Server/Services/MetricAggregationService.ts +98 -1
- package/Server/Services/MonitorService.ts +177 -13
- package/Server/Services/MonitorTemplateService.ts +111 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
- package/Server/Services/NetworkDeviceService.ts +750 -4
- package/Server/Services/NetworkInterfaceService.ts +415 -0
- package/Server/Services/NetworkSiteService.ts +485 -52
- package/Server/Services/PodmanHostFeedService.ts +99 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
- package/Server/Services/PodmanHostService.ts +227 -2
- package/Server/Services/ProjectService.ts +16 -10
- package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
- package/Server/Services/ProxmoxClusterService.ts +225 -2
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
- package/Server/Services/ServiceFeedService.ts +99 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
- package/Server/Services/ServiceOwnerTeamService.ts +129 -0
- package/Server/Services/ServiceOwnerUserService.ts +123 -0
- package/Server/Services/ServiceService.ts +227 -3
- package/Server/Services/StatusPageSubscriberService.ts +7 -0
- package/Server/Services/TelemetryAttributeService.ts +13 -3
- package/Server/Services/TelemetrySourceMapService.ts +307 -0
- package/Server/Services/ThreatIntelFeedService.ts +222 -0
- package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
- package/Server/Services/TraceAggregationService.ts +101 -11
- package/Server/Services/UserService.ts +13 -6
- package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
- package/Server/Services/UserWebhookService.ts +11 -2
- package/Server/Static/Brand/README.md +38 -0
- package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
- package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
- package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
- package/Server/Static/Brand/favicons/favicon.ico +0 -0
- package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
- package/Server/Static/Brand/hou-wb.svg +1 -0
- package/Server/Static/Brand/oneuptime-logo.svg +1 -0
- package/Server/Static/Brand/ou-wb.svg +1 -0
- package/Server/Static/Vendor/README.md +4 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
- package/Server/Types/Database/AggregateBy.ts +83 -0
- package/Server/Types/Database/AggregateResultUtil.ts +126 -0
- package/Server/Types/Database/JSONColumnQuery.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +40 -0
- package/Server/Types/Database/QueryUtil.ts +26 -0
- package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
- package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
- package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
- package/Server/Utils/DataSource/HttpFetch.ts +18 -0
- package/Server/Utils/Database/RelationIdUtil.ts +42 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
- package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
- package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
- package/Server/Utils/Monitor/MonitorResource.ts +226 -49
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
- package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
- package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
- package/Server/Utils/OnCallNotificationContext.ts +686 -0
- package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
- package/Server/Utils/Response.ts +11 -1
- package/Server/Utils/SSRFProtection.ts +230 -60
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
- package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
- package/Server/Utils/StartServer.ts +83 -56
- package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
- package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
- package/Server/Utils/VM/VMAPI.ts +3 -0
- package/Server/Utils/VM/VMRunner.ts +27 -1
- package/Server/Utils/VendorAssets.ts +42 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
- package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
- package/Server/Views/Partials/Head.ejs +9 -9
- package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
- package/Server/Views/ViewMessage.ejs +11 -9
- package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
- package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
- package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
- package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
- package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
- package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
- package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
- package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
- package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
- package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
- package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
- package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
- package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
- package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
- package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
- package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
- package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
- package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
- package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
- package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
- package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
- package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
- package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
- package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
- package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
- package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
- package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
- package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
- package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
- package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
- package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
- package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
- package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
- package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
- package/Tests/Types/API/HostnameAuthorityParsing.test.ts +1 -0
- package/Tests/Types/API/URLMailtoQueryString.test.ts +439 -0
- package/Tests/Types/API/URLQueryString.test.ts +481 -0
- package/Tests/Types/API/URLRouteQuerySeparation.test.ts +491 -0
- package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
- package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
- package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
- package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
- package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
- package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
- package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
- package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
- package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
- package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +393 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +248 -0
- package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +205 -0
- package/Tests/UI/Components/UseHistogramZoom.test.tsx +262 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
- package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
- package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
- package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
- package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
- package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
- package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
- package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
- package/Types/API/URL.ts +100 -28
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
- package/Types/BaseDatabase/NotWildcard.ts +86 -0
- package/Types/BaseDatabase/Wildcard.ts +89 -0
- package/Types/BaseDatabase/WildcardPattern.ts +176 -0
- package/Types/Database/DateColumnValue.ts +184 -0
- package/Types/Database/TableColumn.ts +40 -5
- package/Types/Date.ts +37 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/JSON.ts +8 -0
- package/Types/Log/LogQueryToFilter.ts +167 -129
- package/Types/Monitor/DockerAlertTemplates.ts +43 -12
- package/Types/Monitor/HostAlertTemplates.ts +31 -3
- package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
- package/Types/Monitor/MonitorStep.ts +49 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
- package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
- package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
- package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
- package/Types/Permission.ts +411 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
- package/Types/SerializableObjectDictionary.ts +8 -0
- package/Types/Telemetry/SourceMap.ts +56 -0
- package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
- package/UI/Components/Charts/Utils/useHistogramZoom.ts +101 -0
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
- package/UI/Components/Icon/Icon.tsx +28 -1
- package/UI/Components/LogsViewer/LogsViewer.tsx +19 -3
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
- package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +52 -1
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +18 -2
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +52 -1
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
- package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
- package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
- package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
- package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
- package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
- package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
- package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
- package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
- package/Utils/Telemetry/CrossSignalScope.ts +37 -39
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +18 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +8 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +35 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +45 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +100 -35
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +177 -30
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
- package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +175 -1
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
- package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +177 -1
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +201 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
- package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +177 -1
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostFeedService.js +89 -0
- package/build/dist/Server/Services/HostFeedService.js.map +1 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +175 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
- package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +19 -196
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +59 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +115 -13
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
- package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +408 -47
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
- package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +177 -1
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +40 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceFeedService.js +89 -0
- package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +173 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +62 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +22 -13
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +11 -2
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
- package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +12 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +160 -58
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +70 -44
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +29 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/URL.js +88 -27
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
- package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
- package/build/dist/Types/Database/DateColumnValue.js +125 -0
- package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +18 -2
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Date.js +31 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/JSON.js +2 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +40 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +354 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +8 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/SourceMap.js +9 -0
- package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +47 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +28 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +15 -3
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +33 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +33 -5
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/package.json +2 -1
- package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
- package/Types/Log/LogQueryParser.ts +0 -252
- package/build/dist/Types/Log/LogQueryParser.js +0 -200
- package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
|
@@ -0,0 +1,819 @@
|
|
|
1
|
+
import { generateKeyPairSync } from "crypto";
|
|
2
|
+
import DetectionRule from "../../../../Models/DatabaseModels/DetectionRule";
|
|
3
|
+
import GoogleSecOpsConnection from "../../../../Models/DatabaseModels/GoogleSecOpsConnection";
|
|
4
|
+
import logger from "../../../../Server/Utils/Logger";
|
|
5
|
+
import ConnectorErrorMessage, {
|
|
6
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
7
|
+
} from "../../../../Server/Utils/SecurityEvent/ConnectorErrorMessage";
|
|
8
|
+
import GoogleSecOpsClient, {
|
|
9
|
+
FetchLike,
|
|
10
|
+
FetchResponseLike,
|
|
11
|
+
} from "../../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient";
|
|
12
|
+
import { getMaxLengthFromTableColumnType } from "../../../../Types/Database/ColumnLength";
|
|
13
|
+
import { TableColumnMetadata } from "../../../../Types/Database/TableColumn";
|
|
14
|
+
import TableColumnType from "../../../../Types/Database/TableColumnType";
|
|
15
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
16
|
+
import { getJestSpyOn } from "../../../Spy";
|
|
17
|
+
import {
|
|
18
|
+
afterEach,
|
|
19
|
+
beforeEach,
|
|
20
|
+
describe,
|
|
21
|
+
expect,
|
|
22
|
+
jest,
|
|
23
|
+
test,
|
|
24
|
+
} from "@jest/globals";
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* ConnectorErrorMessage is the guard rail that keeps a security-event
|
|
28
|
+
* background loop from being killed by its own error bookkeeping.
|
|
29
|
+
*
|
|
30
|
+
* The outage it exists for: GoogleSecOpsPoller.pollAllDueConnections
|
|
31
|
+
* caught a per-connection poll failure and then wrote { lastPolledAt,
|
|
32
|
+
* lastError } back onto the row with a bare, unguarded updateOneById.
|
|
33
|
+
* lastError was TableColumnType.LongText — varchar(500) — while a Google
|
|
34
|
+
* SecOps client error is a fixed prefix plus up to 500 characters of
|
|
35
|
+
* echoed response body, so it overflowed. DatabaseService's
|
|
36
|
+
* checkMaxLengthOfFields turns an overflow into a BadDataException, the
|
|
37
|
+
* throw escaped the catch block and the whole loop with it, nothing was
|
|
38
|
+
* stamped, and every remaining connection in that tick was skipped. What
|
|
39
|
+
* the customer saw was a connector that never polled whose row still read
|
|
40
|
+
* lastPolledAt = null AND lastError = null — the two columns meant to
|
|
41
|
+
* explain the outage were exactly the ones the outage prevented from
|
|
42
|
+
* being written. DetectionRuleEvaluator.evaluateAllDueRules had the same
|
|
43
|
+
* unguarded write against DetectionRule.lastError, and ClickHouse errors
|
|
44
|
+
* echo the whole compiled query, so it was likelier still to trip.
|
|
45
|
+
*
|
|
46
|
+
* So this file pins both halves of the fix, plus the column widening that
|
|
47
|
+
* makes the clamp sufficient:
|
|
48
|
+
*
|
|
49
|
+
* - toMessage: every thrown shape becomes a non-empty string that is
|
|
50
|
+
* never longer than MAX_CONNECTOR_ERROR_MESSAGE_LENGTH, with the
|
|
51
|
+
* truncation marker counted inside the limit rather than added on
|
|
52
|
+
* top of it.
|
|
53
|
+
* - recordFailure: the bookkeeping write runs inside its own
|
|
54
|
+
* try/catch and NEVER rethrows — sync throw, async rejection and
|
|
55
|
+
* non-Error rejection alike — so the loop always advances.
|
|
56
|
+
* - the lastError columns on both models are unbounded text, so a
|
|
57
|
+
* clamped message can no longer be rejected on its way in.
|
|
58
|
+
*
|
|
59
|
+
* The regression cases are built by driving the real GoogleSecOpsClient
|
|
60
|
+
* against an injected fetch rather than by copying a magic number, so a
|
|
61
|
+
* change to its error templates shows up here.
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
/*
|
|
65
|
+
* Mirrors of the two private constants in ConnectorErrorMessage.ts. They
|
|
66
|
+
* are deliberately duplicated: the exact stored text is the contract with
|
|
67
|
+
* whoever reads the column, so a silent edit to either should fail here.
|
|
68
|
+
*/
|
|
69
|
+
const TRUNCATION_MARKER: string = "... (truncated)";
|
|
70
|
+
const UNKNOWN_ERROR_MESSAGE: string = "Unknown error.";
|
|
71
|
+
|
|
72
|
+
// The width lastError used to be declared at, i.e. varchar(500).
|
|
73
|
+
const OLD_LAST_ERROR_COLUMN_MAX_LENGTH: number = 500;
|
|
74
|
+
|
|
75
|
+
type Spy = ReturnType<typeof getJestSpyOn>;
|
|
76
|
+
|
|
77
|
+
function repeatToLength(seed: string, length: number): string {
|
|
78
|
+
return seed.repeat(Math.ceil(length / seed.length)).slice(0, length);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
describe("ConnectorErrorMessage.toMessage", () => {
|
|
82
|
+
describe("extracting a message from whatever was thrown", () => {
|
|
83
|
+
test("an Error contributes its .message, unchanged", () => {
|
|
84
|
+
expect(
|
|
85
|
+
ConnectorErrorMessage.toMessage(new Error("token exchange failed")),
|
|
86
|
+
).toBe("token exchange failed");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("an Error subclass contributes its .message too", () => {
|
|
90
|
+
expect(
|
|
91
|
+
ConnectorErrorMessage.toMessage(
|
|
92
|
+
new BadDataException(
|
|
93
|
+
"Region must be a Google SecOps regional prefix.",
|
|
94
|
+
),
|
|
95
|
+
),
|
|
96
|
+
).toBe("Region must be a Google SecOps regional prefix.");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("a thrown string is used as-is", () => {
|
|
100
|
+
expect(ConnectorErrorMessage.toMessage("ECONNRESET")).toBe("ECONNRESET");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("a thrown number is stringified", () => {
|
|
104
|
+
expect(ConnectorErrorMessage.toMessage(503)).toBe("503");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("zero and false are stringified, not mistaken for absent values", () => {
|
|
108
|
+
/*
|
|
109
|
+
* The absent-value branch tests `error !== null && error !== undefined`
|
|
110
|
+
* rather than truthiness, so falsy-but-present values keep their text.
|
|
111
|
+
*/
|
|
112
|
+
expect(ConnectorErrorMessage.toMessage(0)).toBe("0");
|
|
113
|
+
expect(ConnectorErrorMessage.toMessage(false)).toBe("false");
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("a plain object is stringified", () => {
|
|
117
|
+
expect(ConnectorErrorMessage.toMessage({ status: 403 })).toBe(
|
|
118
|
+
"[object Object]",
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("an object with a custom toString contributes that text", () => {
|
|
123
|
+
const thrown: { toString: () => string } = {
|
|
124
|
+
toString: (): string => {
|
|
125
|
+
return "ClickHouse: TABLE_DOESNT_EXIST";
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
expect(ConnectorErrorMessage.toMessage(thrown)).toBe(
|
|
130
|
+
"ClickHouse: TABLE_DOESNT_EXIST",
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("an array is stringified", () => {
|
|
135
|
+
expect(ConnectorErrorMessage.toMessage(["a", "b"])).toBe("a,b");
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe("values that carry nothing usable", () => {
|
|
140
|
+
test("null becomes the unknown-error fallback", () => {
|
|
141
|
+
expect(ConnectorErrorMessage.toMessage(null)).toBe(UNKNOWN_ERROR_MESSAGE);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test("undefined becomes the unknown-error fallback", () => {
|
|
145
|
+
expect(ConnectorErrorMessage.toMessage(undefined)).toBe(
|
|
146
|
+
UNKNOWN_ERROR_MESSAGE,
|
|
147
|
+
);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
test("an Error with an empty message becomes the fallback", () => {
|
|
151
|
+
expect(ConnectorErrorMessage.toMessage(new Error(""))).toBe(
|
|
152
|
+
UNKNOWN_ERROR_MESSAGE,
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("an Error with a whitespace-only message becomes the fallback", () => {
|
|
157
|
+
expect(ConnectorErrorMessage.toMessage(new Error(" \n\t "))).toBe(
|
|
158
|
+
UNKNOWN_ERROR_MESSAGE,
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("an empty or whitespace-only thrown string becomes the fallback", () => {
|
|
163
|
+
expect(ConnectorErrorMessage.toMessage("")).toBe(UNKNOWN_ERROR_MESSAGE);
|
|
164
|
+
expect(ConnectorErrorMessage.toMessage(" ")).toBe(
|
|
165
|
+
UNKNOWN_ERROR_MESSAGE,
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test('no input shape ever yields "" or the literal "undefined"', () => {
|
|
170
|
+
/*
|
|
171
|
+
* Both read like a bug in the recorder rather than a failure worth
|
|
172
|
+
* chasing, which is the whole point of having a fallback string.
|
|
173
|
+
*/
|
|
174
|
+
const emptyish: Array<unknown> = [
|
|
175
|
+
null,
|
|
176
|
+
undefined,
|
|
177
|
+
"",
|
|
178
|
+
" ",
|
|
179
|
+
new Error(""),
|
|
180
|
+
new Error(" "),
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
for (const value of emptyish) {
|
|
184
|
+
const message: string = ConnectorErrorMessage.toMessage(value);
|
|
185
|
+
expect(message).toBe(UNKNOWN_ERROR_MESSAGE);
|
|
186
|
+
expect(message).not.toBe("");
|
|
187
|
+
expect(message).not.toBe("undefined");
|
|
188
|
+
expect(message.trim().length).toBeGreaterThan(0);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe("trimming", () => {
|
|
194
|
+
test("leading and trailing whitespace is stripped from a thrown string", () => {
|
|
195
|
+
expect(ConnectorErrorMessage.toMessage(" \n poll failed \t ")).toBe(
|
|
196
|
+
"poll failed",
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test("leading and trailing whitespace is stripped from an Error message", () => {
|
|
201
|
+
expect(
|
|
202
|
+
ConnectorErrorMessage.toMessage(new Error("\n poll failed \n")),
|
|
203
|
+
).toBe("poll failed");
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("interior whitespace is left alone", () => {
|
|
207
|
+
expect(ConnectorErrorMessage.toMessage("line one\n line two")).toBe(
|
|
208
|
+
"line one\n line two",
|
|
209
|
+
);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe("the length clamp", () => {
|
|
214
|
+
test("a message of exactly the limit is returned untouched", () => {
|
|
215
|
+
const exact: string = repeatToLength(
|
|
216
|
+
"abcdefghij",
|
|
217
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
const message: string = ConnectorErrorMessage.toMessage(new Error(exact));
|
|
221
|
+
|
|
222
|
+
// Boundary: the source compares with <=, so this must not be clamped.
|
|
223
|
+
expect(message).toBe(exact);
|
|
224
|
+
expect(message.length).toBe(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
225
|
+
expect(message.endsWith(TRUNCATION_MARKER)).toBe(false);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("one character over the limit is clamped, and the marker is counted inside the limit", () => {
|
|
229
|
+
const overLimit: string = repeatToLength(
|
|
230
|
+
"abcdefghij",
|
|
231
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH + 1,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
const message: string = ConnectorErrorMessage.toMessage(
|
|
235
|
+
new Error(overLimit),
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
expect(message.length).toBeLessThanOrEqual(
|
|
239
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* Appending the marker on top of a full-length prefix would push the
|
|
244
|
+
* result past the limit, which is precisely the class of bug this
|
|
245
|
+
* helper exists to prevent — so the result lands exactly on it.
|
|
246
|
+
*/
|
|
247
|
+
expect(message.length).toBe(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
248
|
+
expect(message.endsWith(TRUNCATION_MARKER)).toBe(true);
|
|
249
|
+
|
|
250
|
+
const keptPrefix: string = message.slice(
|
|
251
|
+
0,
|
|
252
|
+
message.length - TRUNCATION_MARKER.length,
|
|
253
|
+
);
|
|
254
|
+
expect(keptPrefix.length).toBe(
|
|
255
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH - TRUNCATION_MARKER.length,
|
|
256
|
+
);
|
|
257
|
+
// The surviving text is a real prefix of the input, not a re-render.
|
|
258
|
+
expect(overLimit.startsWith(keptPrefix)).toBe(true);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test("a very long message is clamped to the same bound", () => {
|
|
262
|
+
const huge: string = repeatToLength("clickhouse query fragment ", 50000);
|
|
263
|
+
|
|
264
|
+
const message: string = ConnectorErrorMessage.toMessage(new Error(huge));
|
|
265
|
+
|
|
266
|
+
expect(huge.length).toBe(50000);
|
|
267
|
+
expect(message.length).toBe(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
268
|
+
expect(message.endsWith(TRUNCATION_MARKER)).toBe(true);
|
|
269
|
+
expect(
|
|
270
|
+
huge.startsWith(
|
|
271
|
+
message.slice(0, message.length - TRUNCATION_MARKER.length),
|
|
272
|
+
),
|
|
273
|
+
).toBe(true);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test("no input can produce a string longer than the limit", () => {
|
|
277
|
+
const cases: Array<unknown> = [
|
|
278
|
+
new Error(repeatToLength("x", 10)),
|
|
279
|
+
new Error(repeatToLength("x", MAX_CONNECTOR_ERROR_MESSAGE_LENGTH)),
|
|
280
|
+
new Error(repeatToLength("x", MAX_CONNECTOR_ERROR_MESSAGE_LENGTH + 1)),
|
|
281
|
+
repeatToLength("y", 12345),
|
|
282
|
+
{
|
|
283
|
+
toString: (): string => {
|
|
284
|
+
return repeatToLength("z", 9000);
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
null,
|
|
288
|
+
undefined,
|
|
289
|
+
];
|
|
290
|
+
|
|
291
|
+
for (const value of cases) {
|
|
292
|
+
expect(
|
|
293
|
+
ConnectorErrorMessage.toMessage(value).length,
|
|
294
|
+
).toBeLessThanOrEqual(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
test("trimming happens before the length check, so padding alone never truncates", () => {
|
|
299
|
+
/*
|
|
300
|
+
* A full-width message wrapped in whitespace is exactly the limit
|
|
301
|
+
* once trimmed. Measuring before the trim would clamp it and lose
|
|
302
|
+
* the tail of a message that fits.
|
|
303
|
+
*/
|
|
304
|
+
const exact: string = repeatToLength(
|
|
305
|
+
"abcdefghij",
|
|
306
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
const message: string = ConnectorErrorMessage.toMessage(
|
|
310
|
+
new Error(` ${exact} `),
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
expect(message).toBe(exact);
|
|
314
|
+
expect(message.endsWith(TRUNCATION_MARKER)).toBe(false);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
/*
|
|
320
|
+
* The two client error templates that used to overflow varchar(500).
|
|
321
|
+
* These are produced by driving the real GoogleSecOpsClient against an
|
|
322
|
+
* injected fetch, so the assertions track the client rather than a copy
|
|
323
|
+
* of its format strings.
|
|
324
|
+
*/
|
|
325
|
+
describe("ConnectorErrorMessage.toMessage on the real Google SecOps client errors", () => {
|
|
326
|
+
const { privateKey } = generateKeyPairSync("rsa", {
|
|
327
|
+
modulusLength: 2048,
|
|
328
|
+
privateKeyEncoding: { type: "pkcs8", format: "pem" },
|
|
329
|
+
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
const SERVICE_ACCOUNT_JSON: string = JSON.stringify({
|
|
333
|
+
client_email: "poller@example.iam.gserviceaccount.com",
|
|
334
|
+
private_key: privateKey,
|
|
335
|
+
token_uri: "https://oauth2.example.com/token",
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
const INSTANCE: string =
|
|
339
|
+
"projects/my-project/locations/us/instances/3f0a-instance";
|
|
340
|
+
|
|
341
|
+
/*
|
|
342
|
+
* A Google error body is JSON and routinely far longer than the 500
|
|
343
|
+
* characters the client keeps of it.
|
|
344
|
+
*/
|
|
345
|
+
const HUGE_ERROR_BODY: string = JSON.stringify({
|
|
346
|
+
error: {
|
|
347
|
+
code: 403,
|
|
348
|
+
status: "PERMISSION_DENIED",
|
|
349
|
+
message: repeatToLength(
|
|
350
|
+
"caller does not have permission chronicle.legacies.legacyFetchAlertsView; ",
|
|
351
|
+
4000,
|
|
352
|
+
),
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
function makeClient(
|
|
357
|
+
responses: Array<{ status: number; body: string }>,
|
|
358
|
+
): GoogleSecOpsClient {
|
|
359
|
+
let callIndex: number = 0;
|
|
360
|
+
|
|
361
|
+
const fetchImplementation: FetchLike = (): Promise<FetchResponseLike> => {
|
|
362
|
+
const response: { status: number; body: string } =
|
|
363
|
+
responses[Math.min(callIndex, responses.length - 1)]!;
|
|
364
|
+
callIndex++;
|
|
365
|
+
|
|
366
|
+
return Promise.resolve({
|
|
367
|
+
ok: response.status >= 200 && response.status < 300,
|
|
368
|
+
status: response.status,
|
|
369
|
+
text: (): Promise<string> => {
|
|
370
|
+
return Promise.resolve(response.body);
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
return new GoogleSecOpsClient({
|
|
376
|
+
region: "us",
|
|
377
|
+
instanceResourceName: INSTANCE,
|
|
378
|
+
serviceAccountJson: SERVICE_ACCOUNT_JSON,
|
|
379
|
+
fetchImplementation,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
async function captureFetchAlertsError(
|
|
384
|
+
responses: Array<{ status: number; body: string }>,
|
|
385
|
+
): Promise<Error> {
|
|
386
|
+
try {
|
|
387
|
+
await makeClient(responses).fetchDetectionAlerts({
|
|
388
|
+
startTime: new Date("2026-08-21T09:00:00.000Z"),
|
|
389
|
+
endTime: new Date("2026-08-21T10:00:00.000Z"),
|
|
390
|
+
});
|
|
391
|
+
} catch (error) {
|
|
392
|
+
return error as Error;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
throw new Error("expected the client to throw");
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
test("a failed alerts fetch overflows the old column, and toMessage keeps it storable", async () => {
|
|
399
|
+
const error: Error = await captureFetchAlertsError([
|
|
400
|
+
{
|
|
401
|
+
status: 200,
|
|
402
|
+
body: JSON.stringify({ access_token: "test-token", expires_in: 3600 }),
|
|
403
|
+
},
|
|
404
|
+
{ status: 403, body: HUGE_ERROR_BODY },
|
|
405
|
+
]);
|
|
406
|
+
|
|
407
|
+
const prefix: string = "Google SecOps alerts fetch failed (HTTP 403): ";
|
|
408
|
+
const rawMessage: string = error.message;
|
|
409
|
+
|
|
410
|
+
expect(rawMessage.startsWith(prefix)).toBe(true);
|
|
411
|
+
|
|
412
|
+
/*
|
|
413
|
+
* The template is a 46-character prefix plus responseText.slice(0, 500).
|
|
414
|
+
* 546 > 500, so under the old TableColumnType.LongText declaration
|
|
415
|
+
* checkMaxLengthOfFields threw BadDataException on the poller's own
|
|
416
|
+
* recovery write — which is how lastPolledAt and lastError both stayed
|
|
417
|
+
* null while the connector silently stopped polling.
|
|
418
|
+
*/
|
|
419
|
+
expect(prefix.length).toBe(46);
|
|
420
|
+
expect(rawMessage.length).toBe(prefix.length + 500);
|
|
421
|
+
expect(rawMessage.length).toBeGreaterThan(OLD_LAST_ERROR_COLUMN_MAX_LENGTH);
|
|
422
|
+
expect(rawMessage.length).toBeGreaterThan(
|
|
423
|
+
getMaxLengthFromTableColumnType(TableColumnType.LongText)!,
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
const stored: string = ConnectorErrorMessage.toMessage(error);
|
|
427
|
+
|
|
428
|
+
expect(stored.length).toBeLessThanOrEqual(
|
|
429
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
430
|
+
);
|
|
431
|
+
// 546 fits inside 1000, so the whole diagnostic survives the clamp.
|
|
432
|
+
expect(stored).toBe(rawMessage);
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
test("a failed token exchange overflows the old column too, and toMessage keeps it storable", async () => {
|
|
436
|
+
const error: Error = await captureFetchAlertsError([
|
|
437
|
+
{ status: 401, body: HUGE_ERROR_BODY },
|
|
438
|
+
]);
|
|
439
|
+
|
|
440
|
+
const prefix: string = "Google token exchange failed (HTTP 401): ";
|
|
441
|
+
const rawMessage: string = error.message;
|
|
442
|
+
|
|
443
|
+
expect(rawMessage.startsWith(prefix)).toBe(true);
|
|
444
|
+
|
|
445
|
+
// Same shape as above: prefix + 500 characters of echoed body > 500.
|
|
446
|
+
expect(rawMessage.length).toBe(prefix.length + 500);
|
|
447
|
+
expect(rawMessage.length).toBeGreaterThan(OLD_LAST_ERROR_COLUMN_MAX_LENGTH);
|
|
448
|
+
|
|
449
|
+
const stored: string = ConnectorErrorMessage.toMessage(error);
|
|
450
|
+
|
|
451
|
+
expect(stored.length).toBeLessThanOrEqual(
|
|
452
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
453
|
+
);
|
|
454
|
+
expect(stored).toBe(rawMessage);
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
test("a ClickHouse-style error that echoes a whole compiled query is clamped", () => {
|
|
458
|
+
/*
|
|
459
|
+
* The evaluator side of the same bug: a ClickHouse failure echoes the
|
|
460
|
+
* compiled query back, so its messages run to thousands of characters
|
|
461
|
+
* rather than the client's bounded 546.
|
|
462
|
+
*/
|
|
463
|
+
const echoedQuery: string = repeatToLength(
|
|
464
|
+
"SELECT count() FROM security_event WHERE projectId = {p0:String} AND ",
|
|
465
|
+
8000,
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
const error: Error = new Error(
|
|
469
|
+
`Code: 47. DB::Exception: Missing columns while processing query: ${echoedQuery}`,
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
expect(error.message.length).toBeGreaterThan(
|
|
473
|
+
OLD_LAST_ERROR_COLUMN_MAX_LENGTH,
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
const stored: string = ConnectorErrorMessage.toMessage(error);
|
|
477
|
+
|
|
478
|
+
expect(stored.length).toBe(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
479
|
+
expect(stored.endsWith(TRUNCATION_MARKER)).toBe(true);
|
|
480
|
+
// The head of the message — the part that names the failure — is kept.
|
|
481
|
+
expect(stored.startsWith("Code: 47. DB::Exception:")).toBe(true);
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
describe("ConnectorErrorMessage.recordFailure", () => {
|
|
486
|
+
const LABEL: string =
|
|
487
|
+
"GoogleSecOpsPoller: connection 22222222-2222-4222-8222-222222222222";
|
|
488
|
+
|
|
489
|
+
let errorSpy: Spy;
|
|
490
|
+
|
|
491
|
+
beforeEach(() => {
|
|
492
|
+
// Silence the deliberate error logging; assertions read the spy instead.
|
|
493
|
+
errorSpy = getJestSpyOn(logger, "error").mockImplementation((() => {
|
|
494
|
+
return undefined;
|
|
495
|
+
}) as never);
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
afterEach(() => {
|
|
499
|
+
jest.restoreAllMocks();
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
function loggedLines(): Array<string> {
|
|
503
|
+
return errorSpy.mock.calls.map((call: Array<unknown>): string => {
|
|
504
|
+
const body: unknown = call[0];
|
|
505
|
+
|
|
506
|
+
if (body instanceof Error) {
|
|
507
|
+
return body.message;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
return String(body);
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
describe("the happy path", () => {
|
|
515
|
+
test("awaits write() exactly once and does not throw", async () => {
|
|
516
|
+
let calls: number = 0;
|
|
517
|
+
|
|
518
|
+
await ConnectorErrorMessage.recordFailure({
|
|
519
|
+
label: LABEL,
|
|
520
|
+
write: async (): Promise<void> => {
|
|
521
|
+
calls++;
|
|
522
|
+
return Promise.resolve();
|
|
523
|
+
},
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
expect(calls).toBe(1);
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
test("really awaits the write — it does not resolve before write() finishes", async () => {
|
|
530
|
+
/*
|
|
531
|
+
* The callers stamp lastPolledAt / lastEvaluatedAt through this
|
|
532
|
+
* write; returning before it settles would let the next loop
|
|
533
|
+
* iteration race the bookkeeping.
|
|
534
|
+
*/
|
|
535
|
+
let finished: boolean = false;
|
|
536
|
+
|
|
537
|
+
await ConnectorErrorMessage.recordFailure({
|
|
538
|
+
label: LABEL,
|
|
539
|
+
write: async (): Promise<void> => {
|
|
540
|
+
await Promise.resolve();
|
|
541
|
+
await Promise.resolve();
|
|
542
|
+
finished = true;
|
|
543
|
+
},
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
expect(finished).toBe(true);
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
test("logs nothing when the write succeeds", async () => {
|
|
550
|
+
await ConnectorErrorMessage.recordFailure({
|
|
551
|
+
label: LABEL,
|
|
552
|
+
write: async (): Promise<void> => {
|
|
553
|
+
return Promise.resolve();
|
|
554
|
+
},
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
expect(errorSpy).not.toHaveBeenCalled();
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
test("resolves with undefined", async () => {
|
|
561
|
+
await expect(
|
|
562
|
+
ConnectorErrorMessage.recordFailure({
|
|
563
|
+
label: LABEL,
|
|
564
|
+
write: async (): Promise<void> => {
|
|
565
|
+
return Promise.resolve();
|
|
566
|
+
},
|
|
567
|
+
}),
|
|
568
|
+
).resolves.toBeUndefined();
|
|
569
|
+
});
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
describe("a failing write is swallowed", () => {
|
|
573
|
+
test("an async rejection never escapes", async () => {
|
|
574
|
+
/*
|
|
575
|
+
* The regression: this rejection used to be an unguarded
|
|
576
|
+
* updateOneById inside the loop's catch block, so it escaped
|
|
577
|
+
* pollAllDueConnections and skipped every remaining connection.
|
|
578
|
+
*/
|
|
579
|
+
await expect(
|
|
580
|
+
ConnectorErrorMessage.recordFailure({
|
|
581
|
+
label: LABEL,
|
|
582
|
+
write: async (): Promise<void> => {
|
|
583
|
+
throw new Error("connection terminated unexpectedly");
|
|
584
|
+
},
|
|
585
|
+
}),
|
|
586
|
+
).resolves.not.toThrow();
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
test("a BadDataException from the length check never escapes", async () => {
|
|
590
|
+
/*
|
|
591
|
+
* The exact exception checkMaxLengthOfFields raises when a value is
|
|
592
|
+
* longer than its column's declared max — the thing that actually
|
|
593
|
+
* took the poller down.
|
|
594
|
+
*/
|
|
595
|
+
let threw: boolean = false;
|
|
596
|
+
|
|
597
|
+
try {
|
|
598
|
+
await ConnectorErrorMessage.recordFailure({
|
|
599
|
+
label: LABEL,
|
|
600
|
+
write: async (): Promise<void> => {
|
|
601
|
+
throw new BadDataException(
|
|
602
|
+
"lastError cannot be more than 500 characters.",
|
|
603
|
+
);
|
|
604
|
+
},
|
|
605
|
+
});
|
|
606
|
+
} catch {
|
|
607
|
+
threw = true;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
expect(threw).toBe(false);
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
test("a synchronous throw — before the callback's first await — is swallowed too", async () => {
|
|
614
|
+
/*
|
|
615
|
+
* A callback that throws while building its arguments never returns
|
|
616
|
+
* a promise at all, so only a try/catch around the call itself (not
|
|
617
|
+
* a .catch() on the result) covers it.
|
|
618
|
+
*/
|
|
619
|
+
let threw: boolean = false;
|
|
620
|
+
|
|
621
|
+
try {
|
|
622
|
+
await ConnectorErrorMessage.recordFailure({
|
|
623
|
+
label: LABEL,
|
|
624
|
+
write: ((): Promise<void> => {
|
|
625
|
+
throw new Error("thrown before any await");
|
|
626
|
+
}) as () => Promise<void>,
|
|
627
|
+
});
|
|
628
|
+
} catch {
|
|
629
|
+
threw = true;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
expect(threw).toBe(false);
|
|
633
|
+
expect(errorSpy).toHaveBeenCalled();
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
test("a non-Error rejection value is swallowed", async () => {
|
|
637
|
+
await expect(
|
|
638
|
+
ConnectorErrorMessage.recordFailure({
|
|
639
|
+
label: LABEL,
|
|
640
|
+
write: async (): Promise<void> => {
|
|
641
|
+
return Promise.reject("pool exhausted");
|
|
642
|
+
},
|
|
643
|
+
}),
|
|
644
|
+
).resolves.not.toThrow();
|
|
645
|
+
|
|
646
|
+
expect(errorSpy).toHaveBeenCalled();
|
|
647
|
+
expect(loggedLines().join("\n")).toContain("pool exhausted");
|
|
648
|
+
});
|
|
649
|
+
|
|
650
|
+
test("a rejection with null is swallowed", async () => {
|
|
651
|
+
await expect(
|
|
652
|
+
ConnectorErrorMessage.recordFailure({
|
|
653
|
+
label: LABEL,
|
|
654
|
+
write: async (): Promise<void> => {
|
|
655
|
+
return Promise.reject(null);
|
|
656
|
+
},
|
|
657
|
+
}),
|
|
658
|
+
).resolves.not.toThrow();
|
|
659
|
+
});
|
|
660
|
+
});
|
|
661
|
+
|
|
662
|
+
describe("the failure is reported instead of being lost", () => {
|
|
663
|
+
test("logs the failure, naming the item the caller labelled", async () => {
|
|
664
|
+
await ConnectorErrorMessage.recordFailure({
|
|
665
|
+
label: LABEL,
|
|
666
|
+
write: async (): Promise<void> => {
|
|
667
|
+
throw new Error("connection terminated unexpectedly");
|
|
668
|
+
},
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
expect(errorSpy).toHaveBeenCalled();
|
|
672
|
+
|
|
673
|
+
const lines: Array<string> = loggedLines();
|
|
674
|
+
|
|
675
|
+
// The label is what ties the log line back to a specific connection.
|
|
676
|
+
expect(
|
|
677
|
+
lines.some((line: string): boolean => {
|
|
678
|
+
return line.includes(LABEL);
|
|
679
|
+
}),
|
|
680
|
+
).toBe(true);
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
test("logs the underlying error as well as the label", async () => {
|
|
684
|
+
await ConnectorErrorMessage.recordFailure({
|
|
685
|
+
label: LABEL,
|
|
686
|
+
write: async (): Promise<void> => {
|
|
687
|
+
throw new Error("connection terminated unexpectedly");
|
|
688
|
+
},
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
expect(loggedLines().join("\n")).toContain(
|
|
692
|
+
"connection terminated unexpectedly",
|
|
693
|
+
);
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
test("a label from the evaluator side is reported the same way", async () => {
|
|
697
|
+
const ruleLabel: string =
|
|
698
|
+
"DetectionRuleEvaluator: rule 11111111-1111-4111-8111-111111111111";
|
|
699
|
+
|
|
700
|
+
await ConnectorErrorMessage.recordFailure({
|
|
701
|
+
label: ruleLabel,
|
|
702
|
+
write: async (): Promise<void> => {
|
|
703
|
+
throw new Error("clickhouse unavailable");
|
|
704
|
+
},
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
expect(loggedLines().join("\n")).toContain(ruleLabel);
|
|
708
|
+
});
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
describe("the loop keeps going", () => {
|
|
712
|
+
test("a failing write for one item does not stop the items after it", async () => {
|
|
713
|
+
/*
|
|
714
|
+
* The shape of the outage in miniature: item two's bookkeeping write
|
|
715
|
+
* throws. Before the fix that throw escaped the whole loop and item
|
|
716
|
+
* three was never attempted.
|
|
717
|
+
*/
|
|
718
|
+
const attempted: Array<string> = [];
|
|
719
|
+
|
|
720
|
+
for (const id of ["one", "two", "three"]) {
|
|
721
|
+
await ConnectorErrorMessage.recordFailure({
|
|
722
|
+
label: `GoogleSecOpsPoller: connection ${id}`,
|
|
723
|
+
write: async (): Promise<void> => {
|
|
724
|
+
attempted.push(id);
|
|
725
|
+
|
|
726
|
+
if (id === "two") {
|
|
727
|
+
throw new Error("value too long for type character varying(500)");
|
|
728
|
+
}
|
|
729
|
+
},
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
expect(attempted).toEqual(["one", "two", "three"]);
|
|
734
|
+
});
|
|
735
|
+
});
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
describe("the lastError columns the clamp writes into", () => {
|
|
739
|
+
test("GoogleSecOpsConnection.lastError is unbounded text", () => {
|
|
740
|
+
const metadata: TableColumnMetadata =
|
|
741
|
+
new GoogleSecOpsConnection().getTableColumnMetadata("lastError");
|
|
742
|
+
|
|
743
|
+
expect(metadata.type).toBe(TableColumnType.VeryLongText);
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
test("GoogleSecOpsConnection.lastError has no max length, so a clamped message cannot be rejected", () => {
|
|
747
|
+
const metadata: TableColumnMetadata =
|
|
748
|
+
new GoogleSecOpsConnection().getTableColumnMetadata("lastError");
|
|
749
|
+
|
|
750
|
+
/*
|
|
751
|
+
* checkMaxLengthOfFields only length-checks a column when
|
|
752
|
+
* getMaxLengthFromTableColumnType returns a value, so undefined here
|
|
753
|
+
* means the write can no longer throw on length at all.
|
|
754
|
+
*/
|
|
755
|
+
expect(getMaxLengthFromTableColumnType(metadata.type)).toBeUndefined();
|
|
756
|
+
});
|
|
757
|
+
|
|
758
|
+
test("DetectionRule.lastError is unbounded text", () => {
|
|
759
|
+
const metadata: TableColumnMetadata =
|
|
760
|
+
new DetectionRule().getTableColumnMetadata("lastError");
|
|
761
|
+
|
|
762
|
+
expect(metadata.type).toBe(TableColumnType.VeryLongText);
|
|
763
|
+
});
|
|
764
|
+
|
|
765
|
+
test("DetectionRule.lastError has no max length either", () => {
|
|
766
|
+
const metadata: TableColumnMetadata =
|
|
767
|
+
new DetectionRule().getTableColumnMetadata("lastError");
|
|
768
|
+
|
|
769
|
+
expect(getMaxLengthFromTableColumnType(metadata.type)).toBeUndefined();
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
test("the old declaration really was the 500-character bound", () => {
|
|
773
|
+
// Guards the premise of the fix rather than the fix itself.
|
|
774
|
+
expect(getMaxLengthFromTableColumnType(TableColumnType.LongText)).toBe(
|
|
775
|
+
OLD_LAST_ERROR_COLUMN_MAX_LENGTH,
|
|
776
|
+
);
|
|
777
|
+
});
|
|
778
|
+
|
|
779
|
+
test("the clamp alone would not have been enough on the old column", () => {
|
|
780
|
+
/*
|
|
781
|
+
* Why the widening AND the clamp both had to land: a message clamped
|
|
782
|
+
* to 1000 characters still overflows varchar(500). The clamp bounds
|
|
783
|
+
* what is stored; the text column is what accepts it.
|
|
784
|
+
*/
|
|
785
|
+
expect(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH).toBeGreaterThan(
|
|
786
|
+
OLD_LAST_ERROR_COLUMN_MAX_LENGTH,
|
|
787
|
+
);
|
|
788
|
+
});
|
|
789
|
+
|
|
790
|
+
test("a clamped 50000-character error passes the length check both models now apply", () => {
|
|
791
|
+
const stored: string = ConnectorErrorMessage.toMessage(
|
|
792
|
+
new Error(repeatToLength("clickhouse query fragment ", 50000)),
|
|
793
|
+
);
|
|
794
|
+
|
|
795
|
+
for (const model of [new GoogleSecOpsConnection(), new DetectionRule()]) {
|
|
796
|
+
const metadata: TableColumnMetadata =
|
|
797
|
+
model.getTableColumnMetadata("lastError");
|
|
798
|
+
const maxLength: number | undefined = getMaxLengthFromTableColumnType(
|
|
799
|
+
metadata.type,
|
|
800
|
+
);
|
|
801
|
+
|
|
802
|
+
// Mirrors DatabaseService.checkMaxLengthOfFields: no max, no check.
|
|
803
|
+
expect(maxLength).toBeUndefined();
|
|
804
|
+
expect(stored.length).toBeLessThanOrEqual(
|
|
805
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
806
|
+
);
|
|
807
|
+
}
|
|
808
|
+
});
|
|
809
|
+
|
|
810
|
+
test("both columns stay nullable and optional, so a successful run can clear them", () => {
|
|
811
|
+
const connectionMetadata: TableColumnMetadata =
|
|
812
|
+
new GoogleSecOpsConnection().getTableColumnMetadata("lastError");
|
|
813
|
+
const ruleMetadata: TableColumnMetadata =
|
|
814
|
+
new DetectionRule().getTableColumnMetadata("lastError");
|
|
815
|
+
|
|
816
|
+
expect(connectionMetadata.required).toBeFalsy();
|
|
817
|
+
expect(ruleMetadata.required).toBeFalsy();
|
|
818
|
+
});
|
|
819
|
+
});
|