@oneuptime/common 12.0.13 → 12.0.15

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 (561) hide show
  1. package/Models/DatabaseModels/GlobalOidc.ts +20 -0
  2. package/Models/DatabaseModels/GlobalSso.ts +20 -0
  3. package/Models/DatabaseModels/MarketingConversion.ts +19 -9
  4. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +46 -0
  5. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  6. package/Models/DatabaseModels/StatusPage.ts +7 -4
  7. package/Models/DatabaseModels/UserCall.ts +94 -3
  8. package/Models/DatabaseModels/UserEmail.ts +94 -3
  9. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  10. package/Models/DatabaseModels/UserPush.ts +37 -0
  11. package/Models/DatabaseModels/UserSMS.ts +94 -3
  12. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  13. package/Server/API/BaseAPI.ts +79 -14
  14. package/Server/API/StatusPageAPI.ts +29 -4
  15. package/Server/API/UserCallAPI.ts +53 -45
  16. package/Server/API/UserEmailAPI.ts +53 -44
  17. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  18. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  19. package/Server/API/UserPushAPI.ts +126 -2
  20. package/Server/API/UserSmsAPI.ts +53 -44
  21. package/Server/API/UserWhatsAppAPI.ts +53 -50
  22. package/Server/EnvironmentConfig.ts +7 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.ts +19 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.ts +40 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  29. package/Server/Middleware/SlackAuthorization.ts +43 -6
  30. package/Server/Middleware/UserAuthorization.ts +236 -26
  31. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  32. package/Server/Middleware/WhatsAppAuthorization.ts +43 -3
  33. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  34. package/Server/Services/DatabaseService.ts +101 -0
  35. package/Server/Services/GlobalOidcProjectService.ts +126 -1
  36. package/Server/Services/GlobalOidcService.ts +132 -0
  37. package/Server/Services/GlobalSsoProjectService.ts +126 -1
  38. package/Server/Services/GlobalSsoService.ts +132 -0
  39. package/Server/Services/LogAggregationService.ts +5 -0
  40. package/Server/Services/PushNotificationService.ts +127 -12
  41. package/Server/Services/TeamMemberService.ts +53 -13
  42. package/Server/Services/UserCallService.ts +55 -24
  43. package/Server/Services/UserEmailService.ts +83 -17
  44. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  45. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  46. package/Server/Services/UserNotificationRuleService.ts +26 -0
  47. package/Server/Services/UserPushService.ts +89 -0
  48. package/Server/Services/UserSmsService.ts +50 -17
  49. package/Server/Services/UserWhatsAppService.ts +48 -15
  50. package/Server/Types/Database/QueryHelper.ts +30 -0
  51. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  52. package/Server/Utils/ChannelVerification.ts +510 -0
  53. package/Server/Utils/CronTab.ts +73 -0
  54. package/Server/Utils/GlobalSsoAuthorization.ts +175 -0
  55. package/Server/Utils/Marketing/ConversionUploadProvider.ts +35 -5
  56. package/Server/Utils/Marketing/Providers/GoogleAds.ts +1 -1
  57. package/Server/Utils/Marketing/Providers/LinkedIn.ts +1 -1
  58. package/Server/Utils/Marketing/Providers/Meta.ts +1 -1
  59. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +1 -1
  60. package/Server/Utils/Marketing/Providers/Reddit.ts +1 -1
  61. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +48 -33
  62. package/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts +35 -30
  63. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +33 -28
  64. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +475 -47
  65. package/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.ts +35 -30
  66. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +47 -44
  67. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +33 -28
  68. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +69 -40
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +35 -29
  70. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +8 -0
  72. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  73. package/Server/Utils/Monitor/MonitorResource.ts +161 -21
  74. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  75. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  76. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  77. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  78. package/Server/Utils/StatusPageContentSecurityPolicy.ts +56 -0
  79. package/Server/Utils/StatusPageCustomizationAccess.ts +117 -0
  80. package/Server/Utils/TotpAuth.ts +137 -9
  81. package/Server/Utils/UserRegistrationToken.ts +182 -0
  82. package/Server/Utils/VerificationCode.ts +134 -0
  83. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  84. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  85. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  86. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  87. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  88. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
  89. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  90. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  91. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  92. package/Tests/Server/API/StatusPageCustomizationOrigin.test.ts +348 -0
  93. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  94. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  95. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  96. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  97. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  98. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +265 -0
  99. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +227 -0
  100. package/Tests/Server/Middleware/SlackAuthorization.test.ts +149 -0
  101. package/Tests/Server/Middleware/UserAuthorization.test.ts +27 -13
  102. package/Tests/Server/Middleware/UserAuthorizationGlobalSsoGovernance.test.ts +1455 -0
  103. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +91 -2
  104. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  105. package/Tests/Server/Middleware/WhatsAppAuthorization.test.ts +233 -0
  106. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
  107. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  108. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  109. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  110. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  111. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  112. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  113. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +21 -8
  114. package/Tests/Server/Services/GlobalSsoProviderAuthorization.test.ts +1242 -0
  115. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  116. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  117. package/Tests/Server/Services/MonitorResourceProbeAgreementHydration.test.ts +459 -0
  118. package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +10 -0
  119. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  120. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  121. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  122. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  123. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  124. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  125. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  126. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  127. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  128. package/Tests/Server/Types/AnalyticsDatabase/AggregateUtilBucketTimestamp.test.ts +416 -0
  129. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  130. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  131. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  132. package/Tests/Server/Types/Database/QueryHelperManyToManyAndEmptyValues.test.ts +551 -0
  133. package/Tests/Server/Types/Database/SelectUtil.test.ts +348 -0
  134. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  135. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  136. package/Tests/Server/Utils/Browser.test.ts +162 -0
  137. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  138. package/Tests/Server/Utils/CronTab.test.ts +116 -0
  139. package/Tests/Server/Utils/Express.test.ts +371 -0
  140. package/Tests/Server/Utils/GlobalSSOToken.test.ts +581 -0
  141. package/Tests/Server/Utils/GlobalSsoAuthorization.test.ts +1401 -0
  142. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +254 -0
  143. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +1 -1
  144. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +508 -0
  145. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +30 -9
  146. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +987 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +916 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  152. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +382 -0
  153. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +1219 -0
  154. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  155. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  156. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  157. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  158. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +86 -0
  159. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  160. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  163. package/Tests/Server/Utils/StatusPageContentSecurityPolicy.test.ts +136 -0
  164. package/Tests/Server/Utils/StatusPageCustomizationAccess.test.ts +223 -0
  165. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  166. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  167. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  168. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  169. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  170. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  171. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  172. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  173. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  174. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  175. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  176. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  177. package/Tests/Types/Monitor/MonitorStepConfigHelpers.test.ts +165 -0
  178. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  179. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  180. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  181. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  182. package/Tests/Types/NetworkDevice/NetworkDeviceLinkRuleScope.test.ts +215 -0
  183. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  184. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  185. package/Tests/UI/Components/Button.test.tsx +175 -1
  186. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  187. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  188. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  189. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  190. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  191. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  192. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  193. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  194. package/Tests/UI/Components/Forms/FormSubmitAnalytics.test.tsx +206 -0
  195. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  196. package/Tests/UI/Components/List.test.tsx +9 -2
  197. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  198. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  199. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  200. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  201. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  202. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  205. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  206. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  207. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  208. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  209. package/Tests/UI/Components/Toast.test.tsx +130 -7
  210. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  211. package/Tests/UI/Utils/AIChatExport/ConversationMarkdown.test.ts +774 -0
  212. package/Tests/UI/Utils/AIChatExport/MarkdownBlocks.test.ts +791 -0
  213. package/Tests/UI/Utils/AIChatExport/MarkdownSafety.test.ts +544 -0
  214. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  215. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  216. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  217. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  218. package/Tests/Utils/API.test.ts +16 -2
  219. package/Tests/Utils/Analytics.test.ts +187 -0
  220. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  221. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  223. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +80 -0
  224. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +1291 -0
  225. package/Tests/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.test.ts +214 -0
  226. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  227. package/Types/Email/EmailTemplateType.ts +1 -0
  228. package/Types/Marketing/MarketingConversion.ts +12 -0
  229. package/Types/Monitor/CriteriaFilter.ts +9 -0
  230. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  231. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  232. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  233. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  234. package/Types/NetworkDevice/NetworkDeviceLinkRuleScope.ts +51 -0
  235. package/Types/Permission.ts +35 -0
  236. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  237. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  238. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  239. package/Types/Service/ServiceLanguage.ts +144 -0
  240. package/Types/Text.ts +111 -19
  241. package/UI/Components/Button/Button.tsx +27 -14
  242. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  243. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  244. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  245. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  246. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  247. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  248. package/UI/Components/CommandPalette/Types.ts +49 -0
  249. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  250. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  251. package/UI/Components/Feed/FeedItem.tsx +1 -1
  252. package/UI/Components/FormModal/BasicFormModal.tsx +12 -0
  253. package/UI/Components/Forms/BasicForm.tsx +13 -1
  254. package/UI/Components/Forms/BasicModelForm.tsx +2 -1
  255. package/UI/Components/Forms/ModelForm.tsx +10 -1
  256. package/UI/Components/Forms/Utils/FormAnalyticsName.ts +39 -0
  257. package/UI/Components/List/List.tsx +37 -5
  258. package/UI/Components/List/ListSkeleton.tsx +54 -0
  259. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
  260. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  261. package/UI/Components/Modal/Modal.tsx +2 -2
  262. package/UI/Components/ModelFormModal/ModelFormModal.tsx +6 -1
  263. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  264. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  265. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  266. package/UI/Components/Navbar/NavBar.tsx +14 -1
  267. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  268. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  269. package/UI/Components/SideOver/SideOver.tsx +37 -2
  270. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  271. package/UI/Components/Table/Table.tsx +74 -44
  272. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  273. package/UI/Components/Tabs/Tab.tsx +1 -1
  274. package/UI/Components/Toast/Toast.tsx +118 -53
  275. package/UI/Components/Toast/ToastInit.tsx +82 -32
  276. package/UI/Styles/Theme.css +40 -0
  277. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  278. package/UI/Utils/ModelListCache.ts +188 -0
  279. package/UI/Utils/Project.ts +29 -0
  280. package/Utils/API.ts +6 -1
  281. package/Utils/Analytics.ts +55 -2
  282. package/Utils/Monitor/MonitorMetricType.ts +40 -0
  283. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +587 -37
  284. package/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.ts +115 -0
  285. package/build/dist/Models/DatabaseModels/GlobalOidc.js +21 -0
  286. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/GlobalSso.js +21 -0
  288. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/MarketingConversion.js +20 -10
  290. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +47 -0
  292. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  294. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
  296. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  298. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  300. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  302. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  304. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  306. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  307. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  308. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  309. package/build/dist/Server/API/BaseAPI.js +69 -13
  310. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  311. package/build/dist/Server/API/StatusPageAPI.js +25 -4
  312. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  313. package/build/dist/Server/API/UserCallAPI.js +42 -38
  314. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  315. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  316. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  317. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  318. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  319. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  320. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  321. package/build/dist/Server/API/UserPushAPI.js +95 -2
  322. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  323. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  324. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  325. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  326. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  327. package/build/dist/Server/EnvironmentConfig.js +6 -0
  328. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js +12 -0
  336. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js.map +1 -0
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js +29 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  341. package/build/dist/Server/Middleware/SlackAuthorization.js +28 -4
  342. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  343. package/build/dist/Server/Middleware/UserAuthorization.js +197 -22
  344. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  345. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  346. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  347. package/build/dist/Server/Middleware/WhatsAppAuthorization.js +32 -2
  348. package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
  349. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  350. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  351. package/build/dist/Server/Services/DatabaseService.js +74 -0
  352. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  353. package/build/dist/Server/Services/GlobalOidcProjectService.js +105 -0
  354. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -1
  355. package/build/dist/Server/Services/GlobalOidcService.js +127 -0
  356. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
  357. package/build/dist/Server/Services/GlobalSsoProjectService.js +105 -0
  358. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -1
  359. package/build/dist/Server/Services/GlobalSsoService.js +127 -0
  360. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
  361. package/build/dist/Server/Services/LogAggregationService.js +5 -0
  362. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  363. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  364. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  365. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  366. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  367. package/build/dist/Server/Services/UserCallService.js +54 -22
  368. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  369. package/build/dist/Server/Services/UserEmailService.js +78 -17
  370. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  371. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  372. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  373. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  374. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  375. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  376. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  377. package/build/dist/Server/Services/UserPushService.js +77 -0
  378. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  379. package/build/dist/Server/Services/UserSmsService.js +50 -17
  380. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  381. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  382. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  383. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  384. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  385. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  386. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  387. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  388. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  389. package/build/dist/Server/Utils/CronTab.js +66 -0
  390. package/build/dist/Server/Utils/CronTab.js.map +1 -1
  391. package/build/dist/Server/Utils/GlobalSsoAuthorization.js +112 -0
  392. package/build/dist/Server/Utils/GlobalSsoAuthorization.js.map +1 -0
  393. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +17 -1
  394. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  395. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +1 -1
  396. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  397. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +1 -1
  398. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  399. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +1 -1
  400. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  401. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +1 -1
  402. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  403. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +1 -1
  404. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  405. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +37 -35
  406. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  407. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js +21 -25
  408. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js.map +1 -1
  409. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +20 -22
  410. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  411. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +370 -42
  412. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  413. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js +21 -25
  414. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js.map +1 -1
  415. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +34 -37
  416. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  417. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +21 -25
  418. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  419. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +64 -52
  420. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  421. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +25 -29
  422. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  423. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  424. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  425. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +8 -0
  426. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  427. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  428. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/MonitorResource.js +123 -23
  430. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  432. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  433. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  434. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  435. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  436. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  437. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  438. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js +39 -0
  439. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js.map +1 -0
  440. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js +85 -0
  441. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js.map +1 -0
  442. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  443. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  444. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  445. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  446. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  447. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  448. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  449. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  450. package/build/dist/Types/Marketing/MarketingConversion.js +10 -0
  451. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  452. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  453. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  454. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  455. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  456. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  457. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  458. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  459. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  460. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  461. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  462. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js +46 -0
  463. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js.map +1 -0
  464. package/build/dist/Types/Permission.js +33 -0
  465. package/build/dist/Types/Permission.js.map +1 -1
  466. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  467. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  468. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  469. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  470. package/build/dist/Types/Text.js +82 -17
  471. package/build/dist/Types/Text.js.map +1 -1
  472. package/build/dist/UI/Components/Button/Button.js +22 -14
  473. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  474. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  475. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  476. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  477. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  478. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  479. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  480. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  481. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  482. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  483. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  484. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  485. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  486. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  487. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  488. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  489. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  490. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  491. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  492. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  493. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  494. package/build/dist/UI/Components/FormModal/BasicFormModal.js +2 -1
  495. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  496. package/build/dist/UI/Components/Forms/BasicForm.js +10 -1
  497. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  498. package/build/dist/UI/Components/Forms/BasicModelForm.js +2 -1
  499. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  500. package/build/dist/UI/Components/Forms/ModelForm.js +4 -1
  501. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  502. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js +33 -0
  503. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js.map +1 -0
  504. package/build/dist/UI/Components/List/List.js +19 -5
  505. package/build/dist/UI/Components/List/List.js.map +1 -1
  506. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  507. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  508. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  509. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  510. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  511. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  512. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +2 -1
  513. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  514. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  515. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  516. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  517. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  518. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  519. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  520. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  521. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  522. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  523. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  524. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  525. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  526. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  527. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  528. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  529. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  530. package/build/dist/UI/Components/Table/Table.js +35 -24
  531. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  532. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  533. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  534. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  535. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  536. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  537. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  538. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  539. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  540. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  541. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  542. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  543. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  544. package/build/dist/UI/Utils/Project.js +24 -1
  545. package/build/dist/UI/Utils/Project.js.map +1 -1
  546. package/build/dist/Utils/API.js +6 -1
  547. package/build/dist/Utils/API.js.map +1 -1
  548. package/build/dist/Utils/Analytics.js +50 -2
  549. package/build/dist/Utils/Analytics.js.map +1 -1
  550. package/build/dist/Utils/Monitor/MonitorMetricType.js +37 -0
  551. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  552. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +318 -37
  553. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  554. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js +87 -0
  555. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js.map +1 -0
  556. package/jest.config.json +1 -1
  557. package/package.json +2 -3
  558. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  559. package/Tests/__mocks__/otpauth.js +0 -30
  560. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  561. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,348 @@
