@oneuptime/common 12.0.13 → 12.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  2. package/Models/DatabaseModels/UserCall.ts +94 -3
  3. package/Models/DatabaseModels/UserEmail.ts +94 -3
  4. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  5. package/Models/DatabaseModels/UserPush.ts +37 -0
  6. package/Models/DatabaseModels/UserSMS.ts +94 -3
  7. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  8. package/Server/API/BaseAPI.ts +79 -14
  9. package/Server/API/UserCallAPI.ts +53 -45
  10. package/Server/API/UserEmailAPI.ts +53 -44
  11. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  12. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  13. package/Server/API/UserPushAPI.ts +126 -2
  14. package/Server/API/UserSmsAPI.ts +53 -44
  15. package/Server/API/UserWhatsAppAPI.ts +53 -50
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  20. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  21. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  22. package/Server/Services/DatabaseService.ts +101 -0
  23. package/Server/Services/LogAggregationService.ts +5 -0
  24. package/Server/Services/PushNotificationService.ts +127 -12
  25. package/Server/Services/TeamMemberService.ts +53 -13
  26. package/Server/Services/UserCallService.ts +55 -24
  27. package/Server/Services/UserEmailService.ts +83 -17
  28. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  29. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  30. package/Server/Services/UserNotificationRuleService.ts +26 -0
  31. package/Server/Services/UserPushService.ts +89 -0
  32. package/Server/Services/UserSmsService.ts +50 -17
  33. package/Server/Services/UserWhatsAppService.ts +48 -15
  34. package/Server/Types/Database/QueryHelper.ts +30 -0
  35. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  36. package/Server/Utils/ChannelVerification.ts +510 -0
  37. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  38. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  39. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  40. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  41. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  42. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  43. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  44. package/Server/Utils/TotpAuth.ts +137 -9
  45. package/Server/Utils/UserRegistrationToken.ts +182 -0
  46. package/Server/Utils/VerificationCode.ts +134 -0
  47. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  48. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  49. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  50. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  51. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  52. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
  53. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  54. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  55. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  56. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  57. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  58. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  59. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  60. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  61. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  62. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  63. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
  64. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  65. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  66. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  67. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  68. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  69. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  70. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  71. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  72. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  73. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  74. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  75. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  76. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  77. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  78. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  79. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  80. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  81. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  82. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  83. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  84. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  85. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  86. package/Tests/Server/Utils/Browser.test.ts +162 -0
  87. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  88. package/Tests/Server/Utils/Express.test.ts +371 -0
  89. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  90. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  91. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  92. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  93. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  94. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  95. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  96. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  97. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  98. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  99. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  100. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  101. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  102. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  103. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  104. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  105. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  106. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  107. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  108. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  109. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  110. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  111. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  112. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  113. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  114. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  115. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  116. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  117. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  118. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  119. package/Tests/UI/Components/Button.test.tsx +175 -1
  120. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  121. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  122. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  123. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  124. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  125. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  126. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  127. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  128. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  129. package/Tests/UI/Components/List.test.tsx +9 -2
  130. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  131. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  132. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  133. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  134. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  135. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  136. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  137. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  138. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  139. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  140. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  141. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  142. package/Tests/UI/Components/Toast.test.tsx +130 -7
  143. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  144. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  145. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  146. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  147. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  148. package/Tests/Utils/API.test.ts +16 -2
  149. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  150. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  151. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  152. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  153. package/Types/Email/EmailTemplateType.ts +1 -0
  154. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  155. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  156. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  157. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  158. package/Types/Permission.ts +35 -0
  159. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  160. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  161. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  162. package/Types/Service/ServiceLanguage.ts +144 -0
  163. package/Types/Text.ts +111 -19
  164. package/UI/Components/Button/Button.tsx +27 -14
  165. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  166. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  167. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  168. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  169. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  170. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  171. package/UI/Components/CommandPalette/Types.ts +49 -0
  172. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  173. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  174. package/UI/Components/Feed/FeedItem.tsx +1 -1
  175. package/UI/Components/List/List.tsx +37 -5
  176. package/UI/Components/List/ListSkeleton.tsx +54 -0
  177. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
  178. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  179. package/UI/Components/Modal/Modal.tsx +2 -2
  180. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  181. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  182. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  183. package/UI/Components/Navbar/NavBar.tsx +14 -1
  184. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  185. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  186. package/UI/Components/SideOver/SideOver.tsx +37 -2
  187. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  188. package/UI/Components/Table/Table.tsx +74 -44
  189. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  190. package/UI/Components/Tabs/Tab.tsx +1 -1
  191. package/UI/Components/Toast/Toast.tsx +118 -53
  192. package/UI/Components/Toast/ToastInit.tsx +82 -32
  193. package/UI/Styles/Theme.css +40 -0
  194. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  195. package/UI/Utils/ModelListCache.ts +188 -0
  196. package/UI/Utils/Project.ts +29 -0
  197. package/Utils/API.ts +6 -1
  198. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  199. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  201. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  203. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  205. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  207. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  209. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  211. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  212. package/build/dist/Server/API/BaseAPI.js +69 -13
  213. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  214. package/build/dist/Server/API/UserCallAPI.js +42 -38
  215. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  216. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  217. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  218. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  219. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  220. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  221. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  222. package/build/dist/Server/API/UserPushAPI.js +95 -2
  223. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  224. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  225. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  226. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  227. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  236. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  237. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  239. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  240. package/build/dist/Server/Services/DatabaseService.js +74 -0
  241. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  242. package/build/dist/Server/Services/LogAggregationService.js +5 -0
  243. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  244. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  245. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  246. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  247. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  248. package/build/dist/Server/Services/UserCallService.js +54 -22
  249. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  250. package/build/dist/Server/Services/UserEmailService.js +78 -17
  251. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  252. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  253. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  254. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  255. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  256. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  257. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  258. package/build/dist/Server/Services/UserPushService.js +77 -0
  259. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  260. package/build/dist/Server/Services/UserSmsService.js +50 -17
  261. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  262. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  263. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  264. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  265. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  266. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  267. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  268. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  269. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  270. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  271. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  272. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  273. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  274. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  275. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  276. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  277. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  278. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  279. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  280. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  281. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  282. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  283. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  284. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  285. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  286. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  287. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  288. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  289. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  290. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  291. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  292. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  293. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  294. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  295. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  296. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  297. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  298. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  299. package/build/dist/Types/Permission.js +33 -0
  300. package/build/dist/Types/Permission.js.map +1 -1
  301. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  302. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  303. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  304. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  305. package/build/dist/Types/Text.js +82 -17
  306. package/build/dist/Types/Text.js.map +1 -1
  307. package/build/dist/UI/Components/Button/Button.js +22 -14
  308. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  309. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  310. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  311. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  312. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  313. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  314. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  315. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  316. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  317. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  318. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  319. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  320. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  321. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  322. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  323. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  324. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  325. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  326. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  327. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  328. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  329. package/build/dist/UI/Components/List/List.js +19 -5
  330. package/build/dist/UI/Components/List/List.js.map +1 -1
  331. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  332. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  333. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  334. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  335. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  336. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  337. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  338. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  339. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  340. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  341. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  342. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  343. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  344. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  345. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  346. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  347. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  348. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  349. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  350. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  351. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  352. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  353. package/build/dist/UI/Components/Table/Table.js +35 -24
  354. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  355. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  356. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  357. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  358. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  359. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  360. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  361. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  362. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  363. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  364. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  365. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  366. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  367. package/build/dist/UI/Utils/Project.js +24 -1
  368. package/build/dist/UI/Utils/Project.js.map +1 -1
  369. package/build/dist/Utils/API.js +6 -1
  370. package/build/dist/Utils/API.js.map +1 -1
  371. package/jest.config.json +1 -1
  372. package/package.json +2 -3
  373. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  374. package/Tests/__mocks__/otpauth.js +0 -30
  375. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  376. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,248 @@
