@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.
Files changed (556) hide show
  1. package/Models/DatabaseModels/Incident.ts +267 -1
  2. package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
  3. package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
  4. package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
  5. package/Models/DatabaseModels/InventoryItem.ts +23 -12
  6. package/Models/DatabaseModels/StatusPage.ts +55 -0
  7. package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
  8. package/Server/API/IncidentAPI.ts +162 -0
  9. package/Server/API/StatusPageAPI.ts +487 -171
  10. package/Server/API/StatusPageSubscriberAPI.ts +63 -15
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
  20. package/Server/Infrastructure/Semaphore.ts +10 -0
  21. package/Server/Middleware/IdentityRateLimit.ts +108 -3
  22. package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
  23. package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
  24. package/Server/Services/AlertService.ts +32 -36
  25. package/Server/Services/DatabaseService.ts +93 -10
  26. package/Server/Services/IncidentAlertService.ts +609 -2
  27. package/Server/Services/IncidentCustomFieldService.ts +276 -1
  28. package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
  29. package/Server/Services/IncidentEpisodeService.ts +15 -0
  30. package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
  31. package/Server/Services/IncidentPublicNoteService.ts +30 -1
  32. package/Server/Services/IncidentService.ts +1663 -103
  33. package/Server/Services/IncidentStateTimelineService.ts +13 -0
  34. package/Server/Services/IncidentTemplateService.ts +109 -0
  35. package/Server/Services/InventoryItemService.ts +38 -0
  36. package/Server/Services/IoTDeviceCredentialService.ts +13 -4
  37. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
  38. package/Server/Services/ScheduledMaintenanceService.ts +118 -64
  39. package/Server/Services/SmsService.ts +10 -0
  40. package/Server/Services/StatusPageService.ts +65 -8
  41. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
  42. package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
  43. package/Server/Services/StatusPageSubscriberService.ts +1161 -64
  44. package/Server/Services/UserNotificationRuleService.ts +55 -53
  45. package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
  46. package/Server/Types/Markdown.ts +153 -6
  47. package/Server/Types/Workflow/Components/Email.ts +61 -2
  48. package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
  49. package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
  50. package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
  51. package/Server/Utils/DataSource/EgressGuard.ts +66 -21
  52. package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
  53. package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
  54. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
  55. package/Server/Utils/Response.ts +31 -0
  56. package/Server/Utils/SSRFProtection.ts +76 -16
  57. package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
  58. package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
  59. package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
  60. package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
  61. package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
  62. package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
  63. package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
  64. package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
  65. package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
  66. package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
  67. package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
  68. package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
  69. package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
  70. package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
  71. package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
  72. package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
  73. package/Server/Utils/StatusPageResource.ts +51 -20
  74. package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
  75. package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
  76. package/Server/Utils/Topology/TopologyRequest.ts +463 -0
  77. package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
  78. package/Server/Utils/Topology/TopologySql.ts +1024 -0
  79. package/Server/Utils/VM/VMAPI.ts +1 -0
  80. package/Server/Utils/VM/VMRunner.ts +10 -0
  81. package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
  82. package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
  83. package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
  84. package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
  85. package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
  86. package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
  87. package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
  88. package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
  89. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
  90. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
  91. package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
  92. package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
  93. package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
  94. package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
  95. package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
  96. package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
  97. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
  98. package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
  99. package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
  100. package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
  101. package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
  102. package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
  103. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
  104. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
  105. package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
  106. package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
  107. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
  108. package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
  109. package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
  110. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
  111. package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
  112. package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
  113. package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
  114. package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
  115. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
  116. package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
  117. package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
  118. package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
  119. package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
  120. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
  121. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
  122. package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
  123. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
  124. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
  125. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
  126. package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
  127. package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
  128. package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
  129. package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
  130. package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
  131. package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
  132. package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
  133. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
  134. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
  135. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
  136. package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
  137. package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
  138. package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
  139. package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
  140. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
  141. package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
  142. package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
  143. package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
  144. package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
  145. package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
  146. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
  147. package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
  148. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
  149. package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
  151. package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
  152. package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
  153. package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
  154. package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
  155. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
  156. package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
  157. package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
  158. package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
  159. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
  160. package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
  161. package/Tests/Server/Services/DomainService.test.ts +525 -0
  162. package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
  163. package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
  164. package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
  165. package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
  166. package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
  167. package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
  168. package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
  169. package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
  170. package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
  171. package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
  172. package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
  173. package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
  174. package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
  175. package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
  176. package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
  177. package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
  178. package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
  179. package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
  180. package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
  181. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
  182. package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
  183. package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
  184. package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
  185. package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
  186. package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
  187. package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
  188. package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
  189. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
  190. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
  191. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
  192. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
  193. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
  194. package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
  195. package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
  196. package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
  197. package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
  198. package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
  199. package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
  200. package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
  201. package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
  202. package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
  203. package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
  204. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
  205. package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
  206. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
  207. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
  208. package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
  209. package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
  210. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
  211. package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
  212. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
  213. package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
  214. package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
  215. package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
  216. package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
  217. package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
  218. package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
  219. package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
  220. package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
  221. package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
  222. package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
  223. package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
  224. package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
  225. package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
  226. package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
  227. package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
  228. package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
  229. package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
  230. package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
  231. package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
  232. package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
  233. package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
  234. package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
  235. package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
  236. package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
  237. package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
  238. package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
  239. package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
  240. package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
  241. package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
  242. package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
  243. package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
  244. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
  245. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
  246. package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
  247. package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
  248. package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
  249. package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
  250. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
  251. package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
  252. package/Tests/Types/SafeHtml.test.ts +102 -0
  253. package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
  254. package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
  255. package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
  256. package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
  257. package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
  258. package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
  259. package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
  260. package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
  261. package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
  262. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
  263. package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
  264. package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
  265. package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
  266. package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
  267. package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
  268. package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
  269. package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
  270. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
  271. package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
  272. package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
  273. package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
  274. package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
  275. package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
  276. package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
  277. package/Types/CustomField/CustomFieldOrder.ts +55 -0
  278. package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
  279. package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
  280. package/Types/CustomField/CustomFieldType.ts +14 -0
  281. package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
  282. package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
  283. package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
  284. package/Types/Incident/IncidentAlertLink.ts +19 -0
  285. package/Types/SafeHtml.ts +93 -0
  286. package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
  287. package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
  288. package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
  289. package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
  290. package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
  291. package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
  292. package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
  293. package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
  294. package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
  295. package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
  296. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
  297. package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
  298. package/Types/Telemetry/InventoryLiveness.ts +26 -0
  299. package/Types/Topology/TopologyApi.ts +428 -0
  300. package/Types/Topology/TopologyTypeRules.ts +191 -0
  301. package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
  302. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
  303. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
  304. package/UI/Components/Forms/ModelForm.tsx +70 -8
  305. package/UI/Components/Forms/Validation.ts +1 -1
  306. package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
  307. package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
  308. package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
  309. package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
  310. package/UI/Components/ModelTable/ModelTable.tsx +6 -7
  311. package/UI/Utils/SensitiveUrlToken.ts +10 -5
  312. package/Utils/API.ts +247 -2
  313. package/Utils/Incident/IncidentFromAlerts.ts +78 -0
  314. package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
  315. package/Utils/Markdown/MarkdownEscape.ts +65 -0
  316. package/Utils/ProbeNetworkFailureUtil.ts +673 -0
  317. package/build/dist/Models/DatabaseModels/Incident.js +267 -1
  318. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
  320. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  321. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
  322. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  323. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
  324. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
  326. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
  328. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
  330. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  331. package/build/dist/Server/API/IncidentAPI.js +100 -1
  332. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  333. package/build/dist/Server/API/StatusPageAPI.js +417 -176
  334. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  335. package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
  336. package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
  353. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
  354. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  355. package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
  356. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  357. package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
  358. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  359. package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
  360. package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
  361. package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
  362. package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
  363. package/build/dist/Server/Services/AlertService.js +21 -33
  364. package/build/dist/Server/Services/AlertService.js.map +1 -1
  365. package/build/dist/Server/Services/DatabaseService.js +56 -7
  366. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  367. package/build/dist/Server/Services/IncidentAlertService.js +457 -3
  368. package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
  369. package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
  370. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  371. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
  372. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  373. package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
  374. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  375. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
  376. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
  377. package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
  378. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  379. package/build/dist/Server/Services/IncidentService.js +1148 -42
  380. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  381. package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
  382. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  383. package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
  384. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  385. package/build/dist/Server/Services/InventoryItemService.js +31 -0
  386. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  387. package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
  388. package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
  389. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
  390. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  391. package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
  392. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  393. package/build/dist/Server/Services/SmsService.js +2 -22
  394. package/build/dist/Server/Services/SmsService.js.map +1 -1
  395. package/build/dist/Server/Services/StatusPageService.js +47 -9
  396. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  397. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
  398. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  399. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
  400. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
  401. package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
  402. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  403. package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
  404. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  405. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
  406. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  407. package/build/dist/Server/Types/Markdown.js +110 -6
  408. package/build/dist/Server/Types/Markdown.js.map +1 -1
  409. package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
  410. package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
  411. package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
  412. package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
  413. package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
  414. package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
  415. package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
  416. package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
  417. package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
  418. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  419. package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
  420. package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
  421. package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
  422. package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
  423. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
  424. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  425. package/build/dist/Server/Utils/Response.js +30 -0
  426. package/build/dist/Server/Utils/Response.js.map +1 -1
  427. package/build/dist/Server/Utils/SSRFProtection.js +48 -6
  428. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  429. package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
  430. package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
  431. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
  432. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
  433. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
  434. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
  435. package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
  436. package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
  437. package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
  438. package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
  439. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
  440. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
  441. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
  442. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
  443. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
  444. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
  445. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
  446. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
  447. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
  448. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
  449. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
  450. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
  451. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
  452. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
  453. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
  454. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
  455. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
  456. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
  457. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
  458. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
  459. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
  460. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
  461. package/build/dist/Server/Utils/StatusPageResource.js +39 -7
  462. package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
  463. package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
  464. package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
  465. package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
  466. package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
  467. package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
  468. package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
  469. package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
  470. package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
  471. package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
  472. package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
  473. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  474. package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
  475. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  476. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
  477. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
  478. package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
  479. package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
  480. package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
  481. package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
  482. package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
  483. package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
  484. package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
  485. package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
  486. package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
  487. package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
  488. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
  489. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
  490. package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
  491. package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
  492. package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
  493. package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
  494. package/build/dist/Types/SafeHtml.js +84 -0
  495. package/build/dist/Types/SafeHtml.js.map +1 -0
  496. package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
  497. package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
  498. package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
  499. package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
  500. package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
  501. package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
  502. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
  503. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
  504. package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
  505. package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
  506. package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
  507. package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
  508. package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
  509. package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
  510. package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
  511. package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
  512. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
  513. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
  514. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
  515. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
  516. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
  517. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
  518. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
  519. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
  520. package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
  521. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
  522. package/build/dist/Types/Topology/TopologyApi.js +55 -0
  523. package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
  524. package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
  525. package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
  526. package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
  527. package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
  528. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
  529. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
  530. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
  531. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  532. package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
  533. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  534. package/build/dist/UI/Components/Forms/Validation.js +1 -1
  535. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  536. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  537. package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
  538. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
  539. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  540. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
  541. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  542. package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
  543. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  544. package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
  545. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
  546. package/build/dist/Utils/API.js +177 -1
  547. package/build/dist/Utils/API.js.map +1 -1
  548. package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
  549. package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
  550. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
  551. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
  552. package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
  553. package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
  554. package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
  555. package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
  556. package/package.json +1 -1
