@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,7 +20,6 @@ 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 StatusPageDomain from "../../Models/DatabaseModels/StatusPageDomain";
|
|
18
|
-
import AcmeCertificateService from "./AcmeCertificateService";
|
|
19
23
|
import Telemetry from "../Utils/Telemetry";
|
|
20
24
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
21
25
|
import { StatusPageCNameRecord } from "../EnvironmentConfig";
|
|
@@ -23,7 +27,6 @@ import Domain from "../Types/Domain";
|
|
|
23
27
|
import ArrayUtil from "../../Utils/Array";
|
|
24
28
|
import OneUptimeDate from "../../Types/Date";
|
|
25
29
|
import CertificateReissueUtil from "../../Utils/CertificateReissue";
|
|
26
|
-
import TooManyRequestsException from "../../Types/Exception/TooManyRequestsException";
|
|
27
30
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
28
31
|
const STATUS_PAGE_DOMAIN_EGRESS_LABEL = "Status page domain";
|
|
29
32
|
export class Service extends DatabaseService {
|
|
@@ -117,7 +120,48 @@ export class Service extends DatabaseService {
|
|
|
117
120
|
async removeDomainFromGreenlock(domain) {
|
|
118
121
|
await GreenlockUtil.removeDomain(domain);
|
|
119
122
|
}
|
|
120
|
-
|
|
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(statusPageDomain) {
|
|
128
|
+
if (!statusPageDomain.id) {
|
|
129
|
+
throw new BadDataException("Domain ID is required to order a certificate");
|
|
130
|
+
}
|
|
131
|
+
if (statusPageDomain.fullDomain &&
|
|
132
|
+
statusPageDomain.isCustomCertificate !== undefined) {
|
|
133
|
+
return statusPageDomain;
|
|
134
|
+
}
|
|
135
|
+
const fetchedStatusPageDomain = await this.findOneBy({
|
|
136
|
+
query: {
|
|
137
|
+
_id: statusPageDomain.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 (!fetchedStatusPageDomain) {
|
|
150
|
+
throw new BadDataException("DomainModel not found");
|
|
151
|
+
}
|
|
152
|
+
if (!fetchedStatusPageDomain.fullDomain) {
|
|
153
|
+
throw new BadDataException("Unable to order certificate because domain is null");
|
|
154
|
+
}
|
|
155
|
+
return fetchedStatusPageDomain;
|
|
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.
|
|
163
|
+
*/
|
|
164
|
+
async orderCert(statusPageDomain, options) {
|
|
121
165
|
var _a;
|
|
122
166
|
return Telemetry.startActiveSpan({
|
|
123
167
|
name: "StatusPageDomainService.orderCert",
|
|
@@ -129,46 +173,44 @@ export class Service extends DatabaseService {
|
|
|
129
173
|
},
|
|
130
174
|
fn: async (span) => {
|
|
131
175
|
try {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
176
|
+
const domainToOrder = await this.getDomainToOrder(statusPageDomain);
|
|
177
|
+
logger.debug("Ordering SSL for domain: " + domainToOrder.fullDomain, {
|
|
178
|
+
fullDomain: domainToOrder.fullDomain,
|
|
179
|
+
});
|
|
180
|
+
const outcome = await GreenlockUtil.orderCert({
|
|
181
|
+
domain: domainToOrder.fullDomain,
|
|
182
|
+
reason: (options === null || options === void 0 ? void 0 : options.reason) || CertificateOrderReason.FirstCertificate,
|
|
183
|
+
validateCname: (options === null || options === void 0 ? void 0 : options.cnameVerifiedJustNow)
|
|
184
|
+
? null
|
|
185
|
+
: async (fullDomain) => {
|
|
186
|
+
return await this.isCnameValid(fullDomain);
|
|
136
187
|
},
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
188
|
+
lock: options === null || options === void 0 ? void 0 : options.lock,
|
|
189
|
+
mayOrder: options === null || options === void 0 ? void 0 : options.mayOrder,
|
|
190
|
+
});
|
|
191
|
+
if (outcome === CertificateOrderOutcome.Ordered) {
|
|
192
|
+
logger.debug("SSL ordered for domain: " + domainToOrder.fullDomain, { fullDomain: domainToOrder.fullDomain });
|
|
193
|
+
/*
|
|
194
|
+
* Verified as well as ordered: Let's Encrypt has just fetched
|
|
195
|
+
* its challenge from this domain, so the domain reaches us. A
|
|
196
|
+
* CNAME sweep that saw a DNS blip while the order ran - and
|
|
197
|
+
* marked the domain unverified and unordered - would otherwise
|
|
198
|
+
* leave it "ordered" but "waiting for DNS", with a certificate
|
|
199
|
+
* the dialog had just called verified.
|
|
200
|
+
*/
|
|
201
|
+
await this.updateOneById({
|
|
202
|
+
id: domainToOrder.id,
|
|
203
|
+
data: {
|
|
204
|
+
isCnameVerified: true,
|
|
205
|
+
isSslOrdered: true,
|
|
140
206
|
},
|
|
141
207
|
props: {
|
|
142
208
|
isRoot: true,
|
|
143
209
|
},
|
|
144
210
|
});
|
|
145
|
-
if (!fetchedStatusPageDomain) {
|
|
146
|
-
throw new BadDataException("DomainModel not found");
|
|
147
|
-
}
|
|
148
|
-
statusPageDomain = fetchedStatusPageDomain;
|
|
149
|
-
}
|
|
150
|
-
if (!statusPageDomain.fullDomain) {
|
|
151
|
-
throw new BadDataException("Unable to order certificate because domain is null");
|
|
152
211
|
}
|
|
153
|
-
logger.debug("Ordering SSL for domain: " + statusPageDomain.fullDomain, { fullDomain: statusPageDomain.fullDomain });
|
|
154
|
-
await GreenlockUtil.orderCert({
|
|
155
|
-
domain: statusPageDomain.fullDomain,
|
|
156
|
-
validateCname: async (fullDomain) => {
|
|
157
|
-
return await this.isCnameValid(fullDomain);
|
|
158
|
-
},
|
|
159
|
-
});
|
|
160
|
-
logger.debug("SSL ordered for domain: " + statusPageDomain.fullDomain, { fullDomain: statusPageDomain.fullDomain });
|
|
161
|
-
// update the order.
|
|
162
|
-
await this.updateOneById({
|
|
163
|
-
id: statusPageDomain.id,
|
|
164
|
-
data: {
|
|
165
|
-
isSslOrdered: true,
|
|
166
|
-
},
|
|
167
|
-
props: {
|
|
168
|
-
isRoot: true,
|
|
169
|
-
},
|
|
170
|
-
});
|
|
171
212
|
Telemetry.endSpan(span);
|
|
213
|
+
return outcome;
|
|
172
214
|
}
|
|
173
215
|
catch (err) {
|
|
174
216
|
Telemetry.recordExceptionMarkSpanAsErrorAndEndSpan({
|
|
@@ -180,6 +222,36 @@ export class Service extends DatabaseService {
|
|
|
180
222
|
},
|
|
181
223
|
});
|
|
182
224
|
}
|
|
225
|
+
/*
|
|
226
|
+
* Records these domains as ordered: they have a certificate, ordered
|
|
227
|
+
* before, so nothing is ordered. One write for all of them, and only on
|
|
228
|
+
* domains that are still verified - a CNAME check that failed meanwhile
|
|
229
|
+
* marked a domain unverified and unordered, and marking it ordered again
|
|
230
|
+
* would leave it ordered but "waiting for DNS". The next CNAME check that
|
|
231
|
+
* passes records it again.
|
|
232
|
+
*/
|
|
233
|
+
async recordCertificatesAsOrdered(domainIds) {
|
|
234
|
+
if (domainIds.length === 0) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
await this.updateBy({
|
|
238
|
+
query: {
|
|
239
|
+
_id: QueryHelper.any(domainIds.map((id) => {
|
|
240
|
+
return id.toString();
|
|
241
|
+
})),
|
|
242
|
+
isCnameVerified: true,
|
|
243
|
+
isSslOrdered: false,
|
|
244
|
+
},
|
|
245
|
+
data: {
|
|
246
|
+
isSslOrdered: true,
|
|
247
|
+
},
|
|
248
|
+
limit: LIMIT_MAX,
|
|
249
|
+
skip: 0,
|
|
250
|
+
props: {
|
|
251
|
+
isRoot: true,
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
}
|
|
183
255
|
/*
|
|
184
256
|
* Reissue this domain's Let's Encrypt certificate because a customer asked
|
|
185
257
|
* for it, rather than because it is close to expiring.
|
|
@@ -229,50 +301,159 @@ export class Service extends DatabaseService {
|
|
|
229
301
|
throw new BadDataException("CNAME is not verified. Please verify CNAME first before you reissue the SSL certificate.");
|
|
230
302
|
}
|
|
231
303
|
/*
|
|
232
|
-
* A domain that never ordered a certificate has nothing to reissue
|
|
233
|
-
*
|
|
304
|
+
* A domain that never ordered a certificate has nothing to reissue. Its
|
|
305
|
+
* first certificate is ordered on its own once the CNAME is verified, and
|
|
306
|
+
* the dashboard shows Reissue SSL only after that.
|
|
234
307
|
*/
|
|
235
308
|
if (!statusPageDomain.isSslOrdered) {
|
|
236
|
-
throw new BadDataException("No SSL certificate has been ordered for this domain yet.
|
|
309
|
+
throw new BadDataException("No SSL certificate has been ordered for this domain yet. One is ordered automatically once its CNAME record is verified.");
|
|
237
310
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
311
|
+
await CertificateReissueOrder.reissue({
|
|
312
|
+
domain: statusPageDomain.fullDomain,
|
|
313
|
+
now: now,
|
|
314
|
+
lastReissueRequestedAt: statusPageDomain.certificateReissueRequestedAt,
|
|
315
|
+
claimCooldown: async () => {
|
|
316
|
+
/*
|
|
317
|
+
* Claim the cooldown before ordering anything, and claim it by
|
|
318
|
+
* putting the cooldown condition in the WHERE clause rather than in
|
|
319
|
+
* an `if` above the write. Two clicks that arrive together both read
|
|
320
|
+
* a row that is not cooling down; only the write can decide which
|
|
321
|
+
* one of them gets to spend the CA's allowance.
|
|
322
|
+
*/
|
|
323
|
+
return await this.updateOneBy({
|
|
324
|
+
query: {
|
|
325
|
+
_id: domainId.toString(),
|
|
326
|
+
certificateReissueRequestedAt: QueryHelper.lessThanEqualToOrNull(CertificateReissueUtil.getCooldownCutoff(now)),
|
|
327
|
+
},
|
|
328
|
+
data: {
|
|
329
|
+
certificateReissueRequestedAt: now,
|
|
330
|
+
},
|
|
331
|
+
props: {
|
|
332
|
+
isRoot: true,
|
|
333
|
+
},
|
|
334
|
+
});
|
|
255
335
|
},
|
|
256
|
-
|
|
257
|
-
|
|
336
|
+
giveCooldownBack: async () => {
|
|
337
|
+
await this.updateOneBy({
|
|
338
|
+
query: {
|
|
339
|
+
_id: domainId.toString(),
|
|
340
|
+
certificateReissueRequestedAt: now,
|
|
341
|
+
},
|
|
342
|
+
data: {
|
|
343
|
+
certificateReissueRequestedAt: statusPageDomain.certificateReissueRequestedAt || null,
|
|
344
|
+
},
|
|
345
|
+
props: {
|
|
346
|
+
isRoot: true,
|
|
347
|
+
},
|
|
348
|
+
});
|
|
258
349
|
},
|
|
259
|
-
|
|
260
|
-
|
|
350
|
+
order: async (lock) => {
|
|
351
|
+
logger.debug("Reissuing SSL certificate for domain: " +
|
|
352
|
+
statusPageDomain.fullDomain, { fullDomain: statusPageDomain.fullDomain });
|
|
353
|
+
return await this.orderCert(statusPageDomain, {
|
|
354
|
+
reason: CertificateOrderReason.Reissue,
|
|
355
|
+
lock: lock,
|
|
356
|
+
});
|
|
261
357
|
},
|
|
262
358
|
});
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
359
|
+
}
|
|
360
|
+
/*
|
|
361
|
+
* Order this domain's free certificate unless it has one already, or one
|
|
362
|
+
* is being ordered for it right now (CertificateOrder.orderIfMissing): the
|
|
363
|
+
* one way a first certificate is ordered, whether by Check now, by the
|
|
364
|
+
* order sweeps or by the order-ssl API.
|
|
365
|
+
*
|
|
366
|
+
* Never for a domain that serves a certificate its owner uploaded. Throws
|
|
367
|
+
* what the order throws, so a caller can show why.
|
|
368
|
+
*/
|
|
369
|
+
async orderCertIfMissing(statusPageDomain, options) {
|
|
370
|
+
const domainToOrder = await this.getDomainToOrder(statusPageDomain);
|
|
371
|
+
// The sweeps never order for one either: it serves the upload.
|
|
372
|
+
if (domainToOrder.isCustomCertificate) {
|
|
373
|
+
throw new BadDataException("This domain uses a certificate you uploaded, so there is no free SSL certificate to order for it.");
|
|
273
374
|
}
|
|
274
|
-
|
|
275
|
-
await
|
|
375
|
+
const domainId = domainToOrder.id;
|
|
376
|
+
return await CertificateOrder.orderIfMissing({
|
|
377
|
+
domain: domainToOrder.fullDomain,
|
|
378
|
+
renewIfExpired: options === null || options === void 0 ? void 0 : options.renewIfExpired,
|
|
379
|
+
recordAsOrdered: async () => {
|
|
380
|
+
await this.recordCertificatesAsOrdered([domainId]);
|
|
381
|
+
},
|
|
382
|
+
order: async (lock) => {
|
|
383
|
+
var _a;
|
|
384
|
+
return await this.orderCert(domainToOrder, {
|
|
385
|
+
reason: CertificateOrderReason.FirstCertificate,
|
|
386
|
+
lock: lock,
|
|
387
|
+
cnameVerifiedJustNow: options === null || options === void 0 ? void 0 : options.cnameVerifiedJustNow,
|
|
388
|
+
mayOrder: CertificateOrder.getOrderShare({
|
|
389
|
+
sweep: (options === null || options === void 0 ? void 0 : options.fromSweep)
|
|
390
|
+
? {
|
|
391
|
+
budget: Service.SWEEP_ORDER_BUDGET,
|
|
392
|
+
maxPerWindow: Service.ORDER_MAX_PER_RUN,
|
|
393
|
+
}
|
|
394
|
+
: undefined,
|
|
395
|
+
onDemand: (options === null || options === void 0 ? void 0 : options.onDemand)
|
|
396
|
+
? { projectId: (_a = domainToOrder.projectId) === null || _a === void 0 ? void 0 : _a.toString() }
|
|
397
|
+
: undefined,
|
|
398
|
+
}),
|
|
399
|
+
});
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
/*
|
|
404
|
+
* Called by verify-cname once it has found the domain's CNAME record:
|
|
405
|
+
* order the domain's free certificate now rather than at the next run of
|
|
406
|
+
* the order sweep, and say what happens to its certificate next
|
|
407
|
+
* (CustomDomainOrders.orderOnceCnameIsVerified, which dashboard domains
|
|
408
|
+
* share). Never rejects.
|
|
409
|
+
*/
|
|
410
|
+
async orderCertOnceCnameIsVerified(statusPageDomain, options) {
|
|
411
|
+
return await CustomDomainOrders.orderOnceCnameIsVerified({
|
|
412
|
+
domain: statusPageDomain,
|
|
413
|
+
waitInMs: options === null || options === void 0 ? void 0 : options.waitInMs,
|
|
414
|
+
recordAsOrdered: async () => {
|
|
415
|
+
await this.recordCertificatesAsOrdered([statusPageDomain.id]);
|
|
416
|
+
},
|
|
417
|
+
orderIfMissing: async () => {
|
|
418
|
+
return await this.orderCertIfMissing(statusPageDomain, {
|
|
419
|
+
onDemand: true,
|
|
420
|
+
// The route found the record a moment ago.
|
|
421
|
+
cnameVerifiedJustNow: true,
|
|
422
|
+
renewIfExpired: true,
|
|
423
|
+
});
|
|
424
|
+
},
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
/*
|
|
428
|
+
* Order the first certificate of each of these domains, whose CNAME is
|
|
429
|
+
* verified: at most ORDER_MAX_PER_RUN orders, picked afresh every run; a
|
|
430
|
+
* domain that has a certificate already is only recorded as ordered, and
|
|
431
|
+
* one whose orders keep failing waits longer after each failure
|
|
432
|
+
* (CustomDomainOrders.orderForVerifiedDomainsWithoutOne, which the
|
|
433
|
+
* dashboard sweeps share).
|
|
434
|
+
*/
|
|
435
|
+
async orderCertsForVerifiedDomainsWithoutOne(domains, options) {
|
|
436
|
+
await CustomDomainOrders.orderForVerifiedDomainsWithoutOne({
|
|
437
|
+
domains: domains,
|
|
438
|
+
maxPerRun: Service.ORDER_MAX_PER_RUN,
|
|
439
|
+
recordAsOrdered: async (domainIds) => {
|
|
440
|
+
await this.recordCertificatesAsOrdered(domainIds);
|
|
441
|
+
},
|
|
442
|
+
orderIfMissing: async (domain) => {
|
|
443
|
+
return await this.orderCertIfMissing(domain, {
|
|
444
|
+
fromSweep: true,
|
|
445
|
+
cnameVerifiedJustNow: options === null || options === void 0 ? void 0 : options.cnameVerifiedJustNow,
|
|
446
|
+
});
|
|
447
|
+
},
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
/*
|
|
451
|
+
* Where the certificates of these domains stand, for the Custom Domains
|
|
452
|
+
* page's Status column (CustomDomainCertificates): each one's expiry, and
|
|
453
|
+
* its last failed order while no order since has succeeded.
|
|
454
|
+
*/
|
|
455
|
+
async getCertificates(domains) {
|
|
456
|
+
return await CustomDomainOrders.getCertificates(domains);
|
|
276
457
|
}
|
|
277
458
|
async updateSslProvisioningStatusForAllDomains() {
|
|
278
459
|
const domains = await this.findBy({
|
|
@@ -358,7 +539,16 @@ export class Service extends DatabaseService {
|
|
|
358
539
|
});
|
|
359
540
|
}
|
|
360
541
|
}
|
|
361
|
-
async isCnameValid(fullDomain) {
|
|
542
|
+
async isCnameValid(fullDomain, options) {
|
|
543
|
+
const recordResult = async (cnameStatus) => {
|
|
544
|
+
if ((options === null || options === void 0 ? void 0 : options.recordResult) === false) {
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
await this.updateCnameStatusForStatusPageDomain({
|
|
548
|
+
domain: fullDomain,
|
|
549
|
+
cnameStatus: cnameStatus,
|
|
550
|
+
});
|
|
551
|
+
};
|
|
362
552
|
try {
|
|
363
553
|
// get the token from the domain.
|
|
364
554
|
logger.debug("Checking for CNAME " + fullDomain, {
|
|
@@ -394,10 +584,7 @@ export class Service extends DatabaseService {
|
|
|
394
584
|
});
|
|
395
585
|
logger.debug(result, { fullDomain });
|
|
396
586
|
if (result.isSuccess()) {
|
|
397
|
-
await
|
|
398
|
-
domain: fullDomain,
|
|
399
|
-
cnameStatus: true,
|
|
400
|
-
});
|
|
587
|
+
await recordResult(true);
|
|
401
588
|
return true;
|
|
402
589
|
}
|
|
403
590
|
}
|
|
@@ -421,10 +608,7 @@ export class Service extends DatabaseService {
|
|
|
421
608
|
});
|
|
422
609
|
logger.debug(resultHttps, { fullDomain });
|
|
423
610
|
if (resultHttps.isSuccess()) {
|
|
424
|
-
await
|
|
425
|
-
domain: fullDomain,
|
|
426
|
-
cnameStatus: true,
|
|
427
|
-
});
|
|
611
|
+
await recordResult(true);
|
|
428
612
|
return true;
|
|
429
613
|
}
|
|
430
614
|
}
|
|
@@ -446,20 +630,14 @@ export class Service extends DatabaseService {
|
|
|
446
630
|
}
|
|
447
631
|
if (!cnameRecord) {
|
|
448
632
|
logger.debug(`No CNAME record found for ${fullDomain}. Expected record: ${StatusPageCNameRecord}`, { fullDomain });
|
|
449
|
-
await
|
|
450
|
-
domain: fullDomain,
|
|
451
|
-
cnameStatus: false,
|
|
452
|
-
});
|
|
633
|
+
await recordResult(false);
|
|
453
634
|
return false;
|
|
454
635
|
}
|
|
455
636
|
if (cnameRecord &&
|
|
456
637
|
cnameRecord.trim().toLocaleLowerCase() ===
|
|
457
638
|
StatusPageCNameRecord.trim().toLocaleLowerCase()) {
|
|
458
639
|
logger.debug(`CNAME record for ${fullDomain} matches the expected record: ${StatusPageCNameRecord}`, { fullDomain });
|
|
459
|
-
await
|
|
460
|
-
domain: fullDomain,
|
|
461
|
-
cnameStatus: true,
|
|
462
|
-
});
|
|
640
|
+
await recordResult(true);
|
|
463
641
|
return true;
|
|
464
642
|
}
|
|
465
643
|
logger.debug(`CNAME record for ${fullDomain} is ${cnameRecord} and it does not match the expected record: ${StatusPageCNameRecord}`, { fullDomain });
|
|
@@ -471,10 +649,7 @@ export class Service extends DatabaseService {
|
|
|
471
649
|
});
|
|
472
650
|
logger.debug(err, { fullDomain });
|
|
473
651
|
}
|
|
474
|
-
await
|
|
475
|
-
domain: fullDomain,
|
|
476
|
-
cnameStatus: false,
|
|
477
|
-
});
|
|
652
|
+
await recordResult(false);
|
|
478
653
|
return false;
|
|
479
654
|
}
|
|
480
655
|
catch (err) {
|
|
@@ -482,13 +657,30 @@ export class Service extends DatabaseService {
|
|
|
482
657
|
fullDomain,
|
|
483
658
|
});
|
|
484
659
|
logger.debug(err, { fullDomain });
|
|
485
|
-
await
|
|
486
|
-
domain: fullDomain,
|
|
487
|
-
cnameStatus: false,
|
|
488
|
-
});
|
|
660
|
+
await recordResult(false);
|
|
489
661
|
return false;
|
|
490
662
|
}
|
|
491
663
|
}
|
|
664
|
+
/*
|
|
665
|
+
* Record whether this domain's certificate is being served yet.
|
|
666
|
+
*
|
|
667
|
+
* This never orders a certificate. It used to re-order whenever the HTTPS
|
|
668
|
+
* probe failed while the CNAME still checked out - and right after an
|
|
669
|
+
* order the probe fails as a rule, because nginx writes new certificates
|
|
670
|
+
* to disk every 15 minutes, so a new domain was ordered twice. The
|
|
671
|
+
* re-order could also delete a working certificate: it checks the CNAME
|
|
672
|
+
* once more, and GreenlockUtil.orderCert removes the name's certificate
|
|
673
|
+
* when that check fails, so a moment's DNS trouble between the two checks
|
|
674
|
+
* took the domain off HTTPS. The two cases that do need an order have
|
|
675
|
+
* capped sweeps of their own: checkOrderStatus re-orders a certificate
|
|
676
|
+
* that has gone missing, and the renewal run renews one that is about to
|
|
677
|
+
* expire or has expired.
|
|
678
|
+
*
|
|
679
|
+
* When the probe fails the CNAME is checked again, so a domain whose
|
|
680
|
+
* record was removed goes back to asking for it. The result is written
|
|
681
|
+
* only when it changes: this sweep visits every ordered domain every 15
|
|
682
|
+
* minutes.
|
|
683
|
+
*/
|
|
492
684
|
async updateSslProvisioningStatus(domain) {
|
|
493
685
|
var _a;
|
|
494
686
|
if (!domain.id) {
|
|
@@ -502,6 +694,7 @@ export class Service extends DatabaseService {
|
|
|
502
694
|
_id: true,
|
|
503
695
|
fullDomain: true,
|
|
504
696
|
cnameVerificationToken: true,
|
|
697
|
+
isSslProvisioned: true,
|
|
505
698
|
},
|
|
506
699
|
props: {
|
|
507
700
|
isRoot: true,
|
|
@@ -510,39 +703,17 @@ export class Service extends DatabaseService {
|
|
|
510
703
|
if (!statusPageDomain) {
|
|
511
704
|
throw new BadDataException("DomainModel not found");
|
|
512
705
|
}
|
|
513
|
-
logger.debug(`StatusPageCerts:
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
const isCnameValid = await this.isCnameValid(statusPageDomain.fullDomain);
|
|
519
|
-
await this.updateOneById({
|
|
520
|
-
id: statusPageDomain.id,
|
|
521
|
-
data: {
|
|
522
|
-
isSslProvisioned: false,
|
|
523
|
-
},
|
|
524
|
-
props: {
|
|
525
|
-
isRoot: true,
|
|
526
|
-
},
|
|
527
|
-
});
|
|
528
|
-
if (isCnameValid) {
|
|
529
|
-
try {
|
|
530
|
-
// if cname is valid then order cert again.
|
|
531
|
-
await this.orderCert(statusPageDomain);
|
|
532
|
-
}
|
|
533
|
-
catch (err) {
|
|
534
|
-
logger.error("Cannot order cert for domain: " + statusPageDomain.fullDomain, { fullDomain: statusPageDomain.fullDomain });
|
|
535
|
-
logger.error(err, {
|
|
536
|
-
fullDomain: statusPageDomain.fullDomain,
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
}
|
|
706
|
+
logger.debug(`StatusPageCerts:CheckSslProvisioningStatus - Checking ${statusPageDomain.fullDomain}`, { fullDomain: statusPageDomain.fullDomain });
|
|
707
|
+
const isProvisioned = await this.isSSLProvisioned(statusPageDomain.fullDomain, statusPageDomain.cnameVerificationToken);
|
|
708
|
+
if (!isProvisioned) {
|
|
709
|
+
// isCnameValid also records the result on the domain.
|
|
710
|
+
await this.isCnameValid(statusPageDomain.fullDomain);
|
|
540
711
|
}
|
|
541
|
-
|
|
712
|
+
if (Boolean(statusPageDomain.isSslProvisioned) !== isProvisioned) {
|
|
542
713
|
await this.updateOneById({
|
|
543
714
|
id: statusPageDomain.id,
|
|
544
715
|
data: {
|
|
545
|
-
isSslProvisioned:
|
|
716
|
+
isSslProvisioned: isProvisioned,
|
|
546
717
|
},
|
|
547
718
|
props: {
|
|
548
719
|
isRoot: true,
|
|
@@ -550,40 +721,43 @@ export class Service extends DatabaseService {
|
|
|
550
721
|
});
|
|
551
722
|
}
|
|
552
723
|
}
|
|
724
|
+
/*
|
|
725
|
+
* Order the first certificate of every verified domain that has none yet,
|
|
726
|
+
* at most ORDER_MAX_PER_RUN per run (orderCertsForVerifiedDomainsWithoutOne).
|
|
727
|
+
*
|
|
728
|
+
* Only verified domains. This sweep used to try every domain not marked
|
|
729
|
+
* ordered, verified or not, and without a limit: for a domain whose record
|
|
730
|
+
* was not in place that was one more failed CNAME check every 15 minutes,
|
|
731
|
+
* and for one whose check failed for a moment it was a duplicate order -
|
|
732
|
+
* or, if the check failed again during the order, the deletion of its
|
|
733
|
+
* working certificate. verifyCnameWhoseCnameisNotVerified checks the
|
|
734
|
+
* unverified domains, and orders each one's certificate the moment it is
|
|
735
|
+
* verified; this sweep is the fallback for the rest.
|
|
736
|
+
*/
|
|
553
737
|
async orderSSLForDomainsWhichAreNotOrderedYet() {
|
|
554
738
|
return Telemetry.startActiveSpan({
|
|
555
739
|
name: "StatusPageDomainService.orderSSLForDomainsWhichAreNotOrderedYet",
|
|
556
740
|
options: { attributes: {} },
|
|
557
741
|
fn: async (span) => {
|
|
558
742
|
try {
|
|
559
|
-
const domains = await this.
|
|
743
|
+
const domains = await this.findAllBy({
|
|
560
744
|
query: {
|
|
745
|
+
isCnameVerified: true,
|
|
561
746
|
isSslOrdered: false,
|
|
562
747
|
isCustomCertificate: false, // only order for non custom certificates.
|
|
563
748
|
},
|
|
564
749
|
select: {
|
|
565
750
|
_id: true,
|
|
566
751
|
fullDomain: true,
|
|
752
|
+
isSslOrdered: true,
|
|
753
|
+
isCustomCertificate: true,
|
|
567
754
|
},
|
|
568
|
-
limit: LIMIT_MAX,
|
|
569
755
|
skip: 0,
|
|
570
756
|
props: {
|
|
571
757
|
isRoot: true,
|
|
572
758
|
},
|
|
573
759
|
});
|
|
574
|
-
|
|
575
|
-
try {
|
|
576
|
-
logger.debug("Ordering SSL for domain: " + domain.fullDomain, {
|
|
577
|
-
fullDomain: domain.fullDomain,
|
|
578
|
-
});
|
|
579
|
-
await this.orderCert(domain);
|
|
580
|
-
}
|
|
581
|
-
catch (e) {
|
|
582
|
-
logger.error(e, {
|
|
583
|
-
fullDomain: domain.fullDomain,
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
}
|
|
760
|
+
await this.orderCertsForVerifiedDomainsWithoutOne(domains);
|
|
587
761
|
Telemetry.endSpan(span);
|
|
588
762
|
}
|
|
589
763
|
catch (err) {
|
|
@@ -596,6 +770,14 @@ export class Service extends DatabaseService {
|
|
|
596
770
|
},
|
|
597
771
|
});
|
|
598
772
|
}
|
|
773
|
+
/*
|
|
774
|
+
* Check every domain whose CNAME is not verified yet, at most
|
|
775
|
+
* SSL_PROVISIONING_CHECK_CONCURRENCY at a time, and order the certificate
|
|
776
|
+
* of each one that is verified now straight away rather than at the next
|
|
777
|
+
* run of the order sweep. So a domain is served on its own certificate
|
|
778
|
+
* within about 15 minutes of its record going live - nginx writes new
|
|
779
|
+
* certificates every 15 minutes - whether or not anyone clicked Check now.
|
|
780
|
+
*/
|
|
599
781
|
async verifyCnameWhoseCnameisNotVerified() {
|
|
600
782
|
const domains = await this.findBy({
|
|
601
783
|
query: {
|
|
@@ -604,6 +786,8 @@ export class Service extends DatabaseService {
|
|
|
604
786
|
select: {
|
|
605
787
|
_id: true,
|
|
606
788
|
fullDomain: true,
|
|
789
|
+
isCustomCertificate: true,
|
|
790
|
+
isSslOrdered: true,
|
|
607
791
|
},
|
|
608
792
|
limit: LIMIT_MAX,
|
|
609
793
|
skip: 0,
|
|
@@ -611,21 +795,86 @@ export class Service extends DatabaseService {
|
|
|
611
795
|
isRoot: true,
|
|
612
796
|
},
|
|
613
797
|
});
|
|
614
|
-
|
|
798
|
+
const verifiedNow = [];
|
|
799
|
+
await ArrayUtil.forEachWithConcurrency(domains, Service.SSL_PROVISIONING_CHECK_CONCURRENCY, async (domain) => {
|
|
615
800
|
try {
|
|
616
|
-
|
|
801
|
+
// isCnameValid also records the result on the domain.
|
|
802
|
+
const isVerified = await this.isCnameValid(domain.fullDomain);
|
|
803
|
+
if (isVerified && !domain.isCustomCertificate) {
|
|
804
|
+
verifiedNow.push(domain);
|
|
805
|
+
}
|
|
617
806
|
}
|
|
618
807
|
catch (e) {
|
|
619
808
|
logger.error(e, {
|
|
620
809
|
fullDomain: domain.fullDomain,
|
|
621
810
|
});
|
|
622
811
|
}
|
|
812
|
+
});
|
|
813
|
+
try {
|
|
814
|
+
/*
|
|
815
|
+
* Each was verified by this run a moment ago, so the orders do not
|
|
816
|
+
* check the CNAME again.
|
|
817
|
+
*/
|
|
818
|
+
await this.orderCertsForVerifiedDomainsWithoutOne(verifiedNow, {
|
|
819
|
+
cnameVerifiedJustNow: true,
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
catch (e) {
|
|
823
|
+
// The order sweep orders them on its next run.
|
|
824
|
+
logger.error(e);
|
|
623
825
|
}
|
|
624
826
|
}
|
|
827
|
+
/*
|
|
828
|
+
* Which of these certificate domains are status page domains. The renewal
|
|
829
|
+
* run renews - and removes - only the certificates this returns, so the
|
|
830
|
+
* certificates of dashboard domains and of the primary host, which share
|
|
831
|
+
* the AcmeCertificate table, are never mistaken for status page domains
|
|
832
|
+
* whose CNAME stopped validating.
|
|
833
|
+
*
|
|
834
|
+
* A domain serving a certificate its owner uploaded still claims its
|
|
835
|
+
* Let's Encrypt certificate, which stays renewed meanwhile: nginx serves
|
|
836
|
+
* the uploaded one for that name (AcmeWriteCertificates leaves it alone),
|
|
837
|
+
* and switching back is then instant, on every nginx replica, including
|
|
838
|
+
* ones that start with an empty certificate directory.
|
|
839
|
+
*/
|
|
840
|
+
async getOwnedDomains(domains) {
|
|
841
|
+
if (domains.length === 0) {
|
|
842
|
+
return [];
|
|
843
|
+
}
|
|
844
|
+
const statusPageDomains = await this.findBy({
|
|
845
|
+
query: {
|
|
846
|
+
fullDomain: QueryHelper.any(domains),
|
|
847
|
+
},
|
|
848
|
+
select: {
|
|
849
|
+
fullDomain: true,
|
|
850
|
+
},
|
|
851
|
+
limit: LIMIT_MAX,
|
|
852
|
+
skip: 0,
|
|
853
|
+
props: {
|
|
854
|
+
isRoot: true,
|
|
855
|
+
},
|
|
856
|
+
});
|
|
857
|
+
return statusPageDomains
|
|
858
|
+
.map((statusPageDomain) => {
|
|
859
|
+
return statusPageDomain.fullDomain || "";
|
|
860
|
+
})
|
|
861
|
+
.filter((fullDomain) => {
|
|
862
|
+
return fullDomain.length > 0;
|
|
863
|
+
});
|
|
864
|
+
}
|
|
625
865
|
async renewCertsWhichAreExpiringSoon() {
|
|
626
866
|
await GreenlockUtil.renewAllCertsWhichAreExpiringSoon({
|
|
867
|
+
getOwnedDomains: async (domains) => {
|
|
868
|
+
return await this.getOwnedDomains(domains);
|
|
869
|
+
},
|
|
870
|
+
/*
|
|
871
|
+
* A check that writes nothing: a DNS blip while a certificate is
|
|
872
|
+
* renewed must not mark the domain unverified and unordered while its
|
|
873
|
+
* certificate keeps serving. The provisioning sweep still notices a
|
|
874
|
+
* record that is really gone.
|
|
875
|
+
*/
|
|
627
876
|
validateCname: async (fullDomain) => {
|
|
628
|
-
return await this.isCnameValid(fullDomain);
|
|
877
|
+
return await this.isCnameValid(fullDomain, { recordResult: false });
|
|
629
878
|
},
|
|
630
879
|
notifyDomainRemoved: async (domain) => {
|
|
631
880
|
// mark the domain as not ordered.
|
|
@@ -647,8 +896,19 @@ export class Service extends DatabaseService {
|
|
|
647
896
|
},
|
|
648
897
|
});
|
|
649
898
|
}
|
|
899
|
+
/*
|
|
900
|
+
* Re-order the certificate of a domain that says it has one ordered but
|
|
901
|
+
* whose certificate is gone, at most ORDER_MAX_PER_RUN per run, picked
|
|
902
|
+
* afresh every run. It used to look the certificates up one domain at a
|
|
903
|
+
* time and re-order every missing one in the same run, without a limit.
|
|
904
|
+
*
|
|
905
|
+
* The re-order goes through orderCertIfMissing like every first order, so
|
|
906
|
+
* it never races one that Check now or the order sweep is placing. A
|
|
907
|
+
* domain whose last re-orders failed waits longer after each failure
|
|
908
|
+
* (CertificateOrderFailures).
|
|
909
|
+
*/
|
|
650
910
|
async checkOrderStatus() {
|
|
651
|
-
const domains = await this.
|
|
911
|
+
const domains = await this.findAllBy({
|
|
652
912
|
query: {
|
|
653
913
|
isSslOrdered: true,
|
|
654
914
|
isCustomCertificate: false,
|
|
@@ -656,41 +916,49 @@ export class Service extends DatabaseService {
|
|
|
656
916
|
select: {
|
|
657
917
|
_id: true,
|
|
658
918
|
fullDomain: true,
|
|
659
|
-
|
|
919
|
+
isCustomCertificate: true,
|
|
660
920
|
},
|
|
661
|
-
limit: LIMIT_MAX,
|
|
662
921
|
skip: 0,
|
|
663
922
|
props: {
|
|
664
923
|
isRoot: true,
|
|
665
924
|
},
|
|
666
925
|
});
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
926
|
+
const domainsWithName = domains.filter((domain) => {
|
|
927
|
+
return Boolean(domain.id) && Boolean(domain.fullDomain);
|
|
928
|
+
});
|
|
929
|
+
if (domainsWithName.length === 0) {
|
|
930
|
+
return;
|
|
931
|
+
}
|
|
932
|
+
const certificates = await GreenlockUtil.findCertificatesByDomain(domainsWithName.map((domain) => {
|
|
933
|
+
return CertificateOrder.normalizeDomain(domain.fullDomain);
|
|
934
|
+
}));
|
|
935
|
+
const now = OneUptimeDate.getCurrentDate();
|
|
936
|
+
const domainsWithoutCertificate = await CertificateOrderFailures.withoutThoseWaitingToRetry({
|
|
937
|
+
items: domainsWithName.filter((domain) => {
|
|
938
|
+
return !certificates.has(CertificateOrder.normalizeDomain(domain.fullDomain));
|
|
939
|
+
}),
|
|
940
|
+
getDomain: (domain) => {
|
|
941
|
+
return domain.fullDomain;
|
|
942
|
+
},
|
|
943
|
+
now: now,
|
|
944
|
+
});
|
|
945
|
+
const batch = GreenlockUtil.pickForThisRun({
|
|
946
|
+
items: domainsWithoutCertificate,
|
|
947
|
+
max: Service.ORDER_MAX_PER_RUN,
|
|
948
|
+
now: now,
|
|
949
|
+
getKey: (domain) => {
|
|
950
|
+
return domain.fullDomain || "";
|
|
951
|
+
},
|
|
952
|
+
});
|
|
953
|
+
for (const domain of batch) {
|
|
954
|
+
try {
|
|
955
|
+
await this.orderCertIfMissing(domain, { fromSweep: true });
|
|
670
956
|
}
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
}
|
|
676
|
-
select: {
|
|
677
|
-
_id: true,
|
|
678
|
-
},
|
|
679
|
-
props: {
|
|
680
|
-
isRoot: true,
|
|
681
|
-
},
|
|
682
|
-
});
|
|
683
|
-
if (!acmeCert) {
|
|
684
|
-
try {
|
|
685
|
-
// order cert again.
|
|
686
|
-
await this.orderCert(domain);
|
|
687
|
-
}
|
|
688
|
-
catch (err) {
|
|
689
|
-
logger.error("Cannot order cert for domain: " + domain.fullDomain, {
|
|
690
|
-
fullDomain: domain.fullDomain,
|
|
691
|
-
});
|
|
692
|
-
logger.error(err, { fullDomain: domain.fullDomain });
|
|
693
|
-
}
|
|
957
|
+
catch (err) {
|
|
958
|
+
logger.error("Cannot order cert for domain: " + domain.fullDomain, {
|
|
959
|
+
fullDomain: domain.fullDomain,
|
|
960
|
+
});
|
|
961
|
+
logger.error(err, { fullDomain: domain.fullDomain });
|
|
694
962
|
}
|
|
695
963
|
}
|
|
696
964
|
}
|
|
@@ -703,6 +971,35 @@ export class Service extends DatabaseService {
|
|
|
703
971
|
* shared infrastructure sitting in front of those domains.
|
|
704
972
|
*/
|
|
705
973
|
Service.SSL_PROVISIONING_CHECK_CONCURRENCY = 10;
|
|
974
|
+
/*
|
|
975
|
+
* How many certificates the sweeps that order them may order in one
|
|
976
|
+
* 15-minute window, between them: the order for the domains the CNAME
|
|
977
|
+
* sweep has just verified, the order sweep for every verified domain still
|
|
978
|
+
* without a certificate, and the re-order of a certificate that has gone
|
|
979
|
+
* missing. They draw from one budget (CertificateOrder.takeOrderSlot,
|
|
980
|
+
* SWEEP_ORDER_BUDGET), and each picks its batch afresh every run
|
|
981
|
+
* (GreenlockUtil.pickForThisRun), so a domain whose order keeps failing -
|
|
982
|
+
* a CAA record that leaves Let's Encrypt out, a name it has paused -
|
|
983
|
+
* cannot hold a slot the others are waiting for, and waits longer after
|
|
984
|
+
* each failed order (CertificateOrderFailures). Check now is not counted
|
|
985
|
+
* here: it has a window of its own per domain
|
|
986
|
+
* (CertificateOrder.claimOnDemandOrder) and the on-demand budget.
|
|
987
|
+
*
|
|
988
|
+
* Every order spends from the one Let's Encrypt account the whole
|
|
989
|
+
* installation shares, 300 new orders per three hours, renewals included.
|
|
990
|
+
* Whatever these caps allow, no order is placed beyond the installation's
|
|
991
|
+
* own budget for that account (CertificateOrderBudget), which every order
|
|
992
|
+
* of every kind draws from. In a steady state these sweeps order a few
|
|
993
|
+
* certificates a day: a domain whose owner clicks Check now is ordered by
|
|
994
|
+
* that request. The cap is for a backlog, such as the domains the order
|
|
995
|
+
* sweep used to retry every 15 minutes without any limit, which is now
|
|
996
|
+
* worked off a few domains a run the way the dashboard sweeps
|
|
997
|
+
* (DashboardDomainService.ORDER_MAX_PER_RUN) and renewals
|
|
998
|
+
* (GreenlockUtil.RENEW_MAX_PER_RUN) are.
|
|
999
|
+
*/
|
|
1000
|
+
Service.ORDER_MAX_PER_RUN = 5;
|
|
1001
|
+
// The budget the ordering sweeps share (CertificateOrder.takeOrderSlot).
|
|
1002
|
+
Service.SWEEP_ORDER_BUDGET = "StatusPageDomainSweeps";
|
|
706
1003
|
__decorate([
|
|
707
1004
|
CaptureSpan(),
|
|
708
1005
|
__metadata("design:type", Function),
|
|
@@ -736,7 +1033,7 @@ __decorate([
|
|
|
736
1033
|
__decorate([
|
|
737
1034
|
CaptureSpan(),
|
|
738
1035
|
__metadata("design:type", Function),
|
|
739
|
-
__metadata("design:paramtypes", [StatusPageDomain]),
|
|
1036
|
+
__metadata("design:paramtypes", [StatusPageDomain, Object]),
|
|
740
1037
|
__metadata("design:returntype", Promise)
|
|
741
1038
|
], Service.prototype, "orderCert", null);
|
|
742
1039
|
__decorate([
|
|
@@ -745,6 +1042,24 @@ __decorate([
|
|
|
745
1042
|
__metadata("design:paramtypes", [ObjectID]),
|
|
746
1043
|
__metadata("design:returntype", Promise)
|
|
747
1044
|
], Service.prototype, "reissueCert", null);
|
|
1045
|
+
__decorate([
|
|
1046
|
+
CaptureSpan(),
|
|
1047
|
+
__metadata("design:type", Function),
|
|
1048
|
+
__metadata("design:paramtypes", [StatusPageDomain, Object]),
|
|
1049
|
+
__metadata("design:returntype", Promise)
|
|
1050
|
+
], Service.prototype, "orderCertIfMissing", null);
|
|
1051
|
+
__decorate([
|
|
1052
|
+
CaptureSpan(),
|
|
1053
|
+
__metadata("design:type", Function),
|
|
1054
|
+
__metadata("design:paramtypes", [StatusPageDomain, Object]),
|
|
1055
|
+
__metadata("design:returntype", Promise)
|
|
1056
|
+
], Service.prototype, "orderCertOnceCnameIsVerified", null);
|
|
1057
|
+
__decorate([
|
|
1058
|
+
CaptureSpan(),
|
|
1059
|
+
__metadata("design:type", Function),
|
|
1060
|
+
__metadata("design:paramtypes", [Array]),
|
|
1061
|
+
__metadata("design:returntype", Promise)
|
|
1062
|
+
], Service.prototype, "getCertificates", null);
|
|
748
1063
|
__decorate([
|
|
749
1064
|
CaptureSpan(),
|
|
750
1065
|
__metadata("design:type", Function),
|
|
@@ -760,7 +1075,7 @@ __decorate([
|
|
|
760
1075
|
__decorate([
|
|
761
1076
|
CaptureSpan(),
|
|
762
1077
|
__metadata("design:type", Function),
|
|
763
|
-
__metadata("design:paramtypes", [String]),
|
|
1078
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
764
1079
|
__metadata("design:returntype", Promise)
|
|
765
1080
|
], Service.prototype, "isCnameValid", null);
|
|
766
1081
|
__decorate([
|
|
@@ -781,6 +1096,12 @@ __decorate([
|
|
|
781
1096
|
__metadata("design:paramtypes", []),
|
|
782
1097
|
__metadata("design:returntype", Promise)
|
|
783
1098
|
], Service.prototype, "verifyCnameWhoseCnameisNotVerified", null);
|
|
1099
|
+
__decorate([
|
|
1100
|
+
CaptureSpan(),
|
|
1101
|
+
__metadata("design:type", Function),
|
|
1102
|
+
__metadata("design:paramtypes", [Array]),
|
|
1103
|
+
__metadata("design:returntype", Promise)
|
|
1104
|
+
], Service.prototype, "getOwnedDomains", null);
|
|
784
1105
|
__decorate([
|
|
785
1106
|
CaptureSpan(),
|
|
786
1107
|
__metadata("design:type", Function),
|