1
+ import crypto from "crypto";
2
+
3
+ /*
4
+ * A stand-in for the authenticator app on the user's phone.
5
+ *
6
+ * Every function here is derived from RFC 4648 (base32), RFC 4226 (HOTP) and
7
+ * RFC 6238 (TOTP) using Node's own crypto primitives. Nothing in this file
8
+ * imports `otpauth`, and that is the entire point: the server verifies with
9
+ * `otpauth`, so a test that also generates its expected codes with `otpauth`
10
+ * proves only that the library agrees with itself. It would have passed
11
+ * happily throughout issue #3275, while every user with Google Authenticator
12
+ * was locked out.
13
+ *
14
+ * The most useful thing in here is `googleAuthenticatorCode`, which models the
15
+ * behaviour that caused that bug: real phone apps parse the otpauth:// URI,
16
+ * IGNORE its `algorithm` parameter, and compute SHA1 regardless.
17
+ */
18
+
19
+ const BASE32_ALPHABET: string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
20
+
21
+ export const DEFAULT_DIGITS: number = 6;
22
+ export const DEFAULT_PERIOD_IN_SECONDS: number = 30;
23
+
24
+ /** The algorithm a phone app uses no matter what the QR code claims. */
25
+ export const PHONE_APP_ALGORITHM: string = "SHA1";
26
+
27
+ export type Base32EncodeFunction = (bytes: Buffer) => string;
28
+
29
+ export const base32Encode: Base32EncodeFunction = (bytes: Buffer): string => {
30
+ let bits: string = "";
31
+
32
+ for (const byte of bytes) {
33
+ bits += byte.toString(2).padStart(8, "0");
34
+ }
35
+
36
+ let output: string = "";
37
+
38
+ for (let i: number = 0; i < bits.length; i += 5) {
39
+ const chunk: string = bits.slice(i, i + 5).padEnd(5, "0");
40
+ output += BASE32_ALPHABET[parseInt(chunk, 2)];
41
+ }
42
+
43
+ return output;
44
+ };
45
+
46
+ export type Base32DecodeFunction = (encoded: string) => Buffer;
47
+
48
+ export const base32Decode: Base32DecodeFunction = (encoded: string): Buffer => {
49
+ let bits: string = "";
50
+
51
+ for (const character of encoded.replace(/[=]+$/, "").toUpperCase()) {
52
+ const value: number = BASE32_ALPHABET.indexOf(character);
53
+
54
+ if (value === -1) {
55
+ throw new Error(`Not base32: ${character}`);
56
+ }
57
+
58
+ bits += value.toString(2).padStart(5, "0");
59
+ }
60
+
61
+ const bytes: Array<number> = [];
62
+
63
+ for (let i: number = 0; i + 8 <= bits.length; i += 8) {
64
+ bytes.push(parseInt(bits.slice(i, i + 8), 2));
65
+ }
66
+
67
+ return Buffer.from(bytes);
68
+ };
69
+
70
+ /*
71
+ * HOTP, RFC 4226 section 5.3: HMAC the 8-byte big-endian counter under the
72
+ * shared key, take the low nibble of the last byte as an offset, read a
73
+ * big-endian 31-bit integer from there, reduce modulo 10^digits.
74
+ */
75
+ export type HotpFunction = (data: {
76
+ key: Buffer;
77
+ counter: number;
78
+ algorithm: string;
79
+ digits: number;
80
+ }) => string;
81
+
82
+ export const hotp: HotpFunction = (data: {
83
+ key: Buffer;
84
+ counter: number;
85
+ algorithm: string;
86
+ digits: number;
87
+ }): string => {
88
+ const counterBytes: Buffer = Buffer.alloc(8);
89
+ counterBytes.writeBigUInt64BE(BigInt(data.counter));
90
+
91
+ const digest: Buffer = crypto
92
+ .createHmac(data.algorithm.toLowerCase(), data.key)
93
+ .update(counterBytes)
94
+ .digest();
95
+
96
+ const offset: number = digest[digest.length - 1]! & 0x0f;
97
+
98
+ const binary: number =
99
+ ((digest[offset]! & 0x7f) << 24) |
100
+ ((digest[offset + 1]! & 0xff) << 16) |
101
+ ((digest[offset + 2]! & 0xff) << 8) |
102
+ (digest[offset + 3]! & 0xff);
103
+
104
+ return (binary % 10 ** data.digits).toString().padStart(data.digits, "0");
105
+ };
106
+
107
+ /*
108
+ * TOTP: HOTP with the counter derived from the clock (RFC 6238 section 4).
109
+ */
110
+ export type AuthenticatorCodeFunction = (data: {
111
+ secretBase32: string;
112
+ algorithm?: string | undefined;
113
+ digits?: number | undefined;
114
+ periodInSeconds?: number | undefined;
115
+ atUnixSeconds?: number | undefined;
116
+ }) => string;
117
+
118
+ export const authenticatorCode: AuthenticatorCodeFunction = (data: {
119
+ secretBase32: string;
120
+ algorithm?: string | undefined;
121
+ digits?: number | undefined;
122
+ periodInSeconds?: number | undefined;
123
+ atUnixSeconds?: number | undefined;
124
+ }): string => {
125
+ const period: number = data.periodInSeconds || DEFAULT_PERIOD_IN_SECONDS;
126
+
127
+ const seconds: number =
128
+ data.atUnixSeconds === undefined
129
+ ? Math.floor(Date.now() / 1000)
130
+ : data.atUnixSeconds;
131
+
132
+ return hotp({
133
+ key: base32Decode(data.secretBase32),
134
+ counter: Math.floor(seconds / period),
135
+ algorithm: data.algorithm || PHONE_APP_ALGORITHM,
136
+ digits: data.digits === undefined ? DEFAULT_DIGITS : data.digits,
137
+ });
138
+ };
139
+
140
+ export type OtpauthUriParams = {
141
+ secret: string;
142
+ algorithm: string;
143
+ digits: number;
144
+ periodInSeconds: number;
145
+ issuer: string | null;
146
+ };
147
+
148
+ export type ParseOtpauthUriFunction = (uri: string) => OtpauthUriParams;
149
+
150
+ export const parseOtpauthUri: ParseOtpauthUriFunction = (
151
+ uri: string,
152
+ ): OtpauthUriParams => {
153
+ const params: URLSearchParams = new URLSearchParams(
154
+ uri.slice(uri.indexOf("?") + 1),
155
+ );
156
+
157
+ return {
158
+ secret: params.get("secret") || "",
159
+ algorithm: params.get("algorithm") || PHONE_APP_ALGORITHM,
160
+ digits: parseInt(params.get("digits") || String(DEFAULT_DIGITS), 10),
161
+ periodInSeconds: parseInt(
162
+ params.get("period") || String(DEFAULT_PERIOD_IN_SECONDS),
163
+ 10,
164
+ ),
165
+ issuer: params.get("issuer"),
166
+ };
167
+ };
168
+
169
+ /*
170
+ * What an app that honours every parameter in the URI shows — 1Password,
171
+ * Bitwarden, Aegis, FreeOTP.
172
+ */
173
+ export type CodeFromUriFunction = (
174
+ uri: string,
175
+ atUnixSeconds?: number,
176
+ ) => string;
177
+
178
+ export const conformingAppCode: CodeFromUriFunction = (
179
+ uri: string,
180
+ atUnixSeconds?: number,
181
+ ): string => {
182
+ const params: OtpauthUriParams = parseOtpauthUri(uri);
183
+
184
+ return authenticatorCode({
185
+ secretBase32: params.secret,
186
+ algorithm: params.algorithm,
187
+ digits: params.digits,
188
+ periodInSeconds: params.periodInSeconds,
189
+ atUnixSeconds: atUnixSeconds,
190
+ });
191
+ };
192
+
193
+ /*
194
+ * What Google Authenticator shows: the secret from the URI, but SHA1 whatever
195
+ * the URI says. This is the function that reproduces issue #3275 — hand it a
196
+ * SHA256 URI and the code it returns is the one the user typed in and the
197
+ * server rejected.
198
+ */
199
+ export const googleAuthenticatorCode: CodeFromUriFunction = (
200
+ uri: string,
201
+ atUnixSeconds?: number,
202
+ ): string => {
203
+ const params: OtpauthUriParams = parseOtpauthUri(uri);
204
+
205
+ return authenticatorCode({
206
+ secretBase32: params.secret,
207
+ algorithm: PHONE_APP_ALGORITHM,
208
+ digits: params.digits,
209
+ periodInSeconds: params.periodInSeconds,
210
+ atUnixSeconds: atUnixSeconds,
211
+ });
212
+ };
213
+
214
+ /*
215
+ * The otpauth:// URI a server hands to a QR code, built by hand so a test can
216
+ * produce the exact shape the OLD OneUptime code used to emit.
217
+ */
218
+ export type BuildOtpauthUriFunction = (data: {
219
+ secret: string;
220
+ label: string;
221
+ issuer?: string | undefined;
222
+ algorithm?: string | undefined;
223
+ digits?: number | undefined;
224
+ periodInSeconds?: number | undefined;
225
+ }) => string;
226
+
227
+ export const buildOtpauthUri: BuildOtpauthUriFunction = (data: {
228
+ secret: string;
229
+ label: string;
230
+ issuer?: string | undefined;
231
+ algorithm?: string | undefined;
232
+ digits?: number | undefined;
233
+ periodInSeconds?: number | undefined;
234
+ }): string => {
235
+ const issuer: string = data.issuer || "OneUptime";
236
+
237
+ const query: string = [
238
+ `issuer=${encodeURIComponent(issuer)}`,
239
+ `secret=${data.secret}`,
240
+ `algorithm=${data.algorithm || PHONE_APP_ALGORITHM}`,
241
+ `digits=${data.digits === undefined ? DEFAULT_DIGITS : data.digits}`,
242
+ `period=${data.periodInSeconds || DEFAULT_PERIOD_IN_SECONDS}`,
243
+ ].join("&");
244
+
245
+ return `otpauth://totp/${encodeURIComponent(issuer)}:${encodeURIComponent(
246
+ data.label,
247
+ )}?${query}`;
248
+ };
@@ -0,0 +1,135 @@
1
+ import UserCall from "../../../../../Models/DatabaseModels/UserCall";
2
+ import UserEmail from "../../../../../Models/DatabaseModels/UserEmail";
3
+ import UserIncomingCallNumber from "../../../../../Models/DatabaseModels/UserIncomingCallNumber";
4
+ import UserSMS from "../../../../../Models/DatabaseModels/UserSMS";
5
+ import UserWhatsApp from "../../../../../Models/DatabaseModels/UserWhatsApp";
6
+ import BaseModel from "../../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
7
+ import { ColumnAccessControl } from "../../../../../Types/BaseDatabase/AccessControl";
8
+ import { TableColumnMetadata } from "../../../../../Types/Database/TableColumn";
9
+ import { describe, expect, it } from "@jest/globals";
10
+
11
+ /*
12
+ * GHSA-5cr8-vph4-3hrf, the parts of the fix that live in model metadata
13
+ * rather than in code.
14
+ *
15
+ * Two properties, both of which a later well-meaning edit could remove
16
+ * without breaking a single functional test:
17
+ *
18
+ * 1. THE IDENTITY IS IMMUTABLE. The advisory's remediation list ends with
19
+ * "invalidate outstanding codes when contact details change". There is no
20
+ * such code path here, and that is not an oversight — the address or number
21
+ * on a channel row cannot be changed at all, because its column grants
22
+ * nobody update. A code is therefore bound to the contact detail it was
23
+ * sent to for the whole life of the row. Make one of these columns
24
+ * updatable and that stops being true: a caller verifies their own address,
25
+ * then rewrites the row to point at somebody else's, and arrives at a
26
+ * verified channel they do not own.
27
+ *
28
+ * 2. THE VERIFICATION STATE IS NOT WRITABLE BY THE CALLER. isVerified, the
29
+ * stored digest, its expiry and the attempt counter are all server-owned.
30
+ * A caller who could write any of them would not need to guess a code:
31
+ * they could set isVerified directly, or push the expiry out, or reset the
32
+ * attempt counter between guesses and never hit the limit.
33
+ */
34
+
35
+ interface ChannelUnderTest {
36
+ name: string;
37
+ model: BaseModel;
38
+ identityColumn: string;
39
+ }
40
+
41
+ const CHANNELS: Array<ChannelUnderTest> = [
42
+ { name: "UserEmail", model: new UserEmail(), identityColumn: "email" },
43
+ { name: "UserSMS", model: new UserSMS(), identityColumn: "phone" },
44
+ { name: "UserCall", model: new UserCall(), identityColumn: "phone" },
45
+ { name: "UserWhatsApp", model: new UserWhatsApp(), identityColumn: "phone" },
46
+ {
47
+ name: "UserIncomingCallNumber",
48
+ model: new UserIncomingCallNumber(),
49
+ identityColumn: "phone",
50
+ },
51
+ ];
52
+
53
+ /* Server-owned: writable by nobody through the API, at any point. */
54
+ const SERVER_OWNED_COLUMNS: Array<string> = [
55
+ "isVerified",
56
+ "verificationCode",
57
+ "verificationCodeExpiresAt",
58
+ "verificationFailedAttempts",
59
+ "verificationCodeSentAt",
60
+ ];
61
+
62
+ describe.each(CHANNELS)(
63
+ "$name verification column metadata",
64
+ (channel: ChannelUnderTest) => {
65
+ const accessControlFor: (columnName: string) => ColumnAccessControl = (
66
+ columnName: string,
67
+ ) => {
68
+ const accessControl: ColumnAccessControl | null =
69
+ channel.model.getColumnAccessControlFor(columnName);
70
+
71
+ expect(accessControl).not.toBeNull();
72
+
73
+ return accessControl as ColumnAccessControl;
74
+ };
75
+
76
+ it("does not let anybody change the address or number after creation", () => {
77
+ expect(accessControlFor(channel.identityColumn).update).toEqual([]);
78
+ });
79
+
80
+ it.each(SERVER_OWNED_COLUMNS)(
81
+ "does not let anybody create or update %s",
82
+ (columnName: string) => {
83
+ const accessControl: ColumnAccessControl = accessControlFor(columnName);
84
+
85
+ expect(accessControl.create).toEqual([]);
86
+ expect(accessControl.update).toEqual([]);
87
+ },
88
+ );
89
+
90
+ it.each([
91
+ "verificationCode",
92
+ "verificationCodeExpiresAt",
93
+ "verificationFailedAttempts",
94
+ "verificationCodeSentAt",
95
+ ])("does not expose %s to any reader", (columnName: string) => {
96
+ expect(accessControlFor(columnName).read).toEqual([]);
97
+ });
98
+
99
+ /*
100
+ * The row is born with a placeholder no six-digit code can hash to; the
101
+ * real code is issued by the service once the insert has assigned an id,
102
+ * because the id is part of the hashed message. A default that produced
103
+ * something SHORT would be a live guessable code sitting on every new row
104
+ * for the moment before the service overwrote it.
105
+ */
106
+ it("defaults verificationCode to a value no code can hash to", () => {
107
+ const metadata: TableColumnMetadata =
108
+ channel.model.getTableColumnMetadata("verificationCode");
109
+
110
+ expect(metadata.forceGetDefaultValueOnCreate).toBeDefined();
111
+
112
+ const generated: string = (
113
+ metadata.forceGetDefaultValueOnCreate as () => string
114
+ )();
115
+
116
+ expect(generated).toHaveLength(64);
117
+ expect(generated).not.toMatch(/^[0-9]{1,10}$/);
118
+ });
119
+
120
+ it("generates a different placeholder for every row", () => {
121
+ const metadata: TableColumnMetadata =
122
+ channel.model.getTableColumnMetadata("verificationCode");
123
+
124
+ const generated: Set<string> = new Set<string>();
125
+
126
+ for (let i: number = 0; i < 50; i++) {
127
+ generated.add(
128
+ (metadata.forceGetDefaultValueOnCreate as () => string)(),
129
+ );
130
+ }
131
+
132
+ expect(generated.size).toBe(50);
133
+ });
134
+ },
135
+ );