@@ -12,8 +12,10 @@ import BadDataException from "../../../../Types/Exception/BadDataException";
12
12
  import ComponentID from "../../../../Types/Workflow/ComponentID";
13
13
  import Components from "../../../../Types/Workflow/Components/Email";
14
14
  import nodemailer from "nodemailer";
15
+ import DataSourceEgressGuard from "../../../Utils/DataSource/EgressGuard";
16
+ import PinnedSmtpSocket from "../../../Utils/Mail/PinnedSmtpSocket";
15
17
  import CaptureSpan from "../../../Utils/Telemetry/CaptureSpan";
16
- export default class Email extends ComponentCode {
18
+ class Email extends ComponentCode {
17
19
  constructor() {
18
20
  super();
19
21
  const Component = Components.find((i) => {
@@ -25,7 +27,7 @@ export default class Email extends ComponentCode {
25
27
  this.setMetadata(Component);
26
28
  }
27
29
  async run(args, options) {
28
- var _a, _b, _c, _d, _e;
30
+ var _a, _b, _c, _d;
29
31
  const successPort = this.getMetadata().outPorts.find((p) => {
30
32
  return p.id === "success";
31
33
  });
@@ -81,10 +83,54 @@ export default class Email extends ComponentCode {
81
83
  executePort: errorPort,
82
84
  };
83
85
  }
86
+ const smtpHost = args["smtp-host"].toString().trim();
87
+ // "[fd00::25]" is how an IPv6 literal is usually written next to a port.
88
+ const bareSmtpHost = smtpHost.replace(/^\[|\]$/g, "");
89
+ const smtpPort = args["smtp-port"];
84
90
  try {
91
+ /*
92
+ * The SMTP host is free text typed into the workflow node by any
93
+ * project member who can edit workflows, and nodemailer's failures
94
+ * ("Invalid greeting. response=<banner>", refused vs timed out) come
95
+ * back through the Error port into the workflow log. Unchecked, this
96
+ * step is a port scanner with banner disclosure for whatever network
97
+ * the workflow worker runs in.
98
+ *
99
+ * Same guard and label as a project's own SMTP server in MailService,
100
+ * so the same policy: loopback, link-local and cloud metadata are
101
+ * refused everywhere; private ranges are refused on SaaS and allowed on
102
+ * self-hosted installs unless DATA_SOURCE_BLOCK_PRIVATE_ADDRESSES=true.
103
+ * A refusal is thrown inside this try, so it takes the Error port like
104
+ * any other failure to send, before a socket is opened.
105
+ */
106
+ const validatedAddresses = await DataSourceEgressGuard.assertHostnameAllowed(bareSmtpHost, {
107
+ targetLabel: "SMTP server",
108
+ });
85
109
  const smtpTransport = {
86
- host: (_c = args["smtp-host"]) === null || _c === void 0 ? void 0 : _c.toString(),
87
- port: args["smtp-port"],
110
+ /*
111
+ * nodemailer still needs the name the user typed: it is what TLS
112
+ * sends as SNI and checks the certificate against, on implicit TLS
113
+ * and on the STARTTLS upgrade alike. It is never dialed; see
114
+ * getSocket.
115
+ */
116
+ host: bareSmtpHost,
117
+ port: smtpPort,
118
+ /*
119
+ * Connect here, to the addresses just validated, and hand nodemailer
120
+ * the open socket. Given the name instead, nodemailer resolves it
121
+ * again on its own (dns.resolve4/6, then a process-wide five-minute
122
+ * cache), so a DNS answer that changed after the check would choose
123
+ * the address actually connected to.
124
+ */
125
+ getSocket: (_options, callback) => {
126
+ PinnedSmtpSocket.connect({
127
+ host: bareSmtpHost,
128
+ port: smtpPort,
129
+ addresses: validatedAddresses,
130
+ timeoutInMs: Email.CONNECTION_TIMEOUT_IN_MS,
131
+ onDone: callback,
132
+ });
133
+ },
88
134
  };
89
135
  if (args["secure"] === true ||
90
136
  args["secure"] === "true" ||
@@ -104,8 +150,8 @@ export default class Email extends ComponentCode {
104
150
  await mailer.sendMail({
105
151
  from: args["from"].toString(),
106
152
  to: args["to"].toString(),
107
- subject: ((_d = args["subject"]) === null || _d === void 0 ? void 0 : _d.toString()) || "",
108
- html: ((_e = args["email-body"]) === null || _e === void 0 ? void 0 : _e.toString()) || "",
153
+ subject: ((_c = args["subject"]) === null || _c === void 0 ? void 0 : _c.toString()) || "",
154
+ html: ((_d = args["email-body"]) === null || _d === void 0 ? void 0 : _d.toString()) || "",
109
155
  });
110
156
  options.log("Email sent.");
111
157
  return Promise.resolve({
@@ -125,6 +171,9 @@ export default class Email extends ComponentCode {
125
171
  }
126
172
  }
127
173
  }
174
+ // nodemailer's own default connection timeout.
175
+ Email.CONNECTION_TIMEOUT_IN_MS = 2 * 60 * 1000;
176
+ export default Email;
128
177
  __decorate([
129
178
  CaptureSpan(),
130
179
  __metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"Email.js","sourceRoot":"","sources":["../../../../../../Server/Types/Workflow/Components/Email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Email.js","sourceRoot":"","sources":["../../../../../../Server/Types/Workflow/Components/Email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,405 @@
1
+ import QueryHelper from "../../Types/Database/QueryHelper";
2
+ import Alert from "../../../Models/DatabaseModels/Alert";
3
+ import Incident from "../../../Models/DatabaseModels/Incident";
4
+ import ScheduledMaintenance from "../../../Models/DatabaseModels/ScheduledMaintenance";
5
+ import URL from "../../../Types/API/URL";
6
+ import { escapeMarkdownInline } from "../../../Utils/Markdown/MarkdownEscape";
7
+ import { getSloAffectedResourceMarkdownLines, } from "../../../Utils/Slo/SloAffectedResourceMarkdown";
8
+ /*
9
+ * What an incident, alert or scheduled maintenance event affects, for the
10
+ * text the server writes about it: the "Resources Affected" section of its
11
+ * feed items, the Resources Affected row of its emails, and the workspace
12
+ * summaries.
13
+ *
14
+ * The dashboard's Affected Resources cards (AffectedResourcesDisplay) list
15
+ * every relation the record carries - monitors, hosts, clusters, container
16
+ * hosts, databases, services, SLOs. The server used to name the monitors
17
+ * only, so an SLO burn-rate alert's card named its SLO while its on-call
18
+ * email read "Resources Affected: No resources identified", and an incident
19
+ * raised against a host named nothing at all. Every one of those writers now
20
+ * reads the list from here, so they name what the cards show.
21
+ *
22
+ * Reads run as root - an owner or on-call email has no user session behind
23
+ * it - and are held to the record's own project twice: the record is only
24
+ * read inside that project, and a related row of any other project is left
25
+ * out. The write hooks reject cross-project links now, but rows saved before
26
+ * that check existed may still hold one, and naming it would put another
27
+ * project's resource into this project's feed, Slack and email.
28
+ *
29
+ * The caller hands over the service to read with, and the dashboard URL to
30
+ * link from. Those services import this module, and the owner-notification
31
+ * workers' tests replace them wholesale; importing them here would drag the
32
+ * whole service graph into every one of those suites.
33
+ */
34
+ export var LinkedAffectedResourceType;
35
+ (function (LinkedAffectedResourceType) {
36
+ LinkedAffectedResourceType["Monitor"] = "Monitor";
37
+ LinkedAffectedResourceType["Host"] = "Host";
38
+ LinkedAffectedResourceType["KubernetesCluster"] = "KubernetesCluster";
39
+ LinkedAffectedResourceType["DockerHost"] = "DockerHost";
40
+ LinkedAffectedResourceType["PodmanHost"] = "PodmanHost";
41
+ LinkedAffectedResourceType["ProxmoxCluster"] = "ProxmoxCluster";
42
+ LinkedAffectedResourceType["VMwareVCenter"] = "VMwareVCenter";
43
+ LinkedAffectedResourceType["CephCluster"] = "CephCluster";
44
+ LinkedAffectedResourceType["DockerSwarmCluster"] = "DockerSwarmCluster";
45
+ LinkedAffectedResourceType["IoTFleet"] = "IoTFleet";
46
+ LinkedAffectedResourceType["DatabaseServer"] = "DatabaseServer";
47
+ LinkedAffectedResourceType["NetworkSite"] = "NetworkSite";
48
+ LinkedAffectedResourceType["Service"] = "Service";
49
+ LinkedAffectedResourceType["ServiceLevelObjective"] = "ServiceLevelObjective";
50
+ })(LinkedAffectedResourceType || (LinkedAffectedResourceType = {}));
51
+ /*
52
+ * The categories AffectedResourcesDisplay renders, in the order it renders
53
+ * them, so a feed item lists resources the way the cards beside it do. The
54
+ * routes are the ones each resource's own getXLinkInDashboard builds (a test
55
+ * pins every one that exists); IoT fleets and network sites have none on the
56
+ * server, so theirs follow the dashboard's RouteMap.
57
+ *
58
+ * An alert has a single `monitor`; incidents and scheduled maintenance events
59
+ * have `monitors`. Each record kind is read for the columns its model has.
60
+ */
61
+ export const LINKED_AFFECTED_RESOURCE_RELATIONS = [
62
+ {
63
+ column: "monitors",
64
+ type: LinkedAffectedResourceType.Monitor,
65
+ label: "Monitor",
66
+ dashboardRoute: "monitors",
67
+ },
68
+ {
69
+ column: "monitor",
70
+ type: LinkedAffectedResourceType.Monitor,
71
+ label: "Monitor",
72
+ dashboardRoute: "monitors",
73
+ },
74
+ {
75
+ column: "hosts",
76
+ type: LinkedAffectedResourceType.Host,
77
+ label: "Host",
78
+ dashboardRoute: "host",
79
+ },
80
+ {
81
+ column: "kubernetesClusters",
82
+ type: LinkedAffectedResourceType.KubernetesCluster,
83
+ label: "Kubernetes Cluster",
84
+ dashboardRoute: "kubernetes",
85
+ },
86
+ {
87
+ column: "dockerHosts",
88
+ type: LinkedAffectedResourceType.DockerHost,
89
+ label: "Docker Host",
90
+ dashboardRoute: "docker",
91
+ },
92
+ {
93
+ column: "podmanHosts",
94
+ type: LinkedAffectedResourceType.PodmanHost,
95
+ label: "Podman Host",
96
+ dashboardRoute: "podman",
97
+ },
98
+ {
99
+ column: "proxmoxClusters",
100
+ type: LinkedAffectedResourceType.ProxmoxCluster,
101
+ label: "Proxmox Cluster",
102
+ dashboardRoute: "proxmox",
103
+ },
104
+ {
105
+ column: "vmwareVCenters",
106
+ type: LinkedAffectedResourceType.VMwareVCenter,
107
+ label: "VMware vCenter",
108
+ dashboardRoute: "vmware",
109
+ },
110
+ {
111
+ column: "cephClusters",
112
+ type: LinkedAffectedResourceType.CephCluster,
113
+ label: "Ceph Cluster",
114
+ dashboardRoute: "ceph",
115
+ },
116
+ {
117
+ column: "dockerSwarmClusters",
118
+ type: LinkedAffectedResourceType.DockerSwarmCluster,
119
+ label: "Docker Swarm Cluster",
120
+ dashboardRoute: "docker-swarm",
121
+ },
122
+ {
123
+ column: "iotFleets",
124
+ type: LinkedAffectedResourceType.IoTFleet,
125
+ label: "IoT Fleet",
126
+ dashboardRoute: "iot",
127
+ },
128
+ {
129
+ column: "databaseServers",
130
+ type: LinkedAffectedResourceType.DatabaseServer,
131
+ label: "Database",
132
+ dashboardRoute: "databases",
133
+ },
134
+ {
135
+ column: "networkSites",
136
+ type: LinkedAffectedResourceType.NetworkSite,
137
+ label: "Network Site",
138
+ dashboardRoute: "network-sites/view",
139
+ },
140
+ {
141
+ column: "services",
142
+ type: LinkedAffectedResourceType.Service,
143
+ label: "Service",
144
+ dashboardRoute: "service",
145
+ },
146
+ /*
147
+ * Last, as on the cards: an SLO is the objective measured over the
148
+ * resources above it rather than one of them.
149
+ */
150
+ {
151
+ column: "serviceLevelObjectives",
152
+ type: LinkedAffectedResourceType.ServiceLevelObjective,
153
+ label: "SLO",
154
+ dashboardRoute: "slos",
155
+ },
156
+ ];
157
+ function isSameProject(projectId, expected) {
158
+ if (!projectId) {
159
+ return false;
160
+ }
161
+ return (projectId.toString().trim().toLowerCase() ===
162
+ expected.toString().trim().toLowerCase());
163
+ }
164
+ export default class LinkedAffectedResources {
165
+ // The relations `model` carries, in display order.
166
+ static getRelations(model) {
167
+ return LINKED_AFFECTED_RESOURCE_RELATIONS.filter((relation) => {
168
+ return model.hasColumn(relation.column);
169
+ });
170
+ }
171
+ static async readForIncident(data) {
172
+ return await LinkedAffectedResources.readForIncidents({
173
+ service: data.service,
174
+ projectId: data.projectId,
175
+ incidentIds: [data.incidentId],
176
+ });
177
+ }
178
+ static async readForIncidents(data) {
179
+ return await LinkedAffectedResources.read({
180
+ service: data.service,
181
+ model: new Incident(),
182
+ projectId: data.projectId,
183
+ recordIds: data.incidentIds,
184
+ });
185
+ }
186
+ static async readForAlert(data) {
187
+ return await LinkedAffectedResources.readForAlerts({
188
+ service: data.service,
189
+ projectId: data.projectId,
190
+ alertIds: [data.alertId],
191
+ });
192
+ }
193
+ static async readForAlerts(data) {
194
+ return await LinkedAffectedResources.read({
195
+ service: data.service,
196
+ model: new Alert(),
197
+ projectId: data.projectId,
198
+ recordIds: data.alertIds,
199
+ });
200
+ }
201
+ static async readForScheduledMaintenance(data) {
202
+ return await LinkedAffectedResources.read({
203
+ service: data.service,
204
+ model: new ScheduledMaintenance(),
205
+ projectId: data.projectId,
206
+ recordIds: [data.scheduledMaintenanceId],
207
+ });
208
+ }
209
+ /*
210
+ * The resources linked to any of `recordIds`, merged into one list.
211
+ *
212
+ * One query per relation rather than one query selecting them all: the
213
+ * relations are many-to-many, and joining a dozen of them at once returns
214
+ * the product of their sizes - an incident on 50 monitors and 50 hosts
215
+ * would come back as 2,500 rows. Read one at a time, the rows add up.
216
+ */
217
+ static async read(data) {
218
+ const recordIds = [];
219
+ const seenRecordIds = new Set();
220
+ for (const recordId of data.recordIds) {
221
+ const key = (recordId === null || recordId === void 0 ? void 0 : recordId.toString()) || "";
222
+ if (!key || seenRecordIds.has(key)) {
223
+ continue;
224
+ }
225
+ seenRecordIds.add(key);
226
+ recordIds.push(recordId);
227
+ }
228
+ if (recordIds.length === 0) {
229
+ return [];
230
+ }
231
+ const rowsPerRelation = await Promise.all(LinkedAffectedResources.getRelations(data.model).map((relation) => {
232
+ return data.service.findAllBy({
233
+ query: {
234
+ _id: QueryHelper.any(recordIds),
235
+ projectId: data.projectId,
236
+ },
237
+ select: {
238
+ _id: true,
239
+ projectId: true,
240
+ [relation.column]: {
241
+ _id: true,
242
+ name: true,
243
+ projectId: true,
244
+ },
245
+ },
246
+ props: {
247
+ isRoot: true,
248
+ },
249
+ });
250
+ }));
251
+ return LinkedAffectedResources.collect({
252
+ projectId: data.projectId,
253
+ records: rowsPerRelation.flatMap((rows) => {
254
+ return rows || [];
255
+ }),
256
+ });
257
+ }
258
+ /*
259
+ * The resources on already-read records, in display order and without
260
+ * repeats. A related row is kept only when it has an id and belongs to
261
+ * `projectId`; a row whose project was not read cannot be shown to belong
262
+ * here, so it is left out too - which also makes a caller that drops
263
+ * projectId from its select fail loudly in tests rather than quietly
264
+ * print nothing.
265
+ */
266
+ static collect(data) {
267
+ var _a, _b;
268
+ const resources = [];
269
+ const seen = new Set();
270
+ const records = data.records.filter((record) => {
271
+ if (!record) {
272
+ return false;
273
+ }
274
+ // A record read without its project is taken to be the caller's.
275
+ return (!record.projectId || isSameProject(record.projectId, data.projectId));
276
+ });
277
+ for (const relation of LINKED_AFFECTED_RESOURCE_RELATIONS) {
278
+ for (const record of records) {
279
+ const value = record[relation.column];
280
+ const rows = Array.isArray(value)
281
+ ? value
282
+ : value
283
+ ? [value]
284
+ : [];
285
+ for (const row of rows) {
286
+ const id = ((_a = row === null || row === void 0 ? void 0 : row._id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
287
+ if (!row || !id || !isSameProject(row.projectId, data.projectId)) {
288
+ continue;
289
+ }
290
+ const key = `${relation.type}:${id}`;
291
+ if (seen.has(key)) {
292
+ continue;
293
+ }
294
+ seen.add(key);
295
+ resources.push({
296
+ type: relation.type,
297
+ id: id,
298
+ name: ((_b = row.name) === null || _b === void 0 ? void 0 : _b.toString()) || "",
299
+ });
300
+ }
301
+ }
302
+ }
303
+ return resources;
304
+ }
305
+ /*
306
+ * The names, for plain-text surfaces: emails and workspace summaries.
307
+ *
308
+ * `seriesSummary` is an alert's series identity - the pod or container a
309
+ * grouped monitor raised it for (SeriesLabelDisplay.buildInlineSummary).
310
+ * It names what broke more precisely than the monitor does, so it takes
311
+ * the monitor's place at the head of the list rather than joining it.
312
+ *
313
+ * A name that repeats (a monitor and a host both called "web-01") is
314
+ * printed once: this is a sentence, not a table.
315
+ */
316
+ static getNames(data) {
317
+ var _a;
318
+ const names = [];
319
+ const seenNames = new Set();
320
+ const seriesSummary = ((_a = data.seriesSummary) === null || _a === void 0 ? void 0 : _a.trim()) || "";
321
+ const addName = (name) => {
322
+ const trimmed = name.trim();
323
+ if (!trimmed || seenNames.has(trimmed)) {
324
+ return;
325
+ }
326
+ seenNames.add(trimmed);
327
+ names.push(trimmed);
328
+ };
329
+ addName(seriesSummary);
330
+ for (const resource of data.resources) {
331
+ if (seriesSummary &&
332
+ resource.type === LinkedAffectedResourceType.Monitor) {
333
+ continue;
334
+ }
335
+ addName(resource.name);
336
+ }
337
+ return names;
338
+ }
339
+ // getNames joined with ", ", or `fallback` when there are none.
340
+ static getText(data) {
341
+ return (LinkedAffectedResources.getNames({
342
+ resources: data.resources,
343
+ seriesSummary: data.seriesSummary,
344
+ }).join(", ") || data.fallback);
345
+ }
346
+ static getDashboardUrl(data) {
347
+ const relation = LinkedAffectedResources.getRelationForType(data.resource.type);
348
+ // URL.addRoute mutates, and the caller reuses its dashboard URL.
349
+ return URL.fromString(data.dashboardUrl.toString()).addRoute(`/${data.projectId.toString()}/${relation.dashboardRoute}/${data.resource.id}`);
350
+ }
351
+ /*
352
+ * The bullets under a feed item's "🌎 Resources Affected" header.
353
+ *
354
+ * A monitor keeps the bullet the created feeds have always printed,
355
+ * `- [<name>](<monitor link>)`, and an SLO keeps `- [SLO <name>](<link>)`
356
+ * from getSloAffectedResourceMarkdownLines. Every other resource follows
357
+ * the SLO's shape, `- [Host <name>](<link>)`, so the reader can tell a host
358
+ * from a cluster from a service.
359
+ *
360
+ * Those names are escaped: feeds render without safe mode and the same
361
+ * markdown goes to Slack and Teams, and a host or cluster name can come
362
+ * from an agent rather than from someone typing it.
363
+ */
364
+ static getMarkdownLines(data) {
365
+ const lines = [];
366
+ const slos = [];
367
+ for (const resource of data.resources) {
368
+ if (resource.type === LinkedAffectedResourceType.ServiceLevelObjective) {
369
+ slos.push({
370
+ _id: resource.id,
371
+ name: resource.name,
372
+ // Already held to this project by collect.
373
+ projectId: data.projectId,
374
+ });
375
+ continue;
376
+ }
377
+ const link = LinkedAffectedResources.getDashboardUrl({
378
+ dashboardUrl: data.dashboardUrl,
379
+ projectId: data.projectId,
380
+ resource: resource,
381
+ }).toString();
382
+ if (resource.type === LinkedAffectedResourceType.Monitor) {
383
+ lines.push(`- [${resource.name}](${link})`);
384
+ continue;
385
+ }
386
+ const label = LinkedAffectedResources.getRelationForType(resource.type).label;
387
+ const escapedName = escapeMarkdownInline(resource.name).trim();
388
+ lines.push(`- [${escapedName ? `${label} ${escapedName}` : label}](${link})`);
389
+ }
390
+ // SLOs are last in the table, so appending them keeps the order.
391
+ lines.push(...getSloAffectedResourceMarkdownLines({
392
+ dashboardUrl: data.dashboardUrl,
393
+ projectId: data.projectId,
394
+ serviceLevelObjectives: slos,
395
+ }));
396
+ return lines;
397
+ }
398
+ static getRelationForType(type) {
399
+ // Every type has at least one entry, so this always finds one.
400
+ return LINKED_AFFECTED_RESOURCE_RELATIONS.find((relation) => {
401
+ return relation.type === type;
402
+ });
403
+ }
404
+ }
405
+ //# sourceMappingURL=LinkedAffectedResources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedAffectedResources.js","sourceRoot":"","sources":["../../../../../Server/Utils/AffectedResources/LinkedAffectedResources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import Alert from "../../../Models/DatabaseModels/Alert";
11
+ import AlertStateTimeline from "../../../Models/DatabaseModels/AlertStateTimeline";
12
+ import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
13
+ import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
14
+ import ObjectID from "../../../Types/ObjectID";
15
+ import AlertService from "../../Services/AlertService";
16
+ import ModelPermission from "../../Types/Database/Permissions/Index";
17
+ import QueryHelper from "../../Types/Database/QueryHelper";
18
+ import { applyAlertSelfPrivacyFilter } from "./AlertPrivacyFilter";
19
+ import CaptureSpan from "../Telemetry/CaptureSpan";
20
+ /*
21
+ * Whether a caller may change the state of a set of alerts - acknowledge
22
+ * them, say - when that change is going to be written for them as root.
23
+ *
24
+ * Changing an alert's state from its own page takes two writes as the caller:
25
+ * a new AlertStateTimeline row (table and column permissions only), and then
26
+ * the alert's currentAlertStateId, which is an Alert UPDATE and so is narrowed
27
+ * by the caller's label scope, Owned scope and alert privacy. Being able to
28
+ * read an alert is not enough: a Viewer who is also an AlertMember for one
29
+ * label can read every alert but change the state of only some. A root write
30
+ * skips both, so this checks both, for every alert, before anything is
31
+ * written - the same rule the Microsoft Teams acknowledge action applies to
32
+ * one alert.
33
+ */
34
+ export default class AlertStateChangeAuthorization {
35
+ static async assertCanChangeStateOfAlerts(data) {
36
+ if (data.props.isRoot || data.alertIds.length === 0) {
37
+ return;
38
+ }
39
+ const probe = new AlertStateTimeline();
40
+ probe.projectId = data.projectId;
41
+ probe.alertId = data.alertIds[0];
42
+ probe.alertStateId = ObjectID.generate();
43
+ ModelPermission.checkCreatePermissions(AlertStateTimeline, probe, data.props);
44
+ const alertQuery = {
45
+ _id: QueryHelper.any(data.alertIds),
46
+ projectId: data.projectId,
47
+ };
48
+ /*
49
+ * Labelled block and allow rules are decided per record, from the
50
+ * record's labels.
51
+ */
52
+ const alerts = await AlertService.findBy({
53
+ query: alertQuery,
54
+ select: {
55
+ _id: true,
56
+ labels: {
57
+ _id: true,
58
+ name: true,
59
+ },
60
+ },
61
+ limit: LIMIT_PER_PROJECT,
62
+ skip: 0,
63
+ props: {
64
+ isRoot: true,
65
+ },
66
+ });
67
+ for (const alert of alerts) {
68
+ await ModelPermission.checkUpdatePermissionByModel({
69
+ modelType: Alert,
70
+ fetchModelWithAccessControlIds: async () => {
71
+ return alert;
72
+ },
73
+ props: data.props,
74
+ });
75
+ }
76
+ /*
77
+ * The caller's own update scope (labels, Owned, privacy) as a query:
78
+ * every alert must still be in it.
79
+ */
80
+ const permittedQuery = await ModelPermission.checkUpdateQueryPermissions(Alert, alertQuery, {
81
+ currentAlertStateId: ObjectID.getZeroObjectID(),
82
+ }, data.props);
83
+ const permittedAlerts = await AlertService.findBy({
84
+ query: applyAlertSelfPrivacyFilter(permittedQuery, data.props),
85
+ select: {
86
+ _id: true,
87
+ },
88
+ limit: LIMIT_PER_PROJECT,
89
+ skip: 0,
90
+ props: {
91
+ isRoot: true,
92
+ },
93
+ });
94
+ const permittedIds = new Set(permittedAlerts.map((alert) => {
95
+ var _a;
96
+ return ((_a = alert._id) === null || _a === void 0 ? void 0 : _a.toString().toLowerCase()) || "";
97
+ }));
98
+ const allPermitted = data.alertIds.every((alertId) => {
99
+ return permittedIds.has(alertId.toString().toLowerCase());
100
+ });
101
+ if (!allPermitted) {
102
+ throw new NotAuthorizedException("You do not have permission to change the state of one or more of these alerts.");
103
+ }
104
+ }
105
+ }
106
+ __decorate([
107
+ CaptureSpan(),
108
+ __metadata("design:type", Function),
109
+ __metadata("design:paramtypes", [Object]),
110
+ __metadata("design:returntype", Promise)
111
+ ], AlertStateChangeAuthorization, "assertCanChangeStateOfAlerts", null);
112
+ //# sourceMappingURL=AlertStateChangeAuthorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertStateChangeAuthorization.js","sourceRoot":"","sources":["../../../../../Server/Utils/Alert/AlertStateChangeAuthorization.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,kBAAkB,MAAM,mDAAmD,CAAC;AAEnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,sBAAsB,MAAM,iDAAiD,CAAC;AACrF,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,YAAY,MAAM,6BAA6B,CAAC;AACvD,OAAO,eAAe,MAAM,wCAAwC,CAAC;AAErE,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAE5B,AAAb,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAIhD;QACC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAuB,IAAI,kBAAkB,EAAE,CAAC;QAC3D,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;QAClC,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAEzC,eAAe,CAAC,sBAAsB,CACpC,kBAAkB,EAClB,KAAK,EACL,IAAI,CAAC,KAAK,CACX,CAAC;QAEF,MAAM,UAAU,GAAiB;YAC/B,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;QAEF;;;WAGG;QACH,MAAM,MAAM,GAAiB,MAAM,YAAY,CAAC,MAAM,CAAC;YACrD,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE;gBACN,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI;oBACT,IAAI,EAAE,IAAI;iBACX;aACF;YACD,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,CAAC;YACP,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI;aACb;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,eAAe,CAAC,4BAA4B,CAAC;gBACjD,SAAS,EAAE,KAAK;gBAChB,8BAA8B,EAAE,KAAK,IAAoB,EAAE;oBACzD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;QAED;;;WAGG;QACH,MAAM,cAAc,GAClB,MAAM,eAAe,CAAC,2BAA2B,CAC/C,KAAK,EACL,UAAU,EACV;YACE,mBAAmB,EAAE,QAAQ,CAAC,eAAe,EAAE;SAChD,EACD,IAAI,CAAC,KAAK,CACX,CAAC;QAEJ,MAAM,eAAe,GAAiB,MAAM,YAAY,CAAC,MAAM,CAAC;YAC9D,KAAK,EAAE,2BAA2B,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;YAC9D,MAAM,EAAE;gBACN,GAAG,EAAE,IAAI;aACV;YACD,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,CAAC;YACP,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI;aACb;SACF,CAAC,CAAC;QAEH,MAAM,YAAY,GAAgB,IAAI,GAAG,CACvC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAY,EAAU,EAAE;;YAC3C,OAAO,CAAA,MAAA,KAAK,CAAC,GAAG,0CAAE,QAAQ,GAAG,WAAW,EAAE,KAAI,EAAE,CAAC;QACnD,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,YAAY,GAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,CAC/C,CAAC,OAAiB,EAAW,EAAE;YAC7B,OAAO,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,sBAAsB,CAC9B,gFAAgF,CACjF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAnGqB;IADnB,WAAW,EAAE;;;;uEAmGb"}