@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.
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { FixTotpOtpUrlAlgorithm1787700000000 } from "../../../../Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm";
|
|
2
|
+
import SchemaMigrations from "../../../../Server/Infrastructure/Postgres/SchemaMigrations/Index";
|
|
3
|
+
import TotpAuth from "../../../../Server/Utils/TotpAuth";
|
|
4
|
+
import Email from "../../../../Types/Email";
|
|
5
|
+
import * as OTPAuth from "otpauth";
|
|
6
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { beforeEach, describe, expect, test } from "@jest/globals";
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
* The data repair behind the code fix.
|
|
13
|
+
*
|
|
14
|
+
* A row created before the fix still has `algorithm=SHA256` in the URL its QR
|
|
15
|
+
* code is rendered from. That no longer locks anyone out — verification tries
|
|
16
|
+
* SHA1 first, which is what those phones were emitting all along, and the tests
|
|
17
|
+
* below prove both a phone and a conforming app get in either way. What the
|
|
18
|
+
* rewrite buys is a stored URL that stops lying, which matters for the apps
|
|
19
|
+
* that DO honour the parameter and have no SHA256.
|
|
20
|
+
*
|
|
21
|
+
* Two properties are load-bearing and both are asserted here:
|
|
22
|
+
*
|
|
23
|
+
* 1. the secret is untouched, so an app that already scanned the old QR code
|
|
24
|
+
* keeps working (verification accepts SHA1 and legacy SHA256 either way);
|
|
25
|
+
* 2. verified rows are left alone. Their QR is never displayed again — the
|
|
26
|
+
* Verify action only exists for unverified entries — so the stored URL is
|
|
27
|
+
* a record of what the user's authenticator actually holds, and rewriting
|
|
28
|
+
* it would falsify that record for no benefit.
|
|
29
|
+
*
|
|
30
|
+
* The statements are inspected rather than executed: these tests must run
|
|
31
|
+
* without a database, and what can go wrong here is the WHERE clause, not
|
|
32
|
+
* Postgres' REPLACE().
|
|
33
|
+
*
|
|
34
|
+
* This file also carries the ORDERING guard, handed on from
|
|
35
|
+
* AddNetworkDeviceReachabilityColumnsMigration.test.ts: this is the newest
|
|
36
|
+
* registered migration, so its timestamp must sort above every other one.
|
|
37
|
+
* `generate-postgres-migration` stamps a WALL-CLOCK timestamp, while the
|
|
38
|
+
* recent migrations here use hand-picked round numbers that already run ahead
|
|
39
|
+
* of it — so a generated file lands BELOW several registered migrations
|
|
40
|
+
* unless somebody renumbers it, and runs out of order without anything saying
|
|
41
|
+
* so. Whoever adds the next migration should move this block to theirs.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
const MIGRATION_TIMESTAMP: string = "1787700000000";
|
|
45
|
+
|
|
46
|
+
const MIGRATION_DIRECTORY: string = path.join(
|
|
47
|
+
__dirname,
|
|
48
|
+
"../../../../Server/Infrastructure/Postgres/SchemaMigrations",
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
interface MigrationClass {
|
|
52
|
+
name: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function timestampOf(migrationClass: MigrationClass): number | null {
|
|
56
|
+
const match: RegExpMatchArray | null = migrationClass.name.match(/(\d+)$/);
|
|
57
|
+
return match ? Number(match[1]) : null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type CapturedQueryRunner = {
|
|
61
|
+
runner: QueryRunner;
|
|
62
|
+
queries: Array<string>;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
type MockQueryRunnerFunction = () => CapturedQueryRunner;
|
|
66
|
+
|
|
67
|
+
const mockQueryRunner: MockQueryRunnerFunction = (): CapturedQueryRunner => {
|
|
68
|
+
const queries: Array<string> = [];
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
queries: queries,
|
|
72
|
+
runner: {
|
|
73
|
+
query: async (sql: string): Promise<void> => {
|
|
74
|
+
queries.push(sql);
|
|
75
|
+
},
|
|
76
|
+
} as unknown as QueryRunner,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const migration: FixTotpOtpUrlAlgorithm1787700000000 =
|
|
81
|
+
new FixTotpOtpUrlAlgorithm1787700000000();
|
|
82
|
+
|
|
83
|
+
let up: CapturedQueryRunner;
|
|
84
|
+
let down: CapturedQueryRunner;
|
|
85
|
+
|
|
86
|
+
describe("FixTotpOtpUrlAlgorithm migration", () => {
|
|
87
|
+
beforeEach(async () => {
|
|
88
|
+
up = mockQueryRunner();
|
|
89
|
+
down = mockQueryRunner();
|
|
90
|
+
|
|
91
|
+
await migration.up(up.runner);
|
|
92
|
+
await migration.down(down.runner);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* TypeORM matches migrations by this name. A mismatch between the class name
|
|
97
|
+
* and the `name` property makes the migration run again on every boot.
|
|
98
|
+
*/
|
|
99
|
+
test("names itself consistently so it is recorded as run", () => {
|
|
100
|
+
expect(migration.name).toBe("FixTotpOtpUrlAlgorithm1787700000000");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("is registered in SchemaMigrations/Index.ts, or it never runs", () => {
|
|
104
|
+
expect(SchemaMigrations).toContain(FixTotpOtpUrlAlgorithm1787700000000);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// The guard described in the header. Hand it to the next migration.
|
|
108
|
+
describe("ordering", () => {
|
|
109
|
+
test("its timestamp sorts after every other registered migration", () => {
|
|
110
|
+
const ourTimestamp: number | null = timestampOf(
|
|
111
|
+
FixTotpOtpUrlAlgorithm1787700000000,
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
expect(ourTimestamp).not.toBeNull();
|
|
115
|
+
|
|
116
|
+
const otherTimestamps: Array<number> = [];
|
|
117
|
+
|
|
118
|
+
for (const migrationClass of SchemaMigrations) {
|
|
119
|
+
if (migrationClass === FixTotpOtpUrlAlgorithm1787700000000) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const timestamp: number | null = timestampOf(
|
|
124
|
+
migrationClass as MigrationClass,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
if (timestamp !== null) {
|
|
128
|
+
otherTimestamps.push(timestamp);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
* Math.max() of an empty list is -Infinity, which every timestamp beats.
|
|
134
|
+
* Prove the list was actually enumerated before leaning on the maximum.
|
|
135
|
+
*/
|
|
136
|
+
expect(otherTimestamps.length).toBeGreaterThan(100);
|
|
137
|
+
|
|
138
|
+
expect(ourTimestamp).toBeGreaterThan(Math.max(...otherTimestamps));
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test("it is registered last, matching that timestamp", () => {
|
|
142
|
+
expect(SchemaMigrations[SchemaMigrations.length - 1]).toBe(
|
|
143
|
+
FixTotpOtpUrlAlgorithm1787700000000,
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("it is registered exactly once", () => {
|
|
148
|
+
const occurrences: number = SchemaMigrations.filter(
|
|
149
|
+
(migration: new () => MigrationInterface): boolean => {
|
|
150
|
+
return migration.name === "FixTotpOtpUrlAlgorithm1787700000000";
|
|
151
|
+
},
|
|
152
|
+
).length;
|
|
153
|
+
|
|
154
|
+
expect(occurrences).toBe(1);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* ...and the timestamp in the class name is the one on disk. A class
|
|
159
|
+
* renamed without renaming its file (or two migrations landing on the
|
|
160
|
+
* same timestamp) leaves the ordering above asserting something that is
|
|
161
|
+
* not what actually runs.
|
|
162
|
+
*/
|
|
163
|
+
test("exactly one file on disk carries its timestamp, and it is this one", () => {
|
|
164
|
+
const matching: Array<string> = fs
|
|
165
|
+
.readdirSync(MIGRATION_DIRECTORY)
|
|
166
|
+
.filter((file: string): boolean => {
|
|
167
|
+
return file.startsWith(`${MIGRATION_TIMESTAMP}-`);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
expect(matching).toEqual([
|
|
171
|
+
`${MIGRATION_TIMESTAMP}-FixTotpOtpUrlAlgorithm.ts`,
|
|
172
|
+
]);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe("up", () => {
|
|
177
|
+
test("rewrites the algorithm in the stored otpauth URL", () => {
|
|
178
|
+
expect(up.queries).toHaveLength(1);
|
|
179
|
+
expect(up.queries[0]).toContain(`UPDATE "UserTotpAuth"`);
|
|
180
|
+
expect(up.queries[0]).toContain(
|
|
181
|
+
`REPLACE("twoFactorOtpUrl", 'algorithm=SHA256', 'algorithm=SHA1')`,
|
|
182
|
+
);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* The secret is the only irreplaceable thing on the row. A migration that
|
|
187
|
+
* regenerated it would invalidate every authenticator entry in existence.
|
|
188
|
+
*/
|
|
189
|
+
test("never touches the secret", () => {
|
|
190
|
+
expect(up.queries[0]).not.toContain("twoFactorSecret");
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("only touches enrolments that are still pending", () => {
|
|
194
|
+
expect(up.queries[0]).toContain(`"isVerified" = false`);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("only touches rows that actually carry the broken algorithm", () => {
|
|
198
|
+
expect(up.queries[0]).toContain(
|
|
199
|
+
`"twoFactorOtpUrl" LIKE '%algorithm=SHA256%'`,
|
|
200
|
+
);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("does not delete anything", () => {
|
|
204
|
+
expect(up.queries[0]).not.toMatch(/\bDELETE\b|\bDROP\b|\bTRUNCATE\b/i);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe("down", () => {
|
|
209
|
+
test("is the exact inverse of up", () => {
|
|
210
|
+
expect(down.queries).toHaveLength(1);
|
|
211
|
+
expect(down.queries[0]).toContain(
|
|
212
|
+
`REPLACE("twoFactorOtpUrl", 'algorithm=SHA1', 'algorithm=SHA256')`,
|
|
213
|
+
);
|
|
214
|
+
expect(down.queries[0]).toContain(`"isVerified" = false`);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test("never touches the secret either", () => {
|
|
218
|
+
expect(down.queries[0]).not.toContain("twoFactorSecret");
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
/*
|
|
223
|
+
* What the SQL means, applied to a real URL. Postgres' REPLACE is a plain
|
|
224
|
+
* substring substitution, so doing it here in JavaScript is a faithful model
|
|
225
|
+
* of the statement above — and it lets the result be handed to the real
|
|
226
|
+
* parser and the real verifier.
|
|
227
|
+
*/
|
|
228
|
+
describe("the effect on a row written before the fix", () => {
|
|
229
|
+
const EMAIL: Email = new Email("stuck.user@example.com");
|
|
230
|
+
|
|
231
|
+
type ApplyUpFunction = (url: string) => string;
|
|
232
|
+
|
|
233
|
+
const applyUp: ApplyUpFunction = (url: string): string => {
|
|
234
|
+
return url.split("algorithm=SHA256").join("algorithm=SHA1");
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
type LegacyUrlFunction = (secret: string) => string;
|
|
238
|
+
|
|
239
|
+
/*
|
|
240
|
+
* What the old code wrote: everything as today, but SHA256.
|
|
241
|
+
*/
|
|
242
|
+
const legacyUrl: LegacyUrlFunction = (secret: string): string => {
|
|
243
|
+
return new OTPAuth.TOTP({
|
|
244
|
+
issuer: "OneUptime",
|
|
245
|
+
label: EMAIL.toString(),
|
|
246
|
+
algorithm: "SHA256",
|
|
247
|
+
digits: 6,
|
|
248
|
+
period: 30,
|
|
249
|
+
secret: secret,
|
|
250
|
+
}).toString();
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
test("the repaired QR code produces codes the server accepts", () => {
|
|
254
|
+
const secret: string = TotpAuth.generateSecret();
|
|
255
|
+
|
|
256
|
+
const repaired: OTPAuth.TOTP = OTPAuth.URI.parse(
|
|
257
|
+
applyUp(legacyUrl(secret)),
|
|
258
|
+
) as OTPAuth.TOTP;
|
|
259
|
+
|
|
260
|
+
expect(repaired.algorithm).toBe("SHA1");
|
|
261
|
+
|
|
262
|
+
expect(
|
|
263
|
+
TotpAuth.verifyToken({
|
|
264
|
+
secret: secret,
|
|
265
|
+
token: repaired.generate(),
|
|
266
|
+
email: EMAIL,
|
|
267
|
+
}),
|
|
268
|
+
).toBe(true);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("the secret survives the rewrite unchanged", () => {
|
|
272
|
+
const secret: string = TotpAuth.generateSecret();
|
|
273
|
+
|
|
274
|
+
const repaired: OTPAuth.TOTP = OTPAuth.URI.parse(
|
|
275
|
+
applyUp(legacyUrl(secret)),
|
|
276
|
+
) as OTPAuth.TOTP;
|
|
277
|
+
|
|
278
|
+
expect(repaired.secret.base32).toBe(secret);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
/*
|
|
282
|
+
* Somebody mid-enrolment may already have scanned the old SHA256 QR with
|
|
283
|
+
* an app that honours the parameter. Rewriting the URL must not strand
|
|
284
|
+
* them: their app still emits SHA256 codes, and those still verify.
|
|
285
|
+
*/
|
|
286
|
+
test("an app that already scanned the old SHA256 QR still verifies", () => {
|
|
287
|
+
const secret: string = TotpAuth.generateSecret();
|
|
288
|
+
|
|
289
|
+
const alreadyScanned: OTPAuth.TOTP = OTPAuth.URI.parse(
|
|
290
|
+
legacyUrl(secret),
|
|
291
|
+
) as OTPAuth.TOTP;
|
|
292
|
+
|
|
293
|
+
expect(alreadyScanned.algorithm).toBe("SHA256");
|
|
294
|
+
|
|
295
|
+
expect(
|
|
296
|
+
TotpAuth.verifyToken({
|
|
297
|
+
secret: secret,
|
|
298
|
+
token: alreadyScanned.generate(),
|
|
299
|
+
email: EMAIL,
|
|
300
|
+
}),
|
|
301
|
+
).toBe(true);
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
test("a URL that is already SHA1 is left exactly as it was", () => {
|
|
305
|
+
const secret: string = TotpAuth.generateSecret();
|
|
306
|
+
|
|
307
|
+
const current: string = TotpAuth.generateUri({
|
|
308
|
+
secret: secret,
|
|
309
|
+
userEmail: EMAIL,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
expect(applyUp(current)).toBe(current);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|