@oneuptime/common 14.0.7 → 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/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/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 +14 -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/DatabaseService.ts +93 -10
- 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 +1535 -65
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +68 -18
- 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/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -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/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/CustomFieldsSettingsIncidentOptions.test.tsx +357 -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 +242 -5
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- 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/PublicNotePagesNotifyDefault.test.tsx +113 -1
- 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 +14 -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/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.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 +1052 -0
- 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/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +47 -17
- 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/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/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/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/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/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/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/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/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
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
2
|
+
import { sortCustomFieldDefinitions } from "../../../Types/CustomField/CustomFieldOrder";
|
|
3
|
+
import CustomFieldType from "../../../Types/CustomField/CustomFieldType";
|
|
4
|
+
import { customFieldValueToDate, customFieldValueToText, formatCustomFieldBoolean, formatCustomFieldCalendarDate, } from "../../../Types/CustomField/CustomFieldValueFormat";
|
|
5
|
+
import { isCustomFieldValueEmpty } from "../../../Types/CustomField/CustomFieldValueMapping";
|
|
6
|
+
import { getCustomFieldTemplateVariableName, isValidCustomFieldVariableKey, } from "../../../Types/CustomField/CustomFieldVariableKey";
|
|
7
|
+
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
8
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
9
|
+
import SafeHtml from "../../../Types/SafeHtml";
|
|
10
|
+
import SubscriberNotificationTemplateCompiler from "../../../Types/StatusPage/SubscriberNotificationTemplateCompiler";
|
|
11
|
+
import Timezone from "../../../Types/Timezone";
|
|
12
|
+
import { escapeMarkdownInline } from "../../../Utils/Markdown/MarkdownEscape";
|
|
13
|
+
import IncidentCustomFieldService from "../../Services/IncidentCustomFieldService";
|
|
14
|
+
import Markdown, { MarkdownContentType } from "../../Types/Markdown";
|
|
15
|
+
import { syncIsPublicForMarkdownImages } from "../InlineImageAccessTokenSync";
|
|
16
|
+
import StatusPageResourceUtil from "../StatusPageResource";
|
|
17
|
+
const LINE_BREAK_PATTERN = /\r\n|\r|\n/g;
|
|
18
|
+
export class IncidentTemplateVariables {
|
|
19
|
+
constructor(data) {
|
|
20
|
+
/*
|
|
21
|
+
* Fields whose images are being or have been made public in this send, by
|
|
22
|
+
* name, with the sync that does it. A send awaits several subscribers'
|
|
23
|
+
* messages at once (SubscriberNotificationFanOut), so a second message
|
|
24
|
+
* that carries a field waits for the sync the first one started rather
|
|
25
|
+
* than going out before it has finished.
|
|
26
|
+
*/
|
|
27
|
+
this.publishedImageFields = new Map();
|
|
28
|
+
// What went out, for the feed.
|
|
29
|
+
this.includedFieldsSent = false;
|
|
30
|
+
this.includedFieldsPublished = null;
|
|
31
|
+
this.fieldKeysSent = new Set();
|
|
32
|
+
this.incident = data.incident;
|
|
33
|
+
this.customFields = data.customFields;
|
|
34
|
+
this.textVariables = data.textVariables;
|
|
35
|
+
this.markdownVariables = data.markdownVariables;
|
|
36
|
+
this.incidentLabels = data.incidentLabels;
|
|
37
|
+
this.affectedStatusPages = data.affectedStatusPages;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Every value one status page's messages are filled with, in each
|
|
41
|
+
* channel's format, except the subscriber's own unsubscribeUrl, which the
|
|
42
|
+
* job adds per subscriber.
|
|
43
|
+
*/
|
|
44
|
+
forStatusPage(data) {
|
|
45
|
+
var _a;
|
|
46
|
+
const statusPage = data.statusPage;
|
|
47
|
+
const noResourcesText = data.noResourcesText || "";
|
|
48
|
+
// Empty when the page lists none: the default messages test for that.
|
|
49
|
+
const resourcesAffectedHtml = StatusPageResourceUtil.getResourcesGroupedByGroupName(data.resources);
|
|
50
|
+
const resourcesAffectedPlainText = StatusPageResourceUtil.getResourcesGroupedByGroupNameAsPlainText(data.resources);
|
|
51
|
+
const timezones = statusPage.subscriberTimezones || [];
|
|
52
|
+
// The values that read the same on every channel.
|
|
53
|
+
const shared = Object.assign({ statusPageName: IncidentTemplateVariableBuilder.getStatusPageName(statusPage), statusPageUrl: data.statusPageUrl, detailsUrl: data.detailsUrl, incidentTitle: this.incident.title || "", incidentSeverity: ((_a = this.incident.incidentSeverity) === null || _a === void 0 ? void 0 : _a.name) || " - ", incidentLabels: this.incidentLabels, affectedStatusPages: this.affectedStatusPages }, this.textVariables);
|
|
54
|
+
const emailBody = Object.assign(Object.assign({}, shared), { resourcesAffected: SafeHtml.fromTrustedHtml(resourcesAffectedHtml || SafeHtml.escape(noResourcesText)) });
|
|
55
|
+
const plainText = Object.assign(Object.assign({}, shared), { resourcesAffected: resourcesAffectedPlainText || noResourcesText });
|
|
56
|
+
const markdown = Object.assign(Object.assign({}, shared), { resourcesAffected: resourcesAffectedPlainText || noResourcesText });
|
|
57
|
+
for (const [name, value] of Object.entries(this.markdownVariables)) {
|
|
58
|
+
emailBody[name] = SafeHtml.fromTrustedHtml(value.html);
|
|
59
|
+
plainText[name] = value.plainText;
|
|
60
|
+
markdown[name] = value.source;
|
|
61
|
+
}
|
|
62
|
+
const customFieldRows = [];
|
|
63
|
+
const customFieldsMarkdownLines = [];
|
|
64
|
+
for (const field of this.customFields) {
|
|
65
|
+
const formatted = this.formatValue(field, timezones);
|
|
66
|
+
if (field.variableKey) {
|
|
67
|
+
const variableName = getCustomFieldTemplateVariableName(field.variableKey);
|
|
68
|
+
emailBody[variableName] = formatted.html || formatted.plainText;
|
|
69
|
+
plainText[variableName] = formatted.plainText;
|
|
70
|
+
markdown[variableName] = formatted.markdown;
|
|
71
|
+
}
|
|
72
|
+
if (!field.isIncludedInSubscriberNotifications || !field.hasValue) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
customFieldRows.push(formatted.html
|
|
76
|
+
? { title: field.name, renderedHtml: formatted.html.toHtml() }
|
|
77
|
+
: { title: field.name, plainText: formatted.plainText });
|
|
78
|
+
customFieldsMarkdownLines.push(field.customFieldType === CustomFieldType.Markdown ||
|
|
79
|
+
field.customFieldType === CustomFieldType.LongText
|
|
80
|
+
? `**${field.name}:**\n${formatted.markdown}`
|
|
81
|
+
: `**${field.name}:** ${formatted.markdown}`);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
emailBody: emailBody,
|
|
85
|
+
plainText: plainText,
|
|
86
|
+
markdown: markdown,
|
|
87
|
+
resourcesAffectedHtml: resourcesAffectedHtml,
|
|
88
|
+
resourcesAffectedPlainText: resourcesAffectedPlainText,
|
|
89
|
+
customFieldRows: customFieldRows,
|
|
90
|
+
customFieldsMarkdownLines: customFieldsMarkdownLines,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/*
|
|
94
|
+
* One of the event's Markdown values (markdownVariables), in its three
|
|
95
|
+
* forms, for a default template: "" in each when it has none.
|
|
96
|
+
*/
|
|
97
|
+
getMarkdownVariable(name) {
|
|
98
|
+
return (this.markdownVariables[name] || { source: "", html: "", plainText: "" });
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A default message is about to go out on a channel that carries the
|
|
102
|
+
* included fields: the default email, Slack or Teams message, or a
|
|
103
|
+
* webhook. Awaited before the message is sent: the first time, it makes
|
|
104
|
+
* the included Rich text fields' images public, so the recipient can load
|
|
105
|
+
* them. Never throws.
|
|
106
|
+
*/
|
|
107
|
+
async recordIncludedFieldsSent() {
|
|
108
|
+
if (!this.includedFieldsPublished) {
|
|
109
|
+
this.includedFieldsSent = true;
|
|
110
|
+
this.includedFieldsPublished = (async () => {
|
|
111
|
+
for (const field of this.customFields) {
|
|
112
|
+
if (field.isIncludedInSubscriberNotifications && field.hasValue) {
|
|
113
|
+
await this.publishImages(field);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
})();
|
|
117
|
+
}
|
|
118
|
+
await this.includedFieldsPublished;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A message is about to go out through these custom templates - the ones
|
|
122
|
+
* actually compiled into it. Awaited before the message is sent: it makes
|
|
123
|
+
* the images of the Rich text fields they place ({{customFields.<key>}})
|
|
124
|
+
* public, each field once per send. Never throws.
|
|
125
|
+
*/
|
|
126
|
+
async recordFieldsUsedBy(templates) {
|
|
127
|
+
const keys = IncidentTemplateVariables.getKeysUsedBy(templates);
|
|
128
|
+
for (const key of keys) {
|
|
129
|
+
this.fieldKeysSent.add(key);
|
|
130
|
+
}
|
|
131
|
+
for (const field of this.customFields) {
|
|
132
|
+
if (field.variableKey && keys.has(field.variableKey) && field.hasValue) {
|
|
133
|
+
await this.publishImages(field);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The custom field values this send put into a message, as Markdown for
|
|
139
|
+
* the incident feed's "Subscriber Notification Sent" item, or "" when it
|
|
140
|
+
* sent none. Fields with no value are left out.
|
|
141
|
+
*/
|
|
142
|
+
getSentCustomFieldsMarkdown() {
|
|
143
|
+
var _a;
|
|
144
|
+
const sent = this.customFields.filter((field) => {
|
|
145
|
+
if (!field.hasValue) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return ((this.includedFieldsSent &&
|
|
149
|
+
field.isIncludedInSubscriberNotifications) ||
|
|
150
|
+
Boolean(field.variableKey && this.fieldKeysSent.has(field.variableKey)));
|
|
151
|
+
});
|
|
152
|
+
if (sent.length === 0) {
|
|
153
|
+
return "";
|
|
154
|
+
}
|
|
155
|
+
const listLines = [];
|
|
156
|
+
const richTextBlocks = [];
|
|
157
|
+
for (const field of sent) {
|
|
158
|
+
const name = escapeMarkdownInline(field.name);
|
|
159
|
+
// Rich text is Markdown already, and goes in as the block it is.
|
|
160
|
+
if (field.customFieldType === CustomFieldType.Markdown) {
|
|
161
|
+
richTextBlocks.push(`**${name}:**\n\n${((_a = field.markdown) === null || _a === void 0 ? void 0 : _a.source) || ""}`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const value = this.formatValue(field, [
|
|
165
|
+
Timezone.UTC,
|
|
166
|
+
]);
|
|
167
|
+
listLines.push(`- **${name}:** ${escapeMarkdownInline(value.plainText)}`);
|
|
168
|
+
}
|
|
169
|
+
return ["**Custom fields sent:**", listLines.join("\n"), ...richTextBlocks]
|
|
170
|
+
.filter(Boolean)
|
|
171
|
+
.join("\n\n");
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The included fields for a webhook's data, by Template Variable key:
|
|
175
|
+
* each field's name, type and value as stored (null when it holds none),
|
|
176
|
+
* so an integration reads typed values under keys that survive a rename.
|
|
177
|
+
*/
|
|
178
|
+
getWebhookCustomFields() {
|
|
179
|
+
const customFields = {};
|
|
180
|
+
for (const field of this.customFields) {
|
|
181
|
+
if (!field.isIncludedInSubscriberNotifications || !field.variableKey) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
customFields[field.variableKey] = {
|
|
185
|
+
name: field.name,
|
|
186
|
+
type: field.customFieldType || null,
|
|
187
|
+
value: field.hasValue ? field.value : null,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return customFields;
|
|
191
|
+
}
|
|
192
|
+
async publishImages(field) {
|
|
193
|
+
var _a;
|
|
194
|
+
if (!field.markdown || !field.markdown.source) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
let published = this.publishedImageFields.get(field.name);
|
|
198
|
+
if (!published) {
|
|
199
|
+
// Never rejects: syncIsPublicForMarkdownImages logs and swallows.
|
|
200
|
+
published = Promise.resolve(syncIsPublicForMarkdownImages(field.markdown.source, true, `incident ${((_a = this.incident.id) === null || _a === void 0 ? void 0 : _a.toString()) || ""} custom field "${field.name}"`));
|
|
201
|
+
this.publishedImageFields.set(field.name, published);
|
|
202
|
+
}
|
|
203
|
+
await published;
|
|
204
|
+
}
|
|
205
|
+
formatValue(field, timezones) {
|
|
206
|
+
if (!field.hasValue) {
|
|
207
|
+
return { plainText: "", markdown: "", html: null };
|
|
208
|
+
}
|
|
209
|
+
const value = field.value;
|
|
210
|
+
switch (field.customFieldType) {
|
|
211
|
+
case CustomFieldType.Markdown: {
|
|
212
|
+
const rendered = field.markdown || { source: "", html: "", plainText: "" };
|
|
213
|
+
return {
|
|
214
|
+
plainText: rendered.plainText,
|
|
215
|
+
markdown: rendered.source,
|
|
216
|
+
html: SafeHtml.fromTrustedHtml(rendered.html),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Several lines of plain text: escaped, with its line breaks kept.
|
|
220
|
+
case CustomFieldType.LongText: {
|
|
221
|
+
const text = customFieldValueToText(value);
|
|
222
|
+
return {
|
|
223
|
+
plainText: text,
|
|
224
|
+
markdown: text,
|
|
225
|
+
html: SafeHtml.fromTrustedHtml(SafeHtml.escape(text).replace(LINE_BREAK_PATTERN, "<br/>")),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case CustomFieldType.Boolean: {
|
|
229
|
+
const text = formatCustomFieldBoolean(value);
|
|
230
|
+
return { plainText: text, markdown: text, html: null };
|
|
231
|
+
}
|
|
232
|
+
/*
|
|
233
|
+
* The day that was picked. It is stored as the author's local
|
|
234
|
+
* midnight, not as the day (see formatCustomFieldCalendarDate), so it
|
|
235
|
+
* is not read in the page's time zones: those are the subscribers',
|
|
236
|
+
* not the author's.
|
|
237
|
+
*/
|
|
238
|
+
case CustomFieldType.Date: {
|
|
239
|
+
const text = formatCustomFieldCalendarDate(value);
|
|
240
|
+
return { plainText: text, markdown: text, html: null };
|
|
241
|
+
}
|
|
242
|
+
/*
|
|
243
|
+
* A date and time in the status page's subscriber time zones, as its
|
|
244
|
+
* scheduled maintenance emails show one: a line each in HTML, and
|
|
245
|
+
* separated by commas in text.
|
|
246
|
+
*/
|
|
247
|
+
case CustomFieldType.DateTime: {
|
|
248
|
+
const date = customFieldValueToDate(value);
|
|
249
|
+
if (!date) {
|
|
250
|
+
const text = customFieldValueToText(value);
|
|
251
|
+
return { plainText: text, markdown: text, html: null };
|
|
252
|
+
}
|
|
253
|
+
const lines = OneUptimeDate.getDateAsFormattedArrayInMultipleTimezones({
|
|
254
|
+
date: date,
|
|
255
|
+
timezones: timezones,
|
|
256
|
+
use12HourFormat: true,
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
plainText: lines.join(", "),
|
|
260
|
+
markdown: lines.join(", "),
|
|
261
|
+
html: SafeHtml.fromTrustedHtml(lines
|
|
262
|
+
.map((line) => {
|
|
263
|
+
return SafeHtml.escape(line);
|
|
264
|
+
})
|
|
265
|
+
.join("<br/>")),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
default: {
|
|
269
|
+
const text = customFieldValueToText(value);
|
|
270
|
+
return { plainText: text, markdown: text, html: null };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/*
|
|
275
|
+
* The custom field keys these templates place, {{customFields.<key>}},
|
|
276
|
+
* found the way the compiler finds the placeholders it fills.
|
|
277
|
+
*/
|
|
278
|
+
static getKeysUsedBy(templates) {
|
|
279
|
+
const keys = new Set();
|
|
280
|
+
const prefix = getCustomFieldTemplateVariableName("");
|
|
281
|
+
for (const name of SubscriberNotificationTemplateCompiler.getPlaceholderNames(templates)) {
|
|
282
|
+
if (name.startsWith(prefix)) {
|
|
283
|
+
keys.add(name.slice(prefix.length));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return keys;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
export default class IncidentTemplateVariableBuilder {
|
|
290
|
+
/**
|
|
291
|
+
* Reads what an incident's subscriber messages need, once per send.
|
|
292
|
+
*
|
|
293
|
+
* The incident needs projectId, title, incidentSeverity.name, labels.name
|
|
294
|
+
* and customFields selected. statusPages are the pages the send reaches
|
|
295
|
+
* (IncidentStatusPageScope), and name {{affectedStatusPages}}.
|
|
296
|
+
* markdownVariables are the event's Markdown values - the description, a
|
|
297
|
+
* note, the postmortem - rendered here once for every page;
|
|
298
|
+
* textVariables are its plain ones, such as incidentState and postedAt.
|
|
299
|
+
*
|
|
300
|
+
* customFieldDefinitions skips reading the project's incident custom
|
|
301
|
+
* fields, for a caller that has them already.
|
|
302
|
+
*/
|
|
303
|
+
static async build(data) {
|
|
304
|
+
const incident = data.incident;
|
|
305
|
+
const definitions = data.customFieldDefinitions ||
|
|
306
|
+
(await this.getCustomFieldDefinitions(incident.projectId));
|
|
307
|
+
const customFields = await this.prepareCustomFields({
|
|
308
|
+
definitions: definitions,
|
|
309
|
+
values: incident.customFields,
|
|
310
|
+
});
|
|
311
|
+
const markdownVariables = {};
|
|
312
|
+
for (const [name, source] of Object.entries(data.markdownVariables || {})) {
|
|
313
|
+
markdownVariables[name] = await this.renderMarkdown(source || "");
|
|
314
|
+
}
|
|
315
|
+
/*
|
|
316
|
+
* No image is made public here: nothing has gone out yet, and a send may
|
|
317
|
+
* reach no one (see recordIncludedFieldsSent).
|
|
318
|
+
*/
|
|
319
|
+
return new IncidentTemplateVariables({
|
|
320
|
+
incident: incident,
|
|
321
|
+
customFields: customFields,
|
|
322
|
+
textVariables: Object.assign({}, (data.textVariables || {})),
|
|
323
|
+
markdownVariables: markdownVariables,
|
|
324
|
+
incidentLabels: this.getLabelNames(incident.labels).join(", "),
|
|
325
|
+
affectedStatusPages: this.getAffectedStatusPageNames(data.statusPages).join(", "),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/*
|
|
329
|
+
* The name a status page goes by in its subscribers' messages: its page
|
|
330
|
+
* title, or its name.
|
|
331
|
+
*/
|
|
332
|
+
static getStatusPageName(statusPage) {
|
|
333
|
+
return statusPage.pageTitle || statusPage.name || "Status Page";
|
|
334
|
+
}
|
|
335
|
+
/*
|
|
336
|
+
* The pages that show the incident, by the name their subscribers know
|
|
337
|
+
* them by, in the order given (name order, from IncidentStatusPageScope).
|
|
338
|
+
* A page that does not show incidents is left out: the incident is not on
|
|
339
|
+
* it.
|
|
340
|
+
*/
|
|
341
|
+
static getAffectedStatusPageNames(statusPages) {
|
|
342
|
+
const names = [];
|
|
343
|
+
for (const statusPage of statusPages) {
|
|
344
|
+
if (statusPage.showIncidentsOnStatusPage === false) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
const name = this.getStatusPageName(statusPage).trim();
|
|
348
|
+
if (name && !names.includes(name)) {
|
|
349
|
+
names.push(name);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return names;
|
|
353
|
+
}
|
|
354
|
+
// Label names, alphabetically, so the order does not depend on a join.
|
|
355
|
+
static getLabelNames(labels) {
|
|
356
|
+
return (labels || [])
|
|
357
|
+
.map((label) => {
|
|
358
|
+
return (label.name || "").trim();
|
|
359
|
+
})
|
|
360
|
+
.filter((name) => {
|
|
361
|
+
return name.length > 0;
|
|
362
|
+
})
|
|
363
|
+
.sort((a, b) => {
|
|
364
|
+
return a.localeCompare(b, undefined, { sensitivity: "base" });
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
// The project's incident custom fields, in the order they are shown.
|
|
368
|
+
static async getCustomFieldDefinitions(projectId) {
|
|
369
|
+
if (!projectId) {
|
|
370
|
+
return [];
|
|
371
|
+
}
|
|
372
|
+
const fields = await IncidentCustomFieldService.findBy({
|
|
373
|
+
query: {
|
|
374
|
+
projectId: projectId,
|
|
375
|
+
},
|
|
376
|
+
select: {
|
|
377
|
+
name: true,
|
|
378
|
+
variableKey: true,
|
|
379
|
+
customFieldType: true,
|
|
380
|
+
includeInSubscriberNotifications: true,
|
|
381
|
+
sortOrder: true,
|
|
382
|
+
},
|
|
383
|
+
// Creation order breaks ties in the order below.
|
|
384
|
+
sort: {
|
|
385
|
+
createdAt: SortOrder.Ascending,
|
|
386
|
+
},
|
|
387
|
+
limit: LIMIT_PER_PROJECT,
|
|
388
|
+
skip: 0,
|
|
389
|
+
props: {
|
|
390
|
+
isRoot: true,
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
return fields;
|
|
394
|
+
}
|
|
395
|
+
static async prepareCustomFields(data) {
|
|
396
|
+
// Values are stored under each field's name.
|
|
397
|
+
const values = data.values &&
|
|
398
|
+
typeof data.values === "object" &&
|
|
399
|
+
!Array.isArray(data.values)
|
|
400
|
+
? data.values
|
|
401
|
+
: {};
|
|
402
|
+
const prepared = [];
|
|
403
|
+
const seenNames = new Set();
|
|
404
|
+
for (const definition of sortCustomFieldDefinitions(data.definitions)) {
|
|
405
|
+
const name = typeof definition.name === "string" ? definition.name : "";
|
|
406
|
+
if (!name || seenNames.has(name)) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
seenNames.add(name);
|
|
410
|
+
const variableKey = isValidCustomFieldVariableKey(definition.variableKey)
|
|
411
|
+
? definition.variableKey
|
|
412
|
+
: null;
|
|
413
|
+
const value = Object.prototype.hasOwnProperty.call(values, name)
|
|
414
|
+
? values[name]
|
|
415
|
+
: undefined;
|
|
416
|
+
/*
|
|
417
|
+
* 0 and false are values (a Boolean left at No, a count of zero); an
|
|
418
|
+
* answer of only spaces is not, and would show a subscriber a row
|
|
419
|
+
* with nothing in it.
|
|
420
|
+
*/
|
|
421
|
+
const hasValue = !isCustomFieldValueEmpty(value) &&
|
|
422
|
+
!(typeof value === "string" && value.trim().length === 0);
|
|
423
|
+
const field = {
|
|
424
|
+
name: name,
|
|
425
|
+
variableKey: variableKey,
|
|
426
|
+
customFieldType: definition.customFieldType || undefined,
|
|
427
|
+
isIncludedInSubscriberNotifications: definition.includeInSubscriberNotifications === true,
|
|
428
|
+
value: value,
|
|
429
|
+
hasValue: hasValue,
|
|
430
|
+
};
|
|
431
|
+
if (hasValue && field.customFieldType === CustomFieldType.Markdown) {
|
|
432
|
+
field.markdown = await this.renderMarkdown(customFieldValueToText(value));
|
|
433
|
+
}
|
|
434
|
+
prepared.push(field);
|
|
435
|
+
}
|
|
436
|
+
return prepared;
|
|
437
|
+
}
|
|
438
|
+
/*
|
|
439
|
+
* Markdown in the three forms the channels take: HTML through the email
|
|
440
|
+
* renderer (which escapes raw HTML and keeps only safe links), plain text,
|
|
441
|
+
* and the source as written.
|
|
442
|
+
*/
|
|
443
|
+
static async renderMarkdown(source) {
|
|
444
|
+
return {
|
|
445
|
+
source: source,
|
|
446
|
+
html: await Markdown.convertToHTML(source, MarkdownContentType.Email),
|
|
447
|
+
plainText: Markdown.convertToPlainText(source),
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=IncidentTemplateVariableBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentTemplateVariableBuilder.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Why a status page that lists an incident's monitors does not reach it (see
|
|
3
|
+
* IncidentStatusPageScope). Kept on its own so the delivery record can name
|
|
4
|
+
* the reason without loading the services the scope helper queries.
|
|
5
|
+
*/
|
|
6
|
+
export var StatusPageExclusionReason;
|
|
7
|
+
(function (StatusPageExclusionReason) {
|
|
8
|
+
// The incident is limited to other status pages.
|
|
9
|
+
StatusPageExclusionReason["OutsideIncidentScope"] = "OutsideIncidentScope";
|
|
10
|
+
// The page only shows incidents limited to it, and this one is not.
|
|
11
|
+
StatusPageExclusionReason["OnlyShowsScopedIncidents"] = "OnlyShowsScopedIncidents";
|
|
12
|
+
})(StatusPageExclusionReason || (StatusPageExclusionReason = {}));
|
|
13
|
+
//# sourceMappingURL=StatusPageExclusion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusPageExclusion.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/StatusPageExclusion.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAN,IAAY,yBAKX;AALD,WAAY,yBAAyB;IACnC,iDAAiD;IACjD,0EAA6C,CAAA;IAC7C,oEAAoE;IACpE,kFAAqD,CAAA;AACvD,CAAC,EALW,yBAAyB,KAAzB,yBAAyB,QAKpC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import LIMIT_MAX from "../../../Types/Database/LimitMax";
|
|
2
|
+
import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
|
|
3
|
+
import IncidentScopeAddedPagesNotification from "../../../Types/StatusPage/IncidentScopeAddedPagesNotification";
|
|
4
|
+
import StatusPageService from "../../Services/StatusPageService";
|
|
5
|
+
import QueryHelper from "../../Types/Database/QueryHelper";
|
|
6
|
+
/*
|
|
7
|
+
* Which status pages a caller may pick for an incident or an incident
|
|
8
|
+
* template to be limited to.
|
|
9
|
+
*
|
|
10
|
+
* Limiting an incident to a status page decides who is told about it, so
|
|
11
|
+
* picking a page needs read access to it - the way picking an incident's
|
|
12
|
+
* monitors needs monitor read access. Incident roles do not read status
|
|
13
|
+
* pages, and status page access can be limited to pages with some labels, so
|
|
14
|
+
* someone who may edit an incident may still be unable to see some (or all)
|
|
15
|
+
* of the project's status pages. The dashboard's picker only lists the pages
|
|
16
|
+
* the person can read; this is the same rule for the API, so an incident
|
|
17
|
+
* member cannot reach a page they were deliberately not given through a
|
|
18
|
+
* hand-written request.
|
|
19
|
+
*
|
|
20
|
+
* Only pages being added are checked. Pages an incident or template is
|
|
21
|
+
* already limited to stay, even when the person saving cannot read them
|
|
22
|
+
* (IncidentService keeps them on every edit).
|
|
23
|
+
*/
|
|
24
|
+
export default class StatusPageReadAccess {
|
|
25
|
+
/*
|
|
26
|
+
* Which of these status pages the caller can read, through the status page
|
|
27
|
+
* permissions and labels they actually hold, lower-cased. A caller with no
|
|
28
|
+
* status page read access at all can read none of them.
|
|
29
|
+
*/
|
|
30
|
+
static async getReadableStatusPageIds(data) {
|
|
31
|
+
const statusPageIds = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.statusPageIds);
|
|
32
|
+
if (statusPageIds.length === 0) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
if (data.props.isRoot) {
|
|
36
|
+
return statusPageIds;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const statusPages = await StatusPageService.findBy({
|
|
40
|
+
query: {
|
|
41
|
+
_id: QueryHelper.any(statusPageIds),
|
|
42
|
+
},
|
|
43
|
+
select: {
|
|
44
|
+
_id: true,
|
|
45
|
+
},
|
|
46
|
+
limit: LIMIT_MAX,
|
|
47
|
+
skip: 0,
|
|
48
|
+
props: data.props,
|
|
49
|
+
});
|
|
50
|
+
return IncidentScopeAddedPagesNotification.normalizeStatusPageIds(statusPages);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof NotAuthorizedException) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
* Refuses status pages the caller cannot read. `allowedStatusPageIds` are
|
|
61
|
+
* pages the caller may pick without reading them - an incident template's
|
|
62
|
+
* pages, which a project admin chose for everyone who declares from it.
|
|
63
|
+
* Root (internal) callers pick any page.
|
|
64
|
+
*/
|
|
65
|
+
static async assertCallerCanPickStatusPages(data) {
|
|
66
|
+
if (data.props.isRoot) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const allowed = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.allowedStatusPageIds || []);
|
|
70
|
+
const toCheck = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.statusPageIds).filter((id) => {
|
|
71
|
+
return !allowed.includes(id);
|
|
72
|
+
});
|
|
73
|
+
if (toCheck.length === 0) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const readable = await this.getReadableStatusPageIds({
|
|
77
|
+
statusPageIds: toCheck,
|
|
78
|
+
props: data.props,
|
|
79
|
+
});
|
|
80
|
+
const unreadable = toCheck.filter((id) => {
|
|
81
|
+
return !readable.includes(id);
|
|
82
|
+
});
|
|
83
|
+
if (unreadable.length > 0) {
|
|
84
|
+
throw new NotAuthorizedException(this.getRefusalMessage(data.subject));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
static getRefusalMessage(subject) {
|
|
88
|
+
return `You do not have access to some of the status pages you picked, so this ${subject} cannot be limited to them. Picking status pages needs a role that can read them, such as Status Page Viewer (it can be limited to pages with certain labels).`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=StatusPageReadAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusPageReadAccess.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/StatusPageReadAccess.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,kCAAkC,CAAC;AACzD,OAAO,sBAAsB,MAAM,iDAAiD,CAAC;AACrF,OAAO,mCAAmC,MAAM,+DAA+D,CAAC;AAChH,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AACjE,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAG5C;QACC,MAAM,aAAa,GACjB,mCAAmC,CAAC,sBAAsB,CACxD,IAAI,CAAC,aAAa,CACnB,CAAC;QAEJ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAsB,MAAM,iBAAiB,CAAC,MAAM,CAAC;gBACpE,KAAK,EAAE;oBACL,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;iBACpC;gBACD,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI;iBACV;gBACD,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,OAAO,mCAAmC,CAAC,sBAAsB,CAC/D,WAAW,CACZ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,IAMlD;QACC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GACX,mCAAmC,CAAC,sBAAsB,CACxD,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAChC,CAAC;QAEJ,MAAM,OAAO,GACX,mCAAmC,CAAC,sBAAsB,CACxD,IAAI,CAAC,aAAa,CACnB,CAAC,MAAM,CAAC,CAAC,EAAU,EAAW,EAAE;YAC/B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEL,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAkB,MAAM,IAAI,CAAC,wBAAwB,CAAC;YAClE,aAAa,EAAE,OAAO;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAkB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAU,EAAW,EAAE;YACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,OAAe;QAC7C,OAAO,0EAA0E,OAAO,gKAAgK,CAAC;IAC3P,CAAC;CACF"}
|