@oneuptime/common 13.0.0 → 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/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/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/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 +12 -0
- 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/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/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 +91 -29
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +132 -1
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- 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/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/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 +143 -0
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +33 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +302 -3
- 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/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 +5 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +181 -1
- 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/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/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -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/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -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/TwoFactorStatus.test.tsx +260 -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/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/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 +29 -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/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -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/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/InventoryItemPromotionGate.test.ts +5 -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/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -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/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -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/Dashboard/PublicDashboardResourceListPolicy.test.ts +345 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +299 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -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/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +362 -0
- 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/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/TelemetryEntity.test.ts +580 -0
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -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/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/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -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 +11 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +148 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +29 -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/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -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/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 +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/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -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/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- 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/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -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/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- 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 +4 -0
- package/Utils/API.ts +34 -0
- 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/LabelRuleImportExport.ts +496 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -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/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/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/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 +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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/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/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 +64 -26
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +124 -1
- 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/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/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/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 +113 -0
- 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 +2 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +18 -0
- 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/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +219 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/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 +5 -0
- 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 +136 -1
- 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/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 +1 -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/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/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/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/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/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/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- 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/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/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.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/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/package.json +1 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import Redis, { ClientType } from "../Infrastructure/Redis";
|
|
2
|
+
import { Host, HttpProtocol } from "../EnvironmentConfig";
|
|
3
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
4
|
+
import DatabaseNotConnectedException from "../../Types/Exception/DatabaseNotConnectedException";
|
|
5
|
+
import ObjectID from "../../Types/ObjectID";
|
|
6
|
+
import { createHash, randomBytes } from "crypto";
|
|
7
|
+
import { URL } from "url";
|
|
8
|
+
|
|
9
|
+
export interface MobilePasskeyRequest {
|
|
10
|
+
codeChallenge: string;
|
|
11
|
+
codeChallengeMethod: "S256";
|
|
12
|
+
state: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface MobilePasskeyContext extends MobilePasskeyRequest {
|
|
16
|
+
serverOrigin: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const HANDOFF_ERROR: string =
|
|
20
|
+
"Unable to complete mobile passkey sign-in. Please start again in the app.";
|
|
21
|
+
const CHALLENGE_PREFIX: string = "mobile-passkey-challenge-";
|
|
22
|
+
const CODE_PREFIX: string = "mobile-passkey-code-";
|
|
23
|
+
const CODE_TTL_SECONDS: number = 120;
|
|
24
|
+
const CHALLENGE_TTL_SECONDS: number = 300;
|
|
25
|
+
const RANDOM_VALUE_PATTERN: RegExp = /^[A-Za-z0-9_-]{43}$/;
|
|
26
|
+
const PKCE_VALUE_PATTERN: RegExp = /^[A-Za-z0-9._~-]{43,128}$/;
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Keep the authorization code separate from the eventual session. A callback
|
|
30
|
+
* intercepted by another app contains no access or refresh token and cannot be
|
|
31
|
+
* redeemed without the verifier held by the app that started this sign-in.
|
|
32
|
+
*/
|
|
33
|
+
export default class MobilePasskeyLoginService {
|
|
34
|
+
public static validateRequest(value: unknown): MobilePasskeyContext {
|
|
35
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
36
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const data: Partial<MobilePasskeyRequest> = value;
|
|
40
|
+
if (
|
|
41
|
+
typeof data.codeChallenge !== "string" ||
|
|
42
|
+
data.codeChallenge.length !== 43 ||
|
|
43
|
+
!RANDOM_VALUE_PATTERN.test(data.codeChallenge) ||
|
|
44
|
+
data.codeChallengeMethod !== "S256" ||
|
|
45
|
+
typeof data.state !== "string" ||
|
|
46
|
+
PKCE_VALUE_PATTERN.exec(data.state)?.[0] !== data.state
|
|
47
|
+
) {
|
|
48
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
codeChallenge: data.codeChallenge,
|
|
53
|
+
codeChallengeMethod: "S256",
|
|
54
|
+
state: data.state,
|
|
55
|
+
serverOrigin: this.getServerOrigin(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public static async storeChallengeContext(
|
|
60
|
+
challengeId: string,
|
|
61
|
+
context: MobilePasskeyContext,
|
|
62
|
+
): Promise<void> {
|
|
63
|
+
await this.store(
|
|
64
|
+
`${CHALLENGE_PREFIX}${this.hash(challengeId)}`,
|
|
65
|
+
JSON.stringify(context),
|
|
66
|
+
CHALLENGE_TTL_SECONDS,
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public static async consumeChallengeContext(
|
|
71
|
+
challengeId: string,
|
|
72
|
+
): Promise<MobilePasskeyContext | null> {
|
|
73
|
+
const result: unknown = await this.getStore().eval(
|
|
74
|
+
"local value = redis.call('GET', KEYS[1]); " +
|
|
75
|
+
"if value then redis.call('DEL', KEYS[1]); end; return value",
|
|
76
|
+
1,
|
|
77
|
+
`${CHALLENGE_PREFIX}${this.hash(challengeId)}`,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
if (result === null) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (typeof result !== "string") {
|
|
85
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
let stored: MobilePasskeyContext;
|
|
89
|
+
try {
|
|
90
|
+
stored = JSON.parse(result) as MobilePasskeyContext;
|
|
91
|
+
} catch {
|
|
92
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const context: MobilePasskeyContext = this.validateRequest(stored);
|
|
96
|
+
if (stored.serverOrigin !== context.serverOrigin) {
|
|
97
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return context;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public static async createAuthorizationCode(data: {
|
|
104
|
+
userId: ObjectID;
|
|
105
|
+
context: MobilePasskeyContext;
|
|
106
|
+
}): Promise<string> {
|
|
107
|
+
if (data.context.serverOrigin !== this.getServerOrigin()) {
|
|
108
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const code: string = randomBytes(32).toString("base64url");
|
|
112
|
+
await this.store(
|
|
113
|
+
`${CODE_PREFIX}${this.hash(code)}`,
|
|
114
|
+
JSON.stringify({
|
|
115
|
+
...data.context,
|
|
116
|
+
userId: data.userId.toString(),
|
|
117
|
+
}),
|
|
118
|
+
CODE_TTL_SECONDS,
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// The callback destination is fixed; no caller-controlled redirect URL.
|
|
122
|
+
const callback: URL = new URL("oneuptime://passkey");
|
|
123
|
+
callback.searchParams.set("code", code);
|
|
124
|
+
callback.searchParams.set("state", data.context.state);
|
|
125
|
+
callback.searchParams.set("serverOrigin", data.context.serverOrigin);
|
|
126
|
+
return callback.toString();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public static async exchangeAuthorizationCode(
|
|
130
|
+
value: unknown,
|
|
131
|
+
): Promise<ObjectID> {
|
|
132
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
133
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const data: { code?: unknown; codeVerifier?: unknown; state?: unknown } =
|
|
137
|
+
value;
|
|
138
|
+
if (
|
|
139
|
+
typeof data.code !== "string" ||
|
|
140
|
+
data.code.length !== 43 ||
|
|
141
|
+
!RANDOM_VALUE_PATTERN.test(data.code) ||
|
|
142
|
+
typeof data.codeVerifier !== "string" ||
|
|
143
|
+
PKCE_VALUE_PATTERN.exec(data.codeVerifier)?.[0] !== data.codeVerifier ||
|
|
144
|
+
typeof data.state !== "string" ||
|
|
145
|
+
PKCE_VALUE_PATTERN.exec(data.state)?.[0] !== data.state
|
|
146
|
+
) {
|
|
147
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* Match and delete in one Redis operation. Concurrent exchanges cannot
|
|
152
|
+
* issue two sessions, and a wrong verifier cannot burn the legitimate
|
|
153
|
+
* app's code. This also works on Redis versions without GETDEL.
|
|
154
|
+
*/
|
|
155
|
+
const userId: unknown = await this.getStore().eval(
|
|
156
|
+
"local value = redis.call('GET', KEYS[1]); " +
|
|
157
|
+
"if not value then return nil end; " +
|
|
158
|
+
"local ok, data = pcall(cjson.decode, value); " +
|
|
159
|
+
"if not ok or type(data) ~= 'table' then return nil end; " +
|
|
160
|
+
"if data.codeChallenge ~= ARGV[1] or data.state ~= ARGV[2] " +
|
|
161
|
+
"or data.serverOrigin ~= ARGV[3] or data.codeChallengeMethod ~= 'S256' " +
|
|
162
|
+
"or type(data.userId) ~= 'string' then return nil end; " +
|
|
163
|
+
"redis.call('DEL', KEYS[1]); return data.userId",
|
|
164
|
+
1,
|
|
165
|
+
`${CODE_PREFIX}${this.hash(data.code)}`,
|
|
166
|
+
this.hash(data.codeVerifier),
|
|
167
|
+
data.state,
|
|
168
|
+
this.getServerOrigin(),
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
if (typeof userId !== "string" || !ObjectID.isValidUUID(userId)) {
|
|
172
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return new ObjectID(userId);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private static getServerOrigin(): string {
|
|
179
|
+
const origin: URL = new URL(`${HttpProtocol}${Host.toString()}`);
|
|
180
|
+
if (origin.protocol !== "https:") {
|
|
181
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
182
|
+
}
|
|
183
|
+
return origin.origin;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private static hash(value: string): string {
|
|
187
|
+
return createHash("sha256").update(value, "ascii").digest("base64url");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private static getStore(): ClientType {
|
|
191
|
+
const client: ClientType | null = Redis.getClient();
|
|
192
|
+
if (!client || !Redis.isConnected()) {
|
|
193
|
+
throw new DatabaseNotConnectedException(
|
|
194
|
+
"Mobile passkey sign-in is temporarily unavailable",
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
return client;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private static async store(
|
|
201
|
+
key: string,
|
|
202
|
+
value: string,
|
|
203
|
+
ttlSeconds: number,
|
|
204
|
+
): Promise<void> {
|
|
205
|
+
const result: string | null = await this.getStore().set(
|
|
206
|
+
key,
|
|
207
|
+
value,
|
|
208
|
+
"EX",
|
|
209
|
+
ttlSeconds,
|
|
210
|
+
"NX",
|
|
211
|
+
);
|
|
212
|
+
if (result !== "OK") {
|
|
213
|
+
throw new BadDataException(HANDOFF_ERROR);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
@@ -31,6 +31,7 @@ import ServerException from "../../Types/Exception/ServerException";
|
|
|
31
31
|
import Sleep from "../../Types/Sleep";
|
|
32
32
|
import ProbeService from "./ProbeService";
|
|
33
33
|
import ProjectService, { CurrentPlan } from "./ProjectService";
|
|
34
|
+
import PayAsYouGoBillingService from "./PayAsYouGoBillingService";
|
|
34
35
|
import TeamMemberService from "./TeamMemberService";
|
|
35
36
|
import URL from "../../Types/API/URL";
|
|
36
37
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
@@ -763,6 +764,46 @@ export class Service extends DatabaseService<Model> {
|
|
|
763
764
|
});
|
|
764
765
|
}
|
|
765
766
|
|
|
767
|
+
if (
|
|
768
|
+
IsBillingEnabled &&
|
|
769
|
+
((updateBy.data.monitorType &&
|
|
770
|
+
updateBy.data.monitorType !== MonitorType.Manual) ||
|
|
771
|
+
updateBy.data.disableActiveMonitoring === false)
|
|
772
|
+
) {
|
|
773
|
+
const monitors: Array<Model> = await this.findBy({
|
|
774
|
+
query:
|
|
775
|
+
!updateBy.props.isRoot && updateBy.props.tenantId
|
|
776
|
+
? { ...updateBy.query, projectId: updateBy.props.tenantId }
|
|
777
|
+
: updateBy.query,
|
|
778
|
+
select: { projectId: true, monitorType: true },
|
|
779
|
+
limit: updateBy.limit,
|
|
780
|
+
skip: updateBy.skip,
|
|
781
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
782
|
+
});
|
|
783
|
+
const checkedProjects: Set<string> = new Set<string>();
|
|
784
|
+
|
|
785
|
+
for (const monitor of monitors) {
|
|
786
|
+
const monitorType: MonitorType | undefined =
|
|
787
|
+
(updateBy.data.monitorType as MonitorType | undefined) ||
|
|
788
|
+
monitor.monitorType;
|
|
789
|
+
|
|
790
|
+
if (monitorType === MonitorType.Manual) {
|
|
791
|
+
continue;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
if (!monitor.projectId) {
|
|
795
|
+
throw new BadDataException(
|
|
796
|
+
"ProjectId required to enable monitoring.",
|
|
797
|
+
);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
if (!checkedProjects.has(monitor.projectId.toString())) {
|
|
801
|
+
await PayAsYouGoBillingService.requirePayAsYouGo(monitor.projectId);
|
|
802
|
+
checkedProjects.add(monitor.projectId.toString());
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
766
807
|
return { updateBy, carryForward: null };
|
|
767
808
|
}
|
|
768
809
|
|
|
@@ -1340,11 +1381,20 @@ export class Service extends DatabaseService<Model> {
|
|
|
1340
1381
|
}
|
|
1341
1382
|
|
|
1342
1383
|
if (IsBillingEnabled && createBy.props.tenantId) {
|
|
1384
|
+
if (createBy.data.monitorType !== MonitorType.Manual) {
|
|
1385
|
+
await PayAsYouGoBillingService.requirePayAsYouGo(
|
|
1386
|
+
createBy.props.tenantId,
|
|
1387
|
+
);
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1343
1390
|
const currentPlan: CurrentPlan = await ProjectService.getCurrentPlan(
|
|
1344
1391
|
createBy.props.tenantId,
|
|
1345
1392
|
);
|
|
1346
1393
|
|
|
1347
|
-
if (
|
|
1394
|
+
if (
|
|
1395
|
+
currentPlan.isSubscriptionUnpaid &&
|
|
1396
|
+
createBy.data.monitorType !== MonitorType.Manual
|
|
1397
|
+
) {
|
|
1348
1398
|
throw new BadDataException(
|
|
1349
1399
|
"Your subscription is unpaid. Please update your payment method and pay all the outstanding invoices to add more monitors.",
|
|
1350
1400
|
);
|
|
@@ -16,6 +16,7 @@ import Includes from "../../Types/BaseDatabase/Includes";
|
|
|
16
16
|
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
17
17
|
import { JSONObject } from "../../Types/JSON";
|
|
18
18
|
import MonitorSteps from "../../Types/Monitor/MonitorSteps";
|
|
19
|
+
import MonitorTemplateSyncFieldUtil from "../../Types/Monitor/MonitorTemplateSyncField";
|
|
19
20
|
import MonitorType from "../../Types/Monitor/MonitorType";
|
|
20
21
|
import ObjectID from "../../Types/ObjectID";
|
|
21
22
|
import PositiveNumber from "../../Types/PositiveNumber";
|
|
@@ -24,6 +25,7 @@ import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
|
24
25
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
25
26
|
import MonitorTemplateCustomFieldUtil from "../../Utils/Monitor/MonitorTemplateCustomFieldUtil";
|
|
26
27
|
import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
|
|
28
|
+
import MonitorTemplateSyncUtil from "../../Utils/Monitor/MonitorTemplateSyncUtil";
|
|
27
29
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
28
30
|
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
29
31
|
import Query from "../Types/Database/Query";
|
|
@@ -78,6 +80,29 @@ export class Service extends DatabaseService<Model> {
|
|
|
78
80
|
super(Model);
|
|
79
81
|
}
|
|
80
82
|
|
|
83
|
+
private validateSyncFields(
|
|
84
|
+
steps: MonitorSteps | JSONObject | undefined,
|
|
85
|
+
monitorType: MonitorType | undefined,
|
|
86
|
+
): void {
|
|
87
|
+
if (!steps) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
for (const step of MonitorSteps.fromJSON(steps).data
|
|
92
|
+
?.monitorStepsInstanceArray || []) {
|
|
93
|
+
const fields: Array<string> | undefined =
|
|
94
|
+
MonitorTemplateSyncFieldUtil.parse(
|
|
95
|
+
step.data?.doNotSyncFields,
|
|
96
|
+
monitorType,
|
|
97
|
+
);
|
|
98
|
+
if (fields?.length && !monitorType) {
|
|
99
|
+
throw new BadDataException(
|
|
100
|
+
"Monitor type is required to configure template sync fields",
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
81
106
|
/*
|
|
82
107
|
* A template's monitorSteps embeds the same reference ids a monitor's does,
|
|
83
108
|
* and every one of them reaches a real monitor eventually — through "create
|
|
@@ -91,6 +116,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
91
116
|
protected override async onBeforeCreate(
|
|
92
117
|
createBy: CreateBy<Model>,
|
|
93
118
|
): Promise<OnCreate<Model>> {
|
|
119
|
+
this.validateSyncFields(
|
|
120
|
+
createBy.data.monitorSteps,
|
|
121
|
+
createBy.data.monitorType,
|
|
122
|
+
);
|
|
94
123
|
await MonitorStepsProjectValidator.validateMonitorStepsBelongToProject({
|
|
95
124
|
monitorSteps: createBy.data.monitorSteps,
|
|
96
125
|
projectId: createBy.props.tenantId || createBy.data.projectId,
|
|
@@ -103,7 +132,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
103
132
|
protected override async onBeforeUpdate(
|
|
104
133
|
updateBy: UpdateBy<Model>,
|
|
105
134
|
): Promise<OnUpdate<Model>> {
|
|
106
|
-
if (!updateBy.data.monitorSteps) {
|
|
135
|
+
if (!updateBy.data.monitorSteps && !updateBy.data.monitorType) {
|
|
107
136
|
return { updateBy, carryForward: null };
|
|
108
137
|
}
|
|
109
138
|
|
|
@@ -117,6 +146,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
117
146
|
select: {
|
|
118
147
|
projectId: true,
|
|
119
148
|
monitorSteps: true,
|
|
149
|
+
monitorType: true,
|
|
120
150
|
},
|
|
121
151
|
limit: LIMIT_MAX,
|
|
122
152
|
skip: 0,
|
|
@@ -127,6 +157,16 @@ export class Service extends DatabaseService<Model> {
|
|
|
127
157
|
});
|
|
128
158
|
|
|
129
159
|
for (const template of templates) {
|
|
160
|
+
this.validateSyncFields(
|
|
161
|
+
updateBy.data.monitorSteps === undefined
|
|
162
|
+
? template.monitorSteps
|
|
163
|
+
: (updateBy.data.monitorSteps as MonitorSteps | JSONObject),
|
|
164
|
+
(updateBy.data.monitorType as MonitorType | undefined) ||
|
|
165
|
+
template.monitorType,
|
|
166
|
+
);
|
|
167
|
+
if (!updateBy.data.monitorSteps) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
130
170
|
await MonitorStepsProjectValidator.validateMonitorStepsBelongToProject({
|
|
131
171
|
monitorSteps: updateBy.data.monitorSteps as MonitorSteps | JSONObject,
|
|
132
172
|
projectId: updateBy.props.tenantId || template.projectId,
|
|
@@ -412,6 +452,45 @@ export class Service extends DatabaseService<Model> {
|
|
|
412
452
|
});
|
|
413
453
|
}
|
|
414
454
|
|
|
455
|
+
/** Merge protected fields before applying the device ownership binding. */
|
|
456
|
+
private buildMonitorStepsUpdate(
|
|
457
|
+
template: Model,
|
|
458
|
+
monitor: Monitor,
|
|
459
|
+
): MonitorSteps {
|
|
460
|
+
let monitorSteps: MonitorSteps | undefined = template.monitorSteps;
|
|
461
|
+
|
|
462
|
+
if (MonitorTemplateSyncUtil.hasExcludedFields(monitorSteps)) {
|
|
463
|
+
if (!template.monitorType) {
|
|
464
|
+
throw new BadDataException("Monitor template is missing monitorType");
|
|
465
|
+
}
|
|
466
|
+
monitorSteps = MonitorTemplateSyncUtil.buildSyncedMonitorSteps({
|
|
467
|
+
templateMonitorSteps: monitorSteps,
|
|
468
|
+
currentMonitorSteps: monitor.monitorSteps,
|
|
469
|
+
monitorType: template.monitorType,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
if (template.monitorType === MonitorType.NetworkDevice) {
|
|
474
|
+
monitorSteps = monitor.autoProvisionedNetworkDeviceId
|
|
475
|
+
? NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps({
|
|
476
|
+
monitorSteps,
|
|
477
|
+
networkDeviceId: monitor.autoProvisionedNetworkDeviceId,
|
|
478
|
+
})
|
|
479
|
+
: NetworkDeviceMonitorTemplateUtil.buildSyncedMonitorSteps({
|
|
480
|
+
templateMonitorSteps: monitorSteps,
|
|
481
|
+
currentMonitorSteps: monitor.monitorSteps,
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
if (!monitorSteps) {
|
|
486
|
+
throw new BadDataException(
|
|
487
|
+
"Monitor template steps are required to sync criteria.",
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return monitorSteps;
|
|
492
|
+
}
|
|
493
|
+
|
|
415
494
|
/**
|
|
416
495
|
* Push the template's current configuration onto every monitor that was
|
|
417
496
|
* created from it. Sync is intentionally explicit (button-triggered) so a
|
|
@@ -491,18 +570,20 @@ export class Service extends DatabaseService<Model> {
|
|
|
491
570
|
* while each linked monitor has its own device. A bulk JSON assignment
|
|
492
571
|
* would retarget the entire fleet to the template editor's device. Sync
|
|
493
572
|
* those rows individually and rebind cloned template steps to each
|
|
494
|
-
* monitor's current (or provenance-backed) device instead.
|
|
573
|
+
* monitor's current (or provenance-backed) device instead. Field exclusions
|
|
574
|
+
* also require one merge per monitor so each keeps its own protected values.
|
|
495
575
|
*/
|
|
496
|
-
const
|
|
497
|
-
|
|
498
|
-
|
|
576
|
+
const mergeMonitorSteps: boolean =
|
|
577
|
+
fields.includes("monitorSteps") &&
|
|
578
|
+
(template.monitorType === MonitorType.NetworkDevice ||
|
|
579
|
+
MonitorTemplateSyncUtil.hasExcludedFields(template.monitorSteps));
|
|
499
580
|
|
|
500
581
|
/*
|
|
501
582
|
* Custom field defaults take the same row-at-a-time path for their own
|
|
502
583
|
* reason: they are overlaid on the monitor's existing bag, so the payload
|
|
503
584
|
* is read from the row being written and cannot be shared.
|
|
504
585
|
*/
|
|
505
|
-
if (
|
|
586
|
+
if (mergeMonitorSteps || syncCustomFields) {
|
|
506
587
|
let syncedMonitors: number = 0;
|
|
507
588
|
const linkedMonitorQuery: Query<Monitor> = {
|
|
508
589
|
monitorTemplateId: template.id!,
|
|
@@ -564,17 +645,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
564
645
|
monitor,
|
|
565
646
|
data: {
|
|
566
647
|
...updateData,
|
|
567
|
-
...(
|
|
648
|
+
...(mergeMonitorSteps
|
|
568
649
|
? {
|
|
569
|
-
monitorSteps: monitor
|
|
570
|
-
? NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps({
|
|
571
|
-
monitorSteps: template.monitorSteps,
|
|
572
|
-
networkDeviceId: monitor.autoProvisionedNetworkDeviceId,
|
|
573
|
-
})
|
|
574
|
-
: NetworkDeviceMonitorTemplateUtil.buildSyncedMonitorSteps({
|
|
575
|
-
templateMonitorSteps: template.monitorSteps,
|
|
576
|
-
currentMonitorSteps: monitor.monitorSteps,
|
|
577
|
-
}),
|
|
650
|
+
monitorSteps: this.buildMonitorStepsUpdate(template, monitor),
|
|
578
651
|
}
|
|
579
652
|
: {}),
|
|
580
653
|
...(syncCustomFields
|
|
@@ -801,19 +874,8 @@ export class Service extends DatabaseService<Model> {
|
|
|
801
874
|
|
|
802
875
|
const updateData: Partial<Monitor> = this.buildUpdateData(template, fields);
|
|
803
876
|
|
|
804
|
-
if (
|
|
805
|
-
|
|
806
|
-
fields.includes("monitorSteps")
|
|
807
|
-
) {
|
|
808
|
-
updateData.monitorSteps = monitor.autoProvisionedNetworkDeviceId
|
|
809
|
-
? NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps({
|
|
810
|
-
monitorSteps: template.monitorSteps,
|
|
811
|
-
networkDeviceId: monitor.autoProvisionedNetworkDeviceId,
|
|
812
|
-
})
|
|
813
|
-
: NetworkDeviceMonitorTemplateUtil.buildSyncedMonitorSteps({
|
|
814
|
-
templateMonitorSteps: template.monitorSteps,
|
|
815
|
-
currentMonitorSteps: monitor.monitorSteps,
|
|
816
|
-
});
|
|
877
|
+
if (updateData.monitorSteps !== undefined) {
|
|
878
|
+
updateData.monitorSteps = this.buildMonitorStepsUpdate(template, monitor);
|
|
817
879
|
}
|
|
818
880
|
|
|
819
881
|
/*
|
|
@@ -52,13 +52,18 @@ import logger, { LogAttributes } from "../Utils/Logger";
|
|
|
52
52
|
* then apply themselves through NetworkDeviceService.onCreateSuccess's
|
|
53
53
|
* existing rule chain, exactly as they do for a manual import.
|
|
54
54
|
*
|
|
55
|
-
*
|
|
55
|
+
* Three entry points, the first two mirroring the label-rule engine:
|
|
56
56
|
*
|
|
57
57
|
* - processCompletedScan: the automatic path, called by the
|
|
58
58
|
* NetworkDeviceDiscovery worker for each Completed scan whose
|
|
59
59
|
* autoImportProcessedAt marker is NULL.
|
|
60
60
|
* - applyRuleToCompletedScans: the manual "Run Now" (and its dry run),
|
|
61
61
|
* applying ONE rule to the project's existing completed scans.
|
|
62
|
+
* - rearmRecentScansForRuleChange: called when a rule is written, it
|
|
63
|
+
* imports nothing itself — it clears the marker on the project's recent
|
|
64
|
+
* results so the automatic path above evaluates them against the rule
|
|
65
|
+
* that just changed, instead of the operator having to press Run Now
|
|
66
|
+
* (issue #3487).
|
|
62
67
|
*
|
|
63
68
|
* Everything here is idempotent by construction: a device exists per
|
|
64
69
|
* (project, address), recurring scans re-report the same hosts every
|
|
@@ -120,6 +125,15 @@ export const MAX_MONITORS_PER_AUTO_IMPORT_RUN: number = 500;
|
|
|
120
125
|
// Scans one manual "Run Now" will read, oldest results last.
|
|
121
126
|
export const MAX_SCANS_PER_AUTO_IMPORT_RULE_RUN: number = 100;
|
|
122
127
|
|
|
128
|
+
/*
|
|
129
|
+
* Scans one rule write re-arms — see rearmRecentScansForRuleChange. The same
|
|
130
|
+
* ceiling as a manual run's, because it feeds the same work: a project whose
|
|
131
|
+
* subnets are swept by more fresh scans than this has its newest results
|
|
132
|
+
* re-armed and the rest left to "Run Now", rather than a rule save turning
|
|
133
|
+
* into an unbounded burst of writes.
|
|
134
|
+
*/
|
|
135
|
+
export const MAX_SCANS_REARMED_PER_RULE_WRITE: number = 100;
|
|
136
|
+
|
|
123
137
|
/*
|
|
124
138
|
* How many monitor creates may fail IDENTICALLY, back to back with no success
|
|
125
139
|
* between them, before the run stops attempting any more.
|
|
@@ -429,6 +443,123 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
429
443
|
return result;
|
|
430
444
|
}
|
|
431
445
|
|
|
446
|
+
/*
|
|
447
|
+
* The third way stored results become importable, alongside a new upload
|
|
448
|
+
* and a manual "Run Now": the RULES changed.
|
|
449
|
+
*
|
|
450
|
+
* The sweep is driven entirely by the marker — it looks only at scans whose
|
|
451
|
+
* autoImportProcessedAt is NULL — so results the engine has already
|
|
452
|
+
* evaluated are, as far as the worker is concerned, finished with. That is
|
|
453
|
+
* right for results evaluated against the rules the project HAS, and wrong
|
|
454
|
+
* the moment somebody writes a new one: the rule an operator just authored
|
|
455
|
+
* has nothing left to apply to until a scan reports again. In a project
|
|
456
|
+
* whose scans are one-shot, that is never — so a brand-new rule appears to
|
|
457
|
+
* do nothing at all and the operator is left pressing Run Now by hand,
|
|
458
|
+
* which is what OneUptime issue #3487 reported as "auto import rules have
|
|
459
|
+
* no schedule".
|
|
460
|
+
*
|
|
461
|
+
* Clearing the marker on the project's recent results hands them back to
|
|
462
|
+
* the sweep, which applies the FULL rule set to them within a minute —
|
|
463
|
+
* same pass, same lock, same idempotency as any other tick. Nothing is
|
|
464
|
+
* imported here: this method writes one column and no devices, so a rule
|
|
465
|
+
* save stays a rule save and the minutes of paced import work stay in the
|
|
466
|
+
* worker where a crash is resumable.
|
|
467
|
+
*
|
|
468
|
+
* Bounded to results still inside the engine's own freshness horizon
|
|
469
|
+
* (MAX_RESULT_AGE_IN_HOURS), which preserves exactly the guarantee that
|
|
470
|
+
* stamping rule-less projects exists to give: a first rule can never
|
|
471
|
+
* mass-import an estate discovered months ago. Older results remain Run
|
|
472
|
+
* Now's business, where "import these old hosts" is a deliberate click.
|
|
473
|
+
*
|
|
474
|
+
* Returns how many scans were re-armed. It may throw — the callers are rule
|
|
475
|
+
* writes, and they catch and log rather than fail an operator's save over a
|
|
476
|
+
* re-arm that can be had again from the next scan result or from Run Now.
|
|
477
|
+
*/
|
|
478
|
+
@CaptureSpan()
|
|
479
|
+
public async rearmRecentScansForRuleChange(data: {
|
|
480
|
+
projectId: ObjectID;
|
|
481
|
+
}): Promise<number> {
|
|
482
|
+
const scanStubs: Array<NetworkDeviceDiscoveryScan> =
|
|
483
|
+
await NetworkDeviceDiscoveryScanService.findBy({
|
|
484
|
+
query: {
|
|
485
|
+
projectId: data.projectId,
|
|
486
|
+
/*
|
|
487
|
+
* A scan that is still sweeping counts, for the reason its partial
|
|
488
|
+
* results are importable at all: those hosts have been found.
|
|
489
|
+
*/
|
|
490
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
491
|
+
/*
|
|
492
|
+
* Only STAMPED scans need re-arming. One whose marker is already
|
|
493
|
+
* NULL is queued for the next tick as it stands, and clearing it
|
|
494
|
+
* again would be a write that changes nothing.
|
|
495
|
+
*/
|
|
496
|
+
autoImportProcessedAt: QueryHelper.notNull(),
|
|
497
|
+
/*
|
|
498
|
+
* Fresh results only — the horizon processCompletedScan enforces
|
|
499
|
+
* anyway, applied here so a rule save does not re-arm scans the
|
|
500
|
+
* sweep would only retire again (one pointless write per scan, and
|
|
501
|
+
* a "too old to auto-import" warning per scan in the log).
|
|
502
|
+
* completedAt is NULL while a scan is still sweeping, and those
|
|
503
|
+
* results are the freshest the project has.
|
|
504
|
+
*/
|
|
505
|
+
completedAt: QueryHelper.greaterThanEqualToOrNull(
|
|
506
|
+
OneUptimeDate.getSomeHoursAgo(MAX_RESULT_AGE_IN_HOURS),
|
|
507
|
+
),
|
|
508
|
+
},
|
|
509
|
+
select: {
|
|
510
|
+
_id: true,
|
|
511
|
+
},
|
|
512
|
+
// Newest results first, so a capped re-arm keeps the ones that matter.
|
|
513
|
+
sort: {
|
|
514
|
+
completedAt: SortOrder.Descending,
|
|
515
|
+
},
|
|
516
|
+
limit: MAX_SCANS_REARMED_PER_RULE_WRITE,
|
|
517
|
+
skip: 0,
|
|
518
|
+
props: {
|
|
519
|
+
isRoot: true,
|
|
520
|
+
},
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
for (const scanStub of scanStubs) {
|
|
524
|
+
/*
|
|
525
|
+
* The same hook-free single statement the ingest endpoint clears this
|
|
526
|
+
* marker with, and for the same reasons (see stampScan) — but
|
|
527
|
+
* deliberately WITHOUT refreshing updatedAt. On an In Progress scan
|
|
528
|
+
* that column is the "has this probe gone silent" clock the stale-scan
|
|
529
|
+
* reaper reads (Workers/Jobs/NetworkDeviceDiscovery/
|
|
530
|
+
* RequeueRecurringScans.ts); a rule save is not the probe saying
|
|
531
|
+
* something, and bumping it would postpone the rescue of a scan whose
|
|
532
|
+
* probe had already died.
|
|
533
|
+
*
|
|
534
|
+
* No compare-and-set, because the query above already excludes the row
|
|
535
|
+
* every racing writer is interested in: the sweep only ever reads scans
|
|
536
|
+
* whose marker is NULL, and these are the ones whose marker is set. The
|
|
537
|
+
* one interleaving left is ingest clearing the marker between the read
|
|
538
|
+
* and this write and a sweep consuming those new results — and that
|
|
539
|
+
* sweep loads its rules after the rule write that brought us here, so
|
|
540
|
+
* it applies them. Re-clearing behind it costs one more pass over
|
|
541
|
+
* results whose devices already exist.
|
|
542
|
+
*/
|
|
543
|
+
await NetworkDeviceDiscoveryScanService.updateColumnsByIdWithoutHooks({
|
|
544
|
+
id: scanStub.id!,
|
|
545
|
+
// Cast: the model's JSON column makes DeepPartial recursion blow up.
|
|
546
|
+
data: {
|
|
547
|
+
autoImportProcessedAt: null,
|
|
548
|
+
} as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
|
|
549
|
+
skipUpdateDateColumn: true,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
if (scanStubs.length > 0) {
|
|
554
|
+
logger.info(
|
|
555
|
+
`Auto-import: rules changed, so ${scanStubs.length} recent discovery scan result(s) were re-armed; the next sweep will apply the project's rules to them.`,
|
|
556
|
+
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
return scanStubs.length;
|
|
561
|
+
}
|
|
562
|
+
|
|
432
563
|
/*
|
|
433
564
|
* The manual path: apply ONE rule to the project's completed scans, newest
|
|
434
565
|
* first — or, as a dry run, evaluate everything and write nothing. The
|