@oneuptime/common 12.0.25 → 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/ThreatIntelIndicator.ts +413 -0
- package/Models/DatabaseModels/AlertSeverity.ts +4 -1
- package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
- package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
- package/Models/DatabaseModels/DetectionRule.ts +9 -3
- package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
- package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
- package/Models/DatabaseModels/HostFeed.ts +625 -0
- package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
- package/Models/DatabaseModels/Index.ts +22 -0
- package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
- package/Models/DatabaseModels/Monitor.ts +87 -0
- package/Models/DatabaseModels/NetworkDevice.ts +96 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
- package/Models/DatabaseModels/NetworkSite.ts +120 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
- package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
- package/Models/DatabaseModels/ServiceFeed.ts +625 -0
- package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
- package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
- package/Server/API/AlertAPI.ts +23 -1
- package/Server/API/BaseAPI.ts +14 -3
- package/Server/API/IncidentAPI.ts +41 -1
- package/Server/API/IncidentEpisodeAPI.ts +23 -1
- package/Server/API/MicrosoftTeamsAPI.ts +31 -2
- package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
- package/Server/API/SlackAPI.ts +48 -0
- package/Server/API/TelemetryAPI.ts +167 -42
- package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
- package/Server/API/UserTotpAuthAPI.ts +67 -1
- package/Server/API/UserWebAuthnAPI.ts +44 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
- package/Server/Middleware/IdentityRateLimit.ts +53 -3
- package/Server/Services/AIService.ts +181 -41
- package/Server/Services/CephClusterFeedService.ts +99 -0
- package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
- package/Server/Services/CephClusterOwnerUserService.ts +123 -0
- package/Server/Services/CephClusterService.ts +223 -2
- package/Server/Services/CloudResourceFeedService.ts +99 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
- package/Server/Services/CloudResourceService.ts +227 -2
- package/Server/Services/DatabaseService.ts +265 -0
- package/Server/Services/DockerHostFeedService.ts +99 -0
- package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
- package/Server/Services/DockerHostOwnerUserService.ts +123 -0
- package/Server/Services/DockerHostService.ts +227 -2
- package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
- package/Server/Services/DockerSwarmClusterService.ts +229 -2
- package/Server/Services/EnterpriseLicenseService.ts +15 -7
- package/Server/Services/ExceptionAggregationService.ts +12 -2
- package/Server/Services/HostFeedService.ts +99 -0
- package/Server/Services/HostLabelRuleEngineService.ts +29 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostOwnerTeamService.ts +129 -0
- package/Server/Services/HostOwnerUserService.ts +123 -0
- package/Server/Services/HostService.ts +215 -2
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterFeedService.ts +99 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
- package/Server/Services/KubernetesClusterService.ts +231 -2
- package/Server/Services/LogAggregationService.ts +23 -280
- package/Server/Services/MetricAggregationService.ts +98 -1
- package/Server/Services/MonitorService.ts +177 -13
- package/Server/Services/MonitorTemplateService.ts +111 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
- package/Server/Services/NetworkDeviceService.ts +750 -4
- package/Server/Services/NetworkInterfaceService.ts +415 -0
- package/Server/Services/NetworkSiteService.ts +485 -52
- package/Server/Services/PodmanHostFeedService.ts +99 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
- package/Server/Services/PodmanHostService.ts +227 -2
- package/Server/Services/ProjectService.ts +16 -10
- package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
- package/Server/Services/ProxmoxClusterService.ts +225 -2
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
- package/Server/Services/ServiceFeedService.ts +99 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
- package/Server/Services/ServiceOwnerTeamService.ts +129 -0
- package/Server/Services/ServiceOwnerUserService.ts +123 -0
- package/Server/Services/ServiceService.ts +227 -3
- package/Server/Services/StatusPageSubscriberService.ts +7 -0
- package/Server/Services/TelemetryAttributeService.ts +13 -3
- package/Server/Services/TelemetrySourceMapService.ts +307 -0
- package/Server/Services/ThreatIntelFeedService.ts +222 -0
- package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
- package/Server/Services/TraceAggregationService.ts +101 -11
- package/Server/Services/UserService.ts +13 -6
- package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
- package/Server/Services/UserWebhookService.ts +11 -2
- package/Server/Static/Brand/README.md +38 -0
- package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
- package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
- package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
- package/Server/Static/Brand/favicons/favicon.ico +0 -0
- package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
- package/Server/Static/Brand/hou-wb.svg +1 -0
- package/Server/Static/Brand/oneuptime-logo.svg +1 -0
- package/Server/Static/Brand/ou-wb.svg +1 -0
- package/Server/Static/Vendor/README.md +4 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
- package/Server/Types/Database/AggregateBy.ts +83 -0
- package/Server/Types/Database/AggregateResultUtil.ts +126 -0
- package/Server/Types/Database/JSONColumnQuery.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +40 -0
- package/Server/Types/Database/QueryUtil.ts +26 -0
- package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
- package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
- package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
- package/Server/Utils/DataSource/HttpFetch.ts +18 -0
- package/Server/Utils/Database/RelationIdUtil.ts +42 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
- package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
- package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
- package/Server/Utils/Monitor/MonitorResource.ts +226 -49
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
- package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
- package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
- package/Server/Utils/OnCallNotificationContext.ts +686 -0
- package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
- package/Server/Utils/Response.ts +11 -1
- package/Server/Utils/SSRFProtection.ts +230 -60
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
- package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
- package/Server/Utils/StartServer.ts +83 -56
- package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
- package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
- package/Server/Utils/VM/VMAPI.ts +3 -0
- package/Server/Utils/VM/VMRunner.ts +27 -1
- package/Server/Utils/VendorAssets.ts +42 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
- package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
- package/Server/Views/Partials/Head.ejs +9 -9
- package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
- package/Server/Views/ViewMessage.ejs +11 -9
- package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
- package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
- package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
- package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
- package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
- package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
- package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
- package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
- package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
- package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
- package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
- package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
- package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
- package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
- package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
- package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
- package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
- package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
- package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
- package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
- package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
- package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
- package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
- package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
- package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
- package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
- package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
- package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
- package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
- package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
- package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
- package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
- package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
- package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
- package/Tests/Types/API/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/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/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/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/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +18 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +8 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +35 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +45 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +100 -35
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +177 -30
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
- package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +175 -1
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
- package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +177 -1
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +201 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
- package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +177 -1
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostFeedService.js +89 -0
- package/build/dist/Server/Services/HostFeedService.js.map +1 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +175 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
- package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +19 -196
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +59 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +115 -13
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
- package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +408 -47
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
- package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +177 -1
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +40 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceFeedService.js +89 -0
- package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +173 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +62 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +22 -13
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +11 -2
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
- package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +12 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +160 -58
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +70 -44
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +29 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/URL.js +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/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/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,705 @@
|
|
|
1
|
+
import UserTwoFactorBackupCodeService from "../../../Server/Services/UserTwoFactorBackupCodeService";
|
|
2
|
+
import TwoFactorBackupCode, {
|
|
3
|
+
BackupCodeSetSize,
|
|
4
|
+
} from "../../../Server/Utils/TwoFactorBackupCode";
|
|
5
|
+
import logger from "../../../Server/Utils/Logger";
|
|
6
|
+
import UserTwoFactorBackupCode from "../../../Models/DatabaseModels/UserTwoFactorBackupCode";
|
|
7
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
8
|
+
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
9
|
+
import { getJestSpyOn } from "../../Spy";
|
|
10
|
+
import {
|
|
11
|
+
afterEach,
|
|
12
|
+
beforeEach,
|
|
13
|
+
describe,
|
|
14
|
+
expect,
|
|
15
|
+
jest,
|
|
16
|
+
test,
|
|
17
|
+
} from "@jest/globals";
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* ---------------------------------------------------------------------------
|
|
21
|
+
* generateForUserIfNone -- minting a recovery set for an account that has
|
|
22
|
+
* none, at the moment a second factor is enrolled.
|
|
23
|
+
*
|
|
24
|
+
* WHY THIS METHOD EXISTS AT ALL
|
|
25
|
+
*
|
|
26
|
+
* Backup codes shipped, and then essentially nobody had any: the only writer
|
|
27
|
+
* was a button on the profile page that a user had to go and find, so
|
|
28
|
+
* `countUnusedForUser` was zero for almost every account and the login page's
|
|
29
|
+
* "use a backup code" link -- gated on that count -- rendered for almost
|
|
30
|
+
* nobody. The reported symptom (issue #3382) was a two-factor screen with one
|
|
31
|
+
* "Authenticator App" row and no way out of it. Enrolment is the moment the
|
|
32
|
+
* user is already thinking about losing their phone, so enrolment is where the
|
|
33
|
+
* codes are now made.
|
|
34
|
+
*
|
|
35
|
+
* WHAT THIS FILE IS GUARDING, AND WHY IT IS NOT `regenerateForUser`
|
|
36
|
+
*
|
|
37
|
+
* The tempting one-line implementation is to call `regenerateForUser` from the
|
|
38
|
+
* enrolment paths. That would be a data-loss bug with a very long fuse:
|
|
39
|
+
* enrolling a SECOND authenticator app, or adding a security key next to an
|
|
40
|
+
* existing phone, is an enrolment too, and regeneration REPLACES -- so the ten
|
|
41
|
+
* codes the user printed and filed away months ago would stop working, with
|
|
42
|
+
* nothing on screen to say so. They would find out while locked out. The count
|
|
43
|
+
* check below is the whole method, and the assertions that `create` and the
|
|
44
|
+
* deletes were never touched for a user who already has rows are the ones that
|
|
45
|
+
* would catch that edit.
|
|
46
|
+
*
|
|
47
|
+
* The second property is that the mint does NOT delete first. Two enrolments
|
|
48
|
+
* finishing at the same instant can both read a zero count; if the second one
|
|
49
|
+
* cleared the table, the codes the first one has ALREADY PUT ON THE USER'S
|
|
50
|
+
* SCREEN would be dead before they finished writing them down. Writing without
|
|
51
|
+
* deleting turns that race into two live sets -- more codes than intended, but
|
|
52
|
+
* not a single lie. For the same reason the compensating delete on a failed
|
|
53
|
+
* write removes only the ids this call created, never everything the user has.
|
|
54
|
+
*
|
|
55
|
+
* WHAT IS MOCKED, AND WHAT IS NOT
|
|
56
|
+
*
|
|
57
|
+
* The database is: `countBy`, `create`, `deleteBy` and `deleteOneById` are
|
|
58
|
+
* spies, because what is under test is which of them are called and with what,
|
|
59
|
+
* not what Postgres does with them.
|
|
60
|
+
*
|
|
61
|
+
* TwoFactorBackupCode is NOT mocked. The digests are checked against the real
|
|
62
|
+
* hashing function, because a set stored under a different key -- or under the
|
|
63
|
+
* wrong user's key -- is a set that has never worked and that is
|
|
64
|
+
* indistinguishable, from the profile page, from a set that is simply unused.
|
|
65
|
+
*
|
|
66
|
+
* SIBLING FILES, so nothing here is duplicated:
|
|
67
|
+
*
|
|
68
|
+
* - UserTwoFactorBackupCodeService.test.ts owns `regenerateForUser`,
|
|
69
|
+
* `consumeCode`, `countUnusedForUser`, `getStatusForUser`,
|
|
70
|
+
* `deleteAllForUser` and the `onBeforeCreate` hook.
|
|
71
|
+
* - UserTwoFactorBackupCodeAdminSurface.test.ts owns the UserService
|
|
72
|
+
* surfaces that read and clear these rows.
|
|
73
|
+
* - The crypto itself is Common/Tests/Server/Utils/TwoFactorBackupCode.test.ts.
|
|
74
|
+
* ---------------------------------------------------------------------------
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
const USER_ID: ObjectID = new ObjectID("44444444-4444-4444-8444-444444444444");
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Deliberately `any`. The Common suite type-checks its tests (unlike the App
|
|
81
|
+
* suite, which transpiles only), and jest's own `Mock` generic does not line up
|
|
82
|
+
* with the loosely typed `mock.calls` reads below.
|
|
83
|
+
*/
|
|
84
|
+
let createSpy: any;
|
|
85
|
+
let countBySpy: any;
|
|
86
|
+
let deleteBySpy: any;
|
|
87
|
+
let deleteOneByIdSpy: any;
|
|
88
|
+
let deleteAllForUserSpy: any;
|
|
89
|
+
|
|
90
|
+
/* Every row `create` was asked to write, in order. */
|
|
91
|
+
let createdRows: Array<UserTwoFactorBackupCode> = [];
|
|
92
|
+
|
|
93
|
+
type StubExistingCountFunction = (existing: number) => void;
|
|
94
|
+
|
|
95
|
+
/* How many rows the user is holding when the guard runs. */
|
|
96
|
+
const stubExistingCount: StubExistingCountFunction = (
|
|
97
|
+
existing: number,
|
|
98
|
+
): void => {
|
|
99
|
+
countBySpy.mockImplementation(async (): Promise<PositiveNumber> => {
|
|
100
|
+
return new PositiveNumber(existing);
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
type CreatedIdsFunction = () => Array<string>;
|
|
105
|
+
|
|
106
|
+
const createdIds: CreatedIdsFunction = (): Array<string> => {
|
|
107
|
+
return createdRows.map((row: UserTwoFactorBackupCode) => {
|
|
108
|
+
return row.id?.toString() || "";
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
type DeletedIdsFunction = () => Array<string>;
|
|
113
|
+
|
|
114
|
+
const deletedIds: DeletedIdsFunction = (): Array<string> => {
|
|
115
|
+
return (deleteOneByIdSpy.mock.calls as Array<Array<any>>).map(
|
|
116
|
+
(call: Array<any>) => {
|
|
117
|
+
return String(call[0]?.id);
|
|
118
|
+
},
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
beforeEach(() => {
|
|
123
|
+
jest.restoreAllMocks();
|
|
124
|
+
|
|
125
|
+
createdRows = [];
|
|
126
|
+
|
|
127
|
+
/*
|
|
128
|
+
* The real `create` returns the saved row WITH its `_id`, and
|
|
129
|
+
* `generateForUserIfNone` collects those ids so it can compensate by id
|
|
130
|
+
* later. A stub that returned an id-less row would make every compensation
|
|
131
|
+
* assertion below vacuously pass.
|
|
132
|
+
*/
|
|
133
|
+
createSpy = getJestSpyOn(
|
|
134
|
+
UserTwoFactorBackupCodeService,
|
|
135
|
+
"create",
|
|
136
|
+
).mockImplementation(async (input: any): Promise<UserTwoFactorBackupCode> => {
|
|
137
|
+
const row: UserTwoFactorBackupCode = input.data as UserTwoFactorBackupCode;
|
|
138
|
+
row.id = ObjectID.generate();
|
|
139
|
+
createdRows.push(row);
|
|
140
|
+
return row;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
countBySpy = getJestSpyOn(UserTwoFactorBackupCodeService, "countBy");
|
|
144
|
+
stubExistingCount(0);
|
|
145
|
+
|
|
146
|
+
deleteBySpy = getJestSpyOn(
|
|
147
|
+
UserTwoFactorBackupCodeService,
|
|
148
|
+
"deleteBy",
|
|
149
|
+
).mockImplementation(async (): Promise<number> => {
|
|
150
|
+
return 0;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
deleteOneByIdSpy = getJestSpyOn(
|
|
154
|
+
UserTwoFactorBackupCodeService,
|
|
155
|
+
"deleteOneById",
|
|
156
|
+
).mockImplementation(async (): Promise<number> => {
|
|
157
|
+
return 1;
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* Left calling through to the real implementation (which reaches the mocked
|
|
162
|
+
* `deleteBy` above) so that "the whole set was wiped" can be asserted at
|
|
163
|
+
* both levels: a future edit that reaches for `deleteAllForUser` and one
|
|
164
|
+
* that reaches for `deleteBy` directly are the same bug.
|
|
165
|
+
*/
|
|
166
|
+
deleteAllForUserSpy = getJestSpyOn(
|
|
167
|
+
UserTwoFactorBackupCodeService,
|
|
168
|
+
"deleteAllForUser",
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
* The deliberate-failure cases below hand a rejection to the CaptureSpan
|
|
173
|
+
* decorator and to the service's own cleanup logging. That is correct
|
|
174
|
+
* behaviour, and it is also a stack trace on stderr for a test that passed --
|
|
175
|
+
* silenced so a genuine error in this suite's output is still worth reading.
|
|
176
|
+
*/
|
|
177
|
+
getJestSpyOn(logger, "error").mockImplementation((): void => {
|
|
178
|
+
return undefined;
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
afterEach(() => {
|
|
183
|
+
jest.restoreAllMocks();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
describe("generateForUserIfNone -- when the user already has codes", () => {
|
|
187
|
+
/*
|
|
188
|
+
* THE REASON THE METHOD IS NOT JUST `regenerateForUser`.
|
|
189
|
+
*
|
|
190
|
+
* Adding a second authenticator app, or a security key alongside a phone,
|
|
191
|
+
* runs this exact path. A user who set up TOTP last year, printed the ten
|
|
192
|
+
* codes and filed them in a drawer must still be holding ten working codes
|
|
193
|
+
* afterwards. Returning null is how the API route knows to show nothing;
|
|
194
|
+
* writing nothing is how the drawer stays true.
|
|
195
|
+
*/
|
|
196
|
+
test("returns null and writes nothing at all", async () => {
|
|
197
|
+
stubExistingCount(3);
|
|
198
|
+
|
|
199
|
+
const codes: Array<string> | null =
|
|
200
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
201
|
+
userId: USER_ID,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
expect(codes).toBeNull();
|
|
205
|
+
expect(createSpy).not.toHaveBeenCalled();
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
/*
|
|
209
|
+
* The failure this pins is silent and permanent: a regeneration slipped into
|
|
210
|
+
* the enrolment path leaves the account with a fresh set the user never sees
|
|
211
|
+
* (the route shows codes only when a set is RETURNED) and a printed list that
|
|
212
|
+
* has quietly stopped working. Nothing on any screen changes.
|
|
213
|
+
*/
|
|
214
|
+
test("does not delete the set the user is already holding", async () => {
|
|
215
|
+
stubExistingCount(10);
|
|
216
|
+
|
|
217
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
218
|
+
userId: USER_ID,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
expect(deleteAllForUserSpy).not.toHaveBeenCalled();
|
|
222
|
+
expect(deleteBySpy).not.toHaveBeenCalled();
|
|
223
|
+
expect(deleteOneByIdSpy).not.toHaveBeenCalled();
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
/*
|
|
227
|
+
* One row is enough to mean "this account has a recovery route". A guard
|
|
228
|
+
* written as "fewer than a full set" would top a user up to ten and hand back
|
|
229
|
+
* the new codes only -- leaving them believing the returned list is all they
|
|
230
|
+
* have while older, still-live codes stay in circulation.
|
|
231
|
+
*/
|
|
232
|
+
test("treats even a single existing row as an existing set", async () => {
|
|
233
|
+
stubExistingCount(1);
|
|
234
|
+
|
|
235
|
+
await expect(
|
|
236
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
237
|
+
userId: USER_ID,
|
|
238
|
+
}),
|
|
239
|
+
).resolves.toBeNull();
|
|
240
|
+
|
|
241
|
+
expect(createSpy).not.toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
describe("generateForUserIfNone -- minting for an account with none", () => {
|
|
246
|
+
test("returns a full set of distinct plaintext codes", async () => {
|
|
247
|
+
const codes: Array<string> | null =
|
|
248
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
249
|
+
userId: USER_ID,
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
expect(codes).toHaveLength(BackupCodeSetSize);
|
|
253
|
+
expect(new Set(codes).size).toBe(BackupCodeSetSize);
|
|
254
|
+
expect(createSpy).toHaveBeenCalledTimes(BackupCodeSetSize);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("honours an explicit count", async () => {
|
|
258
|
+
const codes: Array<string> | null =
|
|
259
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
260
|
+
userId: USER_ID,
|
|
261
|
+
count: 4,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
expect(codes).toHaveLength(4);
|
|
265
|
+
expect(createSpy).toHaveBeenCalledTimes(4);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/*
|
|
269
|
+
* THE ONE THAT MATTERS MOST. These codes are shown to the user exactly once,
|
|
270
|
+
* on the screen that follows enrolment, and then the plaintext is gone
|
|
271
|
+
* forever. If the row held anything other than the digest the login path
|
|
272
|
+
* recomputes -- the code itself, a digest keyed to the wrong user -- the
|
|
273
|
+
* user would be filing away a list that has never worked, and would discover
|
|
274
|
+
* it while locked out.
|
|
275
|
+
*/
|
|
276
|
+
test("stores the digest the login path will recompute, never the code", async () => {
|
|
277
|
+
const codes: Array<string> | null =
|
|
278
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
279
|
+
userId: USER_ID,
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
const storedHashes: Array<string> = createdRows.map(
|
|
283
|
+
(row: UserTwoFactorBackupCode) => {
|
|
284
|
+
return row.codeHash || "";
|
|
285
|
+
},
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
const expectedHashes: Array<string> = (codes || []).map((code: string) => {
|
|
289
|
+
return TwoFactorBackupCode.hashCode({ code: code, userId: USER_ID });
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
expect(storedHashes).toEqual(expectedHashes);
|
|
293
|
+
|
|
294
|
+
const leaked: Array<string> = (codes || []).filter((code: string) => {
|
|
295
|
+
return storedHashes.includes(code);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
expect(leaked).toEqual([]);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test("owns every row to the user it was asked for", async () => {
|
|
302
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
303
|
+
userId: USER_ID,
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const violations: Array<string> = [];
|
|
307
|
+
|
|
308
|
+
for (const row of createdRows) {
|
|
309
|
+
if (row.userId?.toString() !== USER_ID.toString()) {
|
|
310
|
+
violations.push(String(row.userId));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
expect(violations).toEqual([]);
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
/*
|
|
318
|
+
* A row minted with a `usedAt` already on it is a code the user can never
|
|
319
|
+
* spend, counted against a total the profile page reports as if it were
|
|
320
|
+
* spendable.
|
|
321
|
+
*/
|
|
322
|
+
test("mints every row unused", async () => {
|
|
323
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
324
|
+
userId: USER_ID,
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
const spent: Array<unknown> = createdRows
|
|
328
|
+
.map((row: UserTwoFactorBackupCode) => {
|
|
329
|
+
return row.usedAt;
|
|
330
|
+
})
|
|
331
|
+
.filter((usedAt: Date | undefined) => {
|
|
332
|
+
return Boolean(usedAt);
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
expect(spent).toEqual([]);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
/*
|
|
339
|
+
* Every write goes through `isRoot`. The model denies create to everybody --
|
|
340
|
+
* including the code's own owner -- and these calls arrive from an enrolment
|
|
341
|
+
* request whose props belong to a logged-in user, so the props have to be
|
|
342
|
+
* replaced rather than forwarded or the whole mint fails permission checks.
|
|
343
|
+
*/
|
|
344
|
+
test("writes as root, because nothing else is permitted to", async () => {
|
|
345
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
346
|
+
userId: USER_ID,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
const violations: Array<unknown> = [];
|
|
350
|
+
|
|
351
|
+
for (const call of createSpy.mock.calls) {
|
|
352
|
+
const input: any = (call as Array<unknown>)[0];
|
|
353
|
+
|
|
354
|
+
if (input?.props?.isRoot !== true) {
|
|
355
|
+
violations.push(input?.props);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
expect(violations).toEqual([]);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
/*
|
|
363
|
+
* THE DIFFERENCE FROM `regenerateForUser`, which opens by deleting.
|
|
364
|
+
*
|
|
365
|
+
* Two enrolments finishing together can both read a zero count. If this one
|
|
366
|
+
* cleared the table first, the set the other call has already rendered onto
|
|
367
|
+
* the user's screen would be dead while they were still copying it down --
|
|
368
|
+
* and nothing would tell them. Not deleting makes the race end with two LIVE
|
|
369
|
+
* sets instead, which is more codes than intended and no lie.
|
|
370
|
+
*/
|
|
371
|
+
test("never deletes first, unlike a regeneration", async () => {
|
|
372
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
373
|
+
userId: USER_ID,
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
expect(deleteAllForUserSpy).not.toHaveBeenCalled();
|
|
377
|
+
expect(deleteBySpy).not.toHaveBeenCalled();
|
|
378
|
+
expect(deleteOneByIdSpy).not.toHaveBeenCalled();
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
/*
|
|
382
|
+
* The guard is only as good as its query, and it has two halves that fail
|
|
383
|
+
* differently.
|
|
384
|
+
*
|
|
385
|
+
* SCOPE: an unscoped count would read the whole table and refuse to mint for
|
|
386
|
+
* anybody the moment one account had codes; a count that ran with the
|
|
387
|
+
* caller's props rather than root would hit the model's empty read
|
|
388
|
+
* permissions and either throw or come back zero -- and a zero here means
|
|
389
|
+
* minting on top of a set the user already holds.
|
|
390
|
+
*
|
|
391
|
+
* UNUSED, NOT ALL. `usedAt IS NULL` has to be in the predicate, because the
|
|
392
|
+
* question this guard answers is "does this account have a way back in" and
|
|
393
|
+
* a user who has spent all ten of theirs does not. Counting spent rows as
|
|
394
|
+
* codes would mean the one account that most needs a fresh set at enrolment
|
|
395
|
+
* -- the one that has burned every code it had -- is the one guaranteed not
|
|
396
|
+
* to get one. That is the same shape as the bug this whole change exists to
|
|
397
|
+
* fix, so it is asserted on the query rather than inferred.
|
|
398
|
+
*/
|
|
399
|
+
test("counts this user's UNUSED rows, as root, once", async () => {
|
|
400
|
+
stubExistingCount(0);
|
|
401
|
+
|
|
402
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
403
|
+
userId: USER_ID,
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
expect(countBySpy).toHaveBeenCalledTimes(1);
|
|
407
|
+
|
|
408
|
+
const call: { query: Record<string, any>; props: Record<string, unknown> } =
|
|
409
|
+
(
|
|
410
|
+
countBySpy.mock.calls[0] as Array<{
|
|
411
|
+
query: Record<string, any>;
|
|
412
|
+
props: Record<string, unknown>;
|
|
413
|
+
}>
|
|
414
|
+
)[0]!;
|
|
415
|
+
|
|
416
|
+
expect(call.query["userId"]).toEqual(USER_ID);
|
|
417
|
+
expect(Object.keys(call.query).sort()).toEqual(["usedAt", "userId"]);
|
|
418
|
+
|
|
419
|
+
/*
|
|
420
|
+
* A bare `usedAt: null` is DROPPED by TypeORM rather than compiled to
|
|
421
|
+
* `IS NULL`, which would silently turn this back into a count of every
|
|
422
|
+
* row. The predicate has to be the QueryHelper.isNull() sentinel, so its
|
|
423
|
+
* presence is what is asserted rather than its literal value.
|
|
424
|
+
*/
|
|
425
|
+
expect(call.query["usedAt"]).toBeDefined();
|
|
426
|
+
expect(call.query["usedAt"]).not.toBeNull();
|
|
427
|
+
|
|
428
|
+
expect(call.props).toEqual({ isRoot: true });
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
/*
|
|
432
|
+
* The account that has burned every code it had is the one this guard used
|
|
433
|
+
* to fail: it reads as "has codes" on a naive count, so enrolling a new
|
|
434
|
+
* authenticator would mint nothing and the user would leave setup with a
|
|
435
|
+
* recovery route made entirely of codes that no longer work.
|
|
436
|
+
*/
|
|
437
|
+
test("mints for an account whose codes have all been spent", async () => {
|
|
438
|
+
stubExistingCount(0);
|
|
439
|
+
|
|
440
|
+
const codes: Array<string> | null =
|
|
441
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
442
|
+
userId: USER_ID,
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
expect(codes).not.toBeNull();
|
|
446
|
+
expect(codes).toHaveLength(BackupCodeSetSize);
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
/*
|
|
450
|
+
* Counted BEFORE anything is generated. A method that minted first and
|
|
451
|
+
* checked afterwards would have written the rows it then decided it did not
|
|
452
|
+
* want.
|
|
453
|
+
*/
|
|
454
|
+
test("checks the count before writing anything", async () => {
|
|
455
|
+
await UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
456
|
+
userId: USER_ID,
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
const countOrder: number = countBySpy.mock.invocationCallOrder[0]!;
|
|
460
|
+
const firstCreateOrder: number = createSpy.mock.invocationCallOrder[0]!;
|
|
461
|
+
|
|
462
|
+
expect(countOrder).toBeLessThan(firstCreateOrder);
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
describe("generateForUserIfNone -- when a write fails partway through", () => {
|
|
467
|
+
type FailOnNthCreateFunction = (nth: number) => void;
|
|
468
|
+
|
|
469
|
+
const failOnNthCreate: FailOnNthCreateFunction = (nth: number): void => {
|
|
470
|
+
let created: number = 0;
|
|
471
|
+
|
|
472
|
+
createSpy.mockImplementation(
|
|
473
|
+
async (input: any): Promise<UserTwoFactorBackupCode> => {
|
|
474
|
+
created++;
|
|
475
|
+
|
|
476
|
+
if (created === nth) {
|
|
477
|
+
throw new Error("Database not connected");
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
const row: UserTwoFactorBackupCode =
|
|
481
|
+
input.data as UserTwoFactorBackupCode;
|
|
482
|
+
row.id = ObjectID.generate();
|
|
483
|
+
createdRows.push(row);
|
|
484
|
+
return row;
|
|
485
|
+
},
|
|
486
|
+
);
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
/*
|
|
490
|
+
* THE STATE THAT LOOKS LIKE THE GOOD ONE.
|
|
491
|
+
*
|
|
492
|
+
* A failure on the fifth insert leaves four rows the caller never returned to
|
|
493
|
+
* anybody, because it threw. `getStatusForUser` would then report "4 backup
|
|
494
|
+
* codes" to a user holding none of them -- and that is worse than reporting
|
|
495
|
+
* zero, because zero is a warning the profile page already knows how to show
|
|
496
|
+
* and the user can act on.
|
|
497
|
+
*/
|
|
498
|
+
test("rethrows the original failure", async () => {
|
|
499
|
+
failOnNthCreate(5);
|
|
500
|
+
|
|
501
|
+
await expect(
|
|
502
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
503
|
+
userId: USER_ID,
|
|
504
|
+
}),
|
|
505
|
+
).rejects.toThrow("Database not connected");
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
/*
|
|
509
|
+
* BY ID, and only the ids THIS call wrote.
|
|
510
|
+
*
|
|
511
|
+
* `deleteAllForUser` would be the easy compensation and is the wrong one: the
|
|
512
|
+
* concurrent enrolment described above may have just written a set that the
|
|
513
|
+
* other user's screen is displaying, and a blanket delete would take it with
|
|
514
|
+
* this call's half-written one. The user would be left copying down ten codes
|
|
515
|
+
* that were already gone.
|
|
516
|
+
*/
|
|
517
|
+
test("compensates only the rows it actually wrote", async () => {
|
|
518
|
+
failOnNthCreate(5);
|
|
519
|
+
|
|
520
|
+
await expect(
|
|
521
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
522
|
+
userId: USER_ID,
|
|
523
|
+
}),
|
|
524
|
+
).rejects.toThrow("Database not connected");
|
|
525
|
+
|
|
526
|
+
expect(createdRows).toHaveLength(4);
|
|
527
|
+
expect(deletedIds()).toEqual(createdIds());
|
|
528
|
+
|
|
529
|
+
expect(deleteAllForUserSpy).not.toHaveBeenCalled();
|
|
530
|
+
expect(deleteBySpy).not.toHaveBeenCalled();
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
/*
|
|
534
|
+
* The compensating delete faces the same permission wall as the write did.
|
|
535
|
+
* Deleting with anything other than root would fail every time, turning the
|
|
536
|
+
* rollback into a no-op that logs and moves on -- which is exactly the
|
|
537
|
+
* partial set this whole branch exists to avoid, arrived at quietly.
|
|
538
|
+
*/
|
|
539
|
+
test("compensates as root", async () => {
|
|
540
|
+
failOnNthCreate(3);
|
|
541
|
+
|
|
542
|
+
await expect(
|
|
543
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
544
|
+
userId: USER_ID,
|
|
545
|
+
}),
|
|
546
|
+
).rejects.toThrow("Database not connected");
|
|
547
|
+
|
|
548
|
+
const violations: Array<unknown> = [];
|
|
549
|
+
|
|
550
|
+
for (const call of deleteOneByIdSpy.mock.calls) {
|
|
551
|
+
const input: any = (call as Array<unknown>)[0];
|
|
552
|
+
|
|
553
|
+
if (input?.props?.isRoot !== true) {
|
|
554
|
+
violations.push(input?.props);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
expect(violations).toEqual([]);
|
|
559
|
+
expect(deleteOneByIdSpy.mock.calls.length).toBe(2);
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
/*
|
|
563
|
+
* The cleanup runs AFTER the write that failed, or it cleans up nothing.
|
|
564
|
+
*/
|
|
565
|
+
test("cleans up after the failure rather than before it", async () => {
|
|
566
|
+
failOnNthCreate(5);
|
|
567
|
+
|
|
568
|
+
await expect(
|
|
569
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
570
|
+
userId: USER_ID,
|
|
571
|
+
}),
|
|
572
|
+
).rejects.toThrow("Database not connected");
|
|
573
|
+
|
|
574
|
+
const firstDeleteOrder: number = deleteOneByIdSpy.mock
|
|
575
|
+
.invocationCallOrder[0] as number;
|
|
576
|
+
const lastCreateOrder: number = createSpy.mock.invocationCallOrder[
|
|
577
|
+
createSpy.mock.invocationCallOrder.length - 1
|
|
578
|
+
] as number;
|
|
579
|
+
|
|
580
|
+
expect(firstDeleteOrder).toBeGreaterThan(lastCreateOrder);
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
/*
|
|
584
|
+
* The ORIGINAL failure is what the caller has to see. Reporting the cleanup
|
|
585
|
+
* error instead would tell an operator why the rollback did not happen while
|
|
586
|
+
* hiding why the write did not -- and the second is the one they can act on.
|
|
587
|
+
*
|
|
588
|
+
* And one failing delete must not abandon the rest: every id that was written
|
|
589
|
+
* is still attempted, because each row left behind is another code counted
|
|
590
|
+
* against a user who has never seen it.
|
|
591
|
+
*/
|
|
592
|
+
test("reports the write failure even when the cleanup also fails", async () => {
|
|
593
|
+
failOnNthCreate(4);
|
|
594
|
+
|
|
595
|
+
let firstCleanup: boolean = true;
|
|
596
|
+
|
|
597
|
+
deleteOneByIdSpy.mockImplementation(async (): Promise<number> => {
|
|
598
|
+
if (firstCleanup) {
|
|
599
|
+
firstCleanup = false;
|
|
600
|
+
throw new Error("the cleanup failed");
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return 1;
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
await expect(
|
|
607
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
608
|
+
userId: USER_ID,
|
|
609
|
+
}),
|
|
610
|
+
).rejects.toThrow("Database not connected");
|
|
611
|
+
|
|
612
|
+
expect(deletedIds()).toEqual(createdIds());
|
|
613
|
+
});
|
|
614
|
+
|
|
615
|
+
/*
|
|
616
|
+
* Nothing was written, so there is nothing to compensate. A rollback that
|
|
617
|
+
* fired anyway would be reaching for rows this call does not own -- and on
|
|
618
|
+
* the `deleteAllForUser` shape it would delete a concurrent enrolment's set
|
|
619
|
+
* on the way past.
|
|
620
|
+
*/
|
|
621
|
+
test("does not delete anything when the very first write fails", async () => {
|
|
622
|
+
failOnNthCreate(1);
|
|
623
|
+
|
|
624
|
+
await expect(
|
|
625
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
626
|
+
userId: USER_ID,
|
|
627
|
+
}),
|
|
628
|
+
).rejects.toThrow("Database not connected");
|
|
629
|
+
|
|
630
|
+
expect(createdRows).toEqual([]);
|
|
631
|
+
expect(deleteOneByIdSpy).not.toHaveBeenCalled();
|
|
632
|
+
expect(deleteAllForUserSpy).not.toHaveBeenCalled();
|
|
633
|
+
expect(deleteBySpy).not.toHaveBeenCalled();
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
/*
|
|
637
|
+
* A failure in the COUNT is not a licence to mint. The guard has not run, so
|
|
638
|
+
* the account may well be holding a printed set; writing on top of it -- or
|
|
639
|
+
* worse, compensating over it -- on the strength of a query that never
|
|
640
|
+
* answered is how a database blip becomes lost recovery codes.
|
|
641
|
+
*/
|
|
642
|
+
test("does not write when the count itself fails", async () => {
|
|
643
|
+
countBySpy.mockImplementation(async (): Promise<PositiveNumber> => {
|
|
644
|
+
throw new Error("Database not connected");
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
await expect(
|
|
648
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
649
|
+
userId: USER_ID,
|
|
650
|
+
}),
|
|
651
|
+
).rejects.toThrow("Database not connected");
|
|
652
|
+
|
|
653
|
+
expect(createSpy).not.toHaveBeenCalled();
|
|
654
|
+
expect(deleteOneByIdSpy).not.toHaveBeenCalled();
|
|
655
|
+
expect(deleteBySpy).not.toHaveBeenCalled();
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
/*
|
|
659
|
+
* A create that comes back without an id is the one failure this loop cannot
|
|
660
|
+
* shrug off, because the id is the ONLY handle the compensation has.
|
|
661
|
+
*
|
|
662
|
+
* Skipping such a row looks harmless -- it is one row, and it was written
|
|
663
|
+
* successfully. It is not: the row is in the database and absent from the
|
|
664
|
+
* cleanup list, so a failure later in the same loop leaves it behind. That
|
|
665
|
+
* is precisely the state the rollback exists to prevent, a code nobody has
|
|
666
|
+
* ever seen that `getStatusForUser` counts as part of a recovery route, and
|
|
667
|
+
* it would be reached silently. So the mint fails at that point instead, and
|
|
668
|
+
* everything written up to it is removed.
|
|
669
|
+
*/
|
|
670
|
+
test("fails the mint rather than losing track of a written row", async () => {
|
|
671
|
+
let created: number = 0;
|
|
672
|
+
|
|
673
|
+
createSpy.mockImplementation(
|
|
674
|
+
async (input: any): Promise<UserTwoFactorBackupCode> => {
|
|
675
|
+
created++;
|
|
676
|
+
|
|
677
|
+
const row: UserTwoFactorBackupCode =
|
|
678
|
+
input.data as UserTwoFactorBackupCode;
|
|
679
|
+
|
|
680
|
+
/*
|
|
681
|
+
* The third row comes back with no id, standing in for a driver or a
|
|
682
|
+
* hook that dropped it. The first two are written normally, so the
|
|
683
|
+
* assertion below can show they were cleaned up.
|
|
684
|
+
*/
|
|
685
|
+
if (created !== 3) {
|
|
686
|
+
row.id = ObjectID.generate();
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
return row;
|
|
690
|
+
},
|
|
691
|
+
);
|
|
692
|
+
|
|
693
|
+
await expect(
|
|
694
|
+
UserTwoFactorBackupCodeService.generateForUserIfNone({
|
|
695
|
+
userId: USER_ID,
|
|
696
|
+
}),
|
|
697
|
+
).rejects.toThrow(/id/i);
|
|
698
|
+
|
|
699
|
+
/* It stopped there rather than writing the remaining seven. */
|
|
700
|
+
expect(createSpy).toHaveBeenCalledTimes(3);
|
|
701
|
+
|
|
702
|
+
/* And it took the two trackable rows with it. */
|
|
703
|
+
expect(deleteOneByIdSpy).toHaveBeenCalledTimes(2);
|
|
704
|
+
});
|
|
705
|
+
});
|