1
+ import logger from "./Logger";
2
+ import VerificationCode from "./VerificationCode";
3
+ import BadDataException from "../../Types/Exception/BadDataException";
4
+ /*
5
+ * The ownership check shared by every notification channel a user can add to
6
+ * their own account: email, SMS, voice call, WhatsApp and the incoming-call
7
+ * number. Each of those had its own copy of "compare the column, set
8
+ * isVerified", and each copy had the same three holes.
9
+ *
10
+ * WHAT WAS WRONG
11
+ *
12
+ * The code was a stable six-digit value with no expiry, no attempt counter
13
+ * and no lockout. Nothing stops a caller creating a channel row pointing at
14
+ * SOMEBODY ELSE'S address or number - that is the normal, intended flow, it
15
+ * is how you add your own phone - so an authenticated low-privilege user
16
+ * could add a colleague's number and then walk the whole 10^6 code space
17
+ * against /verify at request speed. A million requests is minutes of
18
+ * scripting, and the code at the end of it was still the same code it was at
19
+ * the start. Success marks the row verified, which creates the default
20
+ * notification rules, which makes the victim's phone a delivery target for
21
+ * whatever that project pages about.
22
+ *
23
+ * WHAT REPLACES IT
24
+ *
25
+ * Four controls, each of which has to be defeated on its own:
26
+ *
27
+ * EXPIRY a code lives 15 minutes, so the search space is not
28
+ * available indefinitely.
29
+ * ATTEMPTS five wrong guesses per issued code, counted with a single
30
+ * atomic UPDATE ... RETURNING so racing requests cannot all
31
+ * read the same pre-increment value and all decide they are
32
+ * under the limit.
33
+ * ROTATION crossing the attempt limit does not merely pause the
34
+ * attacker with the target still valid behind it - the stored
35
+ * challenge is burned. Continuing costs a resend, which
36
+ * notifies the victim.
37
+ * THROTTLE resends are on a cooldown, so "burn the code and get a new
38
+ * one" is not free either, and the victim is not the one who
39
+ * pays for it in unsolicited messages.
40
+ *
41
+ * On top of that the stored value is a keyed digest rather than the code (see
42
+ * VerificationCode.ts) and the routes are rate limited per user, per row and
43
+ * per address (see Middleware/VerificationCodeRateLimit.ts).
44
+ *
45
+ * Together: five guesses per code, a resend needed for the next five, a
46
+ * cooldown on resends, and every resend visible to the person being attacked.
47
+ */
48
+ const parsePositiveIntFromEnv = (envKey, fallback) => {
49
+ const rawValue = process.env[envKey];
50
+ if (!rawValue) {
51
+ return fallback;
52
+ }
53
+ const parsedValue = parseInt(rawValue, 10);
54
+ if (!Number.isFinite(parsedValue) || parsedValue <= 0) {
55
+ return fallback;
56
+ }
57
+ return parsedValue;
58
+ };
59
+ /*
60
+ * Long enough to survive a slow SMS carrier, an email that lands in a spam
61
+ * folder the user has to go and look in, or a voice call the user missed and
62
+ * had to wait to be repeated. Short enough that the code space is not
63
+ * standing open. Fifteen minutes is the usual figure for exactly this
64
+ * trade-off and is what the notification copy tells the user.
65
+ */
66
+ export const VERIFICATION_CODE_EXPIRY_MINUTES = parsePositiveIntFromEnv("NOTIFICATION_VERIFICATION_CODE_EXPIRY_MINUTES", 15);
67
+ /*
68
+ * Five is chosen for the human, not the attacker: somebody typing a code off
69
+ * a phone screen will fat-finger it once or twice, and almost never five
70
+ * times. The attacker's number is not five - it is five multiplied by how
71
+ * many resends they are willing to send to their victim's phone, which is the
72
+ * point of the cooldown below.
73
+ */
74
+ export const MAX_VERIFICATION_ATTEMPTS = parsePositiveIntFromEnv("NOTIFICATION_VERIFICATION_MAX_ATTEMPTS", 5);
75
+ /*
76
+ * A resend both issues a fresh code and, for SMS/call/WhatsApp, spends real
77
+ * money sending it to a real handset. The cooldown is the control on the
78
+ * "burn five guesses, resend, repeat" loop AND on using the resend button as
79
+ * a way to text somebody 200 times.
80
+ *
81
+ * Sixty seconds is the interval a user who did not receive the first message
82
+ * will tolerate, and it caps the loop above at five guesses a minute: roughly
83
+ * 200,000 minutes, or four months of uninterrupted attack with a message
84
+ * landing on the victim's phone every sixty seconds of it, for an even chance
85
+ * of hitting one code.
86
+ */
87
+ export const RESEND_COOLDOWN_SECONDS = parsePositiveIntFromEnv("NOTIFICATION_VERIFICATION_RESEND_COOLDOWN_SECONDS", 60);
88
+ export var ChannelVerificationOutcome;
89
+ (function (ChannelVerificationOutcome) {
90
+ ChannelVerificationOutcome["Verified"] = "verified";
91
+ ChannelVerificationOutcome["NotFound"] = "not-found";
92
+ ChannelVerificationOutcome["NotOwner"] = "not-owner";
93
+ ChannelVerificationOutcome["AlreadyVerified"] = "already-verified";
94
+ ChannelVerificationOutcome["Expired"] = "expired";
95
+ ChannelVerificationOutcome["TooManyAttempts"] = "too-many-attempts";
96
+ ChannelVerificationOutcome["IncorrectCode"] = "incorrect-code";
97
+ })(ChannelVerificationOutcome || (ChannelVerificationOutcome = {}));
98
+ const asWriter = (service) => {
99
+ return service;
100
+ };
101
+ export default class ChannelVerification {
102
+ /*
103
+ * When a code issued now stops being accepted.
104
+ */
105
+ static getExpiresAt(now = new Date()) {
106
+ return new Date(now.getTime() + VERIFICATION_CODE_EXPIRY_MINUTES * 60 * 1000);
107
+ }
108
+ /*
109
+ * A missing expiry is treated as expired, NOT as "never expires".
110
+ *
111
+ * That is the direction that matters for the rows written before this
112
+ * column existed: they carry a plaintext code and no expiry, and the
113
+ * conservative reading turns them into "request a new code" rather than
114
+ * leaving a permanently valid challenge in place. The cost is that a user
115
+ * who had an unverified channel across the upgrade has to press resend
116
+ * once.
117
+ */
118
+ static isCodeExpired(data) {
119
+ if (!data.expiresAt) {
120
+ return true;
121
+ }
122
+ const now = data.now || new Date();
123
+ return new Date(data.expiresAt).getTime() <= now.getTime();
124
+ }
125
+ /*
126
+ * Seconds the caller must wait before another code may be sent, or 0 if a
127
+ * send is allowed right now.
128
+ */
129
+ static getResendRetryAfterSeconds(data) {
130
+ if (!data.lastSentAt) {
131
+ return 0;
132
+ }
133
+ const now = data.now || new Date();
134
+ const elapsedSeconds = (now.getTime() - new Date(data.lastSentAt).getTime()) / 1000;
135
+ /*
136
+ * A lastSentAt in the future means a clock went backwards, not that the
137
+ * caller may send freely. Treat it as a full cooldown.
138
+ */
139
+ if (elapsedSeconds < 0) {
140
+ return RESEND_COOLDOWN_SECONDS;
141
+ }
142
+ if (elapsedSeconds >= RESEND_COOLDOWN_SECONDS) {
143
+ return 0;
144
+ }
145
+ return Math.max(1, Math.ceil(RESEND_COOLDOWN_SECONDS - elapsedSeconds));
146
+ }
147
+ /*
148
+ * The column values that put a freshly issued code on a row. Returned
149
+ * rather than written so the caller can fold them into whatever write it
150
+ * was already making, and so the plaintext - which exists in memory for
151
+ * exactly as long as it takes to hand it to the notification service -
152
+ * comes back alongside them.
153
+ */
154
+ static issueCode(data) {
155
+ const now = data.now || new Date();
156
+ const plainCode = VerificationCode.generate();
157
+ return {
158
+ plainCode,
159
+ fields: {
160
+ verificationCode: VerificationCode.hashCode({
161
+ code: plainCode,
162
+ channelId: data.channelId,
163
+ }),
164
+ verificationCodeExpiresAt: ChannelVerification.getExpiresAt(now),
165
+ verificationCodeSentAt: now,
166
+ verificationFailedAttempts: 0,
167
+ },
168
+ };
169
+ }
170
+ /*
171
+ * The column values that leave a row with NO live challenge on it: a digest
172
+ * no code can produce, and no expiry.
173
+ *
174
+ * `verificationCode` is NOT NULL on every one of these tables, so "there is
175
+ * no code" cannot be written as null. A random 256-bit digest says the same
176
+ * thing and cannot be hit by any of the 10^6 codes.
177
+ */
178
+ static getClearedCodeFields() {
179
+ return {
180
+ verificationCode: VerificationCode.generateUnusableHash(),
181
+ verificationCodeExpiresAt: null,
182
+ };
183
+ }
184
+ /*
185
+ * Write a fresh code onto an existing row and return the plaintext to send.
186
+ *
187
+ * Callers must have already decided that a send is allowed - this does not
188
+ * check the cooldown, because whether a resend is permitted is a question
189
+ * about the CHANNEL (already verified? project out of SMS credit?) that
190
+ * only the channel's own service can answer.
191
+ */
192
+ static async issueCodeOnItem(data) {
193
+ const issued = ChannelVerification.issueCode({ channelId: data.itemId });
194
+ await asWriter(data.service).updateOneById({
195
+ id: data.itemId,
196
+ props: {
197
+ isRoot: true,
198
+ },
199
+ data: issued.fields,
200
+ });
201
+ return issued.plainCode;
202
+ }
203
+ /*
204
+ * Check a submitted code and, if it is right, mark the row verified.
205
+ *
206
+ * The ORDER of the steps is the security-relevant part:
207
+ *
208
+ * ownership first, so one user cannot even probe the state of another
209
+ * user's row;
210
+ *
211
+ * already-verified before the counter, so re-submitting a code against a
212
+ * row that is already done is not a way to burn somebody's attempts;
213
+ *
214
+ * the lockout gate before the counter, so a row whose budget is already
215
+ * spent is refused without growing the counter forever and without a
216
+ * database write per request;
217
+ *
218
+ * expiry before the counter, because an expired code is refused
219
+ * unconditionally and there is no reason to spend a user's remaining
220
+ * attempts telling them so;
221
+ *
222
+ * the counter before the comparison, so every attempt - including the
223
+ * ones racing each other - has already consumed its slot by the time
224
+ * anybody learns whether it was right.
225
+ *
226
+ * The lockout gate reads a value that a concurrent request may already have
227
+ * moved, which is exactly why it is a fast path and not the control. The
228
+ * control is the atomic increment below: N requests that all slip past the
229
+ * stale gate together still receive N DISTINCT attempt numbers, so all but
230
+ * the first MAX_VERIFICATION_ATTEMPTS of them are refused.
231
+ */
232
+ static async verifyCode(data) {
233
+ var _a;
234
+ const item = await data.service.findOneById({
235
+ id: data.itemId,
236
+ props: {
237
+ isRoot: true,
238
+ },
239
+ select: {
240
+ userId: true,
241
+ projectId: true,
242
+ isVerified: true,
243
+ verificationCode: true,
244
+ verificationCodeExpiresAt: true,
245
+ verificationFailedAttempts: true,
246
+ },
247
+ });
248
+ const writer = asWriter(data.service);
249
+ if (!item) {
250
+ return { outcome: ChannelVerificationOutcome.NotFound };
251
+ }
252
+ if (((_a = item.userId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.userId.toString()) {
253
+ return { outcome: ChannelVerificationOutcome.NotOwner };
254
+ }
255
+ if (item.isVerified) {
256
+ return { outcome: ChannelVerificationOutcome.AlreadyVerified };
257
+ }
258
+ if ((item.verificationFailedAttempts || 0) >= MAX_VERIFICATION_ATTEMPTS) {
259
+ return { outcome: ChannelVerificationOutcome.TooManyAttempts };
260
+ }
261
+ if (ChannelVerification.isCodeExpired({
262
+ expiresAt: item.verificationCodeExpiresAt,
263
+ })) {
264
+ return { outcome: ChannelVerificationOutcome.Expired };
265
+ }
266
+ const attemptNumber = await writer.atomicIncrementColumnValueByOneAndGetValue({
267
+ id: data.itemId,
268
+ columnName: "verificationFailedAttempts",
269
+ });
270
+ /*
271
+ * Only reachable when requests raced past the gate above together. They
272
+ * are refused here rather than being given a comparison, and the request
273
+ * holding attempt number MAX_VERIFICATION_ATTEMPTS still burns the
274
+ * challenge below.
275
+ */
276
+ if (attemptNumber > MAX_VERIFICATION_ATTEMPTS) {
277
+ return { outcome: ChannelVerificationOutcome.TooManyAttempts };
278
+ }
279
+ const submittedHash = VerificationCode.hashCode({
280
+ code: String(data.code),
281
+ channelId: data.itemId,
282
+ });
283
+ if (!VerificationCode.isHashEqual(submittedHash, item.verificationCode || "")) {
284
+ /*
285
+ * That was the last attempt this code gets, so burn it now rather than
286
+ * leave a spent-but-still-valid challenge on the row. The attacker's
287
+ * next move has to be a resend, which costs them the cooldown and tells
288
+ * the victim what is happening.
289
+ *
290
+ * Done exactly once, on the attempt that exhausts the budget; every
291
+ * later request is turned away by the gate above without a write.
292
+ */
293
+ if (attemptNumber >= MAX_VERIFICATION_ATTEMPTS) {
294
+ await writer.updateOneById({
295
+ id: data.itemId,
296
+ props: {
297
+ isRoot: true,
298
+ },
299
+ data: ChannelVerification.getClearedCodeFields(),
300
+ });
301
+ logger.warn(`ChannelVerification: attempt limit reached on ${writer.getModel().tableName} ${data.itemId.toString()} for user ${data.userId.toString()}; verification code invalidated`);
302
+ }
303
+ return { outcome: ChannelVerificationOutcome.IncorrectCode };
304
+ }
305
+ /*
306
+ * Correct. Mark verified AND clear the challenge in the same write: a
307
+ * used code must not remain usable, and the attempt counter goes back to
308
+ * zero so a later re-issue (if the row is ever un-verified) starts fresh.
309
+ */
310
+ await writer.updateOneById({
311
+ id: data.itemId,
312
+ props: {
313
+ isRoot: true,
314
+ },
315
+ data: Object.assign({ isVerified: true, verificationFailedAttempts: 0 }, ChannelVerification.getClearedCodeFields()),
316
+ });
317
+ return {
318
+ outcome: ChannelVerificationOutcome.Verified,
319
+ itemId: data.itemId,
320
+ userId: item.userId,
321
+ projectId: item.projectId,
322
+ };
323
+ }
324
+ /*
325
+ * The message a failed outcome is reported to the caller with.
326
+ *
327
+ * IncorrectCode and NotFound deliberately do NOT say anything the caller
328
+ * did not already know, and every failure is a plain BadDataException so
329
+ * the shape of the response does not vary with the reason either.
330
+ */
331
+ static getFailureException(outcome) {
332
+ switch (outcome) {
333
+ case ChannelVerificationOutcome.NotFound:
334
+ return new BadDataException("Item not found");
335
+ case ChannelVerificationOutcome.NotOwner:
336
+ return new BadDataException("Invalid user ID");
337
+ case ChannelVerificationOutcome.AlreadyVerified:
338
+ return new BadDataException("This is already verified");
339
+ case ChannelVerificationOutcome.Expired:
340
+ return new BadDataException("This verification code has expired. Please request a new code.");
341
+ case ChannelVerificationOutcome.TooManyAttempts:
342
+ return new BadDataException("Too many incorrect attempts. This verification code is no longer valid. Please request a new code.");
343
+ default:
344
+ return new BadDataException("Invalid code");
345
+ }
346
+ }
347
+ }
348
+ //# sourceMappingURL=ChannelVerification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelVerification.js","sourceRoot":"","sources":["../../../../Server/Utils/ChannelVerification.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,66 @@ export default class CronTab {
23
23
  throw new BadDataException(`Invalid cron expression: ${crontab}`);
24
24
  }
25
25
  }
