@oneuptime/common 13.0.7 → 13.0.8
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/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Server/API/AIBillingAPI.ts +1 -0
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +1 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +13 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +17 -0
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +161 -32
- package/Server/API/TeamMemberAPI.ts +3 -0
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +79 -5
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/ProjectService.ts +18 -0
- package/Server/Services/RumSessionPinService.ts +274 -22
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
- package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +12 -0
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/Utils/API.ts +14 -5
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Server/API/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +125 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +3 -3
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +64 -4
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +171 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +17 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +180 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +14 -13
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +11 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +13 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
import OneUptimeDate from "../Date";
|
|
2
|
+
import moment from "moment-timezone";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* The geometry of the schedule timeline, kept free of React so every rule
|
|
6
|
+
* that decides WHERE something is drawn is unit-tested on its own.
|
|
7
|
+
*
|
|
8
|
+
* Two ideas carry the whole file:
|
|
9
|
+
*
|
|
10
|
+
* 1. Days are computed in the VIEW timezone, never the browser's. A week is
|
|
11
|
+
* Monday 00:00 to the next Monday 00:00 on the wall clock of the zone the
|
|
12
|
+
* reader picked, so "Tuesday" means the same thing in the header and in
|
|
13
|
+
* the tooltip, whatever machine the page is open on.
|
|
14
|
+
*
|
|
15
|
+
* 2. Positions are in COLUMN space, not in raw time. Every day column has the
|
|
16
|
+
* same width, but a DST day lasts 23 or 25 hours, so a bar positioned by
|
|
17
|
+
* (t - rangeStart) / rangeLength would drift off its column by up to an
|
|
18
|
+
* hour across a clock change. Instead an instant is placed in the column
|
|
19
|
+
* of its day, at the fraction of that day that has elapsed, and a shift
|
|
20
|
+
* that ends at local midnight always ends exactly on a gridline.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export enum TimelineViewMode {
|
|
24
|
+
Week = "week",
|
|
25
|
+
Month = "month",
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface TimelineDay {
|
|
29
|
+
// "YYYY-MM-DD" in the view timezone.
|
|
30
|
+
key: string;
|
|
31
|
+
start: Date;
|
|
32
|
+
end: Date;
|
|
33
|
+
dayOfMonth: number;
|
|
34
|
+
// "Mon"
|
|
35
|
+
weekdayShort: string;
|
|
36
|
+
// "M"
|
|
37
|
+
weekdayNarrow: string;
|
|
38
|
+
// "Sep"
|
|
39
|
+
monthShort: string;
|
|
40
|
+
isWeekend: boolean;
|
|
41
|
+
isFirstOfMonth: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface TimelineRange {
|
|
45
|
+
mode: TimelineViewMode;
|
|
46
|
+
timezone: string;
|
|
47
|
+
start: Date;
|
|
48
|
+
end: Date;
|
|
49
|
+
days: Array<TimelineDay>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface TimeInterval {
|
|
53
|
+
start: Date;
|
|
54
|
+
end: Date;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface PositionedInterval<T extends TimeInterval> {
|
|
58
|
+
item: T;
|
|
59
|
+
// Both in percent of the day area (0-100).
|
|
60
|
+
left: number;
|
|
61
|
+
width: number;
|
|
62
|
+
// The interval is cut at the range edge; its true start / end is outside.
|
|
63
|
+
continuesBefore: boolean;
|
|
64
|
+
continuesAfter: boolean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const MILLISECONDS_PER_MINUTE: number = 60 * 1000;
|
|
68
|
+
|
|
69
|
+
const HEX_COLOR_PATTERN: RegExp = /^[0-9a-fA-F]{6}$/;
|
|
70
|
+
|
|
71
|
+
export default class ScheduleTimelineLayout {
|
|
72
|
+
/*
|
|
73
|
+
* The days on screen for `mode` around `anchor`, in `timezone`:
|
|
74
|
+
* Week -> the ISO week (Monday first) containing the anchor;
|
|
75
|
+
* Month -> the calendar month containing the anchor.
|
|
76
|
+
*
|
|
77
|
+
* Days are walked as plain calendar dates and each day's edge is parsed in
|
|
78
|
+
* the zone, rather than by stepping a zoned moment a day at a time. In the
|
|
79
|
+
* zones whose DST gap is AT midnight (America/Santiago, America/Havana,
|
|
80
|
+
* Asia/Beirut, Atlantic/Azores, Africa/Cairo) there is no 00:00 on the
|
|
81
|
+
* change day; stepping a zoned moment lands an hour off and drags the
|
|
82
|
+
* neighbouring day's edge with it, while parsing the date resolves to the
|
|
83
|
+
* first instant that day actually has.
|
|
84
|
+
*/
|
|
85
|
+
public static getRange(data: {
|
|
86
|
+
mode: TimelineViewMode;
|
|
87
|
+
anchor: Date;
|
|
88
|
+
timezone: string;
|
|
89
|
+
}): TimelineRange {
|
|
90
|
+
const anchorDate: moment.Moment = ScheduleTimelineLayout.getCalendarDate(
|
|
91
|
+
data.anchor,
|
|
92
|
+
data.timezone,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const firstDate: moment.Moment =
|
|
96
|
+
data.mode === TimelineViewMode.Month
|
|
97
|
+
? anchorDate.clone().startOf("month")
|
|
98
|
+
: anchorDate.clone().startOf("isoWeek");
|
|
99
|
+
|
|
100
|
+
const dayCount: number =
|
|
101
|
+
data.mode === TimelineViewMode.Month ? firstDate.daysInMonth() : 7;
|
|
102
|
+
|
|
103
|
+
const days: Array<TimelineDay> = [];
|
|
104
|
+
|
|
105
|
+
for (let index: number = 0; index < dayCount; index++) {
|
|
106
|
+
const date: moment.Moment = firstDate.clone().add(index, "days");
|
|
107
|
+
const isoWeekday: number = date.isoWeekday();
|
|
108
|
+
|
|
109
|
+
days.push({
|
|
110
|
+
key: date.format("YYYY-MM-DD"),
|
|
111
|
+
start: ScheduleTimelineLayout.getStartOfLocalDay(date, data.timezone),
|
|
112
|
+
end: ScheduleTimelineLayout.getStartOfLocalDay(
|
|
113
|
+
date.clone().add(1, "day"),
|
|
114
|
+
data.timezone,
|
|
115
|
+
),
|
|
116
|
+
dayOfMonth: date.date(),
|
|
117
|
+
weekdayShort: date.format("ddd"),
|
|
118
|
+
weekdayNarrow: date.format("dd").charAt(0),
|
|
119
|
+
monthShort: date.format("MMM"),
|
|
120
|
+
isWeekend: isoWeekday === 6 || isoWeekday === 7,
|
|
121
|
+
isFirstOfMonth: date.date() === 1,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
mode: data.mode,
|
|
127
|
+
timezone: data.timezone,
|
|
128
|
+
start: days[0]!.start,
|
|
129
|
+
end: days[days.length - 1]!.end,
|
|
130
|
+
days,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* An anchor inside the week / month before or after: local noon of that
|
|
136
|
+
* period's first day. Noon rather than midnight, so no anchor ever sits on
|
|
137
|
+
* an edge that a DST change or a later zone switch could move.
|
|
138
|
+
*/
|
|
139
|
+
public static shiftAnchor(data: {
|
|
140
|
+
mode: TimelineViewMode;
|
|
141
|
+
anchor: Date;
|
|
142
|
+
timezone: string;
|
|
143
|
+
direction: 1 | -1;
|
|
144
|
+
}): Date {
|
|
145
|
+
const anchorDate: moment.Moment = ScheduleTimelineLayout.getCalendarDate(
|
|
146
|
+
data.anchor,
|
|
147
|
+
data.timezone,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const target: moment.Moment =
|
|
151
|
+
data.mode === TimelineViewMode.Month
|
|
152
|
+
? anchorDate.clone().startOf("month").add(data.direction, "month")
|
|
153
|
+
: anchorDate
|
|
154
|
+
.clone()
|
|
155
|
+
.startOf("isoWeek")
|
|
156
|
+
.add(data.direction * 7, "days");
|
|
157
|
+
|
|
158
|
+
return moment
|
|
159
|
+
.tz(
|
|
160
|
+
`${target.format("YYYY-MM-DD")} 12:00`,
|
|
161
|
+
"YYYY-MM-DD HH:mm",
|
|
162
|
+
data.timezone,
|
|
163
|
+
)
|
|
164
|
+
.toDate();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* The same wall-clock moment in another zone. Used when the reader changes
|
|
169
|
+
* the view zone, so the dates on screen stay the dates on screen: the same
|
|
170
|
+
* INSTANT would fall on the previous day in any zone west of the old one
|
|
171
|
+
* and quietly page the view back a week or a month.
|
|
172
|
+
*/
|
|
173
|
+
public static moveAnchorToTimezone(data: {
|
|
174
|
+
anchor: Date;
|
|
175
|
+
fromTimezone: string;
|
|
176
|
+
toTimezone: string;
|
|
177
|
+
}): Date {
|
|
178
|
+
const wallClock: string = moment
|
|
179
|
+
.tz(data.anchor, data.fromTimezone)
|
|
180
|
+
.format("YYYY-MM-DDTHH:mm:ss");
|
|
181
|
+
|
|
182
|
+
return moment
|
|
183
|
+
.tz(wallClock, "YYYY-MM-DDTHH:mm:ss", data.toTimezone)
|
|
184
|
+
.toDate();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// The calendar date of `date` in `timezone`, as a zone-free UTC moment.
|
|
188
|
+
private static getCalendarDate(date: Date, timezone: string): moment.Moment {
|
|
189
|
+
return moment.utc(
|
|
190
|
+
moment.tz(date, timezone).format("YYYY-MM-DD"),
|
|
191
|
+
"YYYY-MM-DD",
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// The first instant of a calendar date in `timezone` (DST-gap safe).
|
|
196
|
+
private static getStartOfLocalDay(
|
|
197
|
+
calendarDate: moment.Moment,
|
|
198
|
+
timezone: string,
|
|
199
|
+
): Date {
|
|
200
|
+
return moment
|
|
201
|
+
.tz(calendarDate.format("YYYY-MM-DD"), "YYYY-MM-DD", timezone)
|
|
202
|
+
.toDate();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*
|
|
206
|
+
* "September 14 – 20, 2026", "Sep 28 – Oct 4, 2026",
|
|
207
|
+
* "Dec 28, 2026 – Jan 3, 2027" or "September 2026".
|
|
208
|
+
*/
|
|
209
|
+
public static getRangeLabel(range: TimelineRange): string {
|
|
210
|
+
const first: moment.Moment = moment.tz(range.start, range.timezone);
|
|
211
|
+
|
|
212
|
+
if (range.mode === TimelineViewMode.Month) {
|
|
213
|
+
return first.format("MMMM YYYY");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const lastDay: TimelineDay | undefined = range.days[range.days.length - 1];
|
|
217
|
+
const last: moment.Moment = moment.tz(
|
|
218
|
+
lastDay ? lastDay.start : range.start,
|
|
219
|
+
range.timezone,
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
if (first.year() !== last.year()) {
|
|
223
|
+
return `${first.format("MMM D, YYYY")} – ${last.format("MMM D, YYYY")}`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (first.month() !== last.month()) {
|
|
227
|
+
return `${first.format("MMM D")} – ${last.format("MMM D, YYYY")}`;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return `${first.format("MMMM D")} – ${last.format("D, YYYY")}`;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// "YYYY-MM-DD" of the day containing `date` in `timezone`.
|
|
234
|
+
public static getDayKey(date: Date, timezone: string): string {
|
|
235
|
+
return moment.tz(date, timezone).format("YYYY-MM-DD");
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
public static isWithinRange(date: Date, range: TimeInterval): boolean {
|
|
239
|
+
return (
|
|
240
|
+
date.getTime() >= range.start.getTime() &&
|
|
241
|
+
date.getTime() < range.end.getTime()
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/*
|
|
246
|
+
* Where `instant` falls across the day columns, from 0 (the left edge of
|
|
247
|
+
* the first day) to 1 (the right edge of the last). See the file comment
|
|
248
|
+
* for why this is column space rather than raw time.
|
|
249
|
+
*/
|
|
250
|
+
public static getFraction(instant: Date, range: TimelineRange): number {
|
|
251
|
+
const days: Array<TimelineDay> = range.days;
|
|
252
|
+
|
|
253
|
+
if (days.length === 0) {
|
|
254
|
+
return 0;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const time: number = instant.getTime();
|
|
258
|
+
|
|
259
|
+
if (time <= days[0]!.start.getTime()) {
|
|
260
|
+
return 0;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (time >= days[days.length - 1]!.end.getTime()) {
|
|
264
|
+
return 1;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
let low: number = 0;
|
|
268
|
+
let high: number = days.length - 1;
|
|
269
|
+
|
|
270
|
+
while (low < high) {
|
|
271
|
+
const mid: number = Math.floor((low + high + 1) / 2);
|
|
272
|
+
|
|
273
|
+
if (days[mid]!.start.getTime() <= time) {
|
|
274
|
+
low = mid;
|
|
275
|
+
} else {
|
|
276
|
+
high = mid - 1;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const day: TimelineDay = days[low]!;
|
|
281
|
+
const dayLength: number = day.end.getTime() - day.start.getTime();
|
|
282
|
+
const withinDay: number =
|
|
283
|
+
dayLength > 0 ? (time - day.start.getTime()) / dayLength : 0;
|
|
284
|
+
|
|
285
|
+
return (low + Math.min(1, Math.max(0, withinDay))) / days.length;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/*
|
|
289
|
+
* Place intervals on the day area. Anything that does not overlap the
|
|
290
|
+
* range is dropped; anything that runs past an edge is cut there and says
|
|
291
|
+
* so, so the bar can square off that end instead of pretending to start or
|
|
292
|
+
* stop at the edge of the screen.
|
|
293
|
+
*/
|
|
294
|
+
public static positionIntervals<T extends TimeInterval>(
|
|
295
|
+
items: Array<T>,
|
|
296
|
+
range: TimelineRange,
|
|
297
|
+
): Array<PositionedInterval<T>> {
|
|
298
|
+
const out: Array<PositionedInterval<T>> = [];
|
|
299
|
+
|
|
300
|
+
for (const item of items) {
|
|
301
|
+
if (
|
|
302
|
+
item.end.getTime() <= range.start.getTime() ||
|
|
303
|
+
item.start.getTime() >= range.end.getTime()
|
|
304
|
+
) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const left: number =
|
|
309
|
+
ScheduleTimelineLayout.getFraction(item.start, range) * 100;
|
|
310
|
+
const right: number =
|
|
311
|
+
ScheduleTimelineLayout.getFraction(item.end, range) * 100;
|
|
312
|
+
|
|
313
|
+
if (right <= left) {
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
out.push({
|
|
318
|
+
item,
|
|
319
|
+
left,
|
|
320
|
+
width: right - left,
|
|
321
|
+
continuesBefore: item.start.getTime() < range.start.getTime(),
|
|
322
|
+
continuesAfter: item.end.getTime() > range.end.getTime(),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return out;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/*
|
|
330
|
+
* The stretches of [windowStart, windowEnd) that no interval covers,
|
|
331
|
+
* ignoring holes shorter than `minimumGapMs` (the engine's one-second seams
|
|
332
|
+
* and similar slivers would otherwise draw as hairlines). Overlapping and
|
|
333
|
+
* unsorted input is fine.
|
|
334
|
+
*/
|
|
335
|
+
public static computeGaps(
|
|
336
|
+
intervals: Array<TimeInterval>,
|
|
337
|
+
windowStart: Date,
|
|
338
|
+
windowEnd: Date,
|
|
339
|
+
minimumGapMs: number = MILLISECONDS_PER_MINUTE,
|
|
340
|
+
): Array<TimeInterval> {
|
|
341
|
+
const startTime: number = windowStart.getTime();
|
|
342
|
+
const endTime: number = windowEnd.getTime();
|
|
343
|
+
|
|
344
|
+
if (endTime <= startTime) {
|
|
345
|
+
return [];
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const sorted: Array<TimeInterval> = intervals
|
|
349
|
+
.filter((interval: TimeInterval) => {
|
|
350
|
+
return (
|
|
351
|
+
interval.end.getTime() > startTime &&
|
|
352
|
+
interval.start.getTime() < endTime &&
|
|
353
|
+
interval.end.getTime() > interval.start.getTime()
|
|
354
|
+
);
|
|
355
|
+
})
|
|
356
|
+
.sort((a: TimeInterval, b: TimeInterval) => {
|
|
357
|
+
return a.start.getTime() - b.start.getTime();
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
const gaps: Array<TimeInterval> = [];
|
|
361
|
+
let cursor: number = startTime;
|
|
362
|
+
|
|
363
|
+
const pushGap: (from: number, to: number) => void = (
|
|
364
|
+
from: number,
|
|
365
|
+
to: number,
|
|
366
|
+
): void => {
|
|
367
|
+
if (to - from >= Math.max(1, minimumGapMs)) {
|
|
368
|
+
gaps.push({ start: new Date(from), end: new Date(to) });
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
for (const interval of sorted) {
|
|
373
|
+
const intervalStart: number = Math.max(
|
|
374
|
+
startTime,
|
|
375
|
+
interval.start.getTime(),
|
|
376
|
+
);
|
|
377
|
+
const intervalEnd: number = Math.min(endTime, interval.end.getTime());
|
|
378
|
+
|
|
379
|
+
if (intervalStart > cursor) {
|
|
380
|
+
pushGap(cursor, intervalStart);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
cursor = Math.max(cursor, intervalEnd);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (cursor < endTime) {
|
|
387
|
+
pushGap(cursor, endTime);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return gaps;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// The first interval containing `now`, if any.
|
|
394
|
+
public static findActive<T extends TimeInterval>(
|
|
395
|
+
items: Array<T>,
|
|
396
|
+
now: Date,
|
|
397
|
+
): T | null {
|
|
398
|
+
for (const item of items) {
|
|
399
|
+
if (
|
|
400
|
+
item.start.getTime() <= now.getTime() &&
|
|
401
|
+
item.end.getTime() > now.getTime()
|
|
402
|
+
) {
|
|
403
|
+
return item;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/*
|
|
411
|
+
* "Mon, Sep 14, 09:00 → Mon, Sep 21, 09:00", or
|
|
412
|
+
* "Mon, Sep 14, 09:00 – 17:00" when both ends are on the same day. The end
|
|
413
|
+
* is exclusive, so a shift ending at midnight reads "→ Tue, 00:00".
|
|
414
|
+
*/
|
|
415
|
+
public static formatInterval(data: {
|
|
416
|
+
start: Date;
|
|
417
|
+
end: Date;
|
|
418
|
+
timezone: string;
|
|
419
|
+
use12HourFormat?: boolean | undefined;
|
|
420
|
+
}): string {
|
|
421
|
+
const use12HourFormat: boolean =
|
|
422
|
+
data.use12HourFormat ?? OneUptimeDate.getUserPrefers12HourFormat();
|
|
423
|
+
const timeFormat: string = use12HourFormat ? "h:mm A" : "HH:mm";
|
|
424
|
+
const dateFormat: string = "ddd, MMM D";
|
|
425
|
+
|
|
426
|
+
const start: moment.Moment = moment.tz(data.start, data.timezone);
|
|
427
|
+
const end: moment.Moment = moment.tz(data.end, data.timezone);
|
|
428
|
+
|
|
429
|
+
const startText: string = `${start.format(dateFormat)}, ${start.format(
|
|
430
|
+
timeFormat,
|
|
431
|
+
)}`;
|
|
432
|
+
|
|
433
|
+
if (start.format("YYYY-MM-DD") === end.format("YYYY-MM-DD")) {
|
|
434
|
+
return `${startText} – ${end.format(timeFormat)}`;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const sameYear: boolean = start.year() === end.year();
|
|
438
|
+
const endDateFormat: string = sameYear ? dateFormat : "ddd, MMM D, YYYY";
|
|
439
|
+
|
|
440
|
+
return `${startText} → ${end.format(endDateFormat)}, ${end.format(
|
|
441
|
+
timeFormat,
|
|
442
|
+
)}`;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// "7d", "3d 12h", "8h", "8h 30m", "45m", "<1m".
|
|
446
|
+
public static formatDuration(milliseconds: number): string {
|
|
447
|
+
if (
|
|
448
|
+
!Number.isFinite(milliseconds) ||
|
|
449
|
+
milliseconds < MILLISECONDS_PER_MINUTE
|
|
450
|
+
) {
|
|
451
|
+
return "<1m";
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const totalMinutes: number = Math.round(
|
|
455
|
+
milliseconds / MILLISECONDS_PER_MINUTE,
|
|
456
|
+
);
|
|
457
|
+
const days: number = Math.floor(totalMinutes / (24 * 60));
|
|
458
|
+
const hours: number = Math.floor((totalMinutes % (24 * 60)) / 60);
|
|
459
|
+
const minutes: number = totalMinutes % 60;
|
|
460
|
+
|
|
461
|
+
if (days > 0) {
|
|
462
|
+
return hours > 0 ? `${days}d ${hours}h` : `${days}d`;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
if (hours > 0) {
|
|
466
|
+
return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
return `${minutes}m`;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/*
|
|
473
|
+
* Hours on call inside the window, summed over the intervals (each cut to
|
|
474
|
+
* the window). Overlaps are NOT merged: two schedules at once are two
|
|
475
|
+
* rosters, and the legend reports load, not wall-clock presence.
|
|
476
|
+
*/
|
|
477
|
+
public static sumWithin(
|
|
478
|
+
intervals: Array<TimeInterval>,
|
|
479
|
+
window: TimeInterval,
|
|
480
|
+
): number {
|
|
481
|
+
let total: number = 0;
|
|
482
|
+
|
|
483
|
+
for (const interval of intervals) {
|
|
484
|
+
const start: number = Math.max(
|
|
485
|
+
interval.start.getTime(),
|
|
486
|
+
window.start.getTime(),
|
|
487
|
+
);
|
|
488
|
+
const end: number = Math.min(
|
|
489
|
+
interval.end.getTime(),
|
|
490
|
+
window.end.getTime(),
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
if (end > start) {
|
|
494
|
+
total += end - start;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
return total;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/*
|
|
502
|
+
* Whether the reader may page to the previous / next range: only while
|
|
503
|
+
* part of that range is still inside the window the server can draw.
|
|
504
|
+
*/
|
|
505
|
+
public static getNavigability(data: {
|
|
506
|
+
mode: TimelineViewMode;
|
|
507
|
+
anchor: Date;
|
|
508
|
+
timezone: string;
|
|
509
|
+
addressable: TimeInterval;
|
|
510
|
+
}): { canGoBack: boolean; canGoForward: boolean } {
|
|
511
|
+
const previous: TimelineRange = ScheduleTimelineLayout.getRange({
|
|
512
|
+
mode: data.mode,
|
|
513
|
+
timezone: data.timezone,
|
|
514
|
+
anchor: ScheduleTimelineLayout.shiftAnchor({ ...data, direction: -1 }),
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
const next: TimelineRange = ScheduleTimelineLayout.getRange({
|
|
518
|
+
mode: data.mode,
|
|
519
|
+
timezone: data.timezone,
|
|
520
|
+
anchor: ScheduleTimelineLayout.shiftAnchor({ ...data, direction: 1 }),
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
return {
|
|
524
|
+
canGoBack: previous.end.getTime() > data.addressable.start.getTime(),
|
|
525
|
+
canGoForward: next.start.getTime() < data.addressable.end.getTime(),
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/*
|
|
530
|
+
* `#rrggbb` (or `#rgb`) at `alpha`, as an rgba() string. Anything that is
|
|
531
|
+
* not a hex colour is returned untouched so a bad value degrades to a solid
|
|
532
|
+
* colour rather than to no colour at all.
|
|
533
|
+
*/
|
|
534
|
+
public static withAlpha(color: string, alpha: number): string {
|
|
535
|
+
const rgb: [number, number, number] | null =
|
|
536
|
+
ScheduleTimelineLayout.parseHex(color);
|
|
537
|
+
|
|
538
|
+
if (!rgb) {
|
|
539
|
+
return color;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const clamped: number = Math.min(1, Math.max(0, alpha));
|
|
543
|
+
|
|
544
|
+
return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${clamped})`;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/*
|
|
548
|
+
* Near-black or white, whichever reads on `color`. The per-user palette
|
|
549
|
+
* runs from black to yellow and lime, so a fixed text colour is unreadable
|
|
550
|
+
* on some avatars.
|
|
551
|
+
*/
|
|
552
|
+
public static getContrastTextColor(color: string): string {
|
|
553
|
+
const rgb: [number, number, number] | null =
|
|
554
|
+
ScheduleTimelineLayout.parseHex(color);
|
|
555
|
+
|
|
556
|
+
if (!rgb) {
|
|
557
|
+
return "#ffffff";
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const luminance: number =
|
|
561
|
+
(0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255;
|
|
562
|
+
|
|
563
|
+
return luminance > 0.62 ? "#111827" : "#ffffff";
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
private static parseHex(color: string): [number, number, number] | null {
|
|
567
|
+
const hex: string = color.trim().replace(/^#/, "");
|
|
568
|
+
|
|
569
|
+
const full: string =
|
|
570
|
+
hex.length === 3
|
|
571
|
+
? hex
|
|
572
|
+
.split("")
|
|
573
|
+
.map((char: string) => {
|
|
574
|
+
return char + char;
|
|
575
|
+
})
|
|
576
|
+
.join("")
|
|
577
|
+
: hex;
|
|
578
|
+
|
|
579
|
+
if (!HEX_COLOR_PATTERN.test(full)) {
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
return [
|
|
584
|
+
parseInt(full.slice(0, 2), 16),
|
|
585
|
+
parseInt(full.slice(2, 4), 16),
|
|
586
|
+
parseInt(full.slice(4, 6), 16),
|
|
587
|
+
];
|
|
588
|
+
}
|
|
589
|
+
}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
enum EventName {
|
|
2
2
|
ListenToModalEvent = "ListenToModelEvent",
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Server -> client. A ListenToModelEvent was refused because the socket's
|
|
6
|
+
* handshake carried no access token, or one that no longer decodes (the
|
|
7
|
+
* dashboard's access token lives 15 minutes; the handshake cookie lives as
|
|
8
|
+
* long as the connection). The payload is the refused ListenToModelEventJSON.
|
|
9
|
+
*
|
|
10
|
+
* The socket can not be re-authenticated in place: the cookie is read from
|
|
11
|
+
* the handshake, so the client has to refresh its session and reconnect.
|
|
12
|
+
*/
|
|
13
|
+
AuthenticationRequired = "AuthenticationRequired",
|
|
3
14
|
}
|
|
4
15
|
|
|
5
16
|
export default EventName;
|
|
@@ -33,3 +33,17 @@ export const DETECTION_GROUP_VALUE_ATTRIBUTE: string =
|
|
|
33
33
|
"oneuptime.detection.group_value";
|
|
34
34
|
export const DETECTION_SIGMA_ID_ATTRIBUTE: string =
|
|
35
35
|
"oneuptime.detection.sigma_id";
|
|
36
|
+
|
|
37
|
+
// Save-time bounds for DetectionRule.evaluationIntervalInMinutes.
|
|
38
|
+
export const DETECTION_EVALUATION_INTERVAL_MIN_IN_MINUTES: number = 1;
|
|
39
|
+
export const DETECTION_EVALUATION_INTERVAL_MAX_IN_MINUTES: number = 1440;
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Cap on how far back one evaluation may scan, whatever lastEvaluatedAt
|
|
43
|
+
* says — a rule re-enabled after a month must not trigger a month-long
|
|
44
|
+
* table scan.
|
|
45
|
+
*/
|
|
46
|
+
export const DETECTION_MAX_LOOKBACK_IN_MINUTES: number = 24 * 60;
|
|
47
|
+
|
|
48
|
+
// One alert per distinct group value per cycle, at most.
|
|
49
|
+
export const DETECTION_MAX_GROUPS_PER_EVALUATION: number = 100;
|
|
@@ -43,6 +43,36 @@ export function ocsfSeverityFromId(id: number): OcsfSeverity {
|
|
|
43
43
|
return OcsfSeverity.Unknown;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/*
|
|
47
|
+
* Upper-cased severity text -> OCSF severity. Exported so SQL that grades
|
|
48
|
+
* stored rows (the Google SecOps severity backfill) is generated from this
|
|
49
|
+
* table instead of restating it.
|
|
50
|
+
*/
|
|
51
|
+
export const OCSF_SEVERITY_ALIASES: Readonly<Record<string, OcsfSeverity>> = {
|
|
52
|
+
UNKNOWN: OcsfSeverity.Unknown,
|
|
53
|
+
UNKNOWN_SEVERITY: OcsfSeverity.Unknown,
|
|
54
|
+
NONE: OcsfSeverity.Informational,
|
|
55
|
+
INFO: OcsfSeverity.Informational,
|
|
56
|
+
INFORMATION: OcsfSeverity.Informational,
|
|
57
|
+
INFORMATIONAL: OcsfSeverity.Informational,
|
|
58
|
+
NOTICE: OcsfSeverity.Informational,
|
|
59
|
+
DEBUG: OcsfSeverity.Informational,
|
|
60
|
+
LOW: OcsfSeverity.Low,
|
|
61
|
+
WARN: OcsfSeverity.Low,
|
|
62
|
+
WARNING: OcsfSeverity.Low,
|
|
63
|
+
MEDIUM: OcsfSeverity.Medium,
|
|
64
|
+
MODERATE: OcsfSeverity.Medium,
|
|
65
|
+
ERR: OcsfSeverity.Medium,
|
|
66
|
+
ERROR: OcsfSeverity.Medium,
|
|
67
|
+
HIGH: OcsfSeverity.High,
|
|
68
|
+
SEVERE: OcsfSeverity.High,
|
|
69
|
+
CRITICAL: OcsfSeverity.Critical,
|
|
70
|
+
CRIT: OcsfSeverity.Critical,
|
|
71
|
+
ALERT: OcsfSeverity.Critical,
|
|
72
|
+
FATAL: OcsfSeverity.Fatal,
|
|
73
|
+
EMERGENCY: OcsfSeverity.Fatal,
|
|
74
|
+
};
|
|
75
|
+
|
|
46
76
|
/*
|
|
47
77
|
* Loose severity text -> OCSF severity. Accepts the dialects we ingest:
|
|
48
78
|
* UDM security_result severities (EMERGENCY/ALERT/CRITICAL/ERROR/HIGH/...),
|
|
@@ -57,32 +87,7 @@ export function normalizeOcsfSeverity(text: string): OcsfSeverity | null {
|
|
|
57
87
|
return null;
|
|
58
88
|
}
|
|
59
89
|
|
|
60
|
-
|
|
61
|
-
UNKNOWN: OcsfSeverity.Unknown,
|
|
62
|
-
UNKNOWN_SEVERITY: OcsfSeverity.Unknown,
|
|
63
|
-
NONE: OcsfSeverity.Informational,
|
|
64
|
-
INFO: OcsfSeverity.Informational,
|
|
65
|
-
INFORMATION: OcsfSeverity.Informational,
|
|
66
|
-
INFORMATIONAL: OcsfSeverity.Informational,
|
|
67
|
-
NOTICE: OcsfSeverity.Informational,
|
|
68
|
-
DEBUG: OcsfSeverity.Informational,
|
|
69
|
-
LOW: OcsfSeverity.Low,
|
|
70
|
-
WARN: OcsfSeverity.Low,
|
|
71
|
-
WARNING: OcsfSeverity.Low,
|
|
72
|
-
MEDIUM: OcsfSeverity.Medium,
|
|
73
|
-
MODERATE: OcsfSeverity.Medium,
|
|
74
|
-
ERR: OcsfSeverity.Medium,
|
|
75
|
-
ERROR: OcsfSeverity.Medium,
|
|
76
|
-
HIGH: OcsfSeverity.High,
|
|
77
|
-
SEVERE: OcsfSeverity.High,
|
|
78
|
-
CRITICAL: OcsfSeverity.Critical,
|
|
79
|
-
CRIT: OcsfSeverity.Critical,
|
|
80
|
-
ALERT: OcsfSeverity.Critical,
|
|
81
|
-
FATAL: OcsfSeverity.Fatal,
|
|
82
|
-
EMERGENCY: OcsfSeverity.Fatal,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
return aliases[normalized] || null;
|
|
90
|
+
return OCSF_SEVERITY_ALIASES[normalized] || null;
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
export default OcsfSeverity;
|