@oneuptime/common 12.0.34 → 13.0.1
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/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/CloudResource.ts +45 -7
- package/Models/DatabaseModels/CodeRepository.ts +85 -0
- package/Models/DatabaseModels/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/User.ts +51 -2
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
- package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
- package/Models/DatabaseModels/VMwareResource.ts +1149 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
- package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
- package/Server/API/AIAgentDataAPI.ts +79 -4
- package/Server/API/AIAgentGitHubAPI.ts +523 -0
- package/Server/API/AIChatAPI.ts +20 -1
- package/Server/API/BillingAPI.ts +33 -0
- package/Server/API/DashboardAPI.ts +10 -0
- package/Server/API/GitHubAPI.ts +47 -5
- package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
- package/Server/API/UserWebAuthnAPI.ts +21 -1
- package/Server/API/VMwareResourceAPI.ts +143 -0
- package/Server/EnvironmentConfig.ts +47 -16
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Middleware/IdentityRateLimit.ts +101 -0
- package/Server/Services/AIRunService.ts +13 -0
- package/Server/Services/BillingPaymentMethodService.ts +99 -28
- package/Server/Services/BillingService.ts +287 -20
- package/Server/Services/CloudResourceInstanceService.ts +70 -0
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/MobilePasskeyLoginService.ts +216 -0
- package/Server/Services/MonitorService.ts +51 -1
- package/Server/Services/MonitorTemplateService.ts +218 -35
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +481 -42
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/OpenTelemetryIngestService.ts +17 -0
- package/Server/Services/PayAsYouGoBillingService.ts +446 -0
- package/Server/Services/ProjectService.ts +46 -2
- package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
- package/Server/Services/TeamMemberService.ts +96 -36
- package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
- package/Server/Services/TelemetryUsageBillingService.ts +95 -5
- package/Server/Services/TraceAggregationService.ts +5 -4
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Services/UserWebAuthnService.ts +592 -133
- package/Server/Services/VMwareResourceService.ts +648 -0
- package/Server/Services/VMwareVCenterFeedService.ts +99 -0
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
- package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
- package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
- package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
- package/Server/Services/VMwareVCenterService.ts +629 -0
- package/Server/Services/WorkflowVariableService.ts +203 -0
- package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +225 -17
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +12 -1
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +35 -2
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +502 -38
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
- package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +16 -1
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +264 -10
- package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
- package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
- package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
- package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
- package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
- package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
- package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
- package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
- package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
- package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
- package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
- package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
- package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +158 -1
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
- package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
- package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
- package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
- package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
- package/Tests/Server/Services/BillingService.test.ts +26 -11
- package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
- package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +183 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
- package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
- package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
- package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
- package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
- package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
- package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
- package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
- package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
- package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
- package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
- package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
- package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
- package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
- package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +559 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +309 -4
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +586 -10
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
- package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +691 -8
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +40 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
- package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
- package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
- package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
- package/Tests/Types/SignupPassword.test.ts +205 -0
- package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
- package/Tests/Types/SupportedLanguages.test.ts +119 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
- package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
- package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
- package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
- package/Tests/UI/ReactDomBuild.test.ts +104 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +143 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +153 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +30 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
- package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
- package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
- package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
- package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
- package/Tests/__mocks__/simplewebauthn.js +33 -4
- package/Types/AI/CodeFixTaskContext.ts +122 -0
- package/Types/AI/CodeFixTaskType.ts +62 -0
- package/Types/Accounts/AccountsLanguage.ts +1 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/Calendar/CalendarEvent.ts +16 -0
- package/Types/Cloud/CloudPlatform.ts +372 -0
- package/Types/CodeRepository/GitHubCommand.ts +69 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
- package/Types/Dashboard/DashboardLanguage.ts +1 -0
- package/Types/Dashboard/DashboardTemplates.ts +314 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +16 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
- package/Types/Monitor/MonitorStep.ts +78 -17
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
- package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
- package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
- package/Types/Monitor/MonitorType.ts +24 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
- package/Types/Password.ts +84 -5
- package/Types/Permission.ts +265 -0
- package/Types/Probe/RequestFailedDetails.ts +7 -0
- package/Types/Runner/RunnerLiveStatus.ts +1 -1
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Typings/Index.d.ts +63 -0
- package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/Components/Forms/BasicForm.tsx +44 -2
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
- package/UI/Components/Forms/Fields/FormField.tsx +16 -3
- package/UI/Components/Forms/ModelForm.tsx +159 -5
- package/UI/Components/Forms/Types/Field.ts +8 -1
- package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
- package/UI/Components/Icon/Icon.tsx +16 -0
- package/UI/Components/Input/Input.tsx +42 -7
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
- package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
- package/UI/Components/ModelTable/ModelTable.tsx +14 -6
- package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
- package/UI/Components/Tooltip/Tooltip.tsx +52 -6
- package/UI/Utils/DashboardStackingLayers.ts +85 -0
- package/UI/Utils/LabelRuleImportExport.ts +310 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
- package/UI/Utils/TelemetryService.ts +4 -3
- package/UI/Utils/UseDashboardGridDnd.ts +4 -1
- package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
- package/UI/Utils/WebAuthn.ts +220 -0
- package/UI/esbuild-config.js +10 -0
- package/Utils/API.ts +34 -0
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
- package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
- package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
- package/Utils/Dashboard/Components/Index.ts +16 -0
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/LabelRuleImportExport.ts +496 -0
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
- package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
- package/Utils/Telemetry/EntityKey.ts +19 -0
- package/Utils/Telemetry/EntityRelationship.ts +19 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +44 -7
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +57 -4
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
- package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
- package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
- package/build/dist/Server/API/AIChatAPI.js +19 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +22 -0
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +10 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +33 -5
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
- package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +44 -12
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +14 -1
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
- package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +210 -22
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
- package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
- package/build/dist/Server/Services/MonitorService.js +34 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +167 -30
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +394 -38
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +38 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +85 -28
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +5 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Services/VMwareResourceService.js +395 -0
- package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
- package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +166 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +12 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +20 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +2 -1
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +382 -36
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +14 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +206 -14
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
- package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +1 -0
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Exception/EgressGuardException.js +59 -0
- package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +13 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +61 -18
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +23 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Password.js +63 -5
- package/build/dist/Types/Password.js.map +1 -1
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
- package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +21 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +14 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +37 -8
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
- package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +2 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
- package/build/dist/UI/Utils/WebAuthn.js +121 -0
- package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
- package/build/dist/Utils/API.js +29 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
|
@@ -9,6 +9,7 @@ import { WidenSecurityEventLastErrorColumns1789800000000 } from "../../../Server
|
|
|
9
9
|
import SchemaMigrations from "../../../Server/Infrastructure/Postgres/SchemaMigrations/Index";
|
|
10
10
|
import DetectionRuleService from "../../../Server/Services/DetectionRuleService";
|
|
11
11
|
import GoogleSecOpsConnectionService from "../../../Server/Services/GoogleSecOpsConnectionService";
|
|
12
|
+
import { REDACTED, redactLogString } from "../../../Server/Utils/LogRedaction";
|
|
12
13
|
import ConnectorErrorMessage, {
|
|
13
14
|
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
14
15
|
} from "../../../Server/Utils/SecurityEvent/ConnectorErrorMessage";
|
|
@@ -36,30 +37,49 @@ import { beforeAll, describe, expect, test } from "@jest/globals";
|
|
|
36
37
|
* varchar(500), and DatabaseService.checkMaxLengthOfFields rejects any
|
|
37
38
|
* string longer than a column's declared max with a BadDataException. The
|
|
38
39
|
* poller's catch block writes { lastPolledAt, lastError } to record a
|
|
39
|
-
* failed poll, and a Google SecOps client error is a
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
40
|
+
* failed poll, and a Google SecOps client error is a short prefix plus an
|
|
41
|
+
* echo of whatever Google sent back — comfortably past the bound. So the
|
|
42
|
+
* write that was recording the failure became a second failure, threw out
|
|
43
|
+
* of the catch block, and took pollAllDueConnections down with it:
|
|
44
|
+
* nothing stamped, every remaining connection in that tick skipped,
|
|
44
45
|
* repeated every minute forever. The customer's row read lastPolledAt =
|
|
45
46
|
* null AND lastError = null, because the two columns meant to explain the
|
|
46
47
|
* outage were exactly the ones the outage prevented from being written.
|
|
47
48
|
* DetectionRuleEvaluator had the identical pattern on DetectionRule
|
|
48
49
|
* .lastError, where ClickHouse errors echo the whole compiled query.
|
|
49
50
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
51
|
+
* THE CURRENT CONTRACT — and why the old cap is gone. GoogleSecOpsClient
|
|
52
|
+
* used to clip every echoed body with `.slice(0, BODY_ECHO_LIMIT)`, and an
|
|
53
|
+
* earlier version of this file leaned on that cap as its bound: read the
|
|
54
|
+
* number out of the client, assert the stored value was prefix + exactly
|
|
55
|
+
* that many characters. That cap was deliberately removed. The echo sites
|
|
56
|
+
* now run the body through the client's own redactErrorBody() (which
|
|
57
|
+
* decodes nested JSON before handing it to redactLogString /
|
|
58
|
+
* redactLogValue), which strips credentials but truncates nothing — an
|
|
59
|
+
* operator gets the WHOLE redacted diagnostic. GoogleSecOpsPoller stores it
|
|
60
|
+
* with ConnectorErrorMessage.toMessage(error, { truncate: false }), opting
|
|
61
|
+
* out of the connector clamp entirely, which is only safe because
|
|
62
|
+
* lastError is unbounded `text`. So the property that makes echoing a
|
|
63
|
+
* customer-supplied body safe is REDACTION, not length, and the property
|
|
64
|
+
* that makes storing it safe is that the column has no maximum at all.
|
|
65
|
+
*
|
|
66
|
+
* Five things have to line up, and a regression in any one of them brings
|
|
67
|
+
* the silent outage — or a stored credential — back:
|
|
52
68
|
* 1. both entities declare VeryLongText / `text` with no length, so
|
|
53
69
|
* getMaxLengthFromTableColumnType returns undefined and the length
|
|
54
70
|
* check cannot reject a stored error at all,
|
|
55
71
|
* 2. the widest message the producers can actually emit really is
|
|
56
72
|
* accepted — pinned end to end, from every one of the client's own
|
|
57
73
|
* failure paths through ConnectorErrorMessage.toMessage to the real
|
|
58
|
-
* DatabaseService length check,
|
|
59
|
-
*
|
|
74
|
+
* DatabaseService length check, with the poller's own
|
|
75
|
+
* { truncate: false } storing it whole,
|
|
76
|
+
* 3. every echoed body is redacted, so a private_key / client_secret /
|
|
77
|
+
* token in a response body — including one buried in nested JSON
|
|
78
|
+
* inside an error message — never reaches the column verbatim,
|
|
79
|
+
* 4. the migration widens the live Postgres columns with ALTER COLUMN
|
|
60
80
|
* ... TYPE text rather than DROP + ADD, which would discard every
|
|
61
81
|
* error already stored, and
|
|
62
|
-
*
|
|
82
|
+
* 5. the migration is registered in SchemaMigrations/Index.ts — an
|
|
63
83
|
* unregistered migration never runs, so production would stay on
|
|
64
84
|
* varchar(500) while every entity-level assertion here still passed.
|
|
65
85
|
* That combination is precisely how this failure comes back.
|
|
@@ -92,89 +112,6 @@ const MIGRATIONS_INDEX_SOURCE: string = fs.readFileSync(
|
|
|
92
112
|
"utf8",
|
|
93
113
|
);
|
|
94
114
|
|
|
95
|
-
const GOOGLE_SECOPS_CLIENT_SOURCE: string = fs.readFileSync(
|
|
96
|
-
path.join(
|
|
97
|
-
__dirname,
|
|
98
|
-
"..",
|
|
99
|
-
"..",
|
|
100
|
-
"..",
|
|
101
|
-
"Server",
|
|
102
|
-
"Utils",
|
|
103
|
-
"SecurityEvent",
|
|
104
|
-
"GoogleSecOps",
|
|
105
|
-
"GoogleSecOpsClient.ts",
|
|
106
|
-
),
|
|
107
|
-
"utf8",
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
/*
|
|
111
|
-
* How many characters of whatever Google sent back the client is willing to
|
|
112
|
-
* echo, read out of the client itself rather than restated here. Restating
|
|
113
|
-
* it would let the client widen its echo without a single test noticing
|
|
114
|
-
* that the stored value grew with it.
|
|
115
|
-
*
|
|
116
|
-
* The premise this file was written on — "there are two error templates and
|
|
117
|
-
* both write `responseText.slice(0, 500)`" — no longer holds. The client
|
|
118
|
-
* reports the failures that arrive on an HTTP 200 as well now (an empty
|
|
119
|
-
* body, a body that is not JSON, a shape the parser does not recognize, a
|
|
120
|
-
* query Chronicle rejected in band), and each of those echoes the thing it
|
|
121
|
-
* could not read through a NAMED constant rather than an inline literal. A
|
|
122
|
-
* scan pinned to the inline form kept passing while it covered less than a
|
|
123
|
-
* third of the sites, which is the failure mode this function exists to
|
|
124
|
-
* prevent. So: every `.slice(0, N)` in the client, named bounds resolved.
|
|
125
|
-
*/
|
|
126
|
-
function responseBodyEchoLimits(): Array<number> {
|
|
127
|
-
const pattern: RegExp = /\.slice\(\s*0\s*,\s*(\w+)\s*\)/g;
|
|
128
|
-
const limits: Array<number> = [];
|
|
129
|
-
|
|
130
|
-
let match: RegExpExecArray | null = pattern.exec(GOOGLE_SECOPS_CLIENT_SOURCE);
|
|
131
|
-
while (match) {
|
|
132
|
-
limits.push(resolveNumericToken(String(match[1])));
|
|
133
|
-
match = pattern.exec(GOOGLE_SECOPS_CLIENT_SOURCE);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return limits;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/*
|
|
140
|
-
* An inline bound is its own value; a named one is resolved out of the
|
|
141
|
-
* client's `const NAME: number = N` declaration. An unresolvable name
|
|
142
|
-
* throws rather than becoming NaN and satisfying "they are all equal" by
|
|
143
|
-
* accident.
|
|
144
|
-
*/
|
|
145
|
-
const INLINE_BOUND_PATTERN: RegExp = /^\d+$/;
|
|
146
|
-
|
|
147
|
-
function resolveNumericToken(token: string): number {
|
|
148
|
-
if (INLINE_BOUND_PATTERN.test(token)) {
|
|
149
|
-
return Number(token);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const declaration: RegExpMatchArray | null =
|
|
153
|
-
GOOGLE_SECOPS_CLIENT_SOURCE.match(
|
|
154
|
-
new RegExp(`\\b${token}\\s*:\\s*number\\s*=\\s*(\\d+)`),
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
if (!declaration || declaration[1] === undefined) {
|
|
158
|
-
throw new Error(
|
|
159
|
-
`GoogleSecOpsClient truncates with .slice(0, ${token}) but declares no numeric ${token} — this file cannot bound what it stores`,
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return Number(declaration[1]);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function responseBodyEchoLimit(): number {
|
|
167
|
-
const limits: Array<number> = responseBodyEchoLimits();
|
|
168
|
-
|
|
169
|
-
if (limits.length === 0) {
|
|
170
|
-
throw new Error(
|
|
171
|
-
"GoogleSecOpsClient no longer truncates anything with .slice(0, N) — this file's premise, that every stored error is bounded by a cap the client applies before ConnectorErrorMessage ever sees it, needs revisiting",
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return Math.max(...limits);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
115
|
const { privateKey } = generateKeyPairSync("rsa", {
|
|
179
116
|
modulusLength: 2048,
|
|
180
117
|
privateKeyEncoding: { type: "pkcs8", format: "pem" },
|
|
@@ -184,8 +121,8 @@ const { privateKey } = generateKeyPairSync("rsa", {
|
|
|
184
121
|
/*
|
|
185
122
|
* The real token endpoint, not an example.com stand-in: the client now
|
|
186
123
|
* refuses a token_uri outside Google's hosts, because that URL is
|
|
187
|
-
* customer-supplied and
|
|
188
|
-
*
|
|
124
|
+
* customer-supplied and whatever answers it is echoed (redacted, and in
|
|
125
|
+
* full) straight into lastError. Nothing here reaches the network — the
|
|
189
126
|
* fetch is injected — so the host only has to satisfy that check.
|
|
190
127
|
*/
|
|
191
128
|
const SERVICE_ACCOUNT_JSON: string = JSON.stringify({
|
|
@@ -198,10 +135,76 @@ const INSTANCE: string =
|
|
|
198
135
|
"projects/my-project/locations/us/instances/3f0a-instance";
|
|
199
136
|
|
|
200
137
|
/*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
138
|
+
* The client no longer clips what it echoes, so the width of a stored error
|
|
139
|
+
* is the width of the body Google sent. This is deliberately FAR wider than
|
|
140
|
+
* MAX_CONNECTOR_ERROR_MESSAGE_LENGTH — four times it — for two reasons:
|
|
141
|
+
* the resulting message is one the connector clamp WOULD cut if the poller
|
|
142
|
+
* had not opted out, so the untruncated-storage path is genuinely
|
|
143
|
+
* exercised rather than trivially satisfied, and it is far past the
|
|
144
|
+
* varchar(500) bound whose reappearance is the outage this file guards.
|
|
145
|
+
* It is a local constant on purpose: nothing in the client bounds it any
|
|
146
|
+
* more, so there is nothing left to read out of the client.
|
|
147
|
+
*/
|
|
148
|
+
const OVERSIZED_RESPONSE_BODY_LENGTH: number =
|
|
149
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH * 4;
|
|
150
|
+
|
|
151
|
+
const OVERSIZED_RESPONSE_BODY: string = "x".repeat(
|
|
152
|
+
OVERSIZED_RESPONSE_BODY_LENGTH,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
/*
|
|
156
|
+
* Credential-shaped values, in the shapes a token endpoint or a Chronicle
|
|
157
|
+
* error envelope actually carries them. None of these is real; what matters
|
|
158
|
+
* is that each one is the sort of value the redactor must never let through
|
|
159
|
+
* into a column an operator reads in the dashboard.
|
|
160
|
+
*/
|
|
161
|
+
const LEAKED_CLIENT_SECRET: string = "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9a3b";
|
|
162
|
+
const LEAKED_ACCESS_TOKEN: string =
|
|
163
|
+
"ya29.c.b0Aaekm1J7NotARealTokenValue0123456789";
|
|
164
|
+
const LEAKED_PRIVATE_KEY_BODY: string =
|
|
165
|
+
"MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEANotARealKey";
|
|
166
|
+
const LEAKED_PRIVATE_KEY_PEM: string = `-----BEGIN PRIVATE KEY-----\n${LEAKED_PRIVATE_KEY_BODY}\n-----END PRIVATE KEY-----\n`;
|
|
167
|
+
|
|
168
|
+
const LEAKED_SECRETS: Array<string> = [
|
|
169
|
+
LEAKED_CLIENT_SECRET,
|
|
170
|
+
LEAKED_ACCESS_TOKEN,
|
|
171
|
+
LEAKED_PRIVATE_KEY_BODY,
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
/*
|
|
175
|
+
* Credentials sitting in their own fields, which is what an OAuth error
|
|
176
|
+
* response or a misconfigured proxy echo looks like.
|
|
177
|
+
*/
|
|
178
|
+
const FLAT_CREDENTIAL_BODY: string = JSON.stringify({
|
|
179
|
+
error: {
|
|
180
|
+
code: 403,
|
|
181
|
+
status: "PERMISSION_DENIED",
|
|
182
|
+
message: "The caller does not have permission.",
|
|
183
|
+
client_secret: LEAKED_CLIENT_SECRET,
|
|
184
|
+
access_token: LEAKED_ACCESS_TOKEN,
|
|
185
|
+
private_key: LEAKED_PRIVATE_KEY_PEM,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* The case commit c0f9e0c2db fixed: the credential JSON is a STRING inside
|
|
191
|
+
* the error message, so its key quotes arrive escaped. A purely textual
|
|
192
|
+
* redactor never sees `"client_secret":` in that form and walks straight
|
|
193
|
+
* past it — which is why redactErrorBody decodes the outer JSON before
|
|
194
|
+
* redacting. The test below asserts both halves of that: the raw textual
|
|
195
|
+
* pass really is fooled, and the client's echo is not.
|
|
203
196
|
*/
|
|
204
|
-
const
|
|
197
|
+
const NESTED_CREDENTIAL_BODY: string = JSON.stringify({
|
|
198
|
+
error: {
|
|
199
|
+
code: 400,
|
|
200
|
+
status: "INVALID_ARGUMENT",
|
|
201
|
+
message: JSON.stringify({
|
|
202
|
+
client_secret: LEAKED_CLIENT_SECRET,
|
|
203
|
+
access_token: LEAKED_ACCESS_TOKEN,
|
|
204
|
+
private_key: LEAKED_PRIVATE_KEY_PEM,
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
});
|
|
205
208
|
|
|
206
209
|
function makeFetch(
|
|
207
210
|
responses: Array<{ status: number; body: string }>,
|
|
@@ -256,6 +259,18 @@ async function thrownClientError(
|
|
|
256
259
|
throw new Error("Expected GoogleSecOpsClient to throw, but it did not");
|
|
257
260
|
}
|
|
258
261
|
|
|
262
|
+
/*
|
|
263
|
+
* Exactly what GoogleSecOpsPoller.ts writes into lastError: the connector
|
|
264
|
+
* clamp explicitly disabled, then one more redaction pass. Both halves are
|
|
265
|
+
* reproduced here rather than approximated, because "the value the poller
|
|
266
|
+
* stores fits the column" is the whole claim of this file.
|
|
267
|
+
*/
|
|
268
|
+
function storedLastError(error: Error): string {
|
|
269
|
+
return redactLogString(
|
|
270
|
+
ConnectorErrorMessage.toMessage(error, { truncate: false }),
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
259
274
|
interface LastErrorColumn {
|
|
260
275
|
label: string;
|
|
261
276
|
table: string;
|
|
@@ -427,12 +442,12 @@ describe("the widest error the producers can emit is storable", () => {
|
|
|
427
442
|
let widestClientError: Error;
|
|
428
443
|
|
|
429
444
|
beforeAll(async () => {
|
|
430
|
-
// Fails at the JWT-bearer token exchange: the first
|
|
445
|
+
// Fails at the JWT-bearer token exchange: the first echo site.
|
|
431
446
|
tokenExchangeError = await thrownClientError([
|
|
432
447
|
{ status: 503, body: OVERSIZED_RESPONSE_BODY },
|
|
433
448
|
]);
|
|
434
449
|
|
|
435
|
-
// Token succeeds, the alerts call fails: the second
|
|
450
|
+
// Token succeeds, the alerts call fails: the second echo site.
|
|
436
451
|
alertsFetchError = await thrownClientError([
|
|
437
452
|
successfulTokenResponse(),
|
|
438
453
|
{ status: 500, body: OVERSIZED_RESPONSE_BODY },
|
|
@@ -444,46 +459,59 @@ describe("the widest error the producers can emit is storable", () => {
|
|
|
444
459
|
: tokenExchangeError;
|
|
445
460
|
});
|
|
446
461
|
|
|
447
|
-
test("
|
|
462
|
+
test("each HTTP failure echoes the WHOLE response body, with nothing clipped off the end", () => {
|
|
448
463
|
/*
|
|
449
|
-
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
*
|
|
453
|
-
*
|
|
454
|
-
*
|
|
455
|
-
* assertion was written.
|
|
464
|
+
* What replaced the cap. There is no longer a number to read out of
|
|
465
|
+
* the client and compare against; the assertion is that the body the
|
|
466
|
+
* client was handed survives into the message in one piece, tail
|
|
467
|
+
* included. A `.slice(0, N)` reintroduced at either site fails here,
|
|
468
|
+
* because the last character of the body would stop being the last
|
|
469
|
+
* character of the message.
|
|
456
470
|
*/
|
|
457
|
-
const limits: Array<number> = responseBodyEchoLimits();
|
|
458
|
-
|
|
459
|
-
expect(limits.length).toBeGreaterThan(2);
|
|
460
|
-
expect(new Set(limits).size).toBe(1);
|
|
461
|
-
expect(responseBodyEchoLimit()).toBe(limits[0]);
|
|
462
|
-
});
|
|
463
|
-
|
|
464
|
-
test("each template is a fixed prefix plus a full-width echo of the response body", () => {
|
|
465
|
-
const echoLimit: number = responseBodyEchoLimit();
|
|
466
|
-
|
|
467
471
|
for (const error of [tokenExchangeError, alertsFetchError]) {
|
|
468
|
-
|
|
469
|
-
expect(error.message.endsWith(
|
|
470
|
-
expect(error.message.endsWith("x".repeat(echoLimit + 1))).toBe(false);
|
|
472
|
+
expect(error.message).toContain(OVERSIZED_RESPONSE_BODY);
|
|
473
|
+
expect(error.message.endsWith(OVERSIZED_RESPONSE_BODY)).toBe(true);
|
|
471
474
|
|
|
472
475
|
// ...and ahead of it, a non-empty prefix naming the HTTP status.
|
|
473
476
|
const prefix: string = error.message.slice(
|
|
474
477
|
0,
|
|
475
|
-
error.message.length -
|
|
478
|
+
error.message.length - OVERSIZED_RESPONSE_BODY_LENGTH,
|
|
476
479
|
);
|
|
477
480
|
expect(prefix.length).toBeGreaterThan(0);
|
|
478
481
|
expect(prefix).toContain("HTTP");
|
|
479
482
|
}
|
|
480
483
|
});
|
|
481
484
|
|
|
485
|
+
test("the message width tracks the body width — nothing bounds it but the body itself", async () => {
|
|
486
|
+
/*
|
|
487
|
+
* Falsifies the test above from the other side. Hand the same failure
|
|
488
|
+
* path a body twice as wide and the message grows by exactly the extra
|
|
489
|
+
* characters: no cap, no ceiling, no rounding. Any truncation
|
|
490
|
+
* anywhere on this path — in the client, in the redactor, in the
|
|
491
|
+
* exception — would make the two messages converge instead.
|
|
492
|
+
*/
|
|
493
|
+
const narrow: Error = await thrownClientError([
|
|
494
|
+
successfulTokenResponse(),
|
|
495
|
+
{ status: 500, body: OVERSIZED_RESPONSE_BODY },
|
|
496
|
+
]);
|
|
497
|
+
const wide: Error = await thrownClientError([
|
|
498
|
+
successfulTokenResponse(),
|
|
499
|
+
{ status: 500, body: OVERSIZED_RESPONSE_BODY + OVERSIZED_RESPONSE_BODY },
|
|
500
|
+
]);
|
|
501
|
+
|
|
502
|
+
expect(wide.message.length - narrow.message.length).toBe(
|
|
503
|
+
OVERSIZED_RESPONSE_BODY_LENGTH,
|
|
504
|
+
);
|
|
505
|
+
});
|
|
506
|
+
|
|
482
507
|
test("the widest client error overflows the bound lastError used to carry", () => {
|
|
483
508
|
/*
|
|
484
509
|
* This is the string that killed the poller. Prefix + echoed body is
|
|
485
510
|
* larger than varchar(500), so writing it back onto the row raised
|
|
486
|
-
* BadDataException from inside the catch block.
|
|
511
|
+
* BadDataException from inside the catch block. It is also past the
|
|
512
|
+
* connector clamp, which is exactly why the poller opts out of that
|
|
513
|
+
* clamp and why the column has to be unbounded rather than merely
|
|
514
|
+
* wider.
|
|
487
515
|
*/
|
|
488
516
|
const oldMaxLength: number = getMaxLengthFromTableColumnType(
|
|
489
517
|
TableColumnType.LongText,
|
|
@@ -491,31 +519,64 @@ describe("the widest error the producers can emit is storable", () => {
|
|
|
491
519
|
|
|
492
520
|
expect(widestClientError.message.length).toBeGreaterThan(oldMaxLength);
|
|
493
521
|
|
|
494
|
-
// The overflow is not marginal: the echoed body alone
|
|
495
|
-
expect(
|
|
522
|
+
// The overflow is not marginal: the echoed body alone dwarfs the old column.
|
|
523
|
+
expect(OVERSIZED_RESPONSE_BODY_LENGTH).toBeGreaterThan(oldMaxLength);
|
|
524
|
+
expect(widestClientError.message.length).toBeGreaterThan(
|
|
525
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
526
|
+
);
|
|
496
527
|
});
|
|
497
528
|
|
|
498
|
-
test("
|
|
499
|
-
|
|
529
|
+
test("the poller's { truncate: false } stores the widest client error whole", () => {
|
|
530
|
+
/*
|
|
531
|
+
* GoogleSecOpsPoller writes ConnectorErrorMessage.toMessage(error,
|
|
532
|
+
* { truncate: false }). The operator is meant to get the complete
|
|
533
|
+
* redacted diagnostic, so the returned value must be the message
|
|
534
|
+
* unchanged — no clamp, and specifically no "... (truncated)" marker,
|
|
535
|
+
* whose presence would mean part of the diagnostic was thrown away.
|
|
536
|
+
*/
|
|
537
|
+
const stored: string = ConnectorErrorMessage.toMessage(widestClientError, {
|
|
538
|
+
truncate: false,
|
|
539
|
+
});
|
|
500
540
|
|
|
501
|
-
// Prefix + 500 still fits in 1000, so nothing is lost from an API error.
|
|
502
541
|
expect(stored).toBe(widestClientError.message);
|
|
503
|
-
expect(stored
|
|
504
|
-
|
|
505
|
-
|
|
542
|
+
expect(stored).not.toContain("... (truncated)");
|
|
543
|
+
expect(stored.length).toBeGreaterThan(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
test("the DEFAULT toMessage still clamps, so the cap stays pinned for callers that use it", () => {
|
|
547
|
+
/*
|
|
548
|
+
* Opting out is per call site. Every caller that does NOT pass
|
|
549
|
+
* { truncate: false } must still be clamped to
|
|
550
|
+
* MAX_CONNECTOR_ERROR_MESSAGE_LENGTH with the marker, or a narrow
|
|
551
|
+
* destination somewhere else in the codebase silently starts
|
|
552
|
+
* overflowing.
|
|
553
|
+
*/
|
|
554
|
+
for (const error of [
|
|
555
|
+
tokenExchangeError,
|
|
556
|
+
alertsFetchError,
|
|
557
|
+
new Error("y".repeat(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH * 10)),
|
|
558
|
+
]) {
|
|
559
|
+
const clamped: string = ConnectorErrorMessage.toMessage(error);
|
|
560
|
+
|
|
561
|
+
expect(clamped.length).toBe(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
562
|
+
expect(clamped.endsWith("... (truncated)")).toBe(true);
|
|
563
|
+
}
|
|
506
564
|
});
|
|
507
565
|
|
|
508
566
|
test.each(LAST_ERROR_COLUMNS)(
|
|
509
|
-
"$label accepts the widest client error — the real length check does not reject it",
|
|
567
|
+
"$label accepts the widest client error stored WHOLE — the real length check does not reject it",
|
|
510
568
|
(column: LastErrorColumn) => {
|
|
511
569
|
/*
|
|
512
|
-
* The end-to-end guard: the same value the poller would store
|
|
513
|
-
*
|
|
514
|
-
*
|
|
515
|
-
* throw
|
|
570
|
+
* The end-to-end guard: the same value the poller would store —
|
|
571
|
+
* untruncated and redacted, exactly as GoogleSecOpsPoller builds it
|
|
572
|
+
* — run through the same DatabaseService validation that used to
|
|
573
|
+
* throw. Pre-fix (LongText/varchar(500)) this raised
|
|
574
|
+
* BadDataException, the throw escaped pollAllDueConnections, and the
|
|
575
|
+
* tick died.
|
|
516
576
|
*/
|
|
517
|
-
const stored: string =
|
|
577
|
+
const stored: string = storedLastError(widestClientError);
|
|
518
578
|
|
|
579
|
+
expect(stored.length).toBeGreaterThan(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH);
|
|
519
580
|
expect(() => {
|
|
520
581
|
return column.checkLastError(stored);
|
|
521
582
|
}).not.toThrow();
|
|
@@ -531,7 +592,7 @@ describe("the widest error the producers can emit is storable", () => {
|
|
|
531
592
|
* LongText and it throws exactly as lastError used to. The only
|
|
532
593
|
* thing that changed is the declared column type.
|
|
533
594
|
*/
|
|
534
|
-
const stored: string =
|
|
595
|
+
const stored: string = storedLastError(widestClientError);
|
|
535
596
|
|
|
536
597
|
expect(
|
|
537
598
|
getMaxLengthFromTableColumnType(
|
|
@@ -551,9 +612,10 @@ describe("the widest error the producers can emit is storable", () => {
|
|
|
551
612
|
(column: LastErrorColumn) => {
|
|
552
613
|
/*
|
|
553
614
|
* The evaluator's side: a ClickHouse error echoes the whole
|
|
554
|
-
* compiled query, so it has no natural bound.
|
|
555
|
-
*
|
|
556
|
-
*
|
|
615
|
+
* compiled query, so it has no natural bound. That caller keeps the
|
|
616
|
+
* default clamp, which cuts it to exactly
|
|
617
|
+
* MAX_CONNECTOR_ERROR_MESSAGE_LENGTH — still double the old
|
|
618
|
+
* varchar(500), so widening the column is what makes even the
|
|
557
619
|
* clamped value storable.
|
|
558
620
|
*/
|
|
559
621
|
const clickhouseError: Error = new Error(
|
|
@@ -573,23 +635,6 @@ describe("the widest error the producers can emit is storable", () => {
|
|
|
573
635
|
}).not.toThrow();
|
|
574
636
|
},
|
|
575
637
|
);
|
|
576
|
-
|
|
577
|
-
test("the connector cap is the ceiling on anything that reaches these columns", () => {
|
|
578
|
-
/*
|
|
579
|
-
* Ties the clamp to the column: whatever the producers throw, what is
|
|
580
|
-
* actually written is at most MAX_CONNECTOR_ERROR_MESSAGE_LENGTH, and
|
|
581
|
-
* a text column has no bound to compare that against.
|
|
582
|
-
*/
|
|
583
|
-
for (const error of [
|
|
584
|
-
tokenExchangeError,
|
|
585
|
-
alertsFetchError,
|
|
586
|
-
new Error("y".repeat(MAX_CONNECTOR_ERROR_MESSAGE_LENGTH * 10)),
|
|
587
|
-
]) {
|
|
588
|
-
expect(ConnectorErrorMessage.toMessage(error).length).toBeLessThanOrEqual(
|
|
589
|
-
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
590
|
-
);
|
|
591
|
-
}
|
|
592
|
-
});
|
|
593
638
|
});
|
|
594
639
|
|
|
595
640
|
interface InBandFailure {
|
|
@@ -598,33 +643,44 @@ interface InBandFailure {
|
|
|
598
643
|
body: string;
|
|
599
644
|
/* Everything the client's message carries ahead of the echoed text. */
|
|
600
645
|
prefix: string;
|
|
646
|
+
/*
|
|
647
|
+
* Whether this path echoes the body it could not read. An empty body has
|
|
648
|
+
* nothing to echo, and a body that is not JSON at all is reported by
|
|
649
|
+
* kind rather than quoted — so those two are prefix-only, and pinning
|
|
650
|
+
* that distinction is what stops a future change from quietly turning a
|
|
651
|
+
* fixed string into an unbounded echo without a test noticing.
|
|
652
|
+
*/
|
|
653
|
+
echoesBody: boolean;
|
|
601
654
|
}
|
|
602
655
|
|
|
603
656
|
/*
|
|
604
657
|
* The failures Chronicle reports on an HTTP 200. They are not covered by the
|
|
605
|
-
* two
|
|
658
|
+
* two HTTP paths above because before the client learned to read the stream
|
|
606
659
|
* envelope they did not reach lastError at all — an unreadable body was
|
|
607
660
|
* reported as a healthy poll that found nothing. Each of them now echoes the
|
|
608
|
-
* text it could not read, which is a new way for the stored value
|
|
609
|
-
* so each has to clear the same end-to-end path: the
|
|
610
|
-
*
|
|
661
|
+
* text it could not read, in full, which is a new way for the stored value
|
|
662
|
+
* to grow, so each has to clear the same end-to-end path: the poller's
|
|
663
|
+
* untruncated toMessage and the real length check on both columns.
|
|
611
664
|
*/
|
|
612
665
|
const IN_BAND_FAILURES: Array<InBandFailure> = [
|
|
613
666
|
{
|
|
614
667
|
label: "an empty body",
|
|
615
668
|
body: "",
|
|
616
669
|
prefix: "Google SecOps alerts fetch returned an empty body.",
|
|
670
|
+
echoesBody: false,
|
|
617
671
|
},
|
|
618
672
|
{
|
|
619
673
|
label: "a body that is not JSON",
|
|
620
674
|
body: `<html>${OVERSIZED_RESPONSE_BODY}</html>`,
|
|
621
675
|
prefix: "Google SecOps alerts fetch returned a non-JSON body.",
|
|
676
|
+
echoesBody: false,
|
|
622
677
|
},
|
|
623
678
|
{
|
|
624
679
|
label: "a shape the parser does not recognize",
|
|
625
680
|
body: JSON.stringify([{ somethingElseEntirely: OVERSIZED_RESPONSE_BODY }]),
|
|
626
681
|
prefix:
|
|
627
682
|
"Google SecOps alerts fetch returned an unrecognized response shape: ",
|
|
683
|
+
echoesBody: true,
|
|
628
684
|
},
|
|
629
685
|
{
|
|
630
686
|
label: "a query Chronicle rejected in band",
|
|
@@ -636,12 +692,13 @@ const IN_BAND_FAILURES: Array<InBandFailure> = [
|
|
|
636
692
|
]),
|
|
637
693
|
prefix:
|
|
638
694
|
"Google SecOps alerts query was rejected by Chronicle on an HTTP 200: ",
|
|
695
|
+
echoesBody: true,
|
|
639
696
|
},
|
|
640
697
|
];
|
|
641
698
|
|
|
642
699
|
describe("the failures Chronicle reports on an HTTP 200 are storable too", () => {
|
|
643
700
|
test.each(IN_BAND_FAILURES)(
|
|
644
|
-
"$label is echoed
|
|
701
|
+
"$label is echoed in full and stored whole",
|
|
645
702
|
async (failure: InBandFailure) => {
|
|
646
703
|
const error: Error = await thrownClientError([
|
|
647
704
|
successfulTokenResponse(),
|
|
@@ -650,23 +707,154 @@ describe("the failures Chronicle reports on an HTTP 200 are storable too", () =>
|
|
|
650
707
|
|
|
651
708
|
expect(error.message.startsWith(failure.prefix)).toBe(true);
|
|
652
709
|
|
|
710
|
+
if (failure.echoesBody) {
|
|
711
|
+
/*
|
|
712
|
+
* The echo is complete, not clipped — same contract as the HTTP
|
|
713
|
+
* paths, and the same reason the column has to be unbounded: this
|
|
714
|
+
* message is already past MAX_CONNECTOR_ERROR_MESSAGE_LENGTH.
|
|
715
|
+
*/
|
|
716
|
+
expect(error.message).toContain(OVERSIZED_RESPONSE_BODY);
|
|
717
|
+
expect(error.message.length).toBeGreaterThan(
|
|
718
|
+
MAX_CONNECTOR_ERROR_MESSAGE_LENGTH,
|
|
719
|
+
);
|
|
720
|
+
} else {
|
|
721
|
+
// Reported by kind, so the body never widens the stored value at all.
|
|
722
|
+
expect(error.message).toBe(failure.prefix);
|
|
723
|
+
}
|
|
724
|
+
|
|
653
725
|
/*
|
|
654
|
-
*
|
|
655
|
-
*
|
|
656
|
-
* was widened for.
|
|
726
|
+
* The poller opts out of the clamp, so lastError carries the whole
|
|
727
|
+
* thing however wide it is.
|
|
657
728
|
*/
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
);
|
|
661
|
-
|
|
662
|
-
// The clamp leaves it untouched, so lastError carries the whole thing.
|
|
663
|
-
const stored: string = ConnectorErrorMessage.toMessage(error);
|
|
729
|
+
const stored: string = ConnectorErrorMessage.toMessage(error, {
|
|
730
|
+
truncate: false,
|
|
731
|
+
});
|
|
664
732
|
|
|
665
733
|
expect(stored).toBe(error.message);
|
|
666
|
-
expect(stored
|
|
667
|
-
|
|
668
|
-
)
|
|
734
|
+
expect(stored).not.toContain("... (truncated)");
|
|
735
|
+
|
|
736
|
+
for (const column of LAST_ERROR_COLUMNS) {
|
|
737
|
+
expect(() => {
|
|
738
|
+
return column.checkLastError(storedLastError(error));
|
|
739
|
+
}).not.toThrow();
|
|
740
|
+
}
|
|
741
|
+
},
|
|
742
|
+
);
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
/*
|
|
746
|
+
* Redaction is what makes echoing a customer-supplied body safe now that
|
|
747
|
+
* nothing clips it. The body is attacker-influenced (a token endpoint that
|
|
748
|
+
* mirrors the request, a proxy that dumps headers) and, worse, routinely
|
|
749
|
+
* carries the tenant's OWN credentials back — and lastError is rendered in
|
|
750
|
+
* the dashboard and swept up by support bundles. So the property that used
|
|
751
|
+
* to be "at most 500 characters reach the column" is now "no credential
|
|
752
|
+
* reaches the column at all", and it has to hold on every path that echoes.
|
|
753
|
+
*/
|
|
754
|
+
interface RedactedEchoCase {
|
|
755
|
+
label: string;
|
|
756
|
+
responses: Array<{ status: number; body: string }>;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
const REDACTED_ECHO_CASES: Array<RedactedEchoCase> = [
|
|
760
|
+
{
|
|
761
|
+
label: "the token exchange echoing credential fields",
|
|
762
|
+
responses: [{ status: 400, body: FLAT_CREDENTIAL_BODY }],
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
label: "the token exchange echoing credentials nested inside a message",
|
|
766
|
+
responses: [{ status: 400, body: NESTED_CREDENTIAL_BODY }],
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
label: "the alerts fetch echoing credential fields",
|
|
770
|
+
responses: [
|
|
771
|
+
successfulTokenResponse(),
|
|
772
|
+
{ status: 403, body: FLAT_CREDENTIAL_BODY },
|
|
773
|
+
],
|
|
774
|
+
},
|
|
775
|
+
{
|
|
776
|
+
label: "the alerts fetch echoing credentials nested inside a message",
|
|
777
|
+
responses: [
|
|
778
|
+
successfulTokenResponse(),
|
|
779
|
+
{ status: 403, body: NESTED_CREDENTIAL_BODY },
|
|
780
|
+
],
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
label: "an unrecognized HTTP 200 shape echoing credential fields",
|
|
784
|
+
responses: [
|
|
785
|
+
successfulTokenResponse(),
|
|
786
|
+
{
|
|
787
|
+
status: 200,
|
|
788
|
+
body: JSON.stringify({
|
|
789
|
+
client_secret: LEAKED_CLIENT_SECRET,
|
|
790
|
+
access_token: LEAKED_ACCESS_TOKEN,
|
|
791
|
+
private_key: LEAKED_PRIVATE_KEY_PEM,
|
|
792
|
+
}),
|
|
793
|
+
},
|
|
794
|
+
],
|
|
795
|
+
},
|
|
796
|
+
{
|
|
797
|
+
label: "an in-band query rejection echoing credentials nested in a message",
|
|
798
|
+
responses: [
|
|
799
|
+
successfulTokenResponse(),
|
|
800
|
+
{
|
|
801
|
+
status: 200,
|
|
802
|
+
body: JSON.stringify([
|
|
803
|
+
{
|
|
804
|
+
validSnapshotQuery: false,
|
|
805
|
+
queryValidationErrors: [
|
|
806
|
+
{
|
|
807
|
+
message: JSON.stringify({
|
|
808
|
+
client_secret: LEAKED_CLIENT_SECRET,
|
|
809
|
+
access_token: LEAKED_ACCESS_TOKEN,
|
|
810
|
+
private_key: LEAKED_PRIVATE_KEY_PEM,
|
|
811
|
+
}),
|
|
812
|
+
},
|
|
813
|
+
],
|
|
814
|
+
},
|
|
815
|
+
]),
|
|
816
|
+
},
|
|
817
|
+
],
|
|
818
|
+
},
|
|
819
|
+
];
|
|
820
|
+
|
|
821
|
+
describe("the echoed body is redacted, which is what replaced the cap", () => {
|
|
822
|
+
test("a purely textual pass really is fooled by nested credential JSON", () => {
|
|
823
|
+
/*
|
|
824
|
+
* The premise behind redactErrorBody decoding the outer JSON first
|
|
825
|
+
* (commit c0f9e0c2db). Inside a JSON string the credential's key quotes
|
|
826
|
+
* arrive escaped as \" , which no textual rule keyed on `"key":` can
|
|
827
|
+
* match — so running redactLogString over the raw body leaves the
|
|
828
|
+
* secret in the clear. If this ever stops being true the decode step
|
|
829
|
+
* has become redundant, and the case below stops proving anything.
|
|
830
|
+
*/
|
|
831
|
+
expect(redactLogString(NESTED_CREDENTIAL_BODY)).toContain(
|
|
832
|
+
LEAKED_CLIENT_SECRET,
|
|
833
|
+
);
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
test.each(REDACTED_ECHO_CASES)(
|
|
837
|
+
"$label never puts the credential in lastError",
|
|
838
|
+
async (echoCase: RedactedEchoCase) => {
|
|
839
|
+
const error: Error = await thrownClientError(echoCase.responses);
|
|
840
|
+
const stored: string = storedLastError(error);
|
|
841
|
+
|
|
842
|
+
for (const secret of LEAKED_SECRETS) {
|
|
843
|
+
expect(error.message).not.toContain(secret);
|
|
844
|
+
expect(stored).not.toContain(secret);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/*
|
|
848
|
+
* Falsifiable: the body really did reach the message, and the reason
|
|
849
|
+
* the secret is missing from it is that the redactor replaced the
|
|
850
|
+
* value — not that the client quietly dropped the whole echo, which
|
|
851
|
+
* would satisfy "does not contain" while destroying the diagnostic
|
|
852
|
+
* this column exists to carry.
|
|
853
|
+
*/
|
|
854
|
+
expect(error.message).toContain(REDACTED);
|
|
855
|
+
expect(stored).toContain(REDACTED);
|
|
669
856
|
|
|
857
|
+
// And the redacted echo is still stored whole, on an unbounded column.
|
|
670
858
|
for (const column of LAST_ERROR_COLUMNS) {
|
|
671
859
|
expect(() => {
|
|
672
860
|
return column.checkLastError(stored);
|