@oneuptime/common 14.0.6 → 14.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Incident.ts +267 -1
- package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
- package/Models/DatabaseModels/InventoryItem.ts +23 -12
- package/Models/DatabaseModels/StatusPage.ts +55 -0
- package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
- package/Server/API/IncidentAPI.ts +162 -0
- package/Server/API/StatusPageAPI.ts +487 -171
- package/Server/API/StatusPageSubscriberAPI.ts +63 -15
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
- package/Server/Infrastructure/Semaphore.ts +10 -0
- package/Server/Middleware/IdentityRateLimit.ts +108 -3
- package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
- package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
- package/Server/Services/AlertService.ts +32 -36
- package/Server/Services/DatabaseService.ts +93 -10
- package/Server/Services/IncidentAlertService.ts +609 -2
- package/Server/Services/IncidentCustomFieldService.ts +276 -1
- package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
- package/Server/Services/IncidentEpisodeService.ts +15 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
- package/Server/Services/IncidentPublicNoteService.ts +30 -1
- package/Server/Services/IncidentService.ts +1663 -103
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/InventoryItemService.ts +38 -0
- package/Server/Services/IoTDeviceCredentialService.ts +13 -4
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +118 -64
- package/Server/Services/SmsService.ts +10 -0
- package/Server/Services/StatusPageService.ts +65 -8
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
- package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
- package/Server/Services/StatusPageSubscriberService.ts +1161 -64
- package/Server/Services/UserNotificationRuleService.ts +55 -53
- package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
- package/Server/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
- package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
- package/Server/Utils/Response.ts +31 -0
- package/Server/Utils/SSRFProtection.ts +76 -16
- package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
- package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
- package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
- package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
- package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
- package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
- package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
- package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
- package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
- package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
- package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
- package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
- package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
- package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
- package/Server/Utils/StatusPageResource.ts +51 -20
- package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
- package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
- package/Server/Utils/Topology/TopologyRequest.ts +463 -0
- package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
- package/Server/Utils/Topology/TopologySql.ts +1024 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +10 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
- package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
- package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
- package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
- package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
- package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
- package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
- package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
- package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
- package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
- package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
- package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
- package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
- package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
- package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
- package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
- package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
- package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
- package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
- package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
- package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
- package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
- package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
- package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
- package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
- package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
- package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
- package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
- package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
- package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
- package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
- package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
- package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
- package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
- package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
- package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
- package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
- package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
- package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
- package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
- package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
- package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
- package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
- package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
- package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
- package/Tests/Server/Services/DomainService.test.ts +525 -0
- package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
- package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
- package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
- package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
- package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
- package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
- package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
- package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
- package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
- package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
- package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
- package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
- package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
- package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
- package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
- package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
- package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
- package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
- package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
- package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
- package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
- package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
- package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
- package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
- package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
- package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
- package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
- package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
- package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
- package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
- package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
- package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
- package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
- package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
- package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
- package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
- package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
- package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
- package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
- package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
- package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
- package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
- package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
- package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
- package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
- package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
- package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
- package/Tests/Types/SafeHtml.test.ts +102 -0
- package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
- package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
- package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
- package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
- package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
- package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
- package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
- package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
- package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
- package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
- package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
- package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
- package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
- package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
- package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
- package/Types/CustomField/CustomFieldOrder.ts +55 -0
- package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
- package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
- package/Types/CustomField/CustomFieldType.ts +14 -0
- package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
- package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
- package/Types/Incident/IncidentAlertLink.ts +19 -0
- package/Types/SafeHtml.ts +93 -0
- package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
- package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
- package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
- package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
- package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
- package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
- package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
- package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
- package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
- package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
- package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
- package/Types/Telemetry/InventoryLiveness.ts +26 -0
- package/Types/Topology/TopologyApi.ts +428 -0
- package/Types/Topology/TopologyTypeRules.ts +191 -0
- package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
- package/UI/Components/Forms/ModelForm.tsx +70 -8
- package/UI/Components/Forms/Validation.ts +1 -1
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
- package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
- package/UI/Components/ModelTable/ModelTable.tsx +6 -7
- package/UI/Utils/SensitiveUrlToken.ts +10 -5
- package/Utils/API.ts +247 -2
- package/Utils/Incident/IncidentFromAlerts.ts +78 -0
- package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
- package/Utils/Markdown/MarkdownEscape.ts +65 -0
- package/Utils/ProbeNetworkFailureUtil.ts +673 -0
- package/build/dist/Models/DatabaseModels/Incident.js +267 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +100 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +417 -176
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
- package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +21 -33
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +457 -3
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1148 -42
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +31 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
- package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +2 -22
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +47 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +110 -6
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +30 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +48 -6
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageResource.js +39 -7
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
- package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
- package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
- package/build/dist/Types/SafeHtml.js +84 -0
- package/build/dist/Types/SafeHtml.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
- package/build/dist/Types/Topology/TopologyApi.js +55 -0
- package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +1 -1
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
- package/build/dist/Utils/API.js +177 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
- package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
- package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -10,6 +10,8 @@ import Markdown, { MarkdownContentType } from "../Types/Markdown";
|
|
|
10
10
|
import CallService from "./CallService";
|
|
11
11
|
import DatabaseService from "./DatabaseService";
|
|
12
12
|
import IncidentService from "./IncidentService";
|
|
13
|
+
import LinkedAffectedResources from "../Utils/AffectedResources/LinkedAffectedResources";
|
|
14
|
+
import SeriesLabelDisplay from "../../Types/Monitor/SeriesContext/SeriesLabelDisplay";
|
|
13
15
|
import IncidentSeverityService from "./IncidentSeverityService";
|
|
14
16
|
import MailService from "./MailService";
|
|
15
17
|
import ProjectCallSMSConfigService from "./ProjectCallSMSConfigService";
|
|
@@ -983,15 +985,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
983
985
|
incidentNumber: true,
|
|
984
986
|
incidentNumberWithPrefix: true,
|
|
985
987
|
/*
|
|
986
|
-
* AcknowledgeIncident.hbs
|
|
987
|
-
*
|
|
988
|
-
*
|
|
989
|
-
* alert's Root Cause.
|
|
988
|
+
* No relations here: AcknowledgeIncident.hbs's Resources Affected
|
|
989
|
+
* row is built from every resource the incident is linked to,
|
|
990
|
+
* which generateEmailTemplateForIncidentCreated reads itself.
|
|
990
991
|
*/
|
|
991
|
-
monitors: {
|
|
992
|
-
_id: true,
|
|
993
|
-
name: true,
|
|
994
|
-
},
|
|
995
992
|
},
|
|
996
993
|
});
|
|
997
994
|
}
|
|
@@ -1031,11 +1028,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
1031
1028
|
* select it.
|
|
1032
1029
|
*/
|
|
1033
1030
|
rootCause: true,
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1031
|
+
/*
|
|
1032
|
+
* The series a grouped monitor raised this alert for (the pod or
|
|
1033
|
+
* container), which the Resources Affected row names in place of
|
|
1034
|
+
* the monitor - as the alert owner emails do. The linked resources
|
|
1035
|
+
* themselves are read by generateEmailTemplateForAlertCreated.
|
|
1036
|
+
*/
|
|
1037
|
+
seriesLabels: true,
|
|
1039
1038
|
},
|
|
1040
1039
|
});
|
|
1041
1040
|
}
|
|
@@ -4613,7 +4612,22 @@ export class Service extends DatabaseService<Model> {
|
|
|
4613
4612
|
MarkdownContentType.Email,
|
|
4614
4613
|
),
|
|
4615
4614
|
alertSeverity: alert.alertSeverity!.name!,
|
|
4616
|
-
|
|
4615
|
+
/*
|
|
4616
|
+
* Every resource the alert's Affected Resources card lists. An SLO
|
|
4617
|
+
* burn-rate alert has no monitor, and this used to read "No resources
|
|
4618
|
+
* identified" beside a card naming its SLO.
|
|
4619
|
+
*/
|
|
4620
|
+
resourcesAffected: LinkedAffectedResources.getText({
|
|
4621
|
+
resources: await LinkedAffectedResources.readForAlert({
|
|
4622
|
+
service: AlertService,
|
|
4623
|
+
projectId: alert.projectId!,
|
|
4624
|
+
alertId: alert.id!,
|
|
4625
|
+
}),
|
|
4626
|
+
seriesSummary: SeriesLabelDisplay.buildInlineSummary(
|
|
4627
|
+
alert.seriesLabels,
|
|
4628
|
+
),
|
|
4629
|
+
fallback: "No resources identified",
|
|
4630
|
+
}),
|
|
4617
4631
|
rootCause: await Markdown.convertToHTML(
|
|
4618
4632
|
alert.rootCause || "No root cause identified for this alert",
|
|
4619
4633
|
MarkdownContentType.Email,
|
|
@@ -4664,15 +4678,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
4664
4678
|
MarkdownContentType.Email,
|
|
4665
4679
|
),
|
|
4666
4680
|
incidentSeverity: incident.incidentSeverity!.name!,
|
|
4667
|
-
|
|
4668
|
-
|
|
4669
|
-
|
|
4670
|
-
|
|
4671
|
-
|
|
4672
|
-
|
|
4673
|
-
|
|
4674
|
-
|
|
4675
|
-
|
|
4681
|
+
// Every resource the incident's Affected Resources card lists.
|
|
4682
|
+
resourcesAffected: LinkedAffectedResources.getText({
|
|
4683
|
+
resources: await LinkedAffectedResources.readForIncident({
|
|
4684
|
+
service: IncidentService,
|
|
4685
|
+
projectId: incident.projectId!,
|
|
4686
|
+
incidentId: incident.id!,
|
|
4687
|
+
}),
|
|
4688
|
+
fallback: "No resources identified",
|
|
4689
|
+
}),
|
|
4676
4690
|
rootCause: await Markdown.convertToHTML(
|
|
4677
4691
|
incident.rootCause || "No root cause identified for this incident",
|
|
4678
4692
|
MarkdownContentType.Email,
|
|
@@ -4762,18 +4776,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
4762
4776
|
})
|
|
4763
4777
|
: [];
|
|
4764
4778
|
|
|
4765
|
-
//
|
|
4766
|
-
const
|
|
4767
|
-
|
|
4768
|
-
|
|
4769
|
-
|
|
4770
|
-
|
|
4771
|
-
|
|
4772
|
-
|
|
4773
|
-
|
|
4774
|
-
monitorNames.size > 0
|
|
4775
|
-
? Array.from(monitorNames).join(", ")
|
|
4776
|
-
: "No resources identified";
|
|
4779
|
+
// Every resource any alert in the episode is linked to, each named once.
|
|
4780
|
+
const resourcesAffected: string = LinkedAffectedResources.getText({
|
|
4781
|
+
resources: await LinkedAffectedResources.readForAlerts({
|
|
4782
|
+
service: AlertService,
|
|
4783
|
+
projectId: alertEpisode.projectId!,
|
|
4784
|
+
alertIds: alertIds,
|
|
4785
|
+
}),
|
|
4786
|
+
fallback: "No resources identified",
|
|
4787
|
+
});
|
|
4777
4788
|
|
|
4778
4789
|
// Build alerts list HTML with proper email styling
|
|
4779
4790
|
let alertsListHtml: string = "";
|
|
@@ -4933,24 +4944,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
4933
4944
|
})
|
|
4934
4945
|
: [];
|
|
4935
4946
|
|
|
4936
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
4939
|
-
|
|
4940
|
-
|
|
4941
|
-
|
|
4942
|
-
|
|
4943
|
-
|
|
4944
|
-
|
|
4945
|
-
monitorNames.add(monitor.name);
|
|
4946
|
-
}
|
|
4947
|
-
}
|
|
4948
|
-
}
|
|
4949
|
-
|
|
4950
|
-
const resourcesAffected: string =
|
|
4951
|
-
monitorNames.size > 0
|
|
4952
|
-
? Array.from(monitorNames).join(", ")
|
|
4953
|
-
: "No resources identified";
|
|
4947
|
+
// Every resource any incident in the episode is linked to, each named once.
|
|
4948
|
+
const resourcesAffected: string = LinkedAffectedResources.getText({
|
|
4949
|
+
resources: await LinkedAffectedResources.readForIncidents({
|
|
4950
|
+
service: IncidentService,
|
|
4951
|
+
projectId: incidentEpisode.projectId!,
|
|
4952
|
+
incidentIds: incidentIds,
|
|
4953
|
+
}),
|
|
4954
|
+
fallback: "No resources identified",
|
|
4955
|
+
});
|
|
4954
4956
|
|
|
4955
4957
|
// Build incidents list HTML with proper email styling
|
|
4956
4958
|
let incidentsListHtml: string = "";
|
|
@@ -18,6 +18,8 @@ import IncidentStateTimeline from "../../Models/DatabaseModels/IncidentStateTime
|
|
|
18
18
|
import AlertStateTimeline from "../../Models/DatabaseModels/AlertStateTimeline";
|
|
19
19
|
import Label from "../../Models/DatabaseModels/Label";
|
|
20
20
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
21
|
+
import LinkedAffectedResources from "../Utils/AffectedResources/LinkedAffectedResources";
|
|
22
|
+
import { escapeMarkdownInline } from "../../Utils/Markdown/MarkdownEscape";
|
|
21
23
|
import WorkspaceNotificationLogService from "./WorkspaceNotificationLogService";
|
|
22
24
|
import WorkspaceNotificationStatus from "../../Types/Workspace/WorkspaceNotificationStatus";
|
|
23
25
|
import WorkspaceNotificationActionType from "../../Types/Workspace/WorkspaceNotificationActionType";
|
|
@@ -212,6 +214,18 @@ export class Service extends DatabaseService<WorkspaceNotificationSummary> {
|
|
|
212
214
|
return `[${text}](${url})`;
|
|
213
215
|
}
|
|
214
216
|
|
|
217
|
+
/*
|
|
218
|
+
* Resource names are escaped: a host or cluster name can come from an
|
|
219
|
+
* agent rather than from someone typing it, and this text is markdown.
|
|
220
|
+
*/
|
|
221
|
+
private static joinNames(names: Array<string>): string {
|
|
222
|
+
return names
|
|
223
|
+
.map((name: string): string => {
|
|
224
|
+
return escapeMarkdownInline(name);
|
|
225
|
+
})
|
|
226
|
+
.join(", ");
|
|
227
|
+
}
|
|
228
|
+
|
|
215
229
|
private static formatDuration(totalMinutes: number): string {
|
|
216
230
|
if (totalMinutes < 1) {
|
|
217
231
|
return "< 1m";
|
|
@@ -761,20 +775,20 @@ export class Service extends DatabaseService<WorkspaceNotificationSummary> {
|
|
|
761
775
|
if (
|
|
762
776
|
Service.has(items, WorkspaceNotificationSummaryItem.ResourcesAffected)
|
|
763
777
|
) {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
if (names.
|
|
778
|
+
// Every resource the period's incidents are linked to, not only monitors.
|
|
779
|
+
const names: Array<string> = LinkedAffectedResources.getNames({
|
|
780
|
+
resources: await LinkedAffectedResources.readForIncidents({
|
|
781
|
+
service: IncidentService,
|
|
782
|
+
projectId,
|
|
783
|
+
incidentIds: incidents.map((inc: Incident): ObjectID => {
|
|
784
|
+
return inc.id!;
|
|
785
|
+
}),
|
|
786
|
+
}),
|
|
787
|
+
});
|
|
788
|
+
if (names.length > 0) {
|
|
775
789
|
blocks.push(
|
|
776
790
|
Service.md(
|
|
777
|
-
`${Service.bold(`Resources Affected (${names.
|
|
791
|
+
`${Service.bold(`Resources Affected (${names.length}):`)} ${Service.joinNames(names)}`,
|
|
778
792
|
),
|
|
779
793
|
);
|
|
780
794
|
}
|
|
@@ -1203,16 +1217,20 @@ export class Service extends DatabaseService<WorkspaceNotificationSummary> {
|
|
|
1203
1217
|
if (
|
|
1204
1218
|
Service.has(items, WorkspaceNotificationSummaryItem.ResourcesAffected)
|
|
1205
1219
|
) {
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1220
|
+
// Every resource the period's alerts are linked to, not only monitors.
|
|
1221
|
+
const names: Array<string> = LinkedAffectedResources.getNames({
|
|
1222
|
+
resources: await LinkedAffectedResources.readForAlerts({
|
|
1223
|
+
service: AlertService,
|
|
1224
|
+
projectId,
|
|
1225
|
+
alertIds: alerts.map((a: Alert): ObjectID => {
|
|
1226
|
+
return a.id!;
|
|
1227
|
+
}),
|
|
1228
|
+
}),
|
|
1229
|
+
});
|
|
1230
|
+
if (names.length > 0) {
|
|
1213
1231
|
blocks.push(
|
|
1214
1232
|
Service.md(
|
|
1215
|
-
`${Service.bold(`Resources Affected (${names.
|
|
1233
|
+
`${Service.bold(`Resources Affected (${names.length}):`)} ${Service.joinNames(names)}`,
|
|
1216
1234
|
),
|
|
1217
1235
|
);
|
|
1218
1236
|
}
|
package/Server/Types/Markdown.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Renderer, marked } from "marked";
|
|
2
2
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
3
3
|
import markdownSlugify from "./MarkdownSlugify";
|
|
4
|
+
import SafeHtml from "../../Types/SafeHtml";
|
|
4
5
|
|
|
5
6
|
export type MarkdownRenderer = Renderer;
|
|
6
7
|
|
|
@@ -50,6 +51,26 @@ const HTML_ENTITIES: Record<string, string> = {
|
|
|
50
51
|
nbsp: " ",
|
|
51
52
|
};
|
|
52
53
|
|
|
54
|
+
// The named references getEmailUrl decodes in a link destination.
|
|
55
|
+
const URL_NAMED_CHARACTER_REFERENCES: Record<string, string> = {
|
|
56
|
+
amp: "&",
|
|
57
|
+
lt: "<",
|
|
58
|
+
gt: ">",
|
|
59
|
+
quot: '"',
|
|
60
|
+
apos: "'",
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* The schemes an email may link to, and load an image from. A destination
|
|
65
|
+
* with no scheme is also allowed (see Markdown.getEmailUrl).
|
|
66
|
+
*/
|
|
67
|
+
export const EMAIL_LINK_SCHEMES: ReadonlyArray<string> = [
|
|
68
|
+
"http",
|
|
69
|
+
"https",
|
|
70
|
+
"mailto",
|
|
71
|
+
];
|
|
72
|
+
export const EMAIL_IMAGE_SCHEMES: ReadonlyArray<string> = ["http", "https"];
|
|
73
|
+
|
|
53
74
|
type HoldFunction = (value: string) => string;
|
|
54
75
|
|
|
55
76
|
interface BacktickRuns {
|
|
@@ -603,12 +624,93 @@ export default class Markdown {
|
|
|
603
624
|
* a second implementation is a second thing to get wrong.
|
|
604
625
|
*/
|
|
605
626
|
public static escapeHtml(text: string): string {
|
|
606
|
-
return text
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
627
|
+
return SafeHtml.escape(text);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* The URL a link or image in an EMAIL may point at, ready to go between
|
|
632
|
+
* the double quotes of an href or src attribute - or null when it may not
|
|
633
|
+
* be emitted at all.
|
|
634
|
+
*
|
|
635
|
+
* An email's Markdown comes from people outside the recipient's control: a
|
|
636
|
+
* public note, an incident description, a root cause built from telemetry.
|
|
637
|
+
* marked emits any destination it is given, so `[Details](javascript:...)`
|
|
638
|
+
* or `(data:text/html;base64,...)` became a live link in a status update
|
|
639
|
+
* the subscriber trusts. Only the schemes listed are kept; a destination
|
|
640
|
+
* with no scheme (a relative link or "#anchor") is kept too, as it was
|
|
641
|
+
* before, and cannot run anything.
|
|
642
|
+
*
|
|
643
|
+
* The scheme is judged on exactly the URL the recipient's mail client will
|
|
644
|
+
* see:
|
|
645
|
+
* - The character references marked leaves in a destination
|
|
646
|
+
* ("javascript:") are decoded first, and the result is percent-
|
|
647
|
+
* encoded the way marked does it (encodeURI), which also encodes every
|
|
648
|
+
* space and control character a browser would strip out of a scheme.
|
|
649
|
+
* - The URL is then HTML-escaped into the attribute, so the client's own
|
|
650
|
+
* decoding of the attribute gives back exactly the string that was
|
|
651
|
+
* checked. A character reference this does not decode (":")
|
|
652
|
+
* therefore reaches the client as literal text, never as a ":".
|
|
653
|
+
*/
|
|
654
|
+
public static getEmailUrl(
|
|
655
|
+
href: string | null | undefined,
|
|
656
|
+
allowedSchemes: ReadonlyArray<string>,
|
|
657
|
+
): string | null {
|
|
658
|
+
if (!href) {
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
let url: string;
|
|
663
|
+
|
|
664
|
+
try {
|
|
665
|
+
url = encodeURI(Markdown.decodeUrlCharacterReferences(href)).replace(
|
|
666
|
+
/%25/g,
|
|
667
|
+
"%",
|
|
668
|
+
);
|
|
669
|
+
} catch {
|
|
670
|
+
// A lone surrogate, which encodeURI refuses: no usable URL.
|
|
671
|
+
return null;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
const scheme: RegExpMatchArray | null = url.match(
|
|
675
|
+
/^([a-zA-Z][a-zA-Z0-9+.-]*):/,
|
|
676
|
+
);
|
|
677
|
+
|
|
678
|
+
if (scheme && !allowedSchemes.includes(scheme[1]!.toLowerCase())) {
|
|
679
|
+
return null;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
return Markdown.escapeHtml(url);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/*
|
|
686
|
+
* Numeric character references, and the named ones for the characters
|
|
687
|
+
* escapeHtml writes. Anything else is left as written, and getEmailUrl's
|
|
688
|
+
* escaping makes it inert.
|
|
689
|
+
*/
|
|
690
|
+
private static decodeUrlCharacterReferences(text: string): string {
|
|
691
|
+
return text.replace(
|
|
692
|
+
/&(#[xX][0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,
|
|
693
|
+
(match: string, reference: string): string => {
|
|
694
|
+
if (reference.startsWith("#")) {
|
|
695
|
+
const codePoint: number =
|
|
696
|
+
reference[1] === "x" || reference[1] === "X"
|
|
697
|
+
? parseInt(reference.slice(2), 16)
|
|
698
|
+
: parseInt(reference.slice(1), 10);
|
|
699
|
+
|
|
700
|
+
if (
|
|
701
|
+
!Number.isFinite(codePoint) ||
|
|
702
|
+
codePoint <= 0 ||
|
|
703
|
+
codePoint > 0x10ffff
|
|
704
|
+
) {
|
|
705
|
+
return match;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
return String.fromCodePoint(codePoint);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
return URL_NAMED_CHARACTER_REFERENCES[reference] ?? match;
|
|
712
|
+
},
|
|
713
|
+
);
|
|
612
714
|
}
|
|
613
715
|
|
|
614
716
|
/*
|
|
@@ -743,6 +845,51 @@ export default class Markdown {
|
|
|
743
845
|
);
|
|
744
846
|
};
|
|
745
847
|
|
|
848
|
+
/*
|
|
849
|
+
* Links and images keep only http, https and mailto destinations (http
|
|
850
|
+
* and https for an image), plus relative ones: see getEmailUrl. Any
|
|
851
|
+
* other link renders as its text alone, and any other image as its alt
|
|
852
|
+
* text, so the words the author wrote still read in place.
|
|
853
|
+
*
|
|
854
|
+
* The markup is marked's own. `text` is the link's rendered inline
|
|
855
|
+
* content, and `title` and an image's alt text arrive already escaped by
|
|
856
|
+
* marked's tokenizer, so escaping them again would show "&".
|
|
857
|
+
*/
|
|
858
|
+
renderer.link = function (
|
|
859
|
+
href: string,
|
|
860
|
+
title: string | null | undefined,
|
|
861
|
+
text: string,
|
|
862
|
+
): string {
|
|
863
|
+
const url: string | null = Markdown.getEmailUrl(href, EMAIL_LINK_SCHEMES);
|
|
864
|
+
|
|
865
|
+
if (url === null) {
|
|
866
|
+
return text;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
const titleAttribute: string = title ? ` title="${title}"` : "";
|
|
870
|
+
|
|
871
|
+
return `<a href="${url}"${titleAttribute}>${text}</a>`;
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
renderer.image = function (
|
|
875
|
+
href: string,
|
|
876
|
+
title: string | null,
|
|
877
|
+
text: string,
|
|
878
|
+
): string {
|
|
879
|
+
const url: string | null = Markdown.getEmailUrl(
|
|
880
|
+
href,
|
|
881
|
+
EMAIL_IMAGE_SCHEMES,
|
|
882
|
+
);
|
|
883
|
+
|
|
884
|
+
if (url === null) {
|
|
885
|
+
return text;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
const titleAttribute: string = title ? ` title="${title}"` : "";
|
|
889
|
+
|
|
890
|
+
return `<img src="${url}" alt="${text}"${titleAttribute}>`;
|
|
891
|
+
};
|
|
892
|
+
|
|
746
893
|
this.emailRenderer = renderer;
|
|
747
894
|
|
|
748
895
|
return renderer;
|
|
@@ -6,9 +6,18 @@ import ComponentID from "../../../../Types/Workflow/ComponentID";
|
|
|
6
6
|
import Components from "../../../../Types/Workflow/Components/Email";
|
|
7
7
|
import nodemailer, { Transporter } from "nodemailer";
|
|
8
8
|
import SMTPTransport from "nodemailer/lib/smtp-transport";
|
|
9
|
+
import DataSourceEgressGuard, {
|
|
10
|
+
ResolvedAddress,
|
|
11
|
+
} from "../../../Utils/DataSource/EgressGuard";
|
|
12
|
+
import PinnedSmtpSocket, {
|
|
13
|
+
SmtpSocketCallback,
|
|
14
|
+
} from "../../../Utils/Mail/PinnedSmtpSocket";
|
|
9
15
|
import CaptureSpan from "../../../Utils/Telemetry/CaptureSpan";
|
|
10
16
|
|
|
11
17
|
export default class Email extends ComponentCode {
|
|
18
|
+
// nodemailer's own default connection timeout.
|
|
19
|
+
private static readonly CONNECTION_TIMEOUT_IN_MS: number = 2 * 60 * 1000;
|
|
20
|
+
|
|
12
21
|
public constructor() {
|
|
13
22
|
super();
|
|
14
23
|
|
|
@@ -123,10 +132,60 @@ export default class Email extends ComponentCode {
|
|
|
123
132
|
};
|
|
124
133
|
}
|
|
125
134
|
|
|
135
|
+
const smtpHost: string = args["smtp-host"].toString().trim();
|
|
136
|
+
// "[fd00::25]" is how an IPv6 literal is usually written next to a port.
|
|
137
|
+
const bareSmtpHost: string = smtpHost.replace(/^\[|\]$/g, "");
|
|
138
|
+
const smtpPort: number = args["smtp-port"] as number;
|
|
139
|
+
|
|
126
140
|
try {
|
|
141
|
+
/*
|
|
142
|
+
* The SMTP host is free text typed into the workflow node by any
|
|
143
|
+
* project member who can edit workflows, and nodemailer's failures
|
|
144
|
+
* ("Invalid greeting. response=<banner>", refused vs timed out) come
|
|
145
|
+
* back through the Error port into the workflow log. Unchecked, this
|
|
146
|
+
* step is a port scanner with banner disclosure for whatever network
|
|
147
|
+
* the workflow worker runs in.
|
|
148
|
+
*
|
|
149
|
+
* Same guard and label as a project's own SMTP server in MailService,
|
|
150
|
+
* so the same policy: loopback, link-local and cloud metadata are
|
|
151
|
+
* refused everywhere; private ranges are refused on SaaS and allowed on
|
|
152
|
+
* self-hosted installs unless DATA_SOURCE_BLOCK_PRIVATE_ADDRESSES=true.
|
|
153
|
+
* A refusal is thrown inside this try, so it takes the Error port like
|
|
154
|
+
* any other failure to send, before a socket is opened.
|
|
155
|
+
*/
|
|
156
|
+
const validatedAddresses: Array<ResolvedAddress> =
|
|
157
|
+
await DataSourceEgressGuard.assertHostnameAllowed(bareSmtpHost, {
|
|
158
|
+
targetLabel: "SMTP server",
|
|
159
|
+
});
|
|
160
|
+
|
|
127
161
|
const smtpTransport: SMTPTransport.Options = {
|
|
128
|
-
|
|
129
|
-
|
|
162
|
+
/*
|
|
163
|
+
* nodemailer still needs the name the user typed: it is what TLS
|
|
164
|
+
* sends as SNI and checks the certificate against, on implicit TLS
|
|
165
|
+
* and on the STARTTLS upgrade alike. It is never dialed; see
|
|
166
|
+
* getSocket.
|
|
167
|
+
*/
|
|
168
|
+
host: bareSmtpHost,
|
|
169
|
+
port: smtpPort,
|
|
170
|
+
/*
|
|
171
|
+
* Connect here, to the addresses just validated, and hand nodemailer
|
|
172
|
+
* the open socket. Given the name instead, nodemailer resolves it
|
|
173
|
+
* again on its own (dns.resolve4/6, then a process-wide five-minute
|
|
174
|
+
* cache), so a DNS answer that changed after the check would choose
|
|
175
|
+
* the address actually connected to.
|
|
176
|
+
*/
|
|
177
|
+
getSocket: (
|
|
178
|
+
_options: SMTPTransport.Options,
|
|
179
|
+
callback: SmtpSocketCallback,
|
|
180
|
+
): void => {
|
|
181
|
+
PinnedSmtpSocket.connect({
|
|
182
|
+
host: bareSmtpHost,
|
|
183
|
+
port: smtpPort,
|
|
184
|
+
addresses: validatedAddresses,
|
|
185
|
+
timeoutInMs: Email.CONNECTION_TIMEOUT_IN_MS,
|
|
186
|
+
onDone: callback,
|
|
187
|
+
});
|
|
188
|
+
},
|
|
130
189
|
};
|
|
131
190
|
|
|
132
191
|
if (
|