@oneuptime/common 12.0.12 → 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/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
- package/Models/DatabaseModels/NetworkDevice.ts +64 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/StatusPage.ts +59 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +2 -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/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
- package/Server/API/AIChatAPI.ts +55 -56
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/CommonAPI.ts +89 -0
- package/Server/API/MicrosoftTeamsAPI.ts +20 -9
- package/Server/API/SlackAPI.ts +13 -10
- package/Server/API/StatusPageAPI.ts +2197 -2128
- package/Server/API/TelemetryAPI.ts +72 -3
- 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/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/UserAuthorization.ts +11 -2
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/ApiKeyPermissionService.ts +116 -2
- package/Server/Services/DatabaseService.ts +118 -6
- package/Server/Services/LogAggregationService.ts +39 -0
- package/Server/Services/LogService.ts +21 -0
- package/Server/Services/NetworkSiteService.ts +12 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/SpanService.ts +21 -0
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/TraceAggregationService.ts +15 -0
- 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/Services/WorkspaceNotificationRuleService.ts +172 -220
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/APIKey/AccessPermission.ts +16 -40
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/LogRedaction.ts +576 -0
- package/Server/Utils/Logger.ts +123 -46
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResource.ts +29 -9
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
- package/Server/Utils/StartServer.ts +30 -9
- package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
- 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 +328 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
- package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
- package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
- package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
- package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -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/InMemoryTTLCache.test.ts +158 -0
- package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
- package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -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/DatabaseServiceUpdateDebugLogging.test.ts +282 -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/NetworkSiteService.test.ts +56 -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/TelemetryResourceFacetFilters.test.ts +267 -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/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -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/APIKey/AccessPermission.test.ts +48 -36
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -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/LogRedaction.test.ts +415 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -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/Criteria/SSLMonitorCriteria.test.ts +374 -4
- 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/MonitorResourceIngestedStepSelection.test.ts +455 -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/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
- package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
- package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -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/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
- package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -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/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
- package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
- package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -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/MonitorStep.test.ts +100 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
- 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/StatusPage/SearchEngineIndexing.test.ts +86 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
- 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/MasterPage.test.tsx +36 -1
- 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/Monitor/MonitorMetricType.test.ts +66 -1
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/API/Hostname.ts +79 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
- package/Types/Database/DatabaseProperty.ts +38 -0
- package/Types/Database/TableColumn.ts +34 -7
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Events/Recurring.ts +16 -1
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/MonitorStep.ts +13 -1
- package/Types/Monitor/MonitorType.ts +345 -40
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
- 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/StatusPage/SearchEngineIndexing.ts +61 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CardSelect/CardSelect.tsx +714 -105
- 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/EmptyState/EmptyState.tsx +8 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/Footer/Footer.tsx +32 -6
- package/UI/Components/Forms/Fields/FormField.tsx +3 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Loader/PageLoader.tsx +29 -8
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/MasterPage/MasterPage.tsx +24 -11
- 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/Utils/Monitor/MonitorMetricType.ts +16 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
- package/Utils/Telemetry/CrossSignalScope.ts +75 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -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/StatusPage.js +60 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.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/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +48 -35
- package/build/dist/Server/API/AIChatAPI.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/CommonAPI.js +59 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +13 -10
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +745 -673
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +34 -3
- package/build/dist/Server/API/TelemetryAPI.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/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.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 +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
- package/build/dist/Server/Middleware/UserAuthorization.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/ApiKeyPermissionService.js +90 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +89 -6
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +7 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogService.js +16 -0
- package/build/dist/Server/Services/LogService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +12 -0
- package/build/dist/Server/Services/NetworkSiteService.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/SpanService.js +16 -0
- package/build/dist/Server/Services/SpanService.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/TraceAggregationService.js +2 -0
- package/build/dist/Server/Services/TraceAggregationService.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/Services/WorkspaceNotificationRuleService.js +137 -164
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.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/APIKey/AccessPermission.js +9 -32
- package/build/dist/Server/Utils/APIKey/AccessPermission.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/AnalyticsDatabase/StatementGenerator.js +87 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.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/LogRedaction.js +449 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Logger.js +98 -45
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- 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/Criteria/SSLMonitorCriteria.js +65 -13
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.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/MonitorResource.js +20 -3
- package/build/dist/Server/Utils/Monitor/MonitorResource.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/NetworkInventoryUtil.js +27 -7
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- 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/SessionReplay/SessionReplayGateCacheStore.js +29 -10
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -7
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
- 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/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +63 -0
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +38 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js +24 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Events/Recurring.js +13 -1
- package/build/dist/Types/Events/Recurring.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/MonitorStep.js +9 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +330 -31
- package/build/dist/Types/Monitor/MonitorType.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/StatusPage/SearchEngineIndexing.js +55 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.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/CardSelect/CardSelect.js +360 -40
- package/build/dist/UI/Components/CardSelect/CardSelect.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/EmptyState/EmptyState.js +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.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/Footer/Footer.js +7 -4
- package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.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/Loader/PageLoader.js +15 -5
- package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
- 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/MasterPage/MasterPage.js +10 -2
- package/build/dist/UI/Components/MasterPage/MasterPage.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/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
- package/build/dist/Utils/Telemetry/CrossSignalScope.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
|
+
});
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import APIKeyPermission from "../../../Models/DatabaseModels/ApiKeyPermission";
|
|
2
1
|
import GlobalConfig from "../../../Models/DatabaseModels/GlobalConfig";
|
|
3
2
|
import User from "../../../Models/DatabaseModels/User";
|
|
4
3
|
import ProjectMiddleware from "../../../Server/Middleware/ProjectAuthorization";
|
|
@@ -37,6 +36,19 @@ import {
|
|
|
37
36
|
test,
|
|
38
37
|
} from "@jest/globals";
|
|
39
38
|
|
|
39
|
+
/*
|
|
40
|
+
* PasswordHash has a known, pre-existing TS5.9 compile failure under ts-jest
|
|
41
|
+
* (Buffer vs BinaryLike) that breaks every suite whose import graph reaches
|
|
42
|
+
* it. Nothing here touches password hashing; stub the module before the
|
|
43
|
+
* service import graph drags it into compilation.
|
|
44
|
+
*/
|
|
45
|
+
jest.mock("../../../Server/Utils/PasswordHash", () => {
|
|
46
|
+
return {
|
|
47
|
+
__esModule: true,
|
|
48
|
+
default: class PasswordHashStub {},
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
|
|
40
52
|
/*
|
|
41
53
|
* ProjectAuthorization.isValidProjectIdAndApiKeyMiddleware is the single door
|
|
42
54
|
* every API-key request in the product walks through, and it had no test at all.
|
|
@@ -67,9 +79,9 @@ describe("ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware", () => {
|
|
|
67
79
|
ApiKeyService,
|
|
68
80
|
"findApiKey",
|
|
69
81
|
);
|
|
70
|
-
const
|
|
82
|
+
const spyFindApiKeyPermissions: jest.SpyInstance = getJestSpyOn(
|
|
71
83
|
ApiKeyPermissionService,
|
|
72
|
-
"
|
|
84
|
+
"findPermissionsByApiKeyId",
|
|
73
85
|
);
|
|
74
86
|
const spyGlobalConfigFindOneBy: jest.SpyInstance = getJestSpyOn(
|
|
75
87
|
GlobalConfigService,
|
|
@@ -89,7 +101,7 @@ describe("ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware", () => {
|
|
|
89
101
|
jest.clearAllMocks();
|
|
90
102
|
next = getJestMockFunction();
|
|
91
103
|
spyFindApiKey.mockResolvedValue(null);
|
|
92
|
-
|
|
104
|
+
spyFindApiKeyPermissions.mockResolvedValue([]);
|
|
93
105
|
spyGlobalConfigFindOneBy.mockResolvedValue(null);
|
|
94
106
|
spyUserFindOneBy.mockResolvedValue(null);
|
|
95
107
|
});
|
|
@@ -129,16 +141,17 @@ describe("ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware", () => {
|
|
|
129
141
|
type MockResolvedApiKeyFunction = () => void;
|
|
130
142
|
|
|
131
143
|
const mockResolvedApiKey: MockResolvedApiKeyFunction = (): void => {
|
|
132
|
-
const apiKeyPermission: APIKeyPermission = new APIKeyPermission();
|
|
133
|
-
apiKeyPermission.permission = Permission.ProjectMember;
|
|
134
|
-
apiKeyPermission.labels = [];
|
|
135
|
-
apiKeyPermission.isBlockPermission = false;
|
|
136
|
-
|
|
137
144
|
spyFindApiKey.mockResolvedValue({
|
|
138
145
|
id: apiKeyId,
|
|
139
146
|
projectId: keyProjectId,
|
|
140
147
|
});
|
|
141
|
-
|
|
148
|
+
spyFindApiKeyPermissions.mockResolvedValue([
|
|
149
|
+
{
|
|
150
|
+
permission: Permission.ProjectMember,
|
|
151
|
+
labelIds: [],
|
|
152
|
+
isBlockPermission: false,
|
|
153
|
+
},
|
|
154
|
+
]);
|
|
142
155
|
};
|
|
143
156
|
|
|
144
157
|
test("should call next with no argument and stamp API identity, tenant and permissions on the request", async () => {
|
|
@@ -211,11 +224,7 @@ describe("ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware", () => {
|
|
|
211
224
|
|
|
212
225
|
await runMiddleware(req);
|
|
213
226
|
|
|
214
|
-
expect(
|
|
215
|
-
expect.objectContaining({
|
|
216
|
-
query: { apiKeyId: apiKeyId },
|
|
217
|
-
}),
|
|
218
|
-
);
|
|
227
|
+
expect(spyFindApiKeyPermissions).toHaveBeenCalledWith(apiKeyId);
|
|
219
228
|
|
|
220
229
|
const permissions: Array<UserPermission> =
|
|
221
230
|
(req as OneUptimeRequest).userTenantAccessPermission?.[
|
|
@@ -50,6 +50,25 @@ jest.mock("../../../Server/Services/ProjectService");
|
|
|
50
50
|
jest.mock("../../../Server/Services/TeamMemberService");
|
|
51
51
|
jest.mock("../../../Types/HashedString");
|
|
52
52
|
jest.mock("../../../Types/JSONFunctions");
|
|
53
|
+
/*
|
|
54
|
+
* PasswordHash carries a pre-existing TS5.9 diagnostic that fails any suite
|
|
55
|
+
* whose runtime require graph reaches it (DatabaseService, the base class of
|
|
56
|
+
* every concrete service, imports it). Nothing password-related is under
|
|
57
|
+
* test here, so the module is replaced WITH A FACTORY — an automock would
|
|
58
|
+
* still require (and type-check) the real file.
|
|
59
|
+
*/
|
|
60
|
+
jest.mock("../../../Server/Utils/PasswordHash", () => {
|
|
61
|
+
return {
|
|
62
|
+
__esModule: true,
|
|
63
|
+
default: {
|
|
64
|
+
hash: jest.fn(),
|
|
65
|
+
verify: jest.fn(),
|
|
66
|
+
generateSalt: jest.fn(),
|
|
67
|
+
needsUpgrade: jest.fn(),
|
|
68
|
+
applyPepper: jest.fn(),
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
});
|
|
53
72
|
|
|
54
73
|
type StringOrUndefined = string | undefined;
|
|
55
74
|
|
|
@@ -409,6 +428,66 @@ describe("UserMiddleware", () => {
|
|
|
409
428
|
expect(spyGetUserGlobalAccessPermission).toHaveBeenCalledWith(userId);
|
|
410
429
|
});
|
|
411
430
|
|
|
431
|
+
test("should not set global-permissions and global-permissions-hash in the response header, when the global-permissions-hash set in the request header equals the globalPermissionsHash computed from userGlobalAccessPermission", async () => {
|
|
432
|
+
const mockedRequest: Partial<ExpressRequest> = {
|
|
433
|
+
headers: { "global-permissions-hash": hashValue },
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
getJestSpyOn(ProjectMiddleware, "getProjectId").mockReturnValueOnce(null);
|
|
437
|
+
getJestSpyOn(JSONFunctions, "serialize").mockReturnValueOnce({});
|
|
438
|
+
const spyGetUserGlobalAccessPermission: jest.SpyInstance = getJestSpyOn(
|
|
439
|
+
AccessTokenService,
|
|
440
|
+
"getUserGlobalAccessPermission",
|
|
441
|
+
).mockResolvedValueOnce(mockedGlobalAccessPermission);
|
|
442
|
+
|
|
443
|
+
await UserMiddleware.getUserMiddleware(
|
|
444
|
+
mockedRequest as ExpressRequest,
|
|
445
|
+
res,
|
|
446
|
+
next,
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
expect(res.set).not.toHaveBeenCalledWith(
|
|
450
|
+
"global-permissions",
|
|
451
|
+
expect.anything(),
|
|
452
|
+
);
|
|
453
|
+
expect(res.set).not.toHaveBeenCalledWith(
|
|
454
|
+
"global-permissions-hash",
|
|
455
|
+
expect.anything(),
|
|
456
|
+
);
|
|
457
|
+
expect(next).toHaveBeenCalled();
|
|
458
|
+
expect(spyGetUserGlobalAccessPermission).toHaveBeenCalledWith(userId);
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
test("should set global-permissions and global-permissions-hash in the response header, when the global-permissions-hash set in the request header does not equal the globalPermissionsHash computed from userGlobalAccessPermission", async () => {
|
|
462
|
+
const mockedRequest: Partial<ExpressRequest> = {
|
|
463
|
+
headers: { "global-permissions-hash": "different-hash" },
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
getJestSpyOn(ProjectMiddleware, "getProjectId").mockReturnValueOnce(null);
|
|
467
|
+
getJestSpyOn(JSONFunctions, "serialize").mockReturnValueOnce({});
|
|
468
|
+
const spyGetUserGlobalAccessPermission: jest.SpyInstance = getJestSpyOn(
|
|
469
|
+
AccessTokenService,
|
|
470
|
+
"getUserGlobalAccessPermission",
|
|
471
|
+
).mockResolvedValueOnce(mockedGlobalAccessPermission);
|
|
472
|
+
|
|
473
|
+
await UserMiddleware.getUserMiddleware(
|
|
474
|
+
mockedRequest as ExpressRequest,
|
|
475
|
+
res,
|
|
476
|
+
next,
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
expect(res.set).toHaveBeenCalledWith(
|
|
480
|
+
"global-permissions",
|
|
481
|
+
JSON.stringify({}),
|
|
482
|
+
);
|
|
483
|
+
expect(res.set).toHaveBeenCalledWith(
|
|
484
|
+
"global-permissions-hash",
|
|
485
|
+
hashValue,
|
|
486
|
+
);
|
|
487
|
+
expect(next).toHaveBeenCalled();
|
|
488
|
+
expect(spyGetUserGlobalAccessPermission).toHaveBeenCalledWith(userId);
|
|
489
|
+
});
|
|
490
|
+
|
|
412
491
|
test("should call Response.sendErrorResponse, when tenantId is passed in the header and getUserTenantAccessPermissionWithTenantId throws an exception", async () => {
|
|
413
492
|
const spyGetUserTenantAccessPermissionWithTenantId: jest.SpyInstance =
|
|
414
493
|
getJestSpyOn(
|