@oneuptime/common 13.0.7 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Scripts/generate-service-worker.js +65 -4
- 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 +34 -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 +243 -460
- 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/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +261 -74
- package/Server/API/TeamMemberAPI.ts +13 -1
- 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/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +117 -21
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +56 -4
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- 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 +302 -0
- package/Server/Services/RumSessionPinService.ts +293 -22
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- 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/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- 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/AuditLogsAndComplianceShells.test.tsx +572 -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/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- 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/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- 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 +133 -70
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -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/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- 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/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- 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 +766 -381
- 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 +196 -912
- 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/SsoProviderListingsEdition.test.ts +432 -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/TeamMemberLeaveScimLockEdition.test.ts +252 -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/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- 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/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -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/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- 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/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- 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/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -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/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- 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/Types/Markdown.test.ts +181 -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/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -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/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -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/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- 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/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -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/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -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/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- 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/Types/StatusPage/UptimeDailyAggregate.ts +110 -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 +808 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -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/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- 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/UI/esbuild-enterprise.js +263 -0
- package/Utils/API.ts +14 -5
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- 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 +33 -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 +158 -342
- 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/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.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 +218 -76
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +11 -4
- 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/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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 +94 -15
- 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/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.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/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -4
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.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 +231 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +198 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.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/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.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/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.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/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.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 +24 -16
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.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/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.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/AffectedResourceList.js +96 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- 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/MonitorCriteriaEvaluator.js +449 -261
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- 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/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.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/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +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/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- 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 +425 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- 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/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.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/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- 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/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.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/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- 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/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
package/UI/Utils/Realtime.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { HOST, HTTP_PROTOCOL } from "../Config";
|
|
2
|
+
import API from "./API/API";
|
|
2
3
|
import AnalyticsBaseModel from "../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
3
4
|
import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
4
5
|
import { RealtimeRoute } from "../../ServiceRoute";
|
|
@@ -21,14 +22,55 @@ export interface ListenToModelEvent<
|
|
|
21
22
|
modelId?: ObjectID | undefined;
|
|
22
23
|
}
|
|
23
24
|
|
|
25
|
+
/*
|
|
26
|
+
* One subscription a caller holds: what the server has to be asked for (again
|
|
27
|
+
* after every reconnect) and the handler listening on its room.
|
|
28
|
+
*/
|
|
29
|
+
interface RealtimeSubscription {
|
|
30
|
+
request: ListenToModelEventJSON;
|
|
31
|
+
roomId: string;
|
|
32
|
+
handler: (data: JSONObject) => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
24
35
|
export default abstract class Realtime {
|
|
36
|
+
/*
|
|
37
|
+
* The least time between two refresh-and-reconnects. A reconnect with a
|
|
38
|
+
* freshly refreshed session that the server still refuses (a cookie that
|
|
39
|
+
* does not reach the socket, say) must not turn into a reconnect loop; the
|
|
40
|
+
* next refusal after this long tries again. Far shorter than the 15-minute
|
|
41
|
+
* access token, so a session that genuinely expires again is still renewed.
|
|
42
|
+
*/
|
|
43
|
+
public static readonly AUTHENTICATION_RECOVERY_COOLDOWN_IN_MS: number =
|
|
44
|
+
60 * 1000;
|
|
45
|
+
|
|
25
46
|
private static socket: Socket;
|
|
26
47
|
|
|
48
|
+
/*
|
|
49
|
+
* Every subscription still wanted, by identity: two callers asking for the
|
|
50
|
+
* same room are two entries, and each one's stop function removes only its
|
|
51
|
+
* own. The server forgets a socket's rooms when the connection drops, so
|
|
52
|
+
* this is what gets re-sent on every (re)connect.
|
|
53
|
+
*/
|
|
54
|
+
private static subscriptions: Set<RealtimeSubscription> = new Set();
|
|
55
|
+
|
|
56
|
+
private static isRecoveringAuthentication: boolean = false;
|
|
57
|
+
|
|
58
|
+
private static lastAuthenticationRecoveryAt: number | null = null;
|
|
59
|
+
|
|
27
60
|
public static init(): void {
|
|
28
61
|
const socket: Socket = SocketIO(new URL(HTTP_PROTOCOL, HOST).toString(), {
|
|
29
62
|
path: RealtimeRoute.toString(),
|
|
30
63
|
});
|
|
31
64
|
|
|
65
|
+
// Initial connect and every reconnect: the new connection is in no rooms.
|
|
66
|
+
socket.on("connect", (): void => {
|
|
67
|
+
this.resubscribeAll();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
socket.on(EventName.AuthenticationRequired, (): void => {
|
|
71
|
+
this.onAuthenticationRequired();
|
|
72
|
+
});
|
|
73
|
+
|
|
32
74
|
this.socket = socket;
|
|
33
75
|
}
|
|
34
76
|
|
|
@@ -55,27 +97,22 @@ export default abstract class Realtime {
|
|
|
55
97
|
tenantId: listenToModelEvent.tenantId.toString(),
|
|
56
98
|
};
|
|
57
99
|
|
|
58
|
-
this.emit(EventName.ListenToModalEvent, listenToModelEventJSON as any);
|
|
59
|
-
|
|
60
100
|
const roomId: string = RealtimeUtil.getRoomId(
|
|
61
101
|
listenToModelEvent.tenantId,
|
|
62
102
|
listenToModelEvent.modelType.name,
|
|
63
103
|
listenToModelEvent.eventType,
|
|
64
104
|
);
|
|
65
105
|
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
return stopListening;
|
|
106
|
+
return this.subscribe(
|
|
107
|
+
listenToModelEventJSON,
|
|
108
|
+
roomId,
|
|
109
|
+
(data: JSONObject): void => {
|
|
110
|
+
const id: ObjectID = ObjectID.fromString(
|
|
111
|
+
data["modelId"]?.toString() as string,
|
|
112
|
+
);
|
|
113
|
+
onEvent(id);
|
|
114
|
+
},
|
|
115
|
+
);
|
|
79
116
|
}
|
|
80
117
|
|
|
81
118
|
public static listenToAnalyticsModelEvent<Model extends AnalyticsBaseModel>(
|
|
@@ -93,8 +130,6 @@ export default abstract class Realtime {
|
|
|
93
130
|
tenantId: listenToModelEvent.tenantId.toString(),
|
|
94
131
|
};
|
|
95
132
|
|
|
96
|
-
this.emit(EventName.ListenToModalEvent, listenToModelEventJSON as any);
|
|
97
|
-
|
|
98
133
|
let roomId: string = RealtimeUtil.getRoomId(
|
|
99
134
|
listenToModelEvent.tenantId,
|
|
100
135
|
listenToModelEvent.modelType.name,
|
|
@@ -110,28 +145,139 @@ export default abstract class Realtime {
|
|
|
110
145
|
);
|
|
111
146
|
}
|
|
112
147
|
|
|
113
|
-
this.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
148
|
+
return this.subscribe(
|
|
149
|
+
listenToModelEventJSON,
|
|
150
|
+
roomId,
|
|
151
|
+
(model: JSONObject): void => {
|
|
152
|
+
onEvent(
|
|
153
|
+
AnalyticsBaseModel.fromJSON(
|
|
154
|
+
model,
|
|
155
|
+
listenToModelEvent.modelType,
|
|
156
|
+
) as Model,
|
|
157
|
+
);
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public static emit(eventName: string, data: JSONObject): void {
|
|
163
|
+
if (!this.socket) {
|
|
164
|
+
this.init();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
this.socket.emit(eventName, data);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private static subscribe(
|
|
171
|
+
request: ListenToModelEventJSON,
|
|
172
|
+
roomId: string,
|
|
173
|
+
handler: (data: JSONObject) => void,
|
|
174
|
+
): () => void {
|
|
175
|
+
const subscription: RealtimeSubscription = {
|
|
176
|
+
request: request,
|
|
177
|
+
roomId: roomId,
|
|
178
|
+
handler: handler,
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
this.subscriptions.add(subscription);
|
|
182
|
+
|
|
183
|
+
this.socket.on(roomId, handler);
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* Not connected yet (or between a disconnect and a reconnect): the
|
|
187
|
+
* 'connect' handler sends every registered subscription, this one
|
|
188
|
+
* included. Emitting now as well would have socket.io buffer this one and
|
|
189
|
+
* send it a second time on connect.
|
|
190
|
+
*/
|
|
191
|
+
if (this.socket.connected) {
|
|
192
|
+
this.socket.emit(EventName.ListenToModalEvent, request);
|
|
193
|
+
}
|
|
121
194
|
|
|
122
195
|
// Stop listening to the event.
|
|
123
196
|
const stopListening: () => void = (): void => {
|
|
124
|
-
this.
|
|
197
|
+
this.subscriptions.delete(subscription);
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* Only this subscription's handler. Removing every listener on the room
|
|
201
|
+
* would also silence any other subscription to the same room.
|
|
202
|
+
*/
|
|
203
|
+
this.socket.off(roomId, handler);
|
|
125
204
|
};
|
|
126
205
|
|
|
127
206
|
return stopListening;
|
|
128
207
|
}
|
|
129
208
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
209
|
+
private static resubscribeAll(): void {
|
|
210
|
+
// The server's join is idempotent, so identical requests go once.
|
|
211
|
+
const sentRequests: Set<string> = new Set();
|
|
212
|
+
|
|
213
|
+
for (const subscription of this.subscriptions) {
|
|
214
|
+
const requestKey: string = JSON.stringify(subscription.request);
|
|
215
|
+
|
|
216
|
+
if (sentRequests.has(requestKey)) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
sentRequests.add(requestKey);
|
|
221
|
+
|
|
222
|
+
this.socket.emit(EventName.ListenToModalEvent, subscription.request);
|
|
133
223
|
}
|
|
224
|
+
}
|
|
134
225
|
|
|
135
|
-
|
|
226
|
+
/*
|
|
227
|
+
* The server refused a subscription because this socket's handshake carries
|
|
228
|
+
* no access token, or an expired one. The cookie is read once, when the
|
|
229
|
+
* socket connects, so an HTTP request refreshing the session does nothing
|
|
230
|
+
* for the socket: refresh (or reuse a refresh another request or tab just
|
|
231
|
+
* did), then reconnect so the new handshake carries the new cookie. The
|
|
232
|
+
* reconnect's 'connect' re-sends every subscription, including the refused
|
|
233
|
+
* one.
|
|
234
|
+
*
|
|
235
|
+
* A burst of refusals (a page subscribing to several rooms at once) is one
|
|
236
|
+
* recovery: the first starts it, the rest arrive while it is in flight or
|
|
237
|
+
* inside the cool-down.
|
|
238
|
+
*/
|
|
239
|
+
private static onAuthenticationRequired(): void {
|
|
240
|
+
if (this.isRecoveringAuthentication) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (
|
|
245
|
+
this.lastAuthenticationRecoveryAt !== null &&
|
|
246
|
+
Date.now() - this.lastAuthenticationRecoveryAt <
|
|
247
|
+
this.AUTHENTICATION_RECOVERY_COOLDOWN_IN_MS
|
|
248
|
+
) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
this.isRecoveringAuthentication = true;
|
|
253
|
+
this.lastAuthenticationRecoveryAt = Date.now();
|
|
254
|
+
|
|
255
|
+
this.recoverAuthentication().catch(() => {
|
|
256
|
+
// recoverAuthentication settles every outcome itself.
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private static async recoverAuthentication(): Promise<void> {
|
|
261
|
+
try {
|
|
262
|
+
/*
|
|
263
|
+
* Without a new cookie a reconnect would only be refused again. When
|
|
264
|
+
* the refresh failed because the session is over, the refresh request
|
|
265
|
+
* has already sent the user to the login page.
|
|
266
|
+
*/
|
|
267
|
+
const refreshed: boolean = await API.refreshSession();
|
|
268
|
+
|
|
269
|
+
if (!refreshed) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
this.socket.disconnect();
|
|
274
|
+
this.socket.connect();
|
|
275
|
+
} catch {
|
|
276
|
+
// A refresh that could not complete (offline, say) did not happen.
|
|
277
|
+
} finally {
|
|
278
|
+
this.isRecoveringAuthentication = false;
|
|
279
|
+
// The cool-down runs from the end of the attempt, however long it took.
|
|
280
|
+
this.lastAuthenticationRecoveryAt = Date.now();
|
|
281
|
+
}
|
|
136
282
|
}
|
|
137
283
|
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Edition resolution for the frontend builds (Dashboard and
|
|
3
|
+
* AdminDashboard).
|
|
4
|
+
*
|
|
5
|
+
* Each of those frontends imports its Enterprise UI through one bare
|
|
6
|
+
* specifier, from one file (src/Enterprise/Plugins.ts):
|
|
7
|
+
*
|
|
8
|
+
* Dashboard "@oneuptime/ee-dashboard" -> ee/Dashboard/Index.tsx
|
|
9
|
+
* AdminDashboard "@oneuptime/ee-admin-dashboard" -> ee/AdminDashboard/Index.tsx
|
|
10
|
+
*
|
|
11
|
+
* This module decides what that specifier means for one build and returns the
|
|
12
|
+
* esbuild aliases that make it so. The frontends pass the result to
|
|
13
|
+
* createConfig({ additionalAlias }) - nothing else about the build changes.
|
|
14
|
+
*
|
|
15
|
+
* ONEUPTIME_EDITION picks the edition:
|
|
16
|
+
*
|
|
17
|
+
* auto (default) Enterprise when the ee plugin file is on disk, Community
|
|
18
|
+
* otherwise. A plain checkout builds whatever it contains.
|
|
19
|
+
* community Always the Community stub, even with ee/ present.
|
|
20
|
+
* enterprise The ee plugin, and a hard error when it is missing. The
|
|
21
|
+
* Enterprise image sets this, so a broken COPY of ee/ fails
|
|
22
|
+
* the build instead of quietly shipping the Community UI
|
|
23
|
+
* under an Enterprise tag.
|
|
24
|
+
*
|
|
25
|
+
* Where ee/ is looked for, relative to the frontend directory:
|
|
26
|
+
*
|
|
27
|
+
* <frontend>/../../../../ee the repository: packages/App/FeatureSet/<F>
|
|
28
|
+
* <frontend>/../../../ee the image: /usr/src/app/FeatureSet/<F> -> /usr/src/ee
|
|
29
|
+
*
|
|
30
|
+
* ONEUPTIME_EE_DIR replaces both with one directory (fixtures, tests, odd
|
|
31
|
+
* layouts) - the same variable the server-side loader honours.
|
|
32
|
+
*
|
|
33
|
+
* "Found" means the plugin's Index.tsx FILE exists. The alias points at that
|
|
34
|
+
* file rather than its directory: esbuild resolves a directory alias to a
|
|
35
|
+
* lowercase index.* and would miss Index.tsx on a case-sensitive filesystem.
|
|
36
|
+
*
|
|
37
|
+
* Two more aliases are always returned, so ee code can reach core without
|
|
38
|
+
* relative paths and without an install of its own:
|
|
39
|
+
*
|
|
40
|
+
* "@oneuptime/dashboard/..." (or "@oneuptime/admin-dashboard/...")
|
|
41
|
+
* -> <frontend>/src/...
|
|
42
|
+
* "Common/..." -> <frontend>/node_modules/Common/...
|
|
43
|
+
*
|
|
44
|
+
* Bundling therefore never depends on ee/node_modules. Both are applied in
|
|
45
|
+
* the Community build too, so core resolves identically in both editions.
|
|
46
|
+
*
|
|
47
|
+
* CommonJS, like esbuild-config.js: the frontends' esbuild.config.js files
|
|
48
|
+
* are plain node scripts.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
const fs = require("fs");
|
|
52
|
+
const path = require("path");
|
|
53
|
+
|
|
54
|
+
const EDITION_ENV_VAR = "ONEUPTIME_EDITION";
|
|
55
|
+
const EE_DIR_ENV_VAR = "ONEUPTIME_EE_DIR";
|
|
56
|
+
|
|
57
|
+
const EDITION_AUTO = "auto";
|
|
58
|
+
const EDITION_COMMUNITY = "community";
|
|
59
|
+
const EDITION_ENTERPRISE = "enterprise";
|
|
60
|
+
|
|
61
|
+
const VALID_EDITIONS = [EDITION_AUTO, EDITION_COMMUNITY, EDITION_ENTERPRISE];
|
|
62
|
+
|
|
63
|
+
const PLUGIN_ENTRY_FILENAME = "Index.tsx";
|
|
64
|
+
|
|
65
|
+
/*
|
|
66
|
+
* The Community stub, relative to the frontend directory. Every tsconfig and
|
|
67
|
+
* jest config maps the plugin specifier to this same file.
|
|
68
|
+
*/
|
|
69
|
+
const COMMUNITY_STUB_PATH = path.join(
|
|
70
|
+
"src",
|
|
71
|
+
"Enterprise",
|
|
72
|
+
"CommunityPlugins.ts",
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
function isFile(filePath) {
|
|
76
|
+
try {
|
|
77
|
+
return fs.statSync(filePath).isFile();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The edition the environment asks for: "auto", "community" or "enterprise".
|
|
85
|
+
* Unset or blank means "auto". Anything else is a typo, and a typo must not
|
|
86
|
+
* silently build the wrong edition, so it throws.
|
|
87
|
+
* @param {Object} [env] - Environment to read (defaults to process.env)
|
|
88
|
+
* @returns {string}
|
|
89
|
+
*/
|
|
90
|
+
function readRequestedEdition(env) {
|
|
91
|
+
const source = env || process.env;
|
|
92
|
+
const raw = source[EDITION_ENV_VAR];
|
|
93
|
+
|
|
94
|
+
if (raw === undefined || raw === null || String(raw).trim() === "") {
|
|
95
|
+
return EDITION_AUTO;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const value = String(raw).trim().toLowerCase();
|
|
99
|
+
|
|
100
|
+
if (!VALID_EDITIONS.includes(value)) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`${EDITION_ENV_VAR} must be one of ${VALID_EDITIONS.join(", ")} (got "${raw}").`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Every path the plugin entry may live at, in the order they are tried.
|
|
111
|
+
* @param {string} frontendDir - Absolute path of the frontend package
|
|
112
|
+
* @param {string} eeSubdir - "Dashboard" or "AdminDashboard"
|
|
113
|
+
* @param {Object} [env] - Environment to read (defaults to process.env)
|
|
114
|
+
* @returns {Array<string>}
|
|
115
|
+
*/
|
|
116
|
+
function getEnterpriseCandidates(frontendDir, eeSubdir, env) {
|
|
117
|
+
const source = env || process.env;
|
|
118
|
+
const override = source[EE_DIR_ENV_VAR];
|
|
119
|
+
|
|
120
|
+
if (override !== undefined && override !== null && String(override).trim()) {
|
|
121
|
+
return [
|
|
122
|
+
path.resolve(String(override).trim(), eeSubdir, PLUGIN_ENTRY_FILENAME),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return [
|
|
127
|
+
// Repository: packages/App/FeatureSet/<Frontend> -> <repo>/ee
|
|
128
|
+
path.resolve(
|
|
129
|
+
frontendDir,
|
|
130
|
+
"..",
|
|
131
|
+
"..",
|
|
132
|
+
"..",
|
|
133
|
+
"..",
|
|
134
|
+
"ee",
|
|
135
|
+
eeSubdir,
|
|
136
|
+
PLUGIN_ENTRY_FILENAME,
|
|
137
|
+
),
|
|
138
|
+
// Image: /usr/src/app/FeatureSet/<Frontend> -> /usr/src/ee
|
|
139
|
+
path.resolve(
|
|
140
|
+
frontendDir,
|
|
141
|
+
"..",
|
|
142
|
+
"..",
|
|
143
|
+
"..",
|
|
144
|
+
"ee",
|
|
145
|
+
eeSubdir,
|
|
146
|
+
PLUGIN_ENTRY_FILENAME,
|
|
147
|
+
),
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function assertNonEmptyString(value, name) {
|
|
152
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
153
|
+
throw new Error(`resolveEnterpriseBuild: "${name}" is required.`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Decide the edition for one frontend build.
|
|
159
|
+
* @param {Object} options
|
|
160
|
+
* @param {string} options.frontendDir - Absolute path of the frontend package (its esbuild.config.js __dirname)
|
|
161
|
+
* @param {string} options.pluginSpecifier - e.g. "@oneuptime/ee-dashboard"
|
|
162
|
+
* @param {string} options.eeSubdir - Directory under ee/, e.g. "Dashboard"
|
|
163
|
+
* @param {string} options.internalSpecifier - e.g. "@oneuptime/dashboard"; ee code imports <frontend>/src through it
|
|
164
|
+
* @param {Object} [options.env] - Environment to read (defaults to process.env)
|
|
165
|
+
* @returns {{ edition: string, requestedEdition: string, pluginEntry: (string|null), communityStub: string, candidates: Array<string>, alias: Object }}
|
|
166
|
+
*/
|
|
167
|
+
function resolveEnterpriseBuild(options) {
|
|
168
|
+
const {
|
|
169
|
+
frontendDir,
|
|
170
|
+
pluginSpecifier,
|
|
171
|
+
eeSubdir,
|
|
172
|
+
internalSpecifier,
|
|
173
|
+
env = process.env,
|
|
174
|
+
} = options || {};
|
|
175
|
+
|
|
176
|
+
assertNonEmptyString(frontendDir, "frontendDir");
|
|
177
|
+
assertNonEmptyString(pluginSpecifier, "pluginSpecifier");
|
|
178
|
+
assertNonEmptyString(eeSubdir, "eeSubdir");
|
|
179
|
+
assertNonEmptyString(internalSpecifier, "internalSpecifier");
|
|
180
|
+
|
|
181
|
+
if (!path.isAbsolute(frontendDir)) {
|
|
182
|
+
throw new Error(
|
|
183
|
+
`resolveEnterpriseBuild: "frontendDir" must be absolute (got "${frontendDir}").`,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const communityStub = path.join(frontendDir, COMMUNITY_STUB_PATH);
|
|
188
|
+
|
|
189
|
+
if (!isFile(communityStub)) {
|
|
190
|
+
throw new Error(
|
|
191
|
+
`The Community plugin stub is missing: ${communityStub}. Every frontend that imports ${pluginSpecifier} needs one.`,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const requestedEdition = readRequestedEdition(env);
|
|
196
|
+
const candidates = getEnterpriseCandidates(frontendDir, eeSubdir, env);
|
|
197
|
+
|
|
198
|
+
const pluginEntry =
|
|
199
|
+
requestedEdition === EDITION_COMMUNITY
|
|
200
|
+
? null
|
|
201
|
+
: candidates.find(isFile) || null;
|
|
202
|
+
|
|
203
|
+
if (requestedEdition === EDITION_ENTERPRISE && !pluginEntry) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
`${EDITION_ENV_VAR}=${EDITION_ENTERPRISE}, but the Enterprise UI plugin for ${eeSubdir} was not found. Looked for: ${candidates.join(
|
|
206
|
+
", ",
|
|
207
|
+
)}. Copy the ee/ directory into the build, or unset ${EDITION_ENV_VAR} to build the Community Edition.`,
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return {
|
|
212
|
+
edition: pluginEntry ? EDITION_ENTERPRISE : EDITION_COMMUNITY,
|
|
213
|
+
requestedEdition,
|
|
214
|
+
pluginEntry,
|
|
215
|
+
communityStub,
|
|
216
|
+
candidates,
|
|
217
|
+
alias: {
|
|
218
|
+
[pluginSpecifier]: pluginEntry || communityStub,
|
|
219
|
+
[internalSpecifier]: path.join(frontendDir, "src"),
|
|
220
|
+
Common: path.join(frontendDir, "node_modules", "Common"),
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* The esbuild aliases for one frontend build - what esbuild.config.js passes
|
|
227
|
+
* to createConfig({ additionalAlias }). Same options as resolveEnterpriseBuild.
|
|
228
|
+
* @param {Object} options
|
|
229
|
+
* @returns {Object}
|
|
230
|
+
*/
|
|
231
|
+
function resolveEnterpriseAliases(options) {
|
|
232
|
+
return resolveEnterpriseBuild(options).alias;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* One line for the build log, so a CI log shows which edition was bundled.
|
|
237
|
+
* @param {string} serviceName
|
|
238
|
+
* @param {Object} build - A resolveEnterpriseBuild() result
|
|
239
|
+
* @returns {string}
|
|
240
|
+
*/
|
|
241
|
+
function describeEnterpriseBuild(serviceName, build) {
|
|
242
|
+
if (build.edition === EDITION_ENTERPRISE) {
|
|
243
|
+
return `${serviceName}: building the Enterprise Edition UI from ${build.pluginEntry}`;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return `${serviceName}: building the Community Edition UI (${EDITION_ENV_VAR}=${build.requestedEdition})`;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
module.exports = {
|
|
250
|
+
EDITION_ENV_VAR,
|
|
251
|
+
EE_DIR_ENV_VAR,
|
|
252
|
+
EDITION_AUTO,
|
|
253
|
+
EDITION_COMMUNITY,
|
|
254
|
+
EDITION_ENTERPRISE,
|
|
255
|
+
VALID_EDITIONS,
|
|
256
|
+
PLUGIN_ENTRY_FILENAME,
|
|
257
|
+
COMMUNITY_STUB_PATH,
|
|
258
|
+
readRequestedEdition,
|
|
259
|
+
getEnterpriseCandidates,
|
|
260
|
+
resolveEnterpriseBuild,
|
|
261
|
+
resolveEnterpriseAliases,
|
|
262
|
+
describeEnterpriseBuild,
|
|
263
|
+
};
|
package/Utils/API.ts
CHANGED
|
@@ -247,34 +247,43 @@ export default class API {
|
|
|
247
247
|
return false;
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
+
/*
|
|
251
|
+
* The class this instance was built from, so `new BaseAPI(...).get()` gets
|
|
252
|
+
* BaseAPI's session refresh, error handling and headers rather than the
|
|
253
|
+
* base class's no-op versions.
|
|
254
|
+
*/
|
|
255
|
+
private getStaticClient(): typeof API {
|
|
256
|
+
return this.constructor as typeof API;
|
|
257
|
+
}
|
|
258
|
+
|
|
250
259
|
public async get<
|
|
251
260
|
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>,
|
|
252
261
|
>(options: APIRequestOptions): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
253
|
-
return await
|
|
262
|
+
return await this.getStaticClient().get<T>(options);
|
|
254
263
|
}
|
|
255
264
|
|
|
256
265
|
public async delete<
|
|
257
266
|
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>,
|
|
258
267
|
>(options: APIRequestOptions): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
259
|
-
return await
|
|
268
|
+
return await this.getStaticClient().delete<T>(options);
|
|
260
269
|
}
|
|
261
270
|
|
|
262
271
|
public async head<
|
|
263
272
|
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>,
|
|
264
273
|
>(options: APIRequestOptions): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
265
|
-
return await
|
|
274
|
+
return await this.getStaticClient().head<T>(options);
|
|
266
275
|
}
|
|
267
276
|
|
|
268
277
|
public async put<
|
|
269
278
|
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>,
|
|
270
279
|
>(options: APIRequestOptions): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
271
|
-
return await
|
|
280
|
+
return await this.getStaticClient().put<T>(options);
|
|
272
281
|
}
|
|
273
282
|
|
|
274
283
|
public async patch<
|
|
275
284
|
T extends JSONObject | JSONArray | BaseModel | Array<BaseModel>,
|
|
276
285
|
>(options: APIRequestOptions): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
277
|
-
return await
|
|
286
|
+
return await this.getStaticClient().patch<T>(options);
|
|
278
287
|
}
|
|
279
288
|
|
|
280
289
|
public static handleError(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS } from "../../Types/EnterpriseLicense/EnterpriseLicensePeriods";
|
|
1
2
|
import EnterpriseLicenseUserCountSource from "../../Types/EnterpriseLicense/EnterpriseLicenseUserCountSource";
|
|
2
3
|
|
|
3
4
|
/*
|
|
@@ -49,9 +50,13 @@ export default class EnterpriseLicenseUsageUtil {
|
|
|
49
50
|
/*
|
|
50
51
|
* Expired licenses keep getting a daily "expired" email for this many
|
|
51
52
|
* days after expiry, then go quiet — an abandoned license should not be
|
|
52
|
-
* emailed forever.
|
|
53
|
+
* emailed forever. It has to outlast the grace period by a clear margin:
|
|
54
|
+
* the email that says single sign-on, SCIM provisioning and audit logging
|
|
55
|
+
* have now stopped is only worth sending after they have, which is when
|
|
56
|
+
* the grace period ends.
|
|
53
57
|
*/
|
|
54
|
-
public static readonly expiredNotificationCutoffDays: number =
|
|
58
|
+
public static readonly expiredNotificationCutoffDays: number =
|
|
59
|
+
ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS + 14;
|
|
55
60
|
|
|
56
61
|
/*
|
|
57
62
|
* License keys are shown/emailed masked — enough to identify the key
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import IP from "../Types/IP/IP";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* The two things every caller that holds a host string needs to get right
|
|
5
|
+
* when that host might be an IPv6 literal, in one place.
|
|
6
|
+
*
|
|
7
|
+
* Both are pure text problems that only exist for IPv6, which is exactly why
|
|
8
|
+
* they kept being got wrong one call site at a time:
|
|
9
|
+
*
|
|
10
|
+
* 1. BRACKETS ARE URL SYNTAX, NOT PART OF THE ADDRESS. "[2001:db8::1]" is
|
|
11
|
+
* how RFC 3986 writes an IPv6 host inside a URL authority, and that is
|
|
12
|
+
* the form URL.fromString and Hostname.fromAuthority hand back. Node
|
|
13
|
+
* does NOT strip them: net.connect({host: "[::1]"}) and
|
|
14
|
+
* https.get({host: "[::1]"}) both go to the resolver and come back
|
|
15
|
+
* ENOTFOUND, and `ping [::1]` fails the same way. An IPv4 host never
|
|
16
|
+
* carries brackets, so every one of those call sites worked until
|
|
17
|
+
* somebody pointed it at IPv6.
|
|
18
|
+
*
|
|
19
|
+
* 2. "host:port" IS AMBIGUOUS FOR IPv6, AND NOT IN A WAY THAT LOOKS WRONG.
|
|
20
|
+
* "192.0.2.1:179" cannot be mistaken for an address. Appending ":179" to
|
|
21
|
+
* "2001:518:2800:9::2" produces "2001:518:2800:9::2:179", which node's
|
|
22
|
+
* net.isIP() reports as a PERFECTLY VALID IPv6 address - a different
|
|
23
|
+
* host from the one that was meant. So the unbracketed spelling does not
|
|
24
|
+
* merely read oddly, it silently renames the target.
|
|
25
|
+
*/
|
|
26
|
+
export default class HostAddressUtil {
|
|
27
|
+
/*
|
|
28
|
+
* True when the value is an IPv6 literal, written bare ("2001:db8::1") or
|
|
29
|
+
* bracketed ("[2001:db8::1]"). Anything else - a DNS name, an IPv4 literal,
|
|
30
|
+
* an authority with a port - is false.
|
|
31
|
+
*/
|
|
32
|
+
public static isIPv6(host: string): boolean {
|
|
33
|
+
const bare: string = HostAddressUtil.stripBrackets(host);
|
|
34
|
+
|
|
35
|
+
if (!bare) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return IP.isIP(bare) && new IP(bare).isIPv6();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* The address to hand to a socket, a resolver or the ping binary: the same
|
|
44
|
+
* host with any IPv6 URL brackets removed.
|
|
45
|
+
*
|
|
46
|
+
* Brackets are only removed when what is inside them really is an IPv6
|
|
47
|
+
* address. "[not-an-address]" is returned untouched so it fails validation
|
|
48
|
+
* downstream as the nonsense it is, rather than being quietly laundered
|
|
49
|
+
* into a bare hostname.
|
|
50
|
+
*/
|
|
51
|
+
public static stripBrackets(host: string): string {
|
|
52
|
+
const trimmed: string = (host || "").trim();
|
|
53
|
+
|
|
54
|
+
if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) {
|
|
55
|
+
return trimmed;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const inner: string = trimmed.substring(1, trimmed.length - 1);
|
|
59
|
+
|
|
60
|
+
if (!inner || !IP.isIP(inner) || !new IP(inner).isIPv6()) {
|
|
61
|
+
return trimmed;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return inner;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* The authority form: an IPv6 host is bracketed so the ":" before the port
|
|
69
|
+
* cannot be read as another group of the address. Already-bracketed input
|
|
70
|
+
* is not bracketed twice.
|
|
71
|
+
*
|
|
72
|
+
* A missing/empty port returns the host on its own, bare. That is
|
|
73
|
+
* deliberate: a port-less destination is stored and pinged as the address
|
|
74
|
+
* itself, and wrapping it in brackets there would change what is written to
|
|
75
|
+
* the database and shown to the user for no benefit - the ambiguity this
|
|
76
|
+
* guards against only exists once a ":port" is appended.
|
|
77
|
+
*/
|
|
78
|
+
public static formatHostAndPort(data: {
|
|
79
|
+
host: string;
|
|
80
|
+
port?: string | number | undefined;
|
|
81
|
+
}): string {
|
|
82
|
+
const bare: string = HostAddressUtil.stripBrackets(data.host);
|
|
83
|
+
const port: string =
|
|
84
|
+
data.port === undefined || data.port === null ? "" : String(data.port);
|
|
85
|
+
|
|
86
|
+
if (!port) {
|
|
87
|
+
return bare;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return HostAddressUtil.isIPv6(bare)
|
|
91
|
+
? `[${bare}]:${port}`
|
|
92
|
+
: `${bare}:${port}`;
|
|
93
|
+
}
|
|
94
|
+
}
|