26
+ /**
27
+ * Longest gap (in seconds) between two consecutive runs of this cron.
28
+ *
29
+ * Used to reason about how much data an evaluation window can possibly
30
+ * contain: a monitor polled once every five minutes produces at most one
31
+ * sample per five minutes, so "all values over the last 5 minutes" can
32
+ * never be backed by more than one sample. Callers use this to decide
33
+ * whether a window is actually covered by data or is merely still
34
+ * filling up.
35
+ *
36
+ * The *longest* gap is deliberate. Irregular expressions (say
37
+ * `0,1,30 * * * *`) have both very short and very long gaps; taking the
38
+ * shortest would make callers demand data at a cadence the cron does not
39
+ * actually deliver, and they would wait forever.
40
+ *
41
+ * Returns null when the expression is missing or unparseable so callers
42
+ * can fall back to inferring the cadence from the data itself.
43
+ */
44
+ static getIntervalInSeconds(crontab, referenceDate) {
45
+ if (!crontab) {
46
+ return null;
47
+ }
48
+ try {
49
+ const interval = CronParser.parseExpression(crontab, {
50
+ currentDate: referenceDate || new Date(),
51
+ });
52
+ /*
53
+ * Six executions -> five gaps. Enough to cover a full hour-wrap for
54
+ * every interval offered in the UI without walking the schedule far
55
+ * into the future.
56
+ */
57
+ const executionTimes = [];
58
+ for (let i = 0; i < 6; i++) {
59
+ executionTimes.push(interval.next().toDate());
60
+ }
61
+ let longestGapInSeconds = 0;
62
+ for (let i = 1; i < executionTimes.length; i++) {
63
+ const gapInSeconds = (executionTimes[i].getTime() - executionTimes[i - 1].getTime()) /
64
+ 1000;
65
+ if (gapInSeconds > longestGapInSeconds) {
66
+ longestGapInSeconds = gapInSeconds;
67
+ }
68
+ }
69
+ if (longestGapInSeconds <= 0) {
70
+ return null;
71
+ }
72
+ return longestGapInSeconds;
73
+ }
74
+ catch (error) {
75
+ /*
76
+ * Debug rather than error: this runs on the criteria-evaluation hot
77
+ * path, and monitors created before the interval was a cron (or
78
+ * through a Terraform example using the "Every 5 minutes" label) would
79
+ * otherwise log on every single check. Callers treat null as "cadence
80
+ * unknown" and fall back to inferring it from the data.
81
+ */
82
+ logger.debug(error);
83
+ return null;
84
+ }
85
+ }
26
86
  }
