@oneuptime/common 12.0.24 → 12.0.26
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/Span.ts +101 -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 -27
- 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 -2
- 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/Middleware/SlackAuthorization.ts +96 -18
- 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/LlmMetricSpend.ts +56 -5
- package/Server/Utils/Telemetry/LlmSpan.ts +46 -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/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
- 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/LlmCallsTableIdentity.test.tsx +322 -0
- package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
- package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
- package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
- 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/BaseAPI.test.ts +41 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
- 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/Middleware/SlackAuthorization.test.ts +262 -5
- 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/LlmCostBudgetEvaluator.test.ts +37 -18
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +143 -2
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -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/URLQueryString.test.ts +472 -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/LlmMetricConventions.test.ts +391 -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/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/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +298 -0
- package/Types/API/URL.ts +45 -10
- 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/LlmConventions.ts +255 -0
- package/Types/Telemetry/LlmMetricConventions.ts +212 -7
- 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/Dictionary/DictionaryFilterOperator.ts +83 -0
- package/UI/Components/Icon/Icon.tsx +28 -1
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
- package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
- 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/Utils/Telemetry/LlmMetricQuery.ts +83 -0
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +89 -0
- package/build/dist/Models/AnalyticsModels/Span.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 +11 -20
- 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 -2
- 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/Middleware/SlackAuthorization.js +58 -7
- package/build/dist/Server/Middleware/SlackAuthorization.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/LlmMetricSpend.js +52 -3
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.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/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Types/API/URL.js +40 -10
- 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/LlmConventions.js +236 -0
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmMetricConventions.js +197 -5
- package/build/dist/Types/Telemetry/LlmMetricConventions.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/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/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/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/build/dist/Utils/Telemetry/LlmMetricQuery.js +57 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.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,922 @@
|
|
|
1
|
+
import { describe, expect, test, afterEach, beforeEach } from "@jest/globals";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Tests for the two pieces of MicrosoftTeamsUtil that turn "Microsoft said no"
|
|
5
|
+
* into something a OneUptime admin can act on:
|
|
6
|
+
*
|
|
7
|
+
* - isGraphPermissionDeniedResponse: tells a REFUSAL (401/403, or one of the
|
|
8
|
+
* Graph authorization error codes returned with some other status) apart from
|
|
9
|
+
* a FAILURE (transport error, throttling, Graph outage). Only a refusal names
|
|
10
|
+
* a permission the admin can grant.
|
|
11
|
+
*
|
|
12
|
+
* - isAppInstalledInTeam: asks Graph whether a package carrying THIS
|
|
13
|
+
* deployment's MICROSOFT_TEAMS_APP_CLIENT_ID is installed in a team, matching
|
|
14
|
+
* on teamsApp.externalId. The customer scenario this whole diagnostic exists
|
|
15
|
+
* for is an admin staring at a tile literally named "OneUptime" that was
|
|
16
|
+
* installed from the Teams store and therefore carries OneUptime Cloud's app
|
|
17
|
+
* id, not this deployment's — that MUST come back NotInstalled, because the
|
|
18
|
+
* bot behind it will never accept posts from this deployment.
|
|
19
|
+
*
|
|
20
|
+
* The load-bearing invariant across the whole file: no failure mode is ever
|
|
21
|
+
* reported as NotInstalled. A tenant that answers "I won't tell you" is
|
|
22
|
+
* PermissionDenied (fixable in a minute by granting one permission) and
|
|
23
|
+
* everything else is Unknown — never a false "the app is missing", which is
|
|
24
|
+
* what sends admins round the install loop a second time.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* The client id has to be a literal here: jest.mock factories run while the
|
|
29
|
+
* module graph is being required, which is before any of this file's own consts
|
|
30
|
+
* exist. CLIENT_ID below repeats the same value, and a test asserts the two
|
|
31
|
+
* still agree so a copy-paste drift cannot quietly make every "Installed" case
|
|
32
|
+
* vacuous.
|
|
33
|
+
*/
|
|
34
|
+
jest.mock("../../../../Server/EnvironmentConfig", () => {
|
|
35
|
+
return {
|
|
36
|
+
...(jest.requireActual("../../../../Server/EnvironmentConfig") as Record<
|
|
37
|
+
string,
|
|
38
|
+
unknown
|
|
39
|
+
>),
|
|
40
|
+
MicrosoftTeamsAppClientId: "11111111-2222-3333-4444-555555555555",
|
|
41
|
+
MicrosoftTeamsAppClientSecret: "test-secret",
|
|
42
|
+
MicrosoftTeamsAppTenantId: "test-tenant",
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* Same botbuilder module factory as the other MicrosoftTeams suites — the
|
|
48
|
+
* repo-wide manual mock does not expose everything MicrosoftTeams.ts touches at
|
|
49
|
+
* import time.
|
|
50
|
+
*/
|
|
51
|
+
jest.mock("botbuilder", () => {
|
|
52
|
+
return {
|
|
53
|
+
CloudAdapter: class CloudAdapter {},
|
|
54
|
+
ConfigurationBotFrameworkAuthentication: class ConfigurationBotFrameworkAuthentication {},
|
|
55
|
+
TeamsActivityHandler: class TeamsActivityHandler {},
|
|
56
|
+
TurnContext: class TurnContext {},
|
|
57
|
+
ActivityHandler: class ActivityHandler {},
|
|
58
|
+
MessageFactory: {
|
|
59
|
+
text: jest.fn(),
|
|
60
|
+
attachment: jest.fn(),
|
|
61
|
+
},
|
|
62
|
+
CardFactory: { heroCard: jest.fn() },
|
|
63
|
+
TeamsInfo: {
|
|
64
|
+
getMembers: jest.fn(),
|
|
65
|
+
getPagedMembers: jest.fn(),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
import MicrosoftTeamsUtil, {
|
|
71
|
+
MicrosoftTeamsAppInstallState,
|
|
72
|
+
MICROSOFT_TEAMS_INSTALL_READ_PERMISSION,
|
|
73
|
+
} from "../../../../Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams";
|
|
74
|
+
import API from "../../../../Utils/API";
|
|
75
|
+
import HTTPResponse from "../../../../Types/API/HTTPResponse";
|
|
76
|
+
import HTTPErrorResponse from "../../../../Types/API/HTTPErrorResponse";
|
|
77
|
+
import URL from "../../../../Types/API/URL";
|
|
78
|
+
import Headers from "../../../../Types/API/Headers";
|
|
79
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
80
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
81
|
+
import { MessageFactory, CardFactory, TeamsInfo } from "botbuilder";
|
|
82
|
+
|
|
83
|
+
const CLIENT_ID: string = "11111111-2222-3333-4444-555555555555";
|
|
84
|
+
const GRAPH_TOKEN: string = "graph-token";
|
|
85
|
+
const AUTH_TOKEN: string = "stored-auth-token";
|
|
86
|
+
const TEAM_ID: string = "team-42";
|
|
87
|
+
|
|
88
|
+
// Mirrors MICROSOFT_TEAMS_MAX_PAGES in MicrosoftTeams.ts, which is not exported.
|
|
89
|
+
const MAX_PAGES: number = 500;
|
|
90
|
+
|
|
91
|
+
const FIRST_PAGE_URL: string = `https://graph.microsoft.com/v1.0/teams/${TEAM_ID}/installedApps?$expand=teamsApp`;
|
|
92
|
+
const SECOND_PAGE_URL: string = `https://graph.microsoft.com/v1.0/teams/${TEAM_ID}/installedApps?$expand=teamsApp&$skiptoken=page-2`;
|
|
93
|
+
|
|
94
|
+
interface CapturedGetCall {
|
|
95
|
+
url: URL;
|
|
96
|
+
headers: Headers;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* MicrosoftTeams.ts reads MicrosoftTeamsAppClientId off the module object on
|
|
101
|
+
* every call, so overwriting the property on the mocked module is enough to
|
|
102
|
+
* make the deployment look unconfigured for one test. afterEach puts it back.
|
|
103
|
+
*/
|
|
104
|
+
/*
|
|
105
|
+
* require(), not a top-level `import * as`, and deliberately so: an ES
|
|
106
|
+
* namespace import gives getter-only properties, and assigning to one throws
|
|
107
|
+
* "Cannot set property ... which has only a getter". The raw CommonJS module
|
|
108
|
+
* object is writable, which is the whole point — this flips the deployment to
|
|
109
|
+
* "unconfigured" for a single test and puts it back afterwards.
|
|
110
|
+
*/
|
|
111
|
+
function mutableEnvironmentConfig(): Record<string, unknown> {
|
|
112
|
+
/* eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */
|
|
113
|
+
return require("../../../../Server/EnvironmentConfig") as Record<
|
|
114
|
+
string,
|
|
115
|
+
unknown
|
|
116
|
+
>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function setConfiguredClientId(clientId: string | null): void {
|
|
120
|
+
mutableEnvironmentConfig()["MicrosoftTeamsAppClientId"] = clientId;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function getConfiguredClientId(): unknown {
|
|
124
|
+
return mutableEnvironmentConfig()["MicrosoftTeamsAppClientId"];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function errorResponse(
|
|
128
|
+
statusCode: number,
|
|
129
|
+
body: JSONObject,
|
|
130
|
+
): HTTPErrorResponse {
|
|
131
|
+
return new HTTPErrorResponse(statusCode, body, {});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function mockAccessToken(): jest.SpyInstance {
|
|
135
|
+
return jest
|
|
136
|
+
.spyOn(MicrosoftTeamsUtil, "getValidAccessToken")
|
|
137
|
+
.mockResolvedValue(GRAPH_TOKEN);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* Queues one Graph result per page, in order. Each entry is either a raw JSON
|
|
142
|
+
* body (wrapped in a 200) or an already-built HTTPErrorResponse.
|
|
143
|
+
*/
|
|
144
|
+
function mockGraphPages(
|
|
145
|
+
pages: Array<JSONObject | HTTPErrorResponse>,
|
|
146
|
+
): jest.SpyInstance {
|
|
147
|
+
const getSpy: jest.SpyInstance = jest.spyOn(API, "get");
|
|
148
|
+
|
|
149
|
+
for (const page of pages) {
|
|
150
|
+
if (page instanceof HTTPErrorResponse) {
|
|
151
|
+
getSpy.mockResolvedValueOnce(page);
|
|
152
|
+
} else {
|
|
153
|
+
getSpy.mockResolvedValueOnce(new HTTPResponse<JSONObject>(200, page, {}));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return getSpy;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function installedAppJson(teamsApp: JSONObject | null): JSONObject {
|
|
161
|
+
const installedApp: JSONObject = {
|
|
162
|
+
id: `install-${JSON.stringify(teamsApp)}`,
|
|
163
|
+
};
|
|
164
|
+
if (teamsApp !== null) {
|
|
165
|
+
installedApp["teamsApp"] = teamsApp;
|
|
166
|
+
}
|
|
167
|
+
return installedApp;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function callIsAppInstalledInTeam(data?: {
|
|
171
|
+
teamId?: string | undefined;
|
|
172
|
+
}): Promise<MicrosoftTeamsAppInstallState> {
|
|
173
|
+
return MicrosoftTeamsUtil.isAppInstalledInTeam({
|
|
174
|
+
authToken: AUTH_TOKEN,
|
|
175
|
+
projectId: ObjectID.generate(),
|
|
176
|
+
teamId: data?.teamId || TEAM_ID,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
afterEach(() => {
|
|
181
|
+
jest.restoreAllMocks();
|
|
182
|
+
setConfiguredClientId(CLIENT_ID);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* The botbuilder module mock's jest.fn()s are shared across test files in this
|
|
187
|
+
* suite run — jest.spyOn on an existing mock returns the same function, so call
|
|
188
|
+
* history and mockResolvedValueOnce queues leak between tests unless reset.
|
|
189
|
+
*/
|
|
190
|
+
beforeEach(() => {
|
|
191
|
+
(MessageFactory.text as jest.Mock).mockReset();
|
|
192
|
+
(MessageFactory.attachment as jest.Mock).mockReset();
|
|
193
|
+
(CardFactory.heroCard as jest.Mock).mockReset();
|
|
194
|
+
(TeamsInfo.getMembers as jest.Mock).mockReset();
|
|
195
|
+
(TeamsInfo.getPagedMembers as jest.Mock).mockReset();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
describe("MicrosoftTeamsUtil.isGraphPermissionDeniedResponse", () => {
|
|
199
|
+
describe("status codes", () => {
|
|
200
|
+
test("returns FALSE for a 401 expired token — that is a credential problem, not a missing grant", () => {
|
|
201
|
+
/*
|
|
202
|
+
* Graph answers a missing application permission with 403 and reserves 401
|
|
203
|
+
* for a token it will not accept. getValidAccessToken can hand back a
|
|
204
|
+
* cached app token without revalidating it when miscData carries no
|
|
205
|
+
* expiry, so this 401 is reachable in practice — and answering it with
|
|
206
|
+
* "grant TeamsAppInstallation.ReadForTeam.All" would be exactly the
|
|
207
|
+
* confidently-wrong diagnosis this whole change exists to stop producing.
|
|
208
|
+
*/
|
|
209
|
+
expect(
|
|
210
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
211
|
+
errorResponse(401, { message: "Access token has expired." }),
|
|
212
|
+
),
|
|
213
|
+
).toBe(false);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
test("returns true for 403, regardless of body", () => {
|
|
217
|
+
expect(
|
|
218
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
219
|
+
errorResponse(403, { message: "Forbidden." }),
|
|
220
|
+
),
|
|
221
|
+
).toBe(true);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("returns false for a bare 401 with no message", () => {
|
|
225
|
+
expect(
|
|
226
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
227
|
+
errorResponse(401, {}),
|
|
228
|
+
),
|
|
229
|
+
).toBe(false);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("returns true for a 401 that DOES carry an authorization error code", () => {
|
|
233
|
+
/*
|
|
234
|
+
* Status alone is not the whole signal. If Graph names an authorization
|
|
235
|
+
* refusal, honour it whatever status it arrived on.
|
|
236
|
+
*/
|
|
237
|
+
expect(
|
|
238
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
239
|
+
errorResponse(401, {
|
|
240
|
+
error: { code: "Authorization_RequestDenied" },
|
|
241
|
+
}),
|
|
242
|
+
),
|
|
243
|
+
).toBe(true);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test("returns true for 403 even when the body carries no message at all", () => {
|
|
247
|
+
expect(
|
|
248
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
249
|
+
errorResponse(403, {}),
|
|
250
|
+
),
|
|
251
|
+
).toBe(true);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
test("returns false for 500 with an unrelated message", () => {
|
|
255
|
+
expect(
|
|
256
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
257
|
+
errorResponse(500, {
|
|
258
|
+
message: "An internal server error occurred. Please try again.",
|
|
259
|
+
}),
|
|
260
|
+
),
|
|
261
|
+
).toBe(false);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("returns false for 404 with an unrelated message", () => {
|
|
265
|
+
expect(
|
|
266
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
267
|
+
errorResponse(404, {
|
|
268
|
+
message: "No team found with the specified id.",
|
|
269
|
+
}),
|
|
270
|
+
),
|
|
271
|
+
).toBe(false);
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
test("returns false for 429 with an unrelated message (throttling is a failure, not a refusal)", () => {
|
|
275
|
+
expect(
|
|
276
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
277
|
+
errorResponse(429, {
|
|
278
|
+
message: "Too many requests. Retry after 30 seconds.",
|
|
279
|
+
}),
|
|
280
|
+
),
|
|
281
|
+
).toBe(false);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test("returns false when the body yields an empty message", () => {
|
|
285
|
+
expect(
|
|
286
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
287
|
+
errorResponse(500, {}),
|
|
288
|
+
),
|
|
289
|
+
).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
test("returns false when the body has only unrelated keys, so message resolves empty", () => {
|
|
293
|
+
expect(
|
|
294
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
295
|
+
errorResponse(503, { requestId: "abc-123", date: "2026-01-01" }),
|
|
296
|
+
),
|
|
297
|
+
).toBe(false);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
describe("message fragments on a non-401/403 status", () => {
|
|
302
|
+
/*
|
|
303
|
+
* Graph is not consistent about the status it returns with these codes, so
|
|
304
|
+
* each has to be recognised on its own. 400 is used here precisely because
|
|
305
|
+
* the status alone would not trip the check.
|
|
306
|
+
*/
|
|
307
|
+
const fragmentCases: Array<{ name: string; message: string }> = [
|
|
308
|
+
{
|
|
309
|
+
name: "Authorization_RequestDenied (as written by Graph)",
|
|
310
|
+
message:
|
|
311
|
+
"Authorization_RequestDenied: Insufficient privileges to complete the operation.",
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: "accessDenied (as written by Graph)",
|
|
315
|
+
message: "accessDenied: Failed to execute Skype backend request.",
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
name: "Insufficient privileges (as written by Graph)",
|
|
319
|
+
message: "Insufficient privileges to complete the operation.",
|
|
320
|
+
},
|
|
321
|
+
];
|
|
322
|
+
|
|
323
|
+
for (const fragmentCase of fragmentCases) {
|
|
324
|
+
test(`returns true for a 400 whose message contains ${fragmentCase.name}`, () => {
|
|
325
|
+
expect(
|
|
326
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
327
|
+
errorResponse(400, { message: fragmentCase.message }),
|
|
328
|
+
),
|
|
329
|
+
).toBe(true);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test(`matches ${fragmentCase.name} case-insensitively (all upper case)`, () => {
|
|
333
|
+
expect(
|
|
334
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
335
|
+
errorResponse(400, {
|
|
336
|
+
message: fragmentCase.message.toUpperCase(),
|
|
337
|
+
}),
|
|
338
|
+
),
|
|
339
|
+
).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
test(`matches ${fragmentCase.name} case-insensitively (all lower case)`, () => {
|
|
343
|
+
expect(
|
|
344
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
345
|
+
errorResponse(400, {
|
|
346
|
+
message: fragmentCase.message.toLowerCase(),
|
|
347
|
+
}),
|
|
348
|
+
),
|
|
349
|
+
).toBe(true);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
test("matches a fragment embedded mid-sentence, not just at the start", () => {
|
|
354
|
+
expect(
|
|
355
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
356
|
+
errorResponse(400, {
|
|
357
|
+
message:
|
|
358
|
+
'Graph replied with code "Authorization_RequestDenied" while reading installedApps.',
|
|
359
|
+
}),
|
|
360
|
+
),
|
|
361
|
+
).toBe(true);
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
describe("nested body shapes (HTTPErrorResponse.message coercion)", () => {
|
|
366
|
+
test("finds the fragment in { error: { code, message } }, Graph's real error envelope", () => {
|
|
367
|
+
expect(
|
|
368
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
369
|
+
errorResponse(400, {
|
|
370
|
+
error: {
|
|
371
|
+
code: "Authorization_RequestDenied",
|
|
372
|
+
message: "Insufficient privileges to complete the operation.",
|
|
373
|
+
},
|
|
374
|
+
}),
|
|
375
|
+
),
|
|
376
|
+
).toBe(true);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
test("finds the fragment in { error: { error: '...' } }, the nested-error shape", () => {
|
|
380
|
+
expect(
|
|
381
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
382
|
+
errorResponse(400, {
|
|
383
|
+
error: { error: "accessDenied while expanding teamsApp" },
|
|
384
|
+
}),
|
|
385
|
+
),
|
|
386
|
+
).toBe(true);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
test("finds the fragment in { data: { message } }, since data is checked first", () => {
|
|
390
|
+
expect(
|
|
391
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
392
|
+
errorResponse(400, {
|
|
393
|
+
data: { message: "Authorization_RequestDenied" },
|
|
394
|
+
}),
|
|
395
|
+
),
|
|
396
|
+
).toBe(true);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test("finds the fragment via the JSON.stringify fallback when the object has neither message nor error", () => {
|
|
400
|
+
/*
|
|
401
|
+
* coerceToMessage falls back to JSON.stringify for an object it cannot
|
|
402
|
+
* read a message out of, so the code survives inside the serialised blob.
|
|
403
|
+
*/
|
|
404
|
+
expect(
|
|
405
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
406
|
+
errorResponse(400, {
|
|
407
|
+
error: {
|
|
408
|
+
code: "Authorization_RequestDenied",
|
|
409
|
+
innerError: { requestId: "abc" },
|
|
410
|
+
},
|
|
411
|
+
}),
|
|
412
|
+
),
|
|
413
|
+
).toBe(true);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
test("returns false for a nested body whose message is unrelated", () => {
|
|
417
|
+
expect(
|
|
418
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
419
|
+
errorResponse(500, {
|
|
420
|
+
error: {
|
|
421
|
+
code: "InternalServerError",
|
|
422
|
+
message: "An unexpected error occurred.",
|
|
423
|
+
},
|
|
424
|
+
}),
|
|
425
|
+
),
|
|
426
|
+
).toBe(false);
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
describe("near-misses (documenting the REAL matching behaviour)", () => {
|
|
431
|
+
/*
|
|
432
|
+
* The check is a plain substring test against three exact fragments, so
|
|
433
|
+
* English prose that MEANS the same thing does not match. These tests pin
|
|
434
|
+
* the real behaviour rather than the intended one: if someone later swaps
|
|
435
|
+
* the substring list for a looser regex, these will fail and force the
|
|
436
|
+
* change to be a deliberate one.
|
|
437
|
+
*/
|
|
438
|
+
test("returns FALSE for 'access is denied for this user' on a 500 — the fragment is 'accessdenied' with no words between", () => {
|
|
439
|
+
expect(
|
|
440
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
441
|
+
errorResponse(500, {
|
|
442
|
+
message: "Access is denied for this user.",
|
|
443
|
+
}),
|
|
444
|
+
),
|
|
445
|
+
).toBe(false);
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
test("returns FALSE for 'Access denied' (with a space) on a 500 — only the run-together Graph code matches", () => {
|
|
449
|
+
expect(
|
|
450
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
451
|
+
errorResponse(500, { message: "Access denied." }),
|
|
452
|
+
),
|
|
453
|
+
).toBe(false);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
test("returns FALSE for 'insufficient permissions' on a 500 — the fragment is 'insufficient privileges'", () => {
|
|
457
|
+
expect(
|
|
458
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
459
|
+
errorResponse(500, {
|
|
460
|
+
message: "Insufficient permissions to complete the operation.",
|
|
461
|
+
}),
|
|
462
|
+
),
|
|
463
|
+
).toBe(false);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test("returns FALSE for 'unauthorized' on a 500 — a word the check deliberately does not carry", () => {
|
|
467
|
+
expect(
|
|
468
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
469
|
+
errorResponse(500, { message: "Unauthorized." }),
|
|
470
|
+
),
|
|
471
|
+
).toBe(false);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
test("returns TRUE for the bare code 'accessDenied' on a 500 — the run-together form is what matches", () => {
|
|
475
|
+
expect(
|
|
476
|
+
MicrosoftTeamsUtil.isGraphPermissionDeniedResponse(
|
|
477
|
+
errorResponse(500, { message: "accessDenied" }),
|
|
478
|
+
),
|
|
479
|
+
).toBe(true);
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
describe("MicrosoftTeamsUtil.isAppInstalledInTeam", () => {
|
|
485
|
+
test("test fixture guard: the mocked deployment really is configured with CLIENT_ID", () => {
|
|
486
|
+
/*
|
|
487
|
+
* Every Installed assertion below is only meaningful if the client id the
|
|
488
|
+
* fixtures hand to Graph is the client id the code compares against. If
|
|
489
|
+
* these ever drift apart, the Installed cases would silently become
|
|
490
|
+
* NotInstalled cases and stop testing anything.
|
|
491
|
+
*/
|
|
492
|
+
expect(getConfiguredClientId()).toBe(CLIENT_ID);
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
describe("Installed", () => {
|
|
496
|
+
test("Installed when a teamsApp externalId equals this deployment's client id", async () => {
|
|
497
|
+
mockAccessToken();
|
|
498
|
+
mockGraphPages([
|
|
499
|
+
{
|
|
500
|
+
value: [
|
|
501
|
+
installedAppJson({
|
|
502
|
+
id: "graph-generated-id",
|
|
503
|
+
displayName: "OneUptime",
|
|
504
|
+
externalId: CLIENT_ID,
|
|
505
|
+
}),
|
|
506
|
+
],
|
|
507
|
+
},
|
|
508
|
+
]);
|
|
509
|
+
|
|
510
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
511
|
+
MicrosoftTeamsAppInstallState.Installed,
|
|
512
|
+
);
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
test("Installed when the match is on the SECOND page (@odata.nextLink pagination)", async () => {
|
|
516
|
+
mockAccessToken();
|
|
517
|
+
const getSpy: jest.SpyInstance = mockGraphPages([
|
|
518
|
+
{
|
|
519
|
+
value: [
|
|
520
|
+
installedAppJson({
|
|
521
|
+
displayName: "Planner",
|
|
522
|
+
externalId: "some-other-app-id",
|
|
523
|
+
}),
|
|
524
|
+
],
|
|
525
|
+
"@odata.nextLink": SECOND_PAGE_URL,
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
value: [
|
|
529
|
+
installedAppJson({
|
|
530
|
+
displayName: "OneUptime",
|
|
531
|
+
externalId: CLIENT_ID,
|
|
532
|
+
}),
|
|
533
|
+
],
|
|
534
|
+
},
|
|
535
|
+
]);
|
|
536
|
+
|
|
537
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
538
|
+
MicrosoftTeamsAppInstallState.Installed,
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
expect(getSpy).toHaveBeenCalledTimes(2);
|
|
542
|
+
|
|
543
|
+
const firstCall: CapturedGetCall = getSpy.mock
|
|
544
|
+
.calls[0]?.[0] as CapturedGetCall;
|
|
545
|
+
const secondCall: CapturedGetCall = getSpy.mock
|
|
546
|
+
.calls[1]?.[0] as CapturedGetCall;
|
|
547
|
+
|
|
548
|
+
expect(firstCall.url.toString()).toBe(FIRST_PAGE_URL);
|
|
549
|
+
expect(secondCall.url.toString()).toBe(SECOND_PAGE_URL);
|
|
550
|
+
expect(firstCall.headers["Authorization"]).toBe(`Bearer ${GRAPH_TOKEN}`);
|
|
551
|
+
expect(secondCall.headers["Authorization"]).toBe(`Bearer ${GRAPH_TOKEN}`);
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
test("stops paginating as soon as it finds the match", async () => {
|
|
555
|
+
mockAccessToken();
|
|
556
|
+
const getSpy: jest.SpyInstance = mockGraphPages([
|
|
557
|
+
{
|
|
558
|
+
value: [
|
|
559
|
+
installedAppJson({
|
|
560
|
+
displayName: "OneUptime",
|
|
561
|
+
externalId: CLIENT_ID,
|
|
562
|
+
}),
|
|
563
|
+
],
|
|
564
|
+
"@odata.nextLink": SECOND_PAGE_URL,
|
|
565
|
+
},
|
|
566
|
+
]);
|
|
567
|
+
|
|
568
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
569
|
+
MicrosoftTeamsAppInstallState.Installed,
|
|
570
|
+
);
|
|
571
|
+
expect(getSpy).toHaveBeenCalledTimes(1);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
test("matches on externalId, not on displayName — a renamed package still counts as installed", async () => {
|
|
575
|
+
mockAccessToken();
|
|
576
|
+
mockGraphPages([
|
|
577
|
+
{
|
|
578
|
+
value: [
|
|
579
|
+
installedAppJson({
|
|
580
|
+
displayName: "Acme Status (self-hosted)",
|
|
581
|
+
externalId: CLIENT_ID,
|
|
582
|
+
}),
|
|
583
|
+
],
|
|
584
|
+
},
|
|
585
|
+
]);
|
|
586
|
+
|
|
587
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
588
|
+
MicrosoftTeamsAppInstallState.Installed,
|
|
589
|
+
);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
describe("NotInstalled", () => {
|
|
594
|
+
test("NotInstalled when a single page has no matching externalId", async () => {
|
|
595
|
+
mockAccessToken();
|
|
596
|
+
mockGraphPages([
|
|
597
|
+
{
|
|
598
|
+
value: [
|
|
599
|
+
installedAppJson({
|
|
600
|
+
displayName: "Planner",
|
|
601
|
+
externalId: "planner-app-id",
|
|
602
|
+
}),
|
|
603
|
+
installedAppJson({
|
|
604
|
+
displayName: "Approvals",
|
|
605
|
+
externalId: "approvals-app-id",
|
|
606
|
+
}),
|
|
607
|
+
],
|
|
608
|
+
},
|
|
609
|
+
]);
|
|
610
|
+
|
|
611
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
612
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
613
|
+
);
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
test("NotInstalled when the team has no installed apps at all", async () => {
|
|
617
|
+
mockAccessToken();
|
|
618
|
+
mockGraphPages([{ value: [] }]);
|
|
619
|
+
|
|
620
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
621
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
622
|
+
);
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
test("NotInstalled when the response omits value entirely", async () => {
|
|
626
|
+
mockAccessToken();
|
|
627
|
+
mockGraphPages([{}]);
|
|
628
|
+
|
|
629
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
630
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
631
|
+
);
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
test("NotInstalled when every page is exhausted with no matching externalId", async () => {
|
|
635
|
+
mockAccessToken();
|
|
636
|
+
const getSpy: jest.SpyInstance = mockGraphPages([
|
|
637
|
+
{
|
|
638
|
+
value: [
|
|
639
|
+
installedAppJson({ displayName: "Planner", externalId: "a" }),
|
|
640
|
+
],
|
|
641
|
+
"@odata.nextLink": SECOND_PAGE_URL,
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
value: [installedAppJson({ displayName: "Forms", externalId: "b" })],
|
|
645
|
+
},
|
|
646
|
+
]);
|
|
647
|
+
|
|
648
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
649
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
650
|
+
);
|
|
651
|
+
expect(getSpy).toHaveBeenCalledTimes(2);
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
/*
|
|
655
|
+
* THE customer scenario. An admin installs "OneUptime" from the Teams
|
|
656
|
+
* store, sees the tile in Manage team > Apps, and reasonably concludes the
|
|
657
|
+
* integration is set up. That package carries OneUptime Cloud's app id, so
|
|
658
|
+
* its bot is a different bot and will never accept a proactive post from
|
|
659
|
+
* this deployment. Answering "Installed" here — matching on the name, or on
|
|
660
|
+
* anything other than this deployment's client id — would turn the whole
|
|
661
|
+
* diagnostic into a lie and send the admin looking at the Azure Bot
|
|
662
|
+
* resource for a problem that is really the wrong package.
|
|
663
|
+
*/
|
|
664
|
+
test("NotInstalled for a DIFFERENT app that is also called OneUptime (the Teams-store package)", async () => {
|
|
665
|
+
mockAccessToken();
|
|
666
|
+
mockGraphPages([
|
|
667
|
+
{
|
|
668
|
+
value: [
|
|
669
|
+
installedAppJson({
|
|
670
|
+
id: "store-catalog-id",
|
|
671
|
+
displayName: "OneUptime",
|
|
672
|
+
distributionMethod: "store",
|
|
673
|
+
externalId: "99999999-8888-7777-6666-555555555555",
|
|
674
|
+
}),
|
|
675
|
+
],
|
|
676
|
+
},
|
|
677
|
+
]);
|
|
678
|
+
|
|
679
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
680
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
681
|
+
);
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
test("NotInstalled when an installed app carries no teamsApp expansion", async () => {
|
|
685
|
+
mockAccessToken();
|
|
686
|
+
mockGraphPages([{ value: [installedAppJson(null)] }]);
|
|
687
|
+
|
|
688
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
689
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
690
|
+
);
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
test("NotInstalled when a teamsApp has no externalId at all", async () => {
|
|
694
|
+
mockAccessToken();
|
|
695
|
+
mockGraphPages([
|
|
696
|
+
{ value: [installedAppJson({ displayName: "OneUptime" })] },
|
|
697
|
+
]);
|
|
698
|
+
|
|
699
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
700
|
+
MicrosoftTeamsAppInstallState.NotInstalled,
|
|
701
|
+
);
|
|
702
|
+
});
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
describe("PermissionDenied", () => {
|
|
706
|
+
test("PermissionDenied when Graph answers 403", async () => {
|
|
707
|
+
mockAccessToken();
|
|
708
|
+
mockGraphPages([
|
|
709
|
+
errorResponse(403, {
|
|
710
|
+
error: {
|
|
711
|
+
code: "Authorization_RequestDenied",
|
|
712
|
+
message: "Insufficient privileges to complete the operation.",
|
|
713
|
+
},
|
|
714
|
+
}),
|
|
715
|
+
]);
|
|
716
|
+
|
|
717
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
718
|
+
MicrosoftTeamsAppInstallState.PermissionDenied,
|
|
719
|
+
);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
test("Unknown — not PermissionDenied — when Graph answers 401 with a bad token", async () => {
|
|
723
|
+
/*
|
|
724
|
+
* An expired or empty token is a credential problem. Reporting it as
|
|
725
|
+
* PermissionDenied would put "grant this Graph permission" in front of an
|
|
726
|
+
* admin whose permission was never the issue.
|
|
727
|
+
*/
|
|
728
|
+
mockAccessToken();
|
|
729
|
+
mockGraphPages([
|
|
730
|
+
errorResponse(401, {
|
|
731
|
+
error: {
|
|
732
|
+
code: "InvalidAuthenticationToken",
|
|
733
|
+
message: "Access token is empty.",
|
|
734
|
+
},
|
|
735
|
+
}),
|
|
736
|
+
]);
|
|
737
|
+
|
|
738
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
739
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
740
|
+
);
|
|
741
|
+
});
|
|
742
|
+
|
|
743
|
+
test("PermissionDenied on a non-401/403 status carrying an authorization code", async () => {
|
|
744
|
+
mockAccessToken();
|
|
745
|
+
mockGraphPages([
|
|
746
|
+
errorResponse(400, {
|
|
747
|
+
error: {
|
|
748
|
+
code: "Authorization_RequestDenied",
|
|
749
|
+
message: "Insufficient privileges to complete the operation.",
|
|
750
|
+
},
|
|
751
|
+
}),
|
|
752
|
+
]);
|
|
753
|
+
|
|
754
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
755
|
+
MicrosoftTeamsAppInstallState.PermissionDenied,
|
|
756
|
+
);
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
test("PermissionDenied when the refusal arrives on the SECOND page, not the first", async () => {
|
|
760
|
+
mockAccessToken();
|
|
761
|
+
mockGraphPages([
|
|
762
|
+
{
|
|
763
|
+
value: [
|
|
764
|
+
installedAppJson({ displayName: "Planner", externalId: "a" }),
|
|
765
|
+
],
|
|
766
|
+
"@odata.nextLink": SECOND_PAGE_URL,
|
|
767
|
+
},
|
|
768
|
+
errorResponse(403, { message: "Forbidden." }),
|
|
769
|
+
]);
|
|
770
|
+
|
|
771
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
772
|
+
MicrosoftTeamsAppInstallState.PermissionDenied,
|
|
773
|
+
);
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
test("a refusal is never reported as NotInstalled", async () => {
|
|
777
|
+
mockAccessToken();
|
|
778
|
+
mockGraphPages([errorResponse(403, { message: "Forbidden." })]);
|
|
779
|
+
|
|
780
|
+
const state: MicrosoftTeamsAppInstallState =
|
|
781
|
+
await callIsAppInstalledInTeam();
|
|
782
|
+
|
|
783
|
+
expect(state).not.toBe(MicrosoftTeamsAppInstallState.NotInstalled);
|
|
784
|
+
expect(state).not.toBe(MicrosoftTeamsAppInstallState.Installed);
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
test("names the grant that fixes it in the roster rejection message", () => {
|
|
788
|
+
const message: string = MicrosoftTeamsUtil.getRosterRejectionMessage({
|
|
789
|
+
channelName: "Ops",
|
|
790
|
+
installState: MicrosoftTeamsAppInstallState.PermissionDenied,
|
|
791
|
+
});
|
|
792
|
+
|
|
793
|
+
expect(message).toContain(MICROSOFT_TEAMS_INSTALL_READ_PERMISSION);
|
|
794
|
+
expect(MICROSOFT_TEAMS_INSTALL_READ_PERMISSION).toBe(
|
|
795
|
+
"TeamsAppInstallation.ReadForTeam.All",
|
|
796
|
+
);
|
|
797
|
+
});
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
describe("Unknown", () => {
|
|
801
|
+
test("Unknown when Graph answers 500 with an unrelated message", async () => {
|
|
802
|
+
mockAccessToken();
|
|
803
|
+
mockGraphPages([
|
|
804
|
+
errorResponse(500, {
|
|
805
|
+
error: {
|
|
806
|
+
code: "InternalServerError",
|
|
807
|
+
message: "An unexpected error occurred.",
|
|
808
|
+
},
|
|
809
|
+
}),
|
|
810
|
+
]);
|
|
811
|
+
|
|
812
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
813
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
814
|
+
);
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
test("Unknown when Graph answers 429 (throttling is a failure, not a refusal)", async () => {
|
|
818
|
+
mockAccessToken();
|
|
819
|
+
mockGraphPages([errorResponse(429, { message: "Too many requests." })]);
|
|
820
|
+
|
|
821
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
822
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
823
|
+
);
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
test("Unknown when Graph answers 404 for the team", async () => {
|
|
827
|
+
mockAccessToken();
|
|
828
|
+
mockGraphPages([
|
|
829
|
+
errorResponse(404, { message: "No team found with the specified id." }),
|
|
830
|
+
]);
|
|
831
|
+
|
|
832
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
833
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
834
|
+
);
|
|
835
|
+
});
|
|
836
|
+
|
|
837
|
+
test("Unknown when getValidAccessToken throws", async () => {
|
|
838
|
+
jest
|
|
839
|
+
.spyOn(MicrosoftTeamsUtil, "getValidAccessToken")
|
|
840
|
+
.mockRejectedValue(new Error("Refresh token expired"));
|
|
841
|
+
const getSpy: jest.SpyInstance = jest.spyOn(API, "get");
|
|
842
|
+
|
|
843
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
844
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
845
|
+
);
|
|
846
|
+
expect(getSpy).not.toHaveBeenCalled();
|
|
847
|
+
});
|
|
848
|
+
|
|
849
|
+
test("Unknown when API.get itself rejects (transport failure)", async () => {
|
|
850
|
+
mockAccessToken();
|
|
851
|
+
jest
|
|
852
|
+
.spyOn(API, "get")
|
|
853
|
+
.mockRejectedValue(new Error("getaddrinfo ENOTFOUND"));
|
|
854
|
+
|
|
855
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
856
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
857
|
+
);
|
|
858
|
+
});
|
|
859
|
+
|
|
860
|
+
test("Unknown when the client id is not configured, without calling Graph", async () => {
|
|
861
|
+
setConfiguredClientId(null);
|
|
862
|
+
const tokenSpy: jest.SpyInstance = mockAccessToken();
|
|
863
|
+
/*
|
|
864
|
+
* A rejecting implementation rather than a bare spy, so that a
|
|
865
|
+
* regression which does reach Graph fails loudly here instead of
|
|
866
|
+
* attempting a real network call.
|
|
867
|
+
*/
|
|
868
|
+
const getSpy: jest.SpyInstance = jest
|
|
869
|
+
.spyOn(API, "get")
|
|
870
|
+
.mockRejectedValue(new Error("Graph must not be called"));
|
|
871
|
+
|
|
872
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
873
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
874
|
+
);
|
|
875
|
+
expect(tokenSpy).not.toHaveBeenCalled();
|
|
876
|
+
expect(getSpy).not.toHaveBeenCalled();
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
test("Unknown when the client id is configured as an empty string", async () => {
|
|
880
|
+
setConfiguredClientId("");
|
|
881
|
+
const getSpy: jest.SpyInstance = jest
|
|
882
|
+
.spyOn(API, "get")
|
|
883
|
+
.mockRejectedValue(new Error("Graph must not be called"));
|
|
884
|
+
|
|
885
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
886
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
887
|
+
);
|
|
888
|
+
expect(getSpy).not.toHaveBeenCalled();
|
|
889
|
+
});
|
|
890
|
+
|
|
891
|
+
test(`Unknown when pagination exceeds the ${MAX_PAGES}-page cap, and it stops after exactly ${MAX_PAGES} requests`, async () => {
|
|
892
|
+
mockAccessToken();
|
|
893
|
+
|
|
894
|
+
/*
|
|
895
|
+
* A Graph response that always points at another page. Without the cap
|
|
896
|
+
* this is an infinite loop, so the assertion on the call count is the
|
|
897
|
+
* one that matters: the guard must fire, and it must fire before the
|
|
898
|
+
* request that would have been page 501.
|
|
899
|
+
*/
|
|
900
|
+
const getSpy: jest.SpyInstance = jest.spyOn(API, "get").mockResolvedValue(
|
|
901
|
+
new HTTPResponse<JSONObject>(
|
|
902
|
+
200,
|
|
903
|
+
{
|
|
904
|
+
value: [
|
|
905
|
+
installedAppJson({
|
|
906
|
+
displayName: "Planner",
|
|
907
|
+
externalId: "not-this-deployment",
|
|
908
|
+
}),
|
|
909
|
+
],
|
|
910
|
+
"@odata.nextLink": SECOND_PAGE_URL,
|
|
911
|
+
},
|
|
912
|
+
{},
|
|
913
|
+
),
|
|
914
|
+
);
|
|
915
|
+
|
|
916
|
+
await expect(callIsAppInstalledInTeam()).resolves.toBe(
|
|
917
|
+
MicrosoftTeamsAppInstallState.Unknown,
|
|
918
|
+
);
|
|
919
|
+
expect(getSpy).toHaveBeenCalledTimes(MAX_PAGES);
|
|
920
|
+
});
|
|
921
|
+
});
|
|
922
|
+
});
|