@oneuptime/common 14.0.13 → 14.0.14
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/AlertGroupingRule.ts +10 -6
- package/Models/DatabaseModels/File.ts +41 -2
- package/Models/DatabaseModels/Form.ts +126 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +10 -6
- package/Models/DatabaseModels/LogDropFilter.ts +1 -0
- package/Models/DatabaseModels/LogPipeline.ts +1 -0
- package/Models/DatabaseModels/LogScrubRule.ts +14 -8
- package/Models/DatabaseModels/MetricRecordingRule.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +4 -2
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +22 -9
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +6 -1
- package/Models/DatabaseModels/StatusPage.ts +8 -4
- package/Models/DatabaseModels/TraceDropFilter.ts +1 -0
- package/Models/DatabaseModels/TracePipeline.ts +1 -0
- package/Models/DatabaseModels/TraceRecordingRule.ts +2 -1
- package/Models/DatabaseModels/TraceScrubRule.ts +14 -8
- package/Models/DatabaseModels/UserOnCallLog.ts +4 -2
- package/Server/API/CustomDomainRoutes.ts +251 -0
- package/Server/API/DashboardAPI.ts +33 -4
- package/Server/API/DashboardDomainAPI.ts +63 -93
- package/Server/API/StatusPageAPI.ts +92 -0
- package/Server/API/StatusPageDomainAPI.ts +59 -96
- package/Server/Infrastructure/GlobalCache.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/AlertGroupingEngineService.ts +48 -70
- package/Server/Services/AlertGroupingRuleService.ts +38 -0
- package/Server/Services/CephClusterService.ts +25 -0
- package/Server/Services/CloudResourceService.ts +42 -0
- package/Server/Services/DashboardDomainService.ts +640 -214
- package/Server/Services/DashboardService.ts +30 -8
- package/Server/Services/DatabaseService.ts +143 -12
- package/Server/Services/DockerHostService.ts +60 -0
- package/Server/Services/DockerSwarmClusterService.ts +25 -0
- package/Server/Services/FileService.ts +60 -0
- package/Server/Services/FormService.ts +212 -2
- package/Server/Services/GlobalOidcService.ts +10 -0
- package/Server/Services/GlobalSsoService.ts +10 -0
- package/Server/Services/HostService.ts +58 -0
- package/Server/Services/IncidentGroupingEngineService.ts +48 -70
- package/Server/Services/IncidentGroupingRuleService.ts +38 -0
- package/Server/Services/IoTFleetService.ts +26 -0
- package/Server/Services/KubernetesClusterService.ts +64 -0
- package/Server/Services/LabelService.ts +6 -17
- package/Server/Services/LogScrubRuleService.ts +50 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +264 -0
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +9 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +24 -29
- package/Server/Services/OnCallSetupReminderService.ts +41 -40
- package/Server/Services/PodmanHostService.ts +60 -0
- package/Server/Services/ProfileAggregationService.ts +38 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +76 -3
- package/Server/Services/ProjectOidcService.ts +20 -0
- package/Server/Services/ProjectSsoService.ts +20 -0
- package/Server/Services/ProxmoxClusterService.ts +25 -0
- package/Server/Services/RumApplicationService.ts +45 -0
- package/Server/Services/ScheduledMaintenanceService.ts +9 -23
- package/Server/Services/ServerlessFunctionService.ts +47 -0
- package/Server/Services/ServiceService.ts +33 -10
- package/Server/Services/StatusPageDomainService.ts +622 -213
- package/Server/Services/StatusPageOidcService.ts +20 -0
- package/Server/Services/StatusPageResourceService.ts +89 -34
- package/Server/Services/StatusPageService.ts +270 -54
- package/Server/Services/StatusPageSsoService.ts +20 -0
- package/Server/Services/TraceScrubRuleService.ts +50 -0
- package/Server/Services/UserIncomingCallNumberService.ts +28 -14
- package/Server/Services/VMwareVCenterService.ts +25 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +3 -3
- package/Server/Utils/Greenlock/CertificateOrder.ts +482 -0
- package/Server/Utils/Greenlock/CertificateOrderBudget.ts +134 -0
- package/Server/Utils/Greenlock/CertificateOrderFailures.ts +288 -0
- package/Server/Utils/Greenlock/CertificateOrderLock.ts +163 -0
- package/Server/Utils/Greenlock/CertificateOrderOutcome.ts +29 -0
- package/Server/Utils/Greenlock/CertificateOwners.ts +72 -0
- package/Server/Utils/Greenlock/CertificateReissueOrder.ts +99 -0
- package/Server/Utils/Greenlock/CustomDomainOrders.ts +397 -0
- package/Server/Utils/Greenlock/Greenlock.ts +839 -203
- package/Server/Utils/Rules/GroupingRuleEpisodeOwners.ts +551 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +8 -1
- package/Server/Utils/ScrubRuleValidation.ts +248 -0
- package/Server/Utils/StatusPage/AffectedStatusPageResources.ts +138 -0
- package/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.ts +294 -0
- package/Server/Utils/Telemetry/DiscoveredResourceCreate.ts +275 -0
- package/Server/Utils/Telemetry/DiscoveredResourceUpdate.ts +217 -0
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +8 -2
- package/Tests/App/Accounts/FormPage.test.tsx +238 -0
- package/Tests/App/Accounts/FormUtils.test.ts +108 -0
- package/Tests/App/AdminDashboard/AdminAddToProjectMembersTeam.test.tsx +1087 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +140 -138
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +144 -145
- package/Tests/App/AdminDashboard/AdminSettingsFormsOnePage.test.tsx +907 -0
- package/Tests/App/AdminDashboard/AdminSettingsSwitches.test.tsx +906 -0
- package/Tests/App/AdminDashboard/AdminSmtpSettingsForm.test.tsx +823 -0
- package/Tests/App/AdminDashboard/BulkAddUsersToProjectModal.test.tsx +341 -368
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +199 -54
- package/Tests/App/AdminDashboard/ProjectScopedTeamsPicker.test.tsx +991 -0
- package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +147 -90
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +224 -104
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +302 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +408 -152
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +55 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +206 -115
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +32 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +206 -71
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/AnnouncementCreateForm.test.tsx +1208 -0
- package/Tests/App/Dashboard/AnnouncementEditAndTemplateForms.test.tsx +693 -0
- package/Tests/App/Dashboard/AnnouncementFormsStructure.test.ts +546 -0
- package/Tests/App/Dashboard/AnnouncementStatusPageSuggestions.test.tsx +425 -0
- package/Tests/App/Dashboard/AnnouncementsTableCreateLinks.test.tsx +267 -0
- package/Tests/App/Dashboard/ApiKeyCreateForm.test.ts +68 -51
- package/Tests/App/Dashboard/ApiKeyViewPermissions.test.tsx +11 -9
- package/Tests/App/Dashboard/ApiKeysCreateAccess.test.tsx +24 -16
- package/Tests/App/Dashboard/BulkChangeStateModalOnePage.test.tsx +333 -0
- package/Tests/App/Dashboard/CardDescriptionsSayWhatFor.test.tsx +307 -0
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +18 -4
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +7 -2
- package/Tests/App/Dashboard/ColorFieldsPrefilledPages.test.tsx +453 -0
- package/Tests/App/Dashboard/CreateFromRecordBreadcrumbs.test.ts +272 -0
- package/Tests/App/Dashboard/CreateFromRecordLinks.test.tsx +495 -0
- package/Tests/App/Dashboard/CreateFromRecordPages.test.tsx +1026 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +65 -23
- package/Tests/App/Dashboard/CriteriaName.test.ts +5 -1
- package/Tests/App/Dashboard/CustomDomainCreateFlow.test.tsx +516 -0
- package/Tests/App/Dashboard/CustomDomainDnsSetupModal.test.tsx +547 -0
- package/Tests/App/Dashboard/CustomDomainsPages.test.tsx +1077 -0
- package/Tests/App/Dashboard/CustomFieldSimpleCreate.test.tsx +2 -2
- package/Tests/App/Dashboard/CustomFieldSimpleCreateRender.test.tsx +12 -6
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +1 -1
- package/Tests/App/Dashboard/CustomSmtpConfigForm.test.tsx +969 -0
- package/Tests/App/Dashboard/DashboardBlankCanvasAddWidget.test.tsx +425 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +400 -0
- package/Tests/App/Dashboard/DashboardComponentsMRTranslation.test.tsx +4 -3
- package/Tests/App/Dashboard/DashboardCreateForm.test.ts +375 -0
- package/Tests/App/Dashboard/DashboardCreateFromTemplate.test.tsx +727 -0
- package/Tests/App/Dashboard/DashboardEmptyCanvasAddWidget.test.tsx +86 -0
- package/Tests/App/Dashboard/DashboardPhoneProductsMenu.test.tsx +99 -9
- package/Tests/App/Dashboard/DashboardSharingCard.test.tsx +1226 -0
- package/Tests/App/Dashboard/DashboardSharingEntryPoints.test.tsx +383 -0
- package/Tests/App/Dashboard/DashboardSharingPage.test.tsx +478 -0
- package/Tests/App/Dashboard/DeclareFormsAdvancedRender.test.tsx +90 -34
- package/Tests/App/Dashboard/DeclareIncidentMonitorsApart.test.tsx +1028 -0
- package/Tests/App/Dashboard/DefaultSsoTeams.test.tsx +215 -0
- package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +3 -3
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +15 -12
- package/Tests/App/Dashboard/DiscoveredResourceCreateForms.test.tsx +936 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardGroup.test.tsx +720 -0
- package/Tests/App/Dashboard/EpisodeMemberRoleAssignmentsFormField.test.tsx +331 -0
- package/Tests/App/Dashboard/EpisodePostmortemPage.test.tsx +327 -0
- package/Tests/App/Dashboard/EscalationRuleForm.test.ts +2 -2
- package/Tests/App/Dashboard/EscalationRuleFormGuard.test.ts +6 -2
- package/Tests/App/Dashboard/EscalationRuleOneStep.test.tsx +8 -4
- package/Tests/App/Dashboard/EventMeasurements.test.ts +1175 -0
- package/Tests/App/Dashboard/EventMeasurementsCard.test.tsx +993 -0
- package/Tests/App/Dashboard/EventNoteComposerDialog.test.tsx +939 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +34 -1
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +186 -1
- package/Tests/App/Dashboard/EventSettingsSwitchPages.test.tsx +625 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +6 -2
- package/Tests/App/Dashboard/FeedNoteComposerDialog.test.tsx +1327 -0
- package/Tests/App/Dashboard/FeedNoteDialogHelpers.ts +109 -0
- package/Tests/App/Dashboard/FilterChipClearButton.test.tsx +356 -0
- package/Tests/App/Dashboard/FormBrandingSection.test.tsx +504 -0
- package/Tests/App/Dashboard/FormBrandingValues.test.ts +255 -0
- package/Tests/App/Dashboard/FormBuilderParts.test.tsx +38 -1
- package/Tests/App/Dashboard/FormBuilderUi.test.tsx +176 -2
- package/Tests/App/Dashboard/FormMappingCard.test.tsx +33 -13
- package/Tests/App/Dashboard/FormsMovedPagesAndSubmissions.test.tsx +1 -1
- package/Tests/App/Dashboard/GeneratedKeyForms.test.tsx +30 -7
- package/Tests/App/Dashboard/GlobalProbesOnNewMonitorsCard.test.tsx +258 -0
- package/Tests/App/Dashboard/GroupingRuleFormFlow.test.tsx +653 -37
- package/Tests/App/Dashboard/GroupingRulePages.test.tsx +218 -9
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +52 -4
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +230 -338
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +227 -295
- package/Tests/App/Dashboard/IncidentLinkedAlertsSettingsPage.test.tsx +157 -181
- package/Tests/App/Dashboard/IncidentPostmortemPage.test.tsx +775 -0
- package/Tests/App/Dashboard/IncidentRoleFormField.test.tsx +379 -15
- package/Tests/App/Dashboard/IncidentRolesSettingsPage.test.tsx +148 -32
- package/Tests/App/Dashboard/IncidentTemplateInitialState.test.tsx +430 -0
- package/Tests/App/Dashboard/IncidentTemplateMonitorsApart.test.tsx +492 -0
- package/Tests/App/Dashboard/IncomingCallEscalationOneStep.test.tsx +830 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleForm.test.ts +510 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleFormGuard.test.ts +378 -0
- package/Tests/App/Dashboard/IngestionKeyForm.test.ts +664 -0
- package/Tests/App/Dashboard/IngestionKeySelectorCreate.test.tsx +523 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +130 -9
- package/Tests/App/Dashboard/IpAllowlistCopy.test.ts +122 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +19 -3
- package/Tests/App/Dashboard/KubernetesMetricsSetupEmptyState.test.tsx +275 -0
- package/Tests/App/Dashboard/KubernetesMetricsSetupHints.test.tsx +720 -0
- package/Tests/App/Dashboard/LabelsFormField.test.tsx +18 -13
- package/Tests/App/Dashboard/LegacyDefaultAssigneeNote.test.tsx +359 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +10 -10
- package/Tests/App/Dashboard/MarkdownTemplateDialogsWide.test.tsx +42 -20
- package/Tests/App/Dashboard/MeasurementForms.test.tsx +191 -5
- package/Tests/App/Dashboard/MeasurementPagesI18n.test.ts +2 -0
- package/Tests/App/Dashboard/MeasurementSetup.test.ts +5 -2
- package/Tests/App/Dashboard/MenuSpecificFoldedSections.test.tsx +38 -12
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +34 -11
- package/Tests/App/Dashboard/MetricAndRecordingRuleFormsRender.test.tsx +1206 -0
- package/Tests/App/Dashboard/MetricResultsState.test.ts +248 -0
- package/Tests/App/Dashboard/MetricViewResultsState.test.tsx +404 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +77 -27
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +5 -8
- package/Tests/App/Dashboard/MonitorCriteriaHeaderControls.test.tsx +228 -0
- package/Tests/App/Dashboard/MonitorCriteriaIncidentRoles.test.tsx +411 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +5 -1
- package/Tests/App/Dashboard/MonitorFormIncidentRoles.test.tsx +460 -0
- package/Tests/App/Dashboard/MonitorIntervalRedirect.test.tsx +299 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +243 -2
- package/Tests/App/Dashboard/MonitorProbesAndIntervalPage.test.tsx +638 -0
- package/Tests/App/Dashboard/MonitorStepsDefaultStatusAdvanced.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitoringIntervalCard.test.tsx +493 -0
- package/Tests/App/Dashboard/MonitoringSwitch.test.tsx +597 -0
- package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +4 -5
- package/Tests/App/Dashboard/NotificationChannelOffSwitchLists.test.tsx +636 -0
- package/Tests/App/Dashboard/OnCallPolicyCreateFormGuard.test.ts +8 -4
- package/Tests/App/Dashboard/OnCallPolicyFirstResponders.test.tsx +1 -1
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +54 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +43 -24
- package/Tests/App/Dashboard/OnCallRulesRedirects.test.tsx +530 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +158 -74
- package/Tests/App/Dashboard/OnCallRulesTabs.test.tsx +511 -0
- package/Tests/App/Dashboard/OnCallScheduleAddLayerDefaults.test.tsx +236 -0
- package/Tests/App/Dashboard/OnCallScheduleCreateFormGuard.test.ts +633 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +13 -2
- package/Tests/App/Dashboard/OnCallScheduleWhoTakesTurns.test.tsx +771 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedSettingsForm.test.tsx +357 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +16 -6
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +112 -23
- package/Tests/App/Dashboard/PageSearchIndexCoversMenus.test.tsx +594 -0
- package/Tests/App/Dashboard/PageSearchIndexCoversRoutes.test.tsx +271 -0
- package/Tests/App/Dashboard/PageSearchRanking.test.tsx +373 -0
- package/Tests/App/Dashboard/PostmortemPageParts.test.tsx +548 -0
- package/Tests/App/Dashboard/ProbeAgreementCard.test.tsx +483 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +9 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +282 -404
- package/Tests/App/Dashboard/ProjectAiSettingsSwitchPages.test.tsx +1414 -0
- package/Tests/App/Dashboard/ProjectNotificationChannels.test.tsx +1191 -0
- package/Tests/App/Dashboard/ProjectSettingsSwitchCards.test.tsx +603 -0
- package/Tests/App/Dashboard/RemindersCard.test.tsx +477 -0
- package/Tests/App/Dashboard/ResourceDetailsCard.test.tsx +458 -0
- package/Tests/App/Dashboard/ResourceRuleForm.test.ts +525 -0
- package/Tests/App/Dashboard/ResourceRuleFormsRender.test.tsx +803 -0
- package/Tests/App/Dashboard/RoleAccess.test.ts +753 -0
- package/Tests/App/Dashboard/RoleCardSelectOptions.test.ts +13 -6
- package/Tests/App/Dashboard/RouteUtilPageRoute.test.ts +116 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +1 -1
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +172 -219
- package/Tests/App/Dashboard/RunbookStepHeaderControls.test.tsx +269 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +45 -85
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +16 -23
- package/Tests/App/Dashboard/ScheduledMaintenanceAffectedResourcesEditForm.test.tsx +485 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +27 -2
- package/Tests/App/Dashboard/ScheduledMaintenanceCreateForm.test.tsx +65 -28
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +208 -309
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +36 -53
- package/Tests/App/Dashboard/ScheduledMaintenanceFormsStructure.test.ts +83 -14
- package/Tests/App/Dashboard/ScheduledMaintenanceMonitorsApart.test.tsx +1085 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +378 -25
- package/Tests/App/Dashboard/ScheduledMaintenanceStatusPageSuggestions.test.tsx +513 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateForm.test.tsx +31 -9
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateMonitorsApart.test.tsx +760 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +11 -13
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +228 -69
- package/Tests/App/Dashboard/SelectedProjectSwitches.test.tsx +359 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1 -1
- package/Tests/App/Dashboard/SessionReplayAllowedCard.test.tsx +297 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +7 -1
- package/Tests/App/Dashboard/ShortFormsOnePage.test.tsx +591 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +253 -6
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +99 -0
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +3 -1
- package/Tests/App/Dashboard/SloSettings.test.tsx +257 -4
- package/Tests/App/Dashboard/SsoPages.test.tsx +448 -52
- package/Tests/App/Dashboard/StateChangeDialogsFolded.test.tsx +695 -0
- package/Tests/App/Dashboard/StateChangeFormFields.test.ts +376 -0
- package/Tests/App/Dashboard/StatusPageAccessCard.test.tsx +1088 -0
- package/Tests/App/Dashboard/StatusPageAccessCopy.test.ts +450 -0
- package/Tests/App/Dashboard/StatusPageAccessMenu.test.tsx +137 -0
- package/Tests/App/Dashboard/StatusPageAccessPage.test.tsx +458 -0
- package/Tests/App/Dashboard/StatusPageAdvancedSettingsPage.test.tsx +30 -86
- package/Tests/App/Dashboard/StatusPageBrandingPage.test.tsx +28 -15
- package/Tests/App/Dashboard/StatusPageDisplaySettingsCard.test.tsx +949 -14
- package/Tests/App/Dashboard/StatusPagePrivateUsersNotice.test.tsx +233 -0
- package/Tests/App/Dashboard/StatusPageReportsCard.test.tsx +1001 -0
- package/Tests/App/Dashboard/StatusPageRequireSsoCard.test.tsx +247 -0
- package/Tests/App/Dashboard/StatusPageSubscriberSettingsPages.test.tsx +4 -17
- package/Tests/App/Dashboard/StatusPageSuggestions.test.tsx +930 -0
- package/Tests/App/Dashboard/StatusPageSwitchCardPages.test.tsx +335 -0
- package/Tests/App/Dashboard/TeamBlockPermissionsRedirect.test.tsx +332 -0
- package/Tests/App/Dashboard/TeamCreateForm.test.ts +206 -0
- package/Tests/App/Dashboard/TeamViewPermissions.test.tsx +713 -0
- package/Tests/App/Dashboard/TeamViewSideMenuBlockPermissions.test.tsx +113 -0
- package/Tests/App/Dashboard/TeamsCreateAccess.test.tsx +799 -0
- package/Tests/App/Dashboard/TelemetryDataRuleForms.test.ts +655 -0
- package/Tests/App/Dashboard/TelemetryDataRuleFormsRender.test.tsx +1014 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +6 -3
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +446 -446
- package/Tests/App/Dashboard/TelemetryMonitorFiltersFold.test.tsx +613 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +37 -2
- package/Tests/App/Dashboard/TemplateFormsNoInternalDataWarning.test.tsx +3 -3
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +338 -0
- package/Tests/App/Dashboard/TwilioConfigFirstDefault.test.tsx +786 -0
- package/Tests/App/Dashboard/UpcomingShiftGetCover.test.tsx +306 -0
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +36 -11
- package/Tests/App/Dashboard/UserOverrideForm.test.ts +505 -0
- package/Tests/App/Dashboard/UserOverrideFormGuard.test.ts +334 -0
- package/Tests/App/Dashboard/UserOverrideWhoIsAway.test.tsx +999 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +33 -11
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +49 -4
- package/Tests/App/Dashboard/UsersPageEmptyState.test.tsx +245 -0
- package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +13 -6
- package/Tests/App/Dashboard/WorkspaceMenusConnected.test.tsx +0 -2
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +108 -86
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +397 -0
- package/Tests/App/StatusPage/StatusPageResourceForm.test.tsx +931 -0
- package/Tests/App/StatusPage/StatusPageSubscribeOnePage.test.tsx +686 -0
- package/Tests/DialogActionRules.ts +16 -5
- package/Tests/Helpers/CardHeaderScan.ts +258 -0
- package/Tests/Helpers/FormStepsScan.ts +576 -11
- package/Tests/Helpers/MonitorGroupStatusPageRows.ts +237 -0
- package/Tests/Helpers/NestedControls.ts +184 -0
- package/Tests/Helpers/NestedControlsScan.ts +414 -0
- package/Tests/Helpers/SteppedFooterScan.ts +722 -0
- package/Tests/Models/DatabaseModels/FormModel.test.ts +31 -7
- package/Tests/Models/DatabaseModels/UserOverrideColumnDescriptions.test.ts +123 -0
- package/Tests/Models/TelemetryDataRuleColumnDefaults.test.ts +239 -0
- package/Tests/ResponsiveFlexLayout.test.ts +111 -0
- package/Tests/ResponsiveFlexLayout.ts +165 -0
- package/Tests/Server/API/DashboardDomainOrderSslAPI.test.ts +372 -0
- package/Tests/Server/API/DashboardDomainVerifyCnameAPI.test.ts +921 -0
- package/Tests/Server/API/DashboardSharingPublicRoutes.test.ts +559 -0
- package/Tests/Server/API/FormBrandingPublicRoutes.test.ts +680 -0
- package/Tests/Server/API/ProjectAPICreateWithTenantHeader.test.ts +300 -0
- package/Tests/Server/API/ProjectCreateTestHelpers.ts +211 -0
- package/Tests/Server/API/ProjectCreateWithTenantHeaderPostgres.test.ts +387 -0
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +29 -12
- package/Tests/Server/API/StatusPageDomainVerifyCnameAPI.test.ts +1090 -0
- package/Tests/Server/API/StatusPageMasterPageAccess.test.ts +254 -0
- package/Tests/Server/API/StatusPageReportScheduleWrites.test.ts +829 -0
- package/Tests/Server/API/StatusPageUptimeSettingsWrites.test.ts +417 -0
- package/Tests/Server/API/StatusPagesListingMonitorsAPI.test.ts +1029 -0
- package/Tests/Server/API/StatusPagesListingMonitorsRoute.test.ts +286 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/MigrateIncidentFormsToFormsMigration.test.ts +52 -1
- package/Tests/Server/Services/CustomDomainCertificateLifecycle.test.ts +1559 -0
- package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +186 -16
- package/Tests/Server/Services/DashboardAccessChoice.test.ts +657 -0
- package/Tests/Server/Services/DashboardCreateFromTemplate.test.ts +200 -0
- package/Tests/Server/Services/DashboardDomainCertificateSweeps.test.ts +1142 -0
- package/Tests/Server/Services/DiscoveredResourceCreate.test.ts +864 -0
- package/Tests/Server/Services/DiscoveredResourceUpdate.test.ts +822 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +3 -4
- package/Tests/Server/Services/FileServiceProject.test.ts +345 -0
- package/Tests/Server/Services/FormBranding.test.ts +982 -0
- package/Tests/Server/Services/FormPublicForm.test.ts +15 -0
- package/Tests/Server/Services/GroupingRuleEpisodeOwners.test.ts +857 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +297 -1
- package/Tests/Server/Services/MachinePickedColors.test.ts +202 -0
- package/Tests/Server/Services/OidcProviderCreateDefaults.test.ts +252 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayer.test.ts +799 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayerPlans.test.ts +172 -0
- package/Tests/Server/Services/OnCallDutyPolicyUserOverrideWhoIsAway.test.ts +571 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +35 -13
- package/Tests/Server/Services/OnCallUndeliverablePageRulesLink.test.ts +217 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +213 -4
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefault.test.ts +699 -0
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefaultBilling.test.ts +247 -0
- package/Tests/Server/Services/SamlProviderCreateDefaults.test.ts +255 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberMonitorGroups.test.ts +333 -0
- package/Tests/Server/Services/ScrubRuleSaveValidation.test.ts +947 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +17 -4
- package/Tests/Server/Services/StatusPageAccessChoice.test.ts +548 -0
- package/Tests/Server/Services/StatusPageDomainCertificateSweeps.test.ts +1238 -0
- package/Tests/Server/Services/TeamCreateAccessGrant.test.ts +607 -0
- package/Tests/Server/Services/TwilioConfigSendersGuard.test.ts +249 -0
- package/Tests/Server/Services/VerificationCodesUseProjectTwilioConfig.test.ts +264 -0
- package/Tests/Server/Types/Database/Permissions/FormBrandingColumns.test.ts +270 -0
- package/Tests/Server/Utils/Greenlock/CertificateCleanup.test.ts +526 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrder.test.ts +1062 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderBudget.test.ts +243 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderFailures.test.ts +293 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderLock.test.ts +152 -0
- package/Tests/Server/Utils/Greenlock/CertificateOwnersGuard.test.ts +119 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalOwnership.test.ts +1170 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSafety.test.ts +368 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +188 -11
- package/Tests/Server/Utils/Greenlock/CustomDomainOrders.test.ts +723 -0
- package/Tests/Server/Utils/Greenlock/InMemoryRedis.ts +189 -0
- package/Tests/Server/Utils/Greenlock/NginxAcmeCertificatesToDisk.test.ts +242 -0
- package/Tests/Server/Utils/Greenlock/NginxCustomCertificatesToDisk.test.ts +305 -0
- package/Tests/Server/Utils/Greenlock/OrderCertGuards.test.ts +583 -0
- package/Tests/Server/Utils/Greenlock/OrderCertStorage.test.ts +203 -0
- package/Tests/Server/Utils/StatusPage/AffectedStatusPageResources.test.ts +700 -0
- package/Tests/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.test.ts +744 -0
- package/Tests/Types/CustomDomain/CustomDomainCertificates.test.ts +106 -0
- package/Tests/Types/CustomDomain/CustomDomainVerification.test.ts +94 -0
- package/Tests/Types/Dashboard/DashboardAccess.test.ts +460 -0
- package/Tests/Types/Filter/FilterConditionUtil.test.ts +59 -0
- package/Tests/Types/Form/FormBranding.test.ts +760 -0
- package/Tests/Types/IncomingCall/IncomingCallRingTime.test.ts +80 -0
- package/Tests/Types/NotificationRule/OnCallRuleKind.test.ts +271 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleFirstLayer.test.ts +300 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleLayerDefaults.test.ts +316 -0
- package/Tests/Types/OnCallDutyPolicy/UserOverrideCoverRequest.test.ts +257 -0
- package/Tests/Types/SSO/OidcProviderDefaults.test.ts +474 -0
- package/Tests/Types/SSO/SamlProviderDefaults.test.ts +150 -0
- package/Tests/Types/SSO/SsoProviderDefaults.test.ts +181 -0
- package/Tests/Types/StatusPage/StatusPageAccess.test.ts +393 -0
- package/Tests/Types/StatusPage/StatusPagesListingMonitors.test.ts +149 -0
- package/Tests/Types/Telemetry/ScrubRule.test.ts +375 -0
- package/Tests/UI/Components/AdvancedPageSection.test.tsx +201 -61
- package/Tests/UI/Components/BasicFormModalSteps.test.tsx +129 -153
- package/Tests/UI/Components/Card.test.tsx +354 -367
- package/Tests/UI/Components/CardHeaderActionsGuard.test.tsx +605 -0
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +23 -8
- package/Tests/UI/Components/CardModelDetailOnBeforeUpdate.test.tsx +224 -0
- package/Tests/UI/Components/CardModelDetailPageButtons.test.tsx +231 -0
- package/Tests/UI/Components/ChoiceRows.test.tsx +365 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +341 -5
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +655 -64
- package/Tests/UI/Components/Detail/DetailCreatedOnIdLine.test.tsx +669 -0
- package/Tests/UI/Components/Detail/DetailIdLineDarkMode.test.ts +34 -7
- package/Tests/UI/Components/Detail/DetailIdLineInLocale.test.tsx +71 -0
- package/Tests/UI/Components/Detail/DetailRecordIdLine.test.tsx +26 -7
- package/Tests/UI/Components/Detail/DetailRecordLine.test.tsx +326 -0
- package/Tests/UI/Components/Detail/DetailRecordTime.test.ts +324 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +7 -3
- package/Tests/UI/Components/Dropdown/DropdownChange.test.ts +163 -0
- package/Tests/UI/Components/EntityDropdown.test.tsx +103 -1
- package/Tests/UI/Components/EntityDropdownClearButton.test.tsx +638 -0
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +6 -6
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +21 -4
- package/Tests/UI/Components/EntityDropdownQuery.test.tsx +411 -0
- package/Tests/UI/Components/EntityDropdownQueryHelpers.test.ts +131 -0
- package/Tests/UI/Components/FilePicker.test.tsx +220 -1
- package/Tests/UI/Components/FoldedSection/FoldedSection.test.tsx +582 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionDarkMode.test.ts +197 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionItem.test.ts +247 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionQueries.ts +86 -0
- package/Tests/UI/Components/Forms/AdvancedStepsGuard.test.ts +358 -32
- package/Tests/UI/Components/Forms/AnchoredFieldPopupPlacement.test.tsx +195 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +187 -23
- package/Tests/UI/Components/Forms/BasicFormFillsInOnShow.test.tsx +246 -0
- package/Tests/UI/Components/Forms/BasicFormFooterSetValue.test.tsx +283 -0
- package/Tests/UI/Components/Forms/BasicFormPrimaryActionLastStep.test.tsx +780 -0
- package/Tests/UI/Components/Forms/BasicFormSingleStep.test.tsx +232 -0
- package/Tests/UI/Components/Forms/BasicFormStepValidation.test.tsx +7 -4
- package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +4 -3
- package/Tests/UI/Components/Forms/CreateFormDefaultsGuard.test.ts +252 -7
- package/Tests/UI/Components/Forms/DeclareAndCreateFormsGuard.test.ts +247 -7
- package/Tests/UI/Components/Forms/DiscoveredResourceCreateFormsGuard.test.ts +492 -0
- package/Tests/UI/Components/Forms/FilterConditionOnlyWithTwoFiltersGuard.test.ts +333 -0
- package/Tests/UI/Components/Forms/FoldedEditorWidthTiming.test.tsx +127 -0
- package/Tests/UI/Components/Forms/FoldedSectionsGuard.test.ts +523 -0
- package/Tests/UI/Components/Forms/FollowPickName.test.ts +88 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownChange.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormModalWidth.test.tsx +237 -2
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +181 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +110 -86
- package/Tests/UI/Components/Forms/LabelsFormFieldGuard.test.ts +101 -96
- package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +559 -10
- package/Tests/UI/Components/Forms/MarkdownFormsAreWide.test.ts +56 -4
- package/Tests/UI/Components/Forms/MetricAndRecordingRuleFormsGuard.test.ts +400 -0
- package/Tests/UI/Components/Forms/ModelFormColorDefaults.test.tsx +659 -0
- package/Tests/UI/Components/Forms/ModelFormCreateDefaults.test.tsx +108 -4
- package/Tests/UI/Components/Forms/ModelFormDropdownQuery.test.tsx +403 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +126 -0
- package/Tests/UI/Components/Forms/ModelFormSinglePickPeoplePicker.test.tsx +453 -0
- package/Tests/UI/Components/Forms/OidcProviderFormsGuard.test.ts +321 -0
- package/Tests/UI/Components/Forms/OneIncidentRolePickerGuard.test.ts +823 -0
- package/Tests/UI/Components/Forms/OneSwitchCardsGuard.test.ts +739 -0
- package/Tests/UI/Components/Forms/OpenFormSections.test.tsx +169 -0
- package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +21 -9
- package/Tests/UI/Components/Forms/PrimaryActionLastStepGuard.test.ts +478 -0
- package/Tests/UI/Components/Forms/ProjectTeamFormsGuard.test.ts +240 -0
- package/Tests/UI/Components/Forms/ResourceDetailsOnePlaceGuard.test.ts +936 -0
- package/Tests/UI/Components/Forms/ResourceRuleFormsGuard.test.ts +527 -0
- package/Tests/UI/Components/Forms/SamlProviderFormsGuard.test.ts +387 -0
- package/Tests/UI/Components/Forms/SmallWizardsOnePageGuard.test.ts +331 -0
- package/Tests/UI/Components/Forms/SmtpConfigFormsGuard.test.ts +470 -0
- package/Tests/UI/Components/Forms/StateChangeDialogsFoldTheNote.test.ts +322 -0
- package/Tests/UI/Components/Forms/StatusPageResourceFormsGuard.test.ts +381 -0
- package/Tests/UI/Components/Forms/SteppedFormFooter.test.ts +225 -0
- package/Tests/UI/Components/Forms/SteppedFormFooterTiming.test.tsx +82 -40
- package/Tests/UI/Components/Forms/SwitchCardsGuard.test.ts +339 -0
- package/Tests/UI/Components/Forms/TelemetryDataRuleFormsGuard.test.ts +383 -0
- package/Tests/UI/Components/Forms/UniqueName.test.ts +163 -0
- package/Tests/UI/Components/Forms/Utils/AdvancedFormSection.test.ts +131 -11
- package/Tests/UI/Components/Forms/Utils/CreateFormColorDefaults.test.ts +373 -0
- package/Tests/UI/Components/Forms/Utils/FoldedFormFields.test.ts +482 -0
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +32 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +51 -7
- package/Tests/UI/Components/ModalSecondaryButton.test.tsx +60 -3
- package/Tests/UI/Components/ModelFormDraftValues.test.tsx +255 -0
- package/Tests/UI/Components/ModelPageHeaderChanged.test.tsx +293 -0
- package/Tests/UI/Components/ModelSwitchCard.test.tsx +813 -0
- package/Tests/UI/Components/ModelSwitchEvents.test.ts +188 -0
- package/Tests/UI/Components/ModelSwitchRow.test.tsx +861 -0
- package/Tests/UI/Components/ModelSwitchUtil.test.ts +239 -0
- package/Tests/UI/Components/ModelSwitchesCard.test.tsx +699 -0
- package/Tests/UI/Components/NavBar.test.tsx +41 -2
- package/Tests/UI/Components/NavBarCategoryToggleDarkMode.test.ts +12 -0
- package/Tests/UI/Components/NavBarMenuCatalog.test.tsx +197 -30
- package/Tests/UI/Components/NavBarMenuFolding.test.tsx +221 -39
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +15 -10
- package/Tests/UI/Components/NestedControlsGuard.test.ts +300 -0
- package/Tests/UI/Components/PageBreadcrumbOverride.test.tsx +202 -0
- package/Tests/UI/Components/PeoplePicker/OwnersFieldGuard.test.ts +269 -5
- package/Tests/UI/Components/PeoplePicker/PeoplePickerChange.test.tsx +414 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerExcludePicks.test.tsx +582 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePick.test.tsx +519 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePickTypes.test.ts +174 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +8 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaNamesGuard.test.ts +14 -6
- package/Tests/UI/Components/RuleRun/RuleViewDescription.test.tsx +107 -0
- package/Tests/UI/Components/SaveStatus.test.tsx +81 -0
- package/Tests/UI/Components/SmtpConfig/SmtpConfigFormFields.test.ts +1078 -0
- package/Tests/UI/Components/Sso/OidcProviderForm.test.tsx +608 -0
- package/Tests/UI/Components/Sso/OidcProviderFormFields.test.ts +698 -0
- package/Tests/UI/Components/Sso/SamlProviderForm.test.tsx +583 -0
- package/Tests/UI/Components/Sso/SamlProviderFormFields.test.ts +619 -0
- package/Tests/UI/Components/SteppedEditFormSave.test.tsx +199 -141
- package/Tests/UI/Components/Table/TableEmptyStateComponent.test.tsx +143 -0
- package/Tests/UI/Components/UseSaveModelSwitch.test.tsx +409 -0
- package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +3 -3
- package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +83 -27
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +7 -2
- package/Tests/UI/Components/useSaveOnChange.test.tsx +341 -0
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +75 -5
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +97 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +12 -39
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -6
- package/Tests/{App/Dashboard → UI/Utils}/DefaultInviteTeam.test.ts +126 -4
- package/Tests/UI/Utils/GrantablePermission.test.ts +172 -0
- package/Tests/UI/Utils/PermissionGateColumnUpdate.test.ts +211 -0
- package/Tests/UI/Utils/TranslateTemplate.test.ts +31 -0
- package/Tests/Utils/DistinctColor.test.ts +446 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +14 -2
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +1 -1
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +2 -2
- package/Tests/Utils/Slo/SloHealth.test.ts +28 -6
- package/Tests/Utils/StatusPage/ReportSchedule.test.ts +867 -0
- package/Tests/Utils/Telemetry/DiscoveredResourceName.test.ts +189 -0
- package/Tests/Utils/WordMatch.test.ts +104 -0
- package/Types/BrandColors.ts +10 -0
- package/Types/CustomDomain/CustomDomainCertificates.ts +128 -0
- package/Types/CustomDomain/CustomDomainVerification.ts +78 -0
- package/Types/Dashboard/DashboardAccess.ts +250 -0
- package/Types/Dashboard/DashboardTemplates.ts +33 -0
- package/Types/Filter/FilterConditionUtil.ts +29 -0
- package/Types/Form/FormBranding.ts +475 -0
- package/Types/Form/FormPublic.ts +26 -0
- package/Types/IncomingCall/IncomingCallRingTime.ts +48 -0
- package/Types/Log/LogScrubField.ts +14 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +1 -1
- package/Types/NotificationRule/OnCallRuleKind.ts +194 -0
- package/Types/OnCallDutyPolicy/FirstResponders.ts +3 -32
- package/Types/OnCallDutyPolicy/MiscDataId.ts +38 -0
- package/Types/OnCallDutyPolicy/ScheduleFirstLayer.ts +165 -0
- package/Types/OnCallDutyPolicy/ScheduleLayerDefaults.ts +160 -0
- package/Types/OnCallDutyPolicy/UserOverrideCoverRequest.ts +148 -0
- package/Types/SSO/OidcProviderDefaults.ts +282 -0
- package/Types/SSO/SamlProviderDefaults.ts +77 -0
- package/Types/SSO/SsoProviderDefaults.ts +101 -0
- package/Types/StatusPage/StatusPageAccess.ts +215 -0
- package/Types/StatusPage/StatusPagesListingMonitors.ts +150 -0
- package/Types/Telemetry/ScrubRule.ts +240 -0
- package/UI/Components/AdvancedPageSection/AdvancedPageSection.tsx +59 -29
- package/UI/Components/Card/Card.tsx +139 -80
- package/UI/Components/ChoiceRows/ChoiceRows.tsx +249 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +28 -12
- package/UI/Components/CommandPalette/PaletteFilter.ts +962 -75
- package/UI/Components/CommandPalette/PaletteRow.tsx +35 -3
- package/UI/Components/CommandPalette/Types.ts +37 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +6 -0
- package/UI/Components/Detail/Detail.tsx +52 -15
- package/UI/Components/Detail/DetailRecordLine.tsx +96 -0
- package/UI/Components/Detail/DetailRecordTime.ts +196 -0
- package/UI/Components/Dropdown/DropdownChange.ts +198 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +270 -106
- package/UI/Components/EntityDropdown/EntityDropdownQuery.ts +119 -0
- package/UI/Components/FilePicker/FilePicker.tsx +90 -6
- package/UI/Components/FoldedSection/FoldedSection.tsx +370 -0
- package/UI/Components/FoldedSection/FoldedSectionItem.ts +141 -0
- package/UI/Components/FoldedSection/FoldedSectionTitles.ts +39 -0
- package/UI/Components/FormModal/BasicFormModal.tsx +40 -67
- package/UI/Components/Forms/BasicForm.tsx +218 -119
- package/UI/Components/Forms/BasicModelForm.tsx +0 -2
- package/UI/Components/Forms/CollapsibleFormSection.tsx +108 -18
- package/UI/Components/Forms/Fields/FormField.tsx +62 -15
- package/UI/Components/Forms/Fields/GeneratedKeyField.tsx +1 -5
- package/UI/Components/Forms/FormSummary.tsx +5 -3
- package/UI/Components/Forms/ModelForm.tsx +123 -16
- package/UI/Components/Forms/Types/Field.ts +98 -16
- package/UI/Components/Forms/Utils/AdvancedFormSection.ts +102 -31
- package/UI/Components/Forms/Utils/CreateFormDefaults.ts +158 -17
- package/UI/Components/Forms/Utils/FoldedFormFields.ts +393 -0
- package/UI/Components/Forms/Utils/FollowPickName.ts +52 -0
- package/UI/Components/Forms/Utils/FormModalWidth.ts +35 -4
- package/UI/Components/Forms/Utils/OpenFormSections.ts +104 -0
- package/UI/Components/Forms/Utils/SteppedFormFooter.ts +151 -0
- package/UI/Components/Forms/Utils/UniqueName.ts +81 -0
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +22 -3
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +6 -5
- package/UI/Components/Modal/ModalFooter.tsx +10 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +33 -8
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +44 -58
- package/UI/Components/ModelSwitch/ModelSwitchCard.tsx +305 -0
- package/UI/Components/ModelSwitch/ModelSwitchEvents.ts +109 -0
- package/UI/Components/ModelSwitch/ModelSwitchRow.tsx +438 -0
- package/UI/Components/ModelSwitch/ModelSwitchUtil.ts +120 -0
- package/UI/Components/ModelSwitch/ModelSwitchesCard.tsx +265 -0
- package/UI/Components/ModelSwitch/useSaveModelSwitch.ts +144 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +6 -0
- package/UI/Components/ModelTable/ModelTable.tsx +5 -0
- package/UI/Components/Navbar/NavBar.tsx +10 -9
- package/UI/Components/Navbar/NavBarMenuCatalog.ts +57 -22
- package/UI/Components/Navbar/NavBarMenuModal.tsx +17 -13
- package/UI/Components/Navbar/NavBarMobileMenu.tsx +40 -23
- package/UI/Components/Page/ModelHeaderEvents.ts +75 -0
- package/UI/Components/Page/ModelPage.tsx +21 -1
- package/UI/Components/Page/Page.tsx +68 -13
- package/UI/Components/PeoplePicker/PeoplePicker.tsx +150 -45
- package/UI/Components/PeoplePicker/PeoplePickerTypes.ts +193 -4
- package/UI/Components/PeoplePicker/PeopleSearchPopup.tsx +37 -10
- package/UI/Components/PublicForm/PublicFormFavicon.ts +99 -0
- package/UI/Components/PublicForm/PublicFormLogo.tsx +81 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +5 -3
- package/UI/Components/RuleRun/RuleView.tsx +2 -5
- package/UI/Components/SaveStatus/SaveStatus.tsx +76 -0
- package/UI/Components/SaveStatus/useSaveOnChange.ts +178 -0
- package/UI/Components/SmtpConfig/SmtpConfigFormFields.ts +815 -0
- package/UI/Components/Sso/OidcProviderFormFields.ts +481 -0
- package/UI/Components/Sso/SamlProviderFormFields.ts +322 -0
- package/UI/Components/Sso/SsoProviderFormFields.ts +331 -0
- package/UI/Components/Table/TableEmptyState.tsx +39 -5
- package/UI/Components/Workflow/ArgumentsForm.tsx +21 -78
- package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +18 -145
- package/UI/Components/Workflow/WorkflowLogModal.tsx +1 -3
- package/UI/Types/UseAnchoredFieldPopup.ts +46 -4
- package/UI/Utils/DefaultInviteTeam.ts +306 -0
- package/UI/Utils/GrantablePermission.ts +46 -0
- package/UI/Utils/PermissionGate.ts +80 -7
- package/UI/Utils/TranslateTemplate.ts +22 -0
- package/Utils/DistinctColor.ts +223 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +47 -2
- package/Utils/Slo/SloHealth.ts +9 -3
- package/Utils/StatusPage/ReportSchedule.ts +462 -0
- package/Utils/Telemetry/DiscoveredResourceName.ts +95 -0
- package/Utils/WordMatch.ts +185 -0
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/File.js +47 -1
- package/build/dist/Models/DatabaseModels/File.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Form.js +125 -0
- package/build/dist/Models/DatabaseModels/Form.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogPipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +20 -9
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +6 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TracePipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Server/API/CustomDomainRoutes.js +124 -0
- package/build/dist/Server/API/CustomDomainRoutes.js.map +1 -0
- package/build/dist/Server/API/DashboardAPI.js +22 -4
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardDomainAPI.js +56 -49
- package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +101 -39
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageDomainAPI.js +52 -51
- package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +63 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.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/Services/AlertGroupingEngineService.js +44 -61
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +23 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +39 -0
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +510 -172
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +22 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +114 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +51 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +23 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/FileService.js +45 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/FormService.js +158 -14
- package/build/dist/Server/Services/FormService.js.map +1 -1
- package/build/dist/Server/Services/GlobalOidcService.js +9 -0
- package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
- package/build/dist/Server/Services/GlobalSsoService.js +9 -0
- package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +50 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +45 -62
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetService.js +23 -0
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +54 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +6 -16
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/LogScrubRuleService.js +31 -0
- package/build/dist/Server/Services/LogScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +202 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +7 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +17 -24
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +32 -38
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +51 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProfileAggregationService.js +34 -0
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +53 -3
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOidcService.js +28 -0
- package/build/dist/Server/Services/ProjectOidcService.js.map +1 -1
- package/build/dist/Server/Services/ProjectSsoService.js +28 -0
- package/build/dist/Server/Services/ProjectSsoService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +42 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +18 -26
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +44 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +30 -4
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +495 -174
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOidcService.js +28 -0
- package/build/dist/Server/Services/StatusPageOidcService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +82 -46
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +174 -45
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSsoService.js +28 -0
- package/build/dist/Server/Services/StatusPageSsoService.js.map +1 -1
- package/build/dist/Server/Services/TraceScrubRuleService.js +31 -0
- package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +20 -10
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +23 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +3 -3
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -1
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js +353 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js +119 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js +208 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js +111 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js +30 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js +52 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js +80 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js +296 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/Greenlock.js +595 -146
- package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js +366 -0
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +7 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/ScrubRuleValidation.js +127 -0
- package/build/dist/Server/Utils/ScrubRuleValidation.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js +97 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js +195 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js +177 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js +129 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +8 -2
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -1
- package/build/dist/Types/BrandColors.js +9 -0
- package/build/dist/Types/BrandColors.js.map +1 -1
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js +71 -0
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js.map +1 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js +58 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js +157 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +26 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Filter/FilterConditionUtil.js +24 -0
- package/build/dist/Types/Filter/FilterConditionUtil.js.map +1 -0
- package/build/dist/Types/Form/FormBranding.js +266 -0
- package/build/dist/Types/Form/FormBranding.js.map +1 -0
- package/build/dist/Types/Form/FormPublic.js +6 -0
- package/build/dist/Types/Form/FormPublic.js.map +1 -1
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js +37 -0
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js.map +1 -0
- package/build/dist/Types/Log/LogScrubField.js +15 -0
- package/build/dist/Types/Log/LogScrubField.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js +134 -0
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js +2 -23
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js +30 -0
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js +113 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js +95 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js +99 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js.map +1 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js +189 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js +55 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js +67 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js +132 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js +84 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js.map +1 -0
- package/build/dist/Types/Telemetry/ScrubRule.js +180 -0
- package/build/dist/Types/Telemetry/ScrubRule.js.map +1 -0
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js +9 -7
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +81 -35
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js +54 -0
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +25 -12
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +632 -64
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +7 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +7 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +26 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Detail/DetailRecordLine.js +32 -0
- package/build/dist/UI/Components/Detail/DetailRecordLine.js.map +1 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js +134 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js +102 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js.map +1 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +134 -57
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js +78 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js.map +1 -0
- package/build/dist/UI/Components/FilePicker/FilePicker.js +55 -6
- package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js +139 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js +58 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js +34 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js.map +1 -0
- package/build/dist/UI/Components/FormModal/BasicFormModal.js +29 -45
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +148 -89
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +49 -10
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +25 -11
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js +2 -5
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +5 -3
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +72 -14
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js +80 -23
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js +91 -9
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js +243 -0
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js +25 -5
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js +71 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js +56 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +17 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +8 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +19 -6
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +33 -43
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js +151 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js +54 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js +201 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js +60 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js +116 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js +68 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +3 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js +21 -10
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +10 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js +17 -9
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js +43 -0
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js.map +1 -0
- package/build/dist/UI/Components/Page/ModelPage.js +19 -1
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +31 -13
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js +62 -20
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js +98 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js +35 -14
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js.map +1 -1
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js +66 -0
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js.map +1 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js +38 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +5 -3
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleView.js +2 -2
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -1
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js +46 -0
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js.map +1 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js +98 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js.map +1 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js +503 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js +283 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js +182 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js +208 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Table/TableEmptyState.js +17 -4
- package/build/dist/UI/Components/Table/TableEmptyState.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +17 -52
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +7 -89
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +22 -3
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/DefaultInviteTeam.js +207 -0
- package/build/dist/UI/Utils/DefaultInviteTeam.js.map +1 -0
- package/build/dist/UI/Utils/GrantablePermission.js +31 -0
- package/build/dist/UI/Utils/GrantablePermission.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +54 -3
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/TranslateTemplate.js +16 -0
- package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -1
- package/build/dist/Utils/DistinctColor.js +151 -0
- package/build/dist/Utils/DistinctColor.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +12 -1
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +9 -3
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/StatusPage/ReportSchedule.js +304 -0
- package/build/dist/Utils/StatusPage/ReportSchedule.js.map +1 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js +65 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js.map +1 -0
- package/build/dist/Utils/WordMatch.js +115 -0
- package/build/dist/Utils/WordMatch.js.map +1 -0
- package/package.json +1 -1
- package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +0 -109
- package/Tests/App/StatusPage/StatusPageSubscribeFromFirstStep.test.tsx +0 -382
- package/Tests/UI/Components/Forms/BasicFormFinishFromAnyStep.test.tsx +0 -729
- package/Tests/UI/Components/Forms/FinishFromAnyStep.test.ts +0 -571
- package/Tests/UI/Components/Forms/FinishFromAnyStepGuard.test.ts +0 -566
- package/UI/Components/Forms/Utils/FinishFromAnyStep.ts +0 -284
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js +0 -132
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js.map +0 -1
|
@@ -8,6 +8,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
10
|
import GreenlockUtil from "../Utils/Greenlock/Greenlock";
|
|
11
|
+
import CertificateOrder, { CertificateOrderOutcome, } from "../Utils/Greenlock/CertificateOrder";
|
|
12
|
+
import CustomDomainOrders from "../Utils/Greenlock/CustomDomainOrders";
|
|
13
|
+
import { CertificateOrderReason } from "../Utils/Greenlock/CertificateOrderBudget";
|
|
14
|
+
import CertificateOrderFailures from "../Utils/Greenlock/CertificateOrderFailures";
|
|
15
|
+
import CertificateReissueOrder from "../Utils/Greenlock/CertificateReissueOrder";
|
|
11
16
|
import logger from "../Utils/Logger";
|
|
12
17
|
import DatabaseService from "./DatabaseService";
|
|
13
18
|
import DomainService from "./DomainService";
|
|
@@ -15,15 +20,14 @@ import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
|
15
20
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
16
21
|
import ObjectID from "../../Types/ObjectID";
|
|
17
22
|
import DashboardDomain from "../../Models/DatabaseModels/DashboardDomain";
|
|
18
|
-
import AcmeCertificateService from "./AcmeCertificateService";
|
|
19
23
|
import Telemetry from "../Utils/Telemetry";
|
|
20
24
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
21
25
|
import { DashboardCNameRecord } from "../EnvironmentConfig";
|
|
22
26
|
import Domain from "../Types/Domain";
|
|
23
27
|
import OneUptimeDate from "../../Types/Date";
|
|
24
28
|
import CertificateReissueUtil from "../../Utils/CertificateReissue";
|
|
25
|
-
import TooManyRequestsException from "../../Types/Exception/TooManyRequestsException";
|
|
26
29
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
30
|
+
import ArrayUtil from "../../Utils/Array";
|
|
27
31
|
const DASHBOARD_DOMAIN_EGRESS_LABEL = "Dashboard domain";
|
|
28
32
|
export class Service extends DatabaseService {
|
|
29
33
|
constructor() {
|
|
@@ -116,7 +120,49 @@ export class Service extends DatabaseService {
|
|
|
116
120
|
async removeDomainFromGreenlock(domain) {
|
|
117
121
|
await GreenlockUtil.removeDomain(domain);
|
|
118
122
|
}
|
|
119
|
-
|
|
123
|
+
/*
|
|
124
|
+
* The domain with its full name and whether it serves an uploaded
|
|
125
|
+
* certificate, read once when the caller did not have them both.
|
|
126
|
+
*/
|
|
127
|
+
async getDomainToOrder(dashboardDomain) {
|
|
128
|
+
if (!dashboardDomain.id) {
|
|
129
|
+
throw new BadDataException("Domain ID is required to order a certificate");
|
|
130
|
+
}
|
|
131
|
+
if (dashboardDomain.fullDomain &&
|
|
132
|
+
dashboardDomain.isCustomCertificate !== undefined) {
|
|
133
|
+
return dashboardDomain;
|
|
134
|
+
}
|
|
135
|
+
const fetchedDashboardDomain = await this.findOneBy({
|
|
136
|
+
query: {
|
|
137
|
+
_id: dashboardDomain.id.toString(),
|
|
138
|
+
},
|
|
139
|
+
select: {
|
|
140
|
+
_id: true,
|
|
141
|
+
fullDomain: true,
|
|
142
|
+
isCustomCertificate: true,
|
|
143
|
+
projectId: true,
|
|
144
|
+
},
|
|
145
|
+
props: {
|
|
146
|
+
isRoot: true,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (!fetchedDashboardDomain) {
|
|
150
|
+
throw new BadDataException("DomainModel not found");
|
|
151
|
+
}
|
|
152
|
+
if (!fetchedDashboardDomain.fullDomain) {
|
|
153
|
+
throw new BadDataException("Unable to order certificate because domain is null");
|
|
154
|
+
}
|
|
155
|
+
return fetchedDashboardDomain;
|
|
156
|
+
}
|
|
157
|
+
/*
|
|
158
|
+
* Order this domain's certificate and record it: a first certificate
|
|
159
|
+
* (the default), or a reissue. GreenlockUtil.orderCert places it under the
|
|
160
|
+
* name's order lock - the one handed in, or its own - and within the
|
|
161
|
+
* installation's Let's Encrypt allowance; the outcome says whether it
|
|
162
|
+
* ordered. A CNAME check that fails refuses the order and no longer
|
|
163
|
+
* deletes the domain's certificate.
|
|
164
|
+
*/
|
|
165
|
+
async orderCert(dashboardDomain, options) {
|
|
120
166
|
var _a;
|
|
121
167
|
return Telemetry.startActiveSpan({
|
|
122
168
|
name: "DashboardDomainService.orderCert",
|
|
@@ -128,45 +174,40 @@ export class Service extends DatabaseService {
|
|
|
128
174
|
},
|
|
129
175
|
fn: async (span) => {
|
|
130
176
|
try {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
177
|
+
const domainToOrder = await this.getDomainToOrder(dashboardDomain);
|
|
178
|
+
logger.debug("Ordering SSL for domain: " + domainToOrder.fullDomain, {
|
|
179
|
+
fullDomain: domainToOrder.fullDomain,
|
|
180
|
+
});
|
|
181
|
+
const outcome = await GreenlockUtil.orderCert({
|
|
182
|
+
domain: domainToOrder.fullDomain,
|
|
183
|
+
reason: (options === null || options === void 0 ? void 0 : options.reason) || CertificateOrderReason.FirstCertificate,
|
|
184
|
+
validateCname: (options === null || options === void 0 ? void 0 : options.cnameVerifiedJustNow)
|
|
185
|
+
? null
|
|
186
|
+
: async (fullDomain) => {
|
|
187
|
+
return await this.isCnameValid(fullDomain);
|
|
135
188
|
},
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
189
|
+
lock: options === null || options === void 0 ? void 0 : options.lock,
|
|
190
|
+
mayOrder: options === null || options === void 0 ? void 0 : options.mayOrder,
|
|
191
|
+
});
|
|
192
|
+
if (outcome === CertificateOrderOutcome.Ordered) {
|
|
193
|
+
logger.debug("SSL ordered for domain: " + domainToOrder.fullDomain, { fullDomain: domainToOrder.fullDomain });
|
|
194
|
+
/*
|
|
195
|
+
* Verified as well as ordered: Let's Encrypt has just fetched
|
|
196
|
+
* its challenge from this domain, so the domain reaches us.
|
|
197
|
+
*/
|
|
198
|
+
await this.updateOneById({
|
|
199
|
+
id: domainToOrder.id,
|
|
200
|
+
data: {
|
|
201
|
+
isCnameVerified: true,
|
|
202
|
+
isSslOrdered: true,
|
|
139
203
|
},
|
|
140
204
|
props: {
|
|
141
205
|
isRoot: true,
|
|
142
206
|
},
|
|
143
207
|
});
|
|
144
|
-
if (!fetchedDashboardDomain) {
|
|
145
|
-
throw new BadDataException("DomainModel not found");
|
|
146
|
-
}
|
|
147
|
-
dashboardDomain = fetchedDashboardDomain;
|
|
148
|
-
}
|
|
149
|
-
if (!dashboardDomain.fullDomain) {
|
|
150
|
-
throw new BadDataException("Unable to order certificate because domain is null");
|
|
151
208
|
}
|
|
152
|
-
logger.debug("Ordering SSL for domain: " + dashboardDomain.fullDomain, { fullDomain: dashboardDomain.fullDomain });
|
|
153
|
-
await GreenlockUtil.orderCert({
|
|
154
|
-
domain: dashboardDomain.fullDomain,
|
|
155
|
-
validateCname: async (fullDomain) => {
|
|
156
|
-
return await this.isCnameValid(fullDomain);
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
logger.debug("SSL ordered for domain: " + dashboardDomain.fullDomain, { fullDomain: dashboardDomain.fullDomain });
|
|
160
|
-
await this.updateOneById({
|
|
161
|
-
id: dashboardDomain.id,
|
|
162
|
-
data: {
|
|
163
|
-
isSslOrdered: true,
|
|
164
|
-
},
|
|
165
|
-
props: {
|
|
166
|
-
isRoot: true,
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
209
|
Telemetry.endSpan(span);
|
|
210
|
+
return outcome;
|
|
170
211
|
}
|
|
171
212
|
catch (err) {
|
|
172
213
|
Telemetry.recordExceptionMarkSpanAsErrorAndEndSpan({
|
|
@@ -178,6 +219,110 @@ export class Service extends DatabaseService {
|
|
|
178
219
|
},
|
|
179
220
|
});
|
|
180
221
|
}
|
|
222
|
+
/*
|
|
223
|
+
* Records these domains as ordered: they have a certificate, ordered
|
|
224
|
+
* before, so nothing is ordered. One write for all of them, and only on
|
|
225
|
+
* domains that are still verified (see StatusPageDomainService's twin).
|
|
226
|
+
*/
|
|
227
|
+
async recordCertificatesAsOrdered(domainIds) {
|
|
228
|
+
if (domainIds.length === 0) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
await this.updateBy({
|
|
232
|
+
query: {
|
|
233
|
+
_id: QueryHelper.any(domainIds.map((id) => {
|
|
234
|
+
return id.toString();
|
|
235
|
+
})),
|
|
236
|
+
isCnameVerified: true,
|
|
237
|
+
isSslOrdered: false,
|
|
238
|
+
},
|
|
239
|
+
data: {
|
|
240
|
+
isSslOrdered: true,
|
|
241
|
+
},
|
|
242
|
+
limit: LIMIT_MAX,
|
|
243
|
+
skip: 0,
|
|
244
|
+
props: {
|
|
245
|
+
isRoot: true,
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/*
|
|
250
|
+
* Order this domain's free certificate unless it has one already, or one
|
|
251
|
+
* is being ordered for it right now (CertificateOrder.orderIfMissing): the
|
|
252
|
+
* one way a first certificate is ordered, whether by Check now, by the
|
|
253
|
+
* dashboard sweeps or by the order-ssl API, so a name is never ordered
|
|
254
|
+
* twice. Never for a domain that serves a certificate its owner uploaded.
|
|
255
|
+
* Throws what the order throws, so a caller can show why.
|
|
256
|
+
*/
|
|
257
|
+
async orderCertIfMissing(dashboardDomain, options) {
|
|
258
|
+
const domainToOrder = await this.getDomainToOrder(dashboardDomain);
|
|
259
|
+
if (domainToOrder.isCustomCertificate) {
|
|
260
|
+
throw new BadDataException("This domain uses a certificate you uploaded, so there is no free SSL certificate to order for it.");
|
|
261
|
+
}
|
|
262
|
+
const domainId = domainToOrder.id;
|
|
263
|
+
return await CertificateOrder.orderIfMissing({
|
|
264
|
+
domain: domainToOrder.fullDomain,
|
|
265
|
+
renewIfExpired: options === null || options === void 0 ? void 0 : options.renewIfExpired,
|
|
266
|
+
recordAsOrdered: async () => {
|
|
267
|
+
await this.recordCertificatesAsOrdered([domainId]);
|
|
268
|
+
},
|
|
269
|
+
order: async (lock) => {
|
|
270
|
+
var _a;
|
|
271
|
+
return await this.orderCert(domainToOrder, {
|
|
272
|
+
reason: CertificateOrderReason.FirstCertificate,
|
|
273
|
+
lock: lock,
|
|
274
|
+
cnameVerifiedJustNow: options === null || options === void 0 ? void 0 : options.cnameVerifiedJustNow,
|
|
275
|
+
mayOrder: CertificateOrder.getOrderShare({
|
|
276
|
+
sweep: (options === null || options === void 0 ? void 0 : options.fromSweep)
|
|
277
|
+
? {
|
|
278
|
+
budget: Service.SWEEP_ORDER_BUDGET,
|
|
279
|
+
maxPerWindow: Service.ORDER_MAX_PER_RUN,
|
|
280
|
+
}
|
|
281
|
+
: undefined,
|
|
282
|
+
onDemand: (options === null || options === void 0 ? void 0 : options.onDemand)
|
|
283
|
+
? { projectId: (_a = domainToOrder.projectId) === null || _a === void 0 ? void 0 : _a.toString() }
|
|
284
|
+
: undefined,
|
|
285
|
+
}),
|
|
286
|
+
});
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
/*
|
|
291
|
+
* Called by verify-cname - the domain's Check now - once it has found the
|
|
292
|
+
* domain's CNAME record: order the domain's free certificate now rather
|
|
293
|
+
* than at the next run of the order sweep, and say what happens to its
|
|
294
|
+
* certificate next. The same step as a status page domain's
|
|
295
|
+
* (CustomDomainOrders.orderOnceCnameIsVerified): one on-demand order per
|
|
296
|
+
* domain per 15 minutes, counted against the domain's project, under the
|
|
297
|
+
* name's lock and within the installation's Let's Encrypt allowance; never
|
|
298
|
+
* for an uploaded certificate; Issued only for a certificate that is there
|
|
299
|
+
* and has not expired. Never rejects.
|
|
300
|
+
*/
|
|
301
|
+
async orderCertOnceCnameIsVerified(dashboardDomain, options) {
|
|
302
|
+
return await CustomDomainOrders.orderOnceCnameIsVerified({
|
|
303
|
+
domain: dashboardDomain,
|
|
304
|
+
waitInMs: options === null || options === void 0 ? void 0 : options.waitInMs,
|
|
305
|
+
recordAsOrdered: async () => {
|
|
306
|
+
await this.recordCertificatesAsOrdered([dashboardDomain.id]);
|
|
307
|
+
},
|
|
308
|
+
orderIfMissing: async () => {
|
|
309
|
+
return await this.orderCertIfMissing(dashboardDomain, {
|
|
310
|
+
onDemand: true,
|
|
311
|
+
// The route found the record a moment ago.
|
|
312
|
+
cnameVerifiedJustNow: true,
|
|
313
|
+
renewIfExpired: true,
|
|
314
|
+
});
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/*
|
|
319
|
+
* Where the certificates of these domains stand, for the Custom Domains
|
|
320
|
+
* page's Status column (CustomDomainCertificates): each one's expiry, and
|
|
321
|
+
* its last failed order while no order since has succeeded.
|
|
322
|
+
*/
|
|
323
|
+
async getCertificates(domains) {
|
|
324
|
+
return await CustomDomainOrders.getCertificates(domains);
|
|
325
|
+
}
|
|
181
326
|
/*
|
|
182
327
|
* Reissue this domain's Let's Encrypt certificate because a customer asked
|
|
183
328
|
* for it, rather than because it is close to expiring.
|
|
@@ -227,50 +372,60 @@ export class Service extends DatabaseService {
|
|
|
227
372
|
throw new BadDataException("CNAME is not verified. Please verify CNAME first before you reissue the SSL certificate.");
|
|
228
373
|
}
|
|
229
374
|
/*
|
|
230
|
-
* A domain that never ordered a certificate has nothing to reissue
|
|
231
|
-
*
|
|
375
|
+
* A domain that never ordered a certificate has nothing to reissue. Its
|
|
376
|
+
* first certificate is ordered on its own once the CNAME is verified, and
|
|
377
|
+
* the dashboard shows Reissue SSL only after that.
|
|
232
378
|
*/
|
|
233
379
|
if (!dashboardDomain.isSslOrdered) {
|
|
234
|
-
throw new BadDataException("No SSL certificate has been ordered for this domain yet.
|
|
380
|
+
throw new BadDataException("No SSL certificate has been ordered for this domain yet. One is ordered automatically once its CNAME record is verified.");
|
|
235
381
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
382
|
+
await CertificateReissueOrder.reissue({
|
|
383
|
+
domain: dashboardDomain.fullDomain,
|
|
384
|
+
now: now,
|
|
385
|
+
lastReissueRequestedAt: dashboardDomain.certificateReissueRequestedAt,
|
|
386
|
+
claimCooldown: async () => {
|
|
387
|
+
/*
|
|
388
|
+
* Claim the cooldown before ordering anything, and claim it by
|
|
389
|
+
* putting the cooldown condition in the WHERE clause rather than in
|
|
390
|
+
* an `if` above the write. Two clicks that arrive together both read
|
|
391
|
+
* a row that is not cooling down; only the write can decide which
|
|
392
|
+
* one of them gets to spend the CA's allowance.
|
|
393
|
+
*/
|
|
394
|
+
return await this.updateOneBy({
|
|
395
|
+
query: {
|
|
396
|
+
_id: domainId.toString(),
|
|
397
|
+
certificateReissueRequestedAt: QueryHelper.lessThanEqualToOrNull(CertificateReissueUtil.getCooldownCutoff(now)),
|
|
398
|
+
},
|
|
399
|
+
data: {
|
|
400
|
+
certificateReissueRequestedAt: now,
|
|
401
|
+
},
|
|
402
|
+
props: {
|
|
403
|
+
isRoot: true,
|
|
404
|
+
},
|
|
405
|
+
});
|
|
253
406
|
},
|
|
254
|
-
|
|
255
|
-
|
|
407
|
+
giveCooldownBack: async () => {
|
|
408
|
+
await this.updateOneBy({
|
|
409
|
+
query: {
|
|
410
|
+
_id: domainId.toString(),
|
|
411
|
+
certificateReissueRequestedAt: now,
|
|
412
|
+
},
|
|
413
|
+
data: {
|
|
414
|
+
certificateReissueRequestedAt: dashboardDomain.certificateReissueRequestedAt || null,
|
|
415
|
+
},
|
|
416
|
+
props: {
|
|
417
|
+
isRoot: true,
|
|
418
|
+
},
|
|
419
|
+
});
|
|
256
420
|
},
|
|
257
|
-
|
|
258
|
-
|
|
421
|
+
order: async (lock) => {
|
|
422
|
+
logger.debug("Reissuing SSL certificate for domain: " + dashboardDomain.fullDomain, { fullDomain: dashboardDomain.fullDomain });
|
|
423
|
+
return await this.orderCert(dashboardDomain, {
|
|
424
|
+
reason: CertificateOrderReason.Reissue,
|
|
425
|
+
lock: lock,
|
|
426
|
+
});
|
|
259
427
|
},
|
|
260
428
|
});
|
|
261
|
-
if (claimedRowCount === 0) {
|
|
262
|
-
if (dashboardDomain.certificateReissueRequestedAt) {
|
|
263
|
-
throw new TooManyRequestsException(CertificateReissueUtil.getCooldownMessage(dashboardDomain.certificateReissueRequestedAt, now));
|
|
264
|
-
}
|
|
265
|
-
/*
|
|
266
|
-
* The row matched the cooldown a moment ago and does not now: another
|
|
267
|
-
* request claimed it in between, or the domain was deleted. Either way
|
|
268
|
-
* the caller must not order.
|
|
269
|
-
*/
|
|
270
|
-
throw new BadDataException("Could not start a certificate reissue for this domain. Please refresh the page and try again.");
|
|
271
|
-
}
|
|
272
|
-
logger.debug("Reissuing SSL certificate for domain: " + dashboardDomain.fullDomain, { fullDomain: dashboardDomain.fullDomain });
|
|
273
|
-
await this.orderCert(dashboardDomain);
|
|
274
429
|
}
|
|
275
430
|
async updateSslProvisioningStatusForAllDomains() {
|
|
276
431
|
const domains = await this.findBy({
|
|
@@ -280,6 +435,7 @@ export class Service extends DatabaseService {
|
|
|
280
435
|
},
|
|
281
436
|
select: {
|
|
282
437
|
_id: true,
|
|
438
|
+
fullDomain: true,
|
|
283
439
|
},
|
|
284
440
|
limit: LIMIT_MAX,
|
|
285
441
|
skip: 0,
|
|
@@ -287,9 +443,17 @@ export class Service extends DatabaseService {
|
|
|
287
443
|
isRoot: true,
|
|
288
444
|
},
|
|
289
445
|
});
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
446
|
+
await ArrayUtil.forEachWithConcurrency(domains, Service.DOMAIN_CHECK_CONCURRENCY, async (domain) => {
|
|
447
|
+
try {
|
|
448
|
+
await this.updateSslProvisioningStatus(domain);
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
// one unreachable domain must not end the sweep for the rest.
|
|
452
|
+
logger.error(err, {
|
|
453
|
+
fullDomain: domain.fullDomain,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
});
|
|
293
457
|
}
|
|
294
458
|
async isSSLProvisioned(fulldomain, token) {
|
|
295
459
|
try {
|
|
@@ -340,7 +504,16 @@ export class Service extends DatabaseService {
|
|
|
340
504
|
});
|
|
341
505
|
}
|
|
342
506
|
}
|
|
343
|
-
async isCnameValid(fullDomain) {
|
|
507
|
+
async isCnameValid(fullDomain, options) {
|
|
508
|
+
const recordResult = async (cnameStatus) => {
|
|
509
|
+
if ((options === null || options === void 0 ? void 0 : options.recordResult) === false) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
await this.updateCnameStatusForDashboardDomain({
|
|
513
|
+
domain: fullDomain,
|
|
514
|
+
cnameStatus: cnameStatus,
|
|
515
|
+
});
|
|
516
|
+
};
|
|
344
517
|
try {
|
|
345
518
|
logger.debug("Checking for CNAME " + fullDomain, {
|
|
346
519
|
fullDomain,
|
|
@@ -375,10 +548,7 @@ export class Service extends DatabaseService {
|
|
|
375
548
|
});
|
|
376
549
|
logger.debug(result, { fullDomain });
|
|
377
550
|
if (result.isSuccess()) {
|
|
378
|
-
await
|
|
379
|
-
domain: fullDomain,
|
|
380
|
-
cnameStatus: true,
|
|
381
|
-
});
|
|
551
|
+
await recordResult(true);
|
|
382
552
|
return true;
|
|
383
553
|
}
|
|
384
554
|
}
|
|
@@ -401,10 +571,7 @@ export class Service extends DatabaseService {
|
|
|
401
571
|
});
|
|
402
572
|
logger.debug(resultHttps, { fullDomain });
|
|
403
573
|
if (resultHttps.isSuccess()) {
|
|
404
|
-
await
|
|
405
|
-
domain: fullDomain,
|
|
406
|
-
cnameStatus: true,
|
|
407
|
-
});
|
|
574
|
+
await recordResult(true);
|
|
408
575
|
return true;
|
|
409
576
|
}
|
|
410
577
|
}
|
|
@@ -425,20 +592,14 @@ export class Service extends DatabaseService {
|
|
|
425
592
|
}
|
|
426
593
|
if (!cnameRecord) {
|
|
427
594
|
logger.debug(`No CNAME record found for ${fullDomain}. Expected record: ${DashboardCNameRecord}`, { fullDomain });
|
|
428
|
-
await
|
|
429
|
-
domain: fullDomain,
|
|
430
|
-
cnameStatus: false,
|
|
431
|
-
});
|
|
595
|
+
await recordResult(false);
|
|
432
596
|
return false;
|
|
433
597
|
}
|
|
434
598
|
if (cnameRecord &&
|
|
435
599
|
cnameRecord.trim().toLocaleLowerCase() ===
|
|
436
600
|
DashboardCNameRecord.trim().toLocaleLowerCase()) {
|
|
437
601
|
logger.debug(`CNAME record for ${fullDomain} matches the expected record: ${DashboardCNameRecord}`, { fullDomain });
|
|
438
|
-
await
|
|
439
|
-
domain: fullDomain,
|
|
440
|
-
cnameStatus: true,
|
|
441
|
-
});
|
|
602
|
+
await recordResult(true);
|
|
442
603
|
return true;
|
|
443
604
|
}
|
|
444
605
|
logger.debug(`CNAME record for ${fullDomain} is ${cnameRecord} and it does not match the expected record: ${DashboardCNameRecord}`, { fullDomain });
|
|
@@ -450,22 +611,30 @@ export class Service extends DatabaseService {
|
|
|
450
611
|
});
|
|
451
612
|
logger.debug(err, { fullDomain });
|
|
452
613
|
}
|
|
453
|
-
await
|
|
454
|
-
domain: fullDomain,
|
|
455
|
-
cnameStatus: false,
|
|
456
|
-
});
|
|
614
|
+
await recordResult(false);
|
|
457
615
|
return false;
|
|
458
616
|
}
|
|
459
617
|
catch (err) {
|
|
460
618
|
logger.debug("Failed checking for CNAME " + fullDomain);
|
|
461
619
|
logger.debug(err);
|
|
462
|
-
await
|
|
463
|
-
domain: fullDomain,
|
|
464
|
-
cnameStatus: false,
|
|
465
|
-
});
|
|
620
|
+
await recordResult(false);
|
|
466
621
|
return false;
|
|
467
622
|
}
|
|
468
623
|
}
|
|
624
|
+
/*
|
|
625
|
+
* Record whether this domain's certificate is being served yet.
|
|
626
|
+
*
|
|
627
|
+
* Unlike the status page sweep this never orders a certificate. A probe
|
|
628
|
+
* that fails right after an order is usually racing nginx, which writes
|
|
629
|
+
* new certificates to disk every 15 minutes, and re-ordering then spends a
|
|
630
|
+
* second order on the same name. The two cases that do need an order have
|
|
631
|
+
* capped sweeps of their own: checkOrderStatus re-orders a certificate that
|
|
632
|
+
* has gone missing, and the renewal run renews one that is about to expire.
|
|
633
|
+
*
|
|
634
|
+
* When the probe fails the CNAME is checked again, so a domain whose record
|
|
635
|
+
* was removed goes back to asking for it. The result is written only when
|
|
636
|
+
* it changes: this sweep visits every ordered domain every 15 minutes.
|
|
637
|
+
*/
|
|
469
638
|
async updateSslProvisioningStatus(domain) {
|
|
470
639
|
var _a;
|
|
471
640
|
if (!domain.id) {
|
|
@@ -479,6 +648,7 @@ export class Service extends DatabaseService {
|
|
|
479
648
|
_id: true,
|
|
480
649
|
fullDomain: true,
|
|
481
650
|
cnameVerificationToken: true,
|
|
651
|
+
isSslProvisioned: true,
|
|
482
652
|
},
|
|
483
653
|
props: {
|
|
484
654
|
isRoot: true,
|
|
@@ -487,36 +657,17 @@ export class Service extends DatabaseService {
|
|
|
487
657
|
if (!dashboardDomain) {
|
|
488
658
|
throw new BadDataException("DomainModel not found");
|
|
489
659
|
}
|
|
490
|
-
logger.debug(`DashboardCerts:
|
|
491
|
-
const
|
|
492
|
-
if (!
|
|
493
|
-
|
|
494
|
-
await this.
|
|
495
|
-
id: dashboardDomain.id,
|
|
496
|
-
data: {
|
|
497
|
-
isSslProvisioned: false,
|
|
498
|
-
},
|
|
499
|
-
props: {
|
|
500
|
-
isRoot: true,
|
|
501
|
-
},
|
|
502
|
-
});
|
|
503
|
-
if (isCnameValid) {
|
|
504
|
-
try {
|
|
505
|
-
await this.orderCert(dashboardDomain);
|
|
506
|
-
}
|
|
507
|
-
catch (err) {
|
|
508
|
-
logger.error("Cannot order cert for domain: " + dashboardDomain.fullDomain, { fullDomain: dashboardDomain.fullDomain });
|
|
509
|
-
logger.error(err, {
|
|
510
|
-
fullDomain: dashboardDomain.fullDomain,
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
}
|
|
660
|
+
logger.debug(`DashboardCerts:CheckSslProvisioningStatus - Checking ${dashboardDomain.fullDomain}`, { fullDomain: dashboardDomain.fullDomain });
|
|
661
|
+
const isProvisioned = await this.isSSLProvisioned(dashboardDomain.fullDomain, dashboardDomain.cnameVerificationToken);
|
|
662
|
+
if (!isProvisioned) {
|
|
663
|
+
// isCnameValid also records the result on the domain.
|
|
664
|
+
await this.isCnameValid(dashboardDomain.fullDomain);
|
|
514
665
|
}
|
|
515
|
-
|
|
666
|
+
if (Boolean(dashboardDomain.isSslProvisioned) !== isProvisioned) {
|
|
516
667
|
await this.updateOneById({
|
|
517
668
|
id: dashboardDomain.id,
|
|
518
669
|
data: {
|
|
519
|
-
isSslProvisioned:
|
|
670
|
+
isSslProvisioned: isProvisioned,
|
|
520
671
|
},
|
|
521
672
|
props: {
|
|
522
673
|
isRoot: true,
|
|
@@ -524,40 +675,74 @@ export class Service extends DatabaseService {
|
|
|
524
675
|
});
|
|
525
676
|
}
|
|
526
677
|
}
|
|
678
|
+
/*
|
|
679
|
+
* Order the first certificate of each of these domains, whose CNAME is
|
|
680
|
+
* verified: at most ORDER_MAX_PER_RUN orders in a window between the
|
|
681
|
+
* sweeps that order, picked afresh every run; a domain that has a
|
|
682
|
+
* certificate already is only recorded as ordered, and one whose orders
|
|
683
|
+
* keep failing waits longer after each failure
|
|
684
|
+
* (CustomDomainOrders.orderForVerifiedDomainsWithoutOne, which the status
|
|
685
|
+
* page sweeps share).
|
|
686
|
+
*/
|
|
687
|
+
async orderCertsForVerifiedDomainsWithoutOne(domains, options) {
|
|
688
|
+
await CustomDomainOrders.orderForVerifiedDomainsWithoutOne({
|
|
689
|
+
domains: domains,
|
|
690
|
+
maxPerRun: Service.ORDER_MAX_PER_RUN,
|
|
691
|
+
recordAsOrdered: async (domainIds) => {
|
|
692
|
+
await this.recordCertificatesAsOrdered(domainIds);
|
|
693
|
+
},
|
|
694
|
+
orderIfMissing: async (domain) => {
|
|
695
|
+
return await this.orderCertIfMissing(domain, {
|
|
696
|
+
fromSweep: true,
|
|
697
|
+
cnameVerifiedJustNow: options === null || options === void 0 ? void 0 : options.cnameVerifiedJustNow,
|
|
698
|
+
});
|
|
699
|
+
},
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
/*
|
|
703
|
+
* Order the first certificate for domains whose CNAME is verified.
|
|
704
|
+
*
|
|
705
|
+
* Only verified domains: verifyCnameWhoseCnameisNotVerified checks the
|
|
706
|
+
* rest - and orders each one's certificate the moment it is verified, so
|
|
707
|
+
* this sweep is the fallback for the rest - and ordering one whose record
|
|
708
|
+
* is not in place would only fail the CNAME check again.
|
|
709
|
+
*
|
|
710
|
+
* A domain that already has a certificate is only recorded as ordered -
|
|
711
|
+
* all of them in one write. That is the domain whose CNAME check failed
|
|
712
|
+
* for a moment - which marks it unordered - and then passed again.
|
|
713
|
+
* Ordering for it would spend an order on a duplicate (Let's Encrypt
|
|
714
|
+
* allows five a week per name), and if its certificate is due, the renewal
|
|
715
|
+
* run orders it in this same tick. The rest are ordered through
|
|
716
|
+
* orderCertIfMissing, at most ORDER_MAX_PER_RUN in a window between the
|
|
717
|
+
* sweeps that order, picked afresh every run
|
|
718
|
+
* (GreenlockUtil.pickForThisRun), so a domain whose order keeps failing
|
|
719
|
+
* cannot hold a slot the others are waiting for; it also waits longer
|
|
720
|
+
* after each failure in a row (CertificateOrderFailures).
|
|
721
|
+
*/
|
|
527
722
|
async orderSSLForDomainsWhichAreNotOrderedYet() {
|
|
528
723
|
return Telemetry.startActiveSpan({
|
|
529
724
|
name: "DashboardDomainService.orderSSLForDomainsWhichAreNotOrderedYet",
|
|
530
725
|
options: { attributes: {} },
|
|
531
726
|
fn: async (span) => {
|
|
532
727
|
try {
|
|
533
|
-
const domains = await this.
|
|
728
|
+
const domains = await this.findAllBy({
|
|
534
729
|
query: {
|
|
730
|
+
isCnameVerified: true,
|
|
535
731
|
isSslOrdered: false,
|
|
536
732
|
isCustomCertificate: false,
|
|
537
733
|
},
|
|
538
734
|
select: {
|
|
539
735
|
_id: true,
|
|
540
736
|
fullDomain: true,
|
|
737
|
+
isSslOrdered: true,
|
|
738
|
+
isCustomCertificate: true,
|
|
541
739
|
},
|
|
542
|
-
limit: LIMIT_MAX,
|
|
543
740
|
skip: 0,
|
|
544
741
|
props: {
|
|
545
742
|
isRoot: true,
|
|
546
743
|
},
|
|
547
744
|
});
|
|
548
|
-
|
|
549
|
-
try {
|
|
550
|
-
logger.debug("Ordering SSL for domain: " + domain.fullDomain, {
|
|
551
|
-
fullDomain: domain.fullDomain,
|
|
552
|
-
});
|
|
553
|
-
await this.orderCert(domain);
|
|
554
|
-
}
|
|
555
|
-
catch (e) {
|
|
556
|
-
logger.error(e, {
|
|
557
|
-
fullDomain: domain.fullDomain,
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
}
|
|
745
|
+
await this.orderCertsForVerifiedDomainsWithoutOne(domains);
|
|
561
746
|
Telemetry.endSpan(span);
|
|
562
747
|
}
|
|
563
748
|
catch (err) {
|
|
@@ -570,6 +755,15 @@ export class Service extends DatabaseService {
|
|
|
570
755
|
},
|
|
571
756
|
});
|
|
572
757
|
}
|
|
758
|
+
/*
|
|
759
|
+
* Check every domain whose CNAME is not verified yet, at most
|
|
760
|
+
* DOMAIN_CHECK_CONCURRENCY at a time, and order the certificate of each
|
|
761
|
+
* one that is verified now straight away rather than at the next run of
|
|
762
|
+
* the order sweep - as the status page sweep does. So a domain is served
|
|
763
|
+
* on its own certificate within about 15 minutes of its record going live
|
|
764
|
+
* - nginx writes new certificates every 15 minutes - whether or not
|
|
765
|
+
* anyone clicked Check now.
|
|
766
|
+
*/
|
|
573
767
|
async verifyCnameWhoseCnameisNotVerified() {
|
|
574
768
|
const domains = await this.findBy({
|
|
575
769
|
query: {
|
|
@@ -578,6 +772,8 @@ export class Service extends DatabaseService {
|
|
|
578
772
|
select: {
|
|
579
773
|
_id: true,
|
|
580
774
|
fullDomain: true,
|
|
775
|
+
isCustomCertificate: true,
|
|
776
|
+
isSslOrdered: true,
|
|
581
777
|
},
|
|
582
778
|
limit: LIMIT_MAX,
|
|
583
779
|
skip: 0,
|
|
@@ -585,19 +781,84 @@ export class Service extends DatabaseService {
|
|
|
585
781
|
isRoot: true,
|
|
586
782
|
},
|
|
587
783
|
});
|
|
588
|
-
|
|
784
|
+
const verifiedNow = [];
|
|
785
|
+
await ArrayUtil.forEachWithConcurrency(domains, Service.DOMAIN_CHECK_CONCURRENCY, async (domain) => {
|
|
589
786
|
try {
|
|
590
|
-
|
|
787
|
+
// isCnameValid also records the result on the domain.
|
|
788
|
+
const isVerified = await this.isCnameValid(domain.fullDomain);
|
|
789
|
+
if (isVerified && !domain.isCustomCertificate) {
|
|
790
|
+
verifiedNow.push(domain);
|
|
791
|
+
}
|
|
591
792
|
}
|
|
592
793
|
catch (e) {
|
|
593
794
|
logger.error(e, { fullDomain: domain.fullDomain });
|
|
594
795
|
}
|
|
796
|
+
});
|
|
797
|
+
try {
|
|
798
|
+
/*
|
|
799
|
+
* Each was verified by this run a moment ago, so the orders do not
|
|
800
|
+
* check the CNAME again.
|
|
801
|
+
*/
|
|
802
|
+
await this.orderCertsForVerifiedDomainsWithoutOne(verifiedNow, {
|
|
803
|
+
cnameVerifiedJustNow: true,
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
catch (e) {
|
|
807
|
+
// The order sweep orders them on its next run.
|
|
808
|
+
logger.error(e);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/*
|
|
812
|
+
* Which of these certificate domains are dashboard domains. The renewal
|
|
813
|
+
* run renews - and removes - only the certificates this returns, so the
|
|
814
|
+
* certificates of status page domains and of the primary host, which share
|
|
815
|
+
* the AcmeCertificate table, are never mistaken for dashboard domains
|
|
816
|
+
* whose CNAME stopped validating.
|
|
817
|
+
*
|
|
818
|
+
* A domain serving a certificate its owner uploaded still claims its
|
|
819
|
+
* Let's Encrypt certificate, which stays renewed meanwhile: nginx serves
|
|
820
|
+
* the uploaded one for that name (AcmeWriteCertificates leaves it alone),
|
|
821
|
+
* and switching back is then instant, on every nginx replica, including
|
|
822
|
+
* ones that start with an empty certificate directory.
|
|
823
|
+
*/
|
|
824
|
+
async getOwnedDomains(domains) {
|
|
825
|
+
if (domains.length === 0) {
|
|
826
|
+
return [];
|
|
595
827
|
}
|
|
828
|
+
const dashboardDomains = await this.findBy({
|
|
829
|
+
query: {
|
|
830
|
+
fullDomain: QueryHelper.any(domains),
|
|
831
|
+
},
|
|
832
|
+
select: {
|
|
833
|
+
fullDomain: true,
|
|
834
|
+
},
|
|
835
|
+
limit: LIMIT_MAX,
|
|
836
|
+
skip: 0,
|
|
837
|
+
props: {
|
|
838
|
+
isRoot: true,
|
|
839
|
+
},
|
|
840
|
+
});
|
|
841
|
+
return dashboardDomains
|
|
842
|
+
.map((dashboardDomain) => {
|
|
843
|
+
return dashboardDomain.fullDomain || "";
|
|
844
|
+
})
|
|
845
|
+
.filter((fullDomain) => {
|
|
846
|
+
return fullDomain.length > 0;
|
|
847
|
+
});
|
|
596
848
|
}
|
|
597
849
|
async renewCertsWhichAreExpiringSoon() {
|
|
598
850
|
await GreenlockUtil.renewAllCertsWhichAreExpiringSoon({
|
|
851
|
+
maxPerRun: Service.ORDER_MAX_PER_RUN,
|
|
852
|
+
getOwnedDomains: async (domains) => {
|
|
853
|
+
return await this.getOwnedDomains(domains);
|
|
854
|
+
},
|
|
855
|
+
/*
|
|
856
|
+
* A check that writes nothing: a DNS blip while a certificate is
|
|
857
|
+
* renewed must not mark the domain unverified and unordered while its
|
|
858
|
+
* certificate keeps serving.
|
|
859
|
+
*/
|
|
599
860
|
validateCname: async (fullDomain) => {
|
|
600
|
-
return await this.isCnameValid(fullDomain);
|
|
861
|
+
return await this.isCnameValid(fullDomain, { recordResult: false });
|
|
601
862
|
},
|
|
602
863
|
notifyDomainRemoved: async (domain) => {
|
|
603
864
|
await this.updateOneBy({
|
|
@@ -618,8 +879,21 @@ export class Service extends DatabaseService {
|
|
|
618
879
|
},
|
|
619
880
|
});
|
|
620
881
|
}
|
|
882
|
+
/*
|
|
883
|
+
* Re-order the certificate of a domain that says it has one ordered but
|
|
884
|
+
* whose certificate is gone, at most ORDER_MAX_PER_RUN per run.
|
|
885
|
+
*
|
|
886
|
+
* This is how dashboard domains recover from the status page renewal job,
|
|
887
|
+
* which until it learned to check ownership deleted every dashboard
|
|
888
|
+
* certificate that came due for renewal while the domain kept saying
|
|
889
|
+
* "ordered" - nginx then served the stale copy on disk until it expired.
|
|
890
|
+
* Domains are picked afresh every run, for the same reason as in the
|
|
891
|
+
* first-order sweep above, and re-ordered through orderCertIfMissing, so a
|
|
892
|
+
* re-order never races another order for the same name and shares the
|
|
893
|
+
* sweeps' budget.
|
|
894
|
+
*/
|
|
621
895
|
async checkOrderStatus() {
|
|
622
|
-
const domains = await this.
|
|
896
|
+
const domains = await this.findAllBy({
|
|
623
897
|
query: {
|
|
624
898
|
isSslOrdered: true,
|
|
625
899
|
isCustomCertificate: false,
|
|
@@ -627,43 +901,83 @@ export class Service extends DatabaseService {
|
|
|
627
901
|
select: {
|
|
628
902
|
_id: true,
|
|
629
903
|
fullDomain: true,
|
|
630
|
-
|
|
904
|
+
isCustomCertificate: true,
|
|
631
905
|
},
|
|
632
|
-
limit: LIMIT_MAX,
|
|
633
906
|
skip: 0,
|
|
634
907
|
props: {
|
|
635
908
|
isRoot: true,
|
|
636
909
|
},
|
|
637
910
|
});
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
911
|
+
const fullDomains = domains
|
|
912
|
+
.map((domain) => {
|
|
913
|
+
return domain.fullDomain || "";
|
|
914
|
+
})
|
|
915
|
+
.filter((fullDomain) => {
|
|
916
|
+
return fullDomain.length > 0;
|
|
917
|
+
});
|
|
918
|
+
if (fullDomains.length === 0) {
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
const certificates = await GreenlockUtil.findCertificatesByDomain(fullDomains.map((fullDomain) => {
|
|
922
|
+
return CertificateOrder.normalizeDomain(fullDomain);
|
|
923
|
+
}));
|
|
924
|
+
const now = OneUptimeDate.getCurrentDate();
|
|
925
|
+
const domainsWithoutCertificate = await CertificateOrderFailures.withoutThoseWaitingToRetry({
|
|
926
|
+
items: domains.filter((domain) => {
|
|
927
|
+
return (Boolean(domain.id) &&
|
|
928
|
+
Boolean(domain.fullDomain) &&
|
|
929
|
+
!certificates.has(CertificateOrder.normalizeDomain(domain.fullDomain)));
|
|
930
|
+
}),
|
|
931
|
+
getDomain: (domain) => {
|
|
932
|
+
return domain.fullDomain;
|
|
933
|
+
},
|
|
934
|
+
now: now,
|
|
935
|
+
});
|
|
936
|
+
const batch = GreenlockUtil.pickForThisRun({
|
|
937
|
+
items: domainsWithoutCertificate,
|
|
938
|
+
max: Service.ORDER_MAX_PER_RUN,
|
|
939
|
+
now: now,
|
|
940
|
+
getKey: (domain) => {
|
|
941
|
+
return domain.fullDomain || "";
|
|
942
|
+
},
|
|
943
|
+
});
|
|
944
|
+
for (const domain of batch) {
|
|
945
|
+
try {
|
|
946
|
+
await this.orderCertIfMissing(domain, { fromSweep: true });
|
|
641
947
|
}
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
_id: true,
|
|
648
|
-
},
|
|
649
|
-
props: {
|
|
650
|
-
isRoot: true,
|
|
651
|
-
},
|
|
652
|
-
});
|
|
653
|
-
if (!acmeCert) {
|
|
654
|
-
try {
|
|
655
|
-
await this.orderCert(domain);
|
|
656
|
-
}
|
|
657
|
-
catch (err) {
|
|
658
|
-
logger.error("Cannot order cert for domain: " + domain.fullDomain, {
|
|
659
|
-
fullDomain: domain.fullDomain,
|
|
660
|
-
});
|
|
661
|
-
logger.error(err, { fullDomain: domain.fullDomain });
|
|
662
|
-
}
|
|
948
|
+
catch (err) {
|
|
949
|
+
logger.error("Cannot order cert for domain: " + domain.fullDomain, {
|
|
950
|
+
fullDomain: domain.fullDomain,
|
|
951
|
+
});
|
|
952
|
+
logger.error(err, { fullDomain: domain.fullDomain });
|
|
663
953
|
}
|
|
664
954
|
}
|
|
665
955
|
}
|
|
666
956
|
}
|
|
957
|
+
/*
|
|
958
|
+
* How many certificates the dashboard sweeps may order: the first orders
|
|
959
|
+
* and the re-orders of a certificate that has gone missing together, in
|
|
960
|
+
* one 15-minute window (SWEEP_ORDER_BUDGET, CertificateOrder.takeOrderSlot)
|
|
961
|
+
* - and, separately, how many the dashboard renewal run renews per run.
|
|
962
|
+
*
|
|
963
|
+
* Every order spends from the one Let's Encrypt account the whole
|
|
964
|
+
* installation shares - 300 new orders per account per three hours - and
|
|
965
|
+
* status page certificates, the larger fleet, are ordered and renewed from
|
|
966
|
+
* it too. These caps keep a backlog - such as the first runs re-ordering
|
|
967
|
+
* every dashboard certificate the status page renewal job used to delete -
|
|
968
|
+
* worked off a few domains per run rather than in one burst, and none of
|
|
969
|
+
* them can order beyond the installation's own budget for that account
|
|
970
|
+
* (CertificateOrderBudget), which every order of every kind draws from.
|
|
971
|
+
*/
|
|
972
|
+
Service.ORDER_MAX_PER_RUN = 5;
|
|
973
|
+
// The budget the dashboard ordering sweeps share (CertificateOrder.takeOrderSlot).
|
|
974
|
+
Service.SWEEP_ORDER_BUDGET = "DashboardDomainSweeps";
|
|
975
|
+
/*
|
|
976
|
+
* How many domains the verification and provisioning sweeps check at once.
|
|
977
|
+
* Each check is a bounded request out to a customer domain; the same
|
|
978
|
+
* figure the status page provisioning sweep uses.
|
|
979
|
+
*/
|
|
980
|
+
Service.DOMAIN_CHECK_CONCURRENCY = 10;
|
|
667
981
|
__decorate([
|
|
668
982
|
CaptureSpan(),
|
|
669
983
|
__metadata("design:type", Function),
|
|
@@ -697,9 +1011,27 @@ __decorate([
|
|
|
697
1011
|
__decorate([
|
|
698
1012
|
CaptureSpan(),
|
|
699
1013
|
__metadata("design:type", Function),
|
|
700
|
-
__metadata("design:paramtypes", [DashboardDomain]),
|
|
1014
|
+
__metadata("design:paramtypes", [DashboardDomain, Object]),
|
|
701
1015
|
__metadata("design:returntype", Promise)
|
|
702
1016
|
], Service.prototype, "orderCert", null);
|
|
1017
|
+
__decorate([
|
|
1018
|
+
CaptureSpan(),
|
|
1019
|
+
__metadata("design:type", Function),
|
|
1020
|
+
__metadata("design:paramtypes", [DashboardDomain, Object]),
|
|
1021
|
+
__metadata("design:returntype", Promise)
|
|
1022
|
+
], Service.prototype, "orderCertIfMissing", null);
|
|
1023
|
+
__decorate([
|
|
1024
|
+
CaptureSpan(),
|
|
1025
|
+
__metadata("design:type", Function),
|
|
1026
|
+
__metadata("design:paramtypes", [DashboardDomain, Object]),
|
|
1027
|
+
__metadata("design:returntype", Promise)
|
|
1028
|
+
], Service.prototype, "orderCertOnceCnameIsVerified", null);
|
|
1029
|
+
__decorate([
|
|
1030
|
+
CaptureSpan(),
|
|
1031
|
+
__metadata("design:type", Function),
|
|
1032
|
+
__metadata("design:paramtypes", [Array]),
|
|
1033
|
+
__metadata("design:returntype", Promise)
|
|
1034
|
+
], Service.prototype, "getCertificates", null);
|
|
703
1035
|
__decorate([
|
|
704
1036
|
CaptureSpan(),
|
|
705
1037
|
__metadata("design:type", Function),
|
|
@@ -721,7 +1053,7 @@ __decorate([
|
|
|
721
1053
|
__decorate([
|
|
722
1054
|
CaptureSpan(),
|
|
723
1055
|
__metadata("design:type", Function),
|
|
724
|
-
__metadata("design:paramtypes", [String]),
|
|
1056
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
725
1057
|
__metadata("design:returntype", Promise)
|
|
726
1058
|
], Service.prototype, "isCnameValid", null);
|
|
727
1059
|
__decorate([
|
|
@@ -742,6 +1074,12 @@ __decorate([
|
|
|
742
1074
|
__metadata("design:paramtypes", []),
|
|
743
1075
|
__metadata("design:returntype", Promise)
|
|
744
1076
|
], Service.prototype, "verifyCnameWhoseCnameisNotVerified", null);
|
|
1077
|
+
__decorate([
|
|
1078
|
+
CaptureSpan(),
|
|
1079
|
+
__metadata("design:type", Function),
|
|
1080
|
+
__metadata("design:paramtypes", [Array]),
|
|
1081
|
+
__metadata("design:returntype", Promise)
|
|
1082
|
+
], Service.prototype, "getOwnedDomains", null);
|
|
745
1083
|
__decorate([
|
|
746
1084
|
CaptureSpan(),
|
|
747
1085
|
__metadata("design:type", Function),
|