27
87
  __decorate([
28
88
  CaptureSpan(),
@@ -30,4 +90,10 @@ __decorate([
30
90
  __metadata("design:paramtypes", [String]),
31
91
  __metadata("design:returntype", Date)
32
92
  ], CronTab, "getNextExecutionTime", null);
93
+ __decorate([
94
+ CaptureSpan(),
95
+ __metadata("design:type", Function),
96
+ __metadata("design:paramtypes", [Object, Object]),
97
+ __metadata("design:returntype", Object)
98
+ ], CronTab, "getIntervalInSeconds", null);
33
99
  //# sourceMappingURL=CronTab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CronTab.js","sourceRoot":"","sources":["../../../../Server/Utils/CronTab.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AACtE,OAAO,UAA8B,MAAM,aAAa,CAAC;AACzD,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,OAAO;IAEZ,AAAP,MAAM,CAAC,oBAAoB,CAAC,OAAe;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAmB,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,iBAAiB,GAAS,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,IAAI,gBAAgB,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF;AAVe;IADb,WAAW,EAAE;;;oCACuC,IAAI;yCASxD"}
1
+ {"version":3,"file":"CronTab.js","sourceRoot":"","sources":["../../../../Server/Utils/CronTab.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AACtE,OAAO,UAA8B,MAAM,aAAa,CAAC;AACzD,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,OAAO;IAEZ,AAAP,MAAM,CAAC,oBAAoB,CAAC,OAAe;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAmB,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,iBAAiB,GAAS,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,IAAI,gBAAgB,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IAEW,AAAP,MAAM,CAAC,oBAAoB,CAChC,OAAkC,EAClC,aAAgC;QAEhC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAmB,UAAU,CAAC,eAAe,CAAC,OAAO,EAAE;gBACnE,WAAW,EAAE,aAAa,IAAI,IAAI,IAAI,EAAE;aACzC,CAAC,CAAC;YAEH;;;;eAIG;YACH,MAAM,cAAc,GAAgB,EAAE,CAAC;YAEvC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,mBAAmB,GAAW,CAAC,CAAC;YAEpC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvD,MAAM,YAAY,GAChB,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC;oBACjE,IAAI,CAAC;gBAEP,IAAI,YAAY,GAAG,mBAAmB,EAAE,CAAC;oBACvC,mBAAmB,GAAG,YAAY,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,IAAI,mBAAmB,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf;;;;;;eAMG;YACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAnFe;IADb,WAAW,EAAE;;;oCACuC,IAAI;yCASxD;AAqBa;IADb,WAAW,EAAE;;;;yCAqDb"}
@@ -0,0 +1,112 @@
1
+ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
2
+ /*
3
+ * The stateful half of Global SSO enforcement.
4
+ *
5
+ * A Global SSO/OIDC token is a 30-day, self-contained JWT with no project
6
+ * binding, so on its own it answers only "this person authenticated against
7
+ * SOME instance-wide identity provider at some point in the last month". Two
8
+ * questions it cannot answer:
9
+ *
10
+ * 1. IS THE PROVIDER STILL TRUSTED? Turning a provider off, or deleting it,
11
+ * has to actually cut off access. Without a check at request time the
12
+ * "Enabled" toggle does nothing to anyone already signed in, for up to
13
+ * thirty days. This check is UNCONDITIONAL - "disabled" has only one
14
+ * possible meaning.
15
+ *
16
+ * 2. DOES THE PROVIDER GOVERN THIS PROJECT? Deliberately OPT-IN, per
17
+ * provider, via `restrictToAttachedProjects`. The attachment rows
18
+ * (GlobalSsoProject / GlobalOidcProject) were introduced as the
19
+ * PROVISIONING allow-list - "a SAML assertion can only ever provision a
20
+ * user into projects that a master admin has explicitly attached here",
21
+ * per the model's own docstring - and the login routers gate a session on
22
+ * membership of ANY project, not of an attached one. Reading attachments
23
+ * as an access boundary by default would therefore lock existing users
24
+ * out of projects they legitimately reach today, immediately on upgrade,
25
+ * with no way to recover from inside the product. So it stays off unless
26
+ * an admin asks for it.
27
+ *
28
+ * Both answers come from Postgres and run on every authenticated request
29
+ * against an SSO-enforced project, so both are cached in-process for 60
30
+ * seconds, and concurrent misses share one query.
31
+ */
32
+ export const GLOBAL_SSO_AUTHORIZATION_CACHE_TTL_MS = 60000;
33
+ /*
34
+ * Absence of an entry means "not yet looked up", which is why these are read
35
+ * with an explicit `undefined` check rather than a truthiness test: a cached
36
+ * "this provider is disabled" must not be mistaken for a cache miss and
37
+ * re-queried on every single request.
38
+ */
39
+ export const globalSsoProviderTrustCache = new InMemoryTTLCache(10000);
40
+ export const globalSsoAttachmentsCache = new InMemoryTTLCache(10000);
41
+ /*
42
+ * Namespaced by kind. A Global SSO provider and a Global OIDC provider are
43
+ * different rows in different tables and could in principle share an id;
44
+ * collapsing the keys would let one vouch for the other.
45
+ */
46
+ export function globalProviderCacheKey(providerKind, providerId) {
47
+ return `${providerKind}:${providerId.toString()}`;
48
+ }
49
+ /**
50
+ * Decides whether a provider's attachments cover `projectId`, for a provider
51
+ * that has opted into attachment-scoped access.
52
+ *
53
+ * A provider with no attachment rows at all is instance-wide, matching the
54
+ * "default-all" reading the login routers use. A provider that HAS attachment
55
+ * rows governs exactly the enabled ones - so disabling them all denies rather
56
+ * than widens.
57
+ */
58
+ export function doAttachmentsGovernProject(attachments, projectId) {
59
+ if (!attachments.hasAnyAttachmentRows) {
60
+ return true;
61
+ }
62
+ return attachments.enabledProjectIds.includes(projectId.toString());
63
+ }
64
+ /** Drops every cached answer. Used by the write hooks and by tests. */
65
+ export function clearGlobalSsoAuthorizationCaches() {
66
+ globalSsoProviderTrustCache.clear();
67
+ globalSsoAttachmentsCache.clear();
68
+ inFlightTrustLookups.clear();
69
+ inFlightAttachmentLookups.clear();
70
+ }
71
+ /*
72
+ * In-flight de-duplication.
73
+ *
74
+ * The multi-tenant permission path fans out over every project the user
75
+ * belongs to CONCURRENTLY. Without this, a cold cache means N simultaneous
76
+ * copies of the same two queries - for a user in fifty projects, a hundred
77
+ * queries where two would do. Worse, failures are never cached, so a database
78
+ * that is already struggling gets the full fan-out again on every request.
79
+ *
80
+ * Sharing the promise collapses all of that to one query per provider, and a
81
+ * rejection is shared too rather than being retried N times in the same tick.
82
+ */
83
+ const inFlightTrustLookups = new Map();
84
+ const inFlightAttachmentLookups = new Map();
85
+ async function loadOnce(inFlight, key, load) {
86
+ const existing = inFlight.get(key);
87
+ if (existing) {
88
+ return existing;
89
+ }
90
+ const pending = load().finally(() => {
91
+ /*
92
+ * Only clear the slot if it is still OURS. A cache clear between the two
93
+ * (every write to a Global SSO/OIDC service does exactly that, twice) lets
94
+ * a NEWER lookup take the key while this one is still on the wire; a blind
95
+ * delete would evict that newer entry when this one settles, and the fan-
96
+ * out that follows would stop de-duplicating - the one situation this
97
+ * exists for.
98
+ */
99
+ if (inFlight.get(key) === pending) {
100
+ inFlight.delete(key);
101
+ }
102
+ });
103
+ inFlight.set(key, pending);
104
+ return pending;
105
+ }
106
+ export function loadTrustOnce(key, load) {
107
+ return loadOnce(inFlightTrustLookups, key, load);
108
+ }
109
+ export function loadAttachmentsOnce(key, load) {
110
+ return loadOnce(inFlightAttachmentLookups, key, load);
111
+ }
112
+ //# sourceMappingURL=GlobalSsoAuthorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalSsoAuthorization.js","sourceRoot":"","sources":["../../../../Server/Utils/GlobalSsoAuthorization.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,oCAAoC,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,CAAC,MAAM,qCAAqC,GAAW,KAAM,CAAC;AAUpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GACtC,IAAI,gBAAgB,CAAC,KAAM,CAAC,CAAC;AAe/B,MAAM,CAAC,MAAM,yBAAyB,GACpC,IAAI,gBAAgB,CAAC,KAAM,CAAC,CAAC;AAI/B;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAAgC,EAChC,UAAoB;IAEpB,OAAO,GAAG,YAAY,IAAI,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAsC,EACtC,SAAmB;IAEnB,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iCAAiC;IAC/C,2BAA2B,CAAC,KAAK,EAAE,CAAC;IACpC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IAClC,oBAAoB,CAAC,KAAK,EAAE,CAAC;IAC7B,yBAAyB,CAAC,KAAK,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAGtB,IAAI,GAAG,EAAE,CAAC;AACd,MAAM,yBAAyB,GAG3B,IAAI,GAAG,EAAE,CAAC;AAEd,KAAK,UAAU,QAAQ,CACrB,QAAiC,EACjC,GAAW,EACX,IAAsB;IAEtB,MAAM,QAAQ,GAA2B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE3D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAe,IAAI,EAAE,CAAC,OAAO,CAAC,GAAS,EAAE;QACpD;;;;;;;WAOG;QACH,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;YAClC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,IAAwC;IAExC,OAAO,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,IAA8C;IAE9C,OAAO,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { AxiosError } from "axios";
2
- import { MarketingConversionType } from "../../../Types/Marketing/MarketingConversion";
2
+ import { AdUploadableMarketingConversionTypes, MarketingConversionType, } from "../../../Types/Marketing/MarketingConversion";
3
3
  export default class ConversionUploadProvider {
4
4
  constructor() {
5
5
  /*
@@ -9,6 +9,22 @@ export default class ConversionUploadProvider {
9
9
  */
10
10
  this.maxBatchSize = 500;
11
11
  }
12
+ /*
13
+ * Every provider maps a conversion onto a platform conversion action by
14
+ * branching on isSignUp() — so a conversion type the ad platforms have no
15
+ * mapping for (a booked meeting) would otherwise be silently uploaded as a
16
+ * purchase. Screen those out here, before any provider sees them, so no
17
+ * provider or call site can skip the check.
18
+ */
19
+ getSkipReason(conversion) {
20
+ if (!AdUploadableMarketingConversionTypes.includes(conversion.conversionType)) {
21
+ return {
22
+ reason: `Conversion type ${conversion.conversionType || "unknown"} has no ad platform conversion mapping`,
23
+ isPermanent: true,
24
+ };
25
+ }
26
+ return this.getProviderSkipReason(conversion);
27
+ }
12
28
  getClickId(conversion, clickIdKey) {
13
29
  const clickIds = conversion.clickIds || {};
14
30
  const value = clickIds[clickIdKey];
@@ -1 +1 @@
1
- {"version":3,"file":"ConversionUploadProvider.js","sourceRoot":"","sources":["../../../../../Server/Utils/Marketing/ConversionUploadProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAsCvF,MAAM,CAAC,OAAO,OAAgB,wBAAwB;IAAtD;QAKE;;;;WAIG;QACa,iBAAY,GAAW,GAAG,CAAC;IAoD7C,CAAC;IAxCW,UAAU,CAClB,UAA+B,EAC/B,UAAkB;QAElB,MAAM,QAAQ,GAAe,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvD,MAAM,KAAK,GAAY,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAES,aAAa,CAAC,UAA+B;QACrD,IACE,UAAU,CAAC,yBAAyB,KAAK,SAAS;YAClD,UAAU,CAAC,yBAAyB,KAAK,IAAI;YAC7C,UAAU,CAAC,yBAAyB,IAAI,CAAC,EACzC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IACpD,CAAC;IAES,QAAQ,CAAC,UAA+B;QAChD,OAAO,UAAU,CAAC,cAAc,KAAK,uBAAuB,CAAC,MAAM,CAAC;IACtE,CAAC;IAES,eAAe,CACvB,UAA+B,EAC/B,IAAY;QAEZ,MAAM,YAAY,GAAS,UAAU,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1E,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,GAAY;;QACxC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,MAAM,KAAI,GAAG,KAAK,IAAI,CAAC,SAAS,CAC3D,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,IAAI,KAAI,GAAG,CAAC,OAAO,CAClC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,GAAa,aAAb,GAAG,uBAAH,GAAG,CAAY,OAAO,KAAI,eAAe,CAAC;IACpD,CAAC;CACF"}
1
+ {"version":3,"file":"ConversionUploadProvider.js","sourceRoot":"","sources":["../../../../../Server/Utils/Marketing/ConversionUploadProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EACL,oCAAoC,EACpC,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AAyCtD,MAAM,CAAC,OAAO,OAAgB,wBAAwB;IAAtD;QAKE;;;;WAIG;QACa,iBAAY,GAAW,GAAG,CAAC;IA4E7C,CAAC;IAxEC;;;;;;OAMG;IACI,aAAa,CAAC,UAA+B;QAClD,IACE,CAAC,oCAAoC,CAAC,QAAQ,CAC5C,UAAU,CAAC,cAAyC,CACrD,EACD,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,mBACN,UAAU,CAAC,cAAc,IAAI,SAC/B,wCAAwC;gBACxC,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAUS,UAAU,CAClB,UAA+B,EAC/B,UAAkB;QAElB,MAAM,QAAQ,GAAe,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvD,MAAM,KAAK,GAAY,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAES,aAAa,CAAC,UAA+B;QACrD,IACE,UAAU,CAAC,yBAAyB,KAAK,SAAS;YAClD,UAAU,CAAC,yBAAyB,KAAK,IAAI;YAC7C,UAAU,CAAC,yBAAyB,IAAI,CAAC,EACzC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IACpD,CAAC;IAES,QAAQ,CAAC,UAA+B;QAChD,OAAO,UAAU,CAAC,cAAc,KAAK,uBAAuB,CAAC,MAAM,CAAC;IACtE,CAAC;IAES,eAAe,CACvB,UAA+B,EAC/B,IAAY;QAEZ,MAAM,YAAY,GAAS,UAAU,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1E,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,GAAY;;QACxC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,MAAM,KAAI,GAAG,KAAK,IAAI,CAAC,SAAS,CAC3D,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,IAAI,KAAI,GAAG,CAAC,OAAO,CAClC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,GAAa,aAAb,GAAG,uBAAH,GAAG,CAAY,OAAO,KAAI,eAAe,CAAC;IACpD,CAAC;CACF"}
@@ -26,7 +26,7 @@ export default class GoogleAdsProvider extends ConversionUploadProvider {
26
26
  GoogleAdsOAuthRefreshToken &&
27
27
  GoogleAdsCustomerId);
28
28
  }
29
- getSkipReason(conversion) {
29
+ getProviderSkipReason(conversion) {
30
30
  if (!this.getGoogleClickId(conversion)) {
31
31
  return {
32
32
  reason: "No Google click id (gclid/wbraid/gbraid)",
@@ -1 +1 @@
1
- {"version":3,"file":"GoogleAds.js","sourceRoot":"","sources":["../../../../../../Server/Utils/Marketing/Providers/GoogleAds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GoogleAds.js","sourceRoot":"","sources":["../../../../../../Server/Utils/Marketing/Providers/GoogleAds.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ export default class LinkedInProvider extends ConversionUploadProvider {
28
28
  isConfigured() {
29
29
  return Boolean(LinkedInConversionsAccessToken);
30
30
  }
31
- getSkipReason(conversion) {
31
+ getProviderSkipReason(conversion) {
32
32
  if (!this.getClickId(conversion, "li_fat_id")) {
33
33
  return {
34
34
  reason: "No LinkedIn click id (li_fat_id)",