@oneuptime/common 12.0.13 → 12.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/GlobalOidc.ts +20 -0
- package/Models/DatabaseModels/GlobalSso.ts +20 -0
- package/Models/DatabaseModels/MarketingConversion.ts +19 -9
- package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +46 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/StatusPage.ts +7 -4
- 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/StatusPageAPI.ts +29 -4
- 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/EnvironmentConfig.ts +7 -0
- 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/1787800000000-AddScopeToNetworkDeviceLinkRule.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/SlackAuthorization.ts +43 -6
- package/Server/Middleware/UserAuthorization.ts +236 -26
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Middleware/WhatsAppAuthorization.ts +43 -3
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/GlobalOidcProjectService.ts +126 -1
- package/Server/Services/GlobalOidcService.ts +132 -0
- package/Server/Services/GlobalSsoProjectService.ts +126 -1
- package/Server/Services/GlobalSsoService.ts +132 -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/CronTab.ts +73 -0
- package/Server/Utils/GlobalSsoAuthorization.ts +175 -0
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +35 -5
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +1 -1
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +1 -1
- package/Server/Utils/Marketing/Providers/Meta.ts +1 -1
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +1 -1
- package/Server/Utils/Marketing/Providers/Reddit.ts +1 -1
- package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +48 -33
- package/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts +35 -30
- package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +33 -28
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +475 -47
- package/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.ts +35 -30
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +47 -44
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +33 -28
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +69 -40
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +35 -29
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +8 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResource.ts +161 -21
- 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/StatusPageContentSecurityPolicy.ts +56 -0
- package/Server/Utils/StatusPageCustomizationAccess.ts +117 -0
- 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/StatusPageCustomizationOrigin.test.ts +348 -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 +265 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +227 -0
- package/Tests/Server/Middleware/SlackAuthorization.test.ts +149 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +27 -13
- package/Tests/Server/Middleware/UserAuthorizationGlobalSsoGovernance.test.ts +1455 -0
- package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +91 -2
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Middleware/WhatsAppAuthorization.test.ts +233 -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/DiscoveryScanClaimHookFreeSafety.test.ts +21 -8
- package/Tests/Server/Services/GlobalSsoProviderAuthorization.test.ts +1242 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/MonitorResourceProbeAgreementHydration.test.ts +459 -0
- package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +10 -0
- 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/AnalyticsDatabase/AggregateUtilBucketTimestamp.test.ts +416 -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/Database/QueryHelperManyToManyAndEmptyValues.test.ts +551 -0
- package/Tests/Server/Types/Database/SelectUtil.test.ts +348 -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/CronTab.test.ts +116 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/GlobalSSOToken.test.ts +581 -0
- package/Tests/Server/Utils/GlobalSsoAuthorization.test.ts +1401 -0
- package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +254 -0
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +508 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +30 -9
- 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/EvaluateOverTime.test.ts +987 -0
- package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +916 -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/ProfileMonitorCriteria.test.ts +382 -0
- package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +1219 -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/MonitorResourceIngestedStepSelection.test.ts +86 -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/StatusPageContentSecurityPolicy.test.ts +136 -0
- package/Tests/Server/Utils/StatusPageCustomizationAccess.test.ts +223 -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/MonitorStepConfigHelpers.test.ts +165 -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/NetworkDevice/NetworkDeviceLinkRuleScope.test.ts +215 -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/FormSubmitAnalytics.test.tsx +206 -0
- 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/AIChatExport/ConversationMarkdown.test.ts +774 -0
- package/Tests/UI/Utils/AIChatExport/MarkdownBlocks.test.ts +791 -0
- package/Tests/UI/Utils/AIChatExport/MarkdownSafety.test.ts +544 -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/Analytics.test.ts +187 -0
- 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 +80 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +1291 -0
- package/Tests/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.test.ts +214 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Marketing/MarketingConversion.ts +12 -0
- package/Types/Monitor/CriteriaFilter.ts +9 -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/NetworkDevice/NetworkDeviceLinkRuleScope.ts +51 -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/FormModal/BasicFormModal.tsx +12 -0
- package/UI/Components/Forms/BasicForm.tsx +13 -1
- package/UI/Components/Forms/BasicModelForm.tsx +2 -1
- package/UI/Components/Forms/ModelForm.tsx +10 -1
- package/UI/Components/Forms/Utils/FormAnalyticsName.ts +39 -0
- 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/ModelFormModal/ModelFormModal.tsx +6 -1
- 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/Analytics.ts +55 -2
- package/Utils/Monitor/MonitorMetricType.ts +40 -0
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +587 -37
- package/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.ts +115 -0
- package/build/dist/Models/DatabaseModels/GlobalOidc.js +21 -0
- package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSso.js +21 -0
- package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +20 -10
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +47 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.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 +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.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/StatusPageAPI.js +25 -4
- package/build/dist/Server/API/StatusPageAPI.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/EnvironmentConfig.js +6 -0
- package/build/dist/Server/EnvironmentConfig.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/1787800000000-AddScopeToNetworkDeviceLinkRule.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.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/SlackAuthorization.js +28 -4
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +197 -22
- 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/Middleware/WhatsAppAuthorization.js +32 -2
- package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
- 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/GlobalOidcProjectService.js +105 -0
- package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -1
- package/build/dist/Server/Services/GlobalOidcService.js +127 -0
- package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
- package/build/dist/Server/Services/GlobalSsoProjectService.js +105 -0
- package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -1
- package/build/dist/Server/Services/GlobalSsoService.js +127 -0
- package/build/dist/Server/Services/GlobalSsoService.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/CronTab.js +66 -0
- package/build/dist/Server/Utils/CronTab.js.map +1 -1
- package/build/dist/Server/Utils/GlobalSsoAuthorization.js +112 -0
- package/build/dist/Server/Utils/GlobalSsoAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +17 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +37 -35
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js +21 -25
- package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +20 -22
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +370 -42
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js +21 -25
- package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +34 -37
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +21 -25
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +64 -52
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +25 -29
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.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/MonitorCriteriaEvaluator.js +8 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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 +123 -23
- 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/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/StatusPageContentSecurityPolicy.js +39 -0
- package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageCustomizationAccess.js +85 -0
- package/build/dist/Server/Utils/StatusPageCustomizationAccess.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/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingConversion.js +10 -0
- package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.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/NetworkDevice/NetworkDeviceLinkRuleScope.js +46 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.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/FormModal/BasicFormModal.js +2 -1
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +10 -1
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js +2 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +4 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js +33 -0
- package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js.map +1 -0
- 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/ModelFormModal/ModelFormModal.js +2 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- 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/Analytics.js +50 -2
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +37 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +318 -37
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js +87 -0
- package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js.map +1 -0
- 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,227 @@
|
|
|
1
|
+
import SchemaMigrations from "../../../../Server/Infrastructure/Postgres/SchemaMigrations/Index";
|
|
2
|
+
import { MigrationInterface } from "typeorm";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { describe, expect, test } from "@jest/globals";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* The ordering guard for the migration registry.
|
|
9
|
+
*
|
|
10
|
+
* TypeORM runs migrations in the order this array lists them, and records each
|
|
11
|
+
* one by class name. Two things can go wrong when a migration is added, and
|
|
12
|
+
* neither one announces itself — the schema simply diverges on some
|
|
13
|
+
* installations and not others:
|
|
14
|
+
*
|
|
15
|
+
* 1. the new migration runs BEFORE one that is already deployed. Existing
|
|
16
|
+
* installations have already recorded the older migration, so the new one
|
|
17
|
+
* still runs last for them, while a fresh install runs it in the listed
|
|
18
|
+
* position. The two databases end up different.
|
|
19
|
+
* 2. two migrations share a timestamp, so the file a class belongs to is
|
|
20
|
+
* ambiguous and the pairing between name and file can silently swap.
|
|
21
|
+
*
|
|
22
|
+
* `generate-postgres-migration` stamps a WALL-CLOCK timestamp, while the
|
|
23
|
+
* recent migrations here use hand-picked round numbers that already run ahead
|
|
24
|
+
* of wall clock — so a freshly generated file lands BELOW several registered
|
|
25
|
+
* migrations unless somebody renumbers it. That is case 1, and it is the
|
|
26
|
+
* likely one.
|
|
27
|
+
*
|
|
28
|
+
* This guard is deliberately written against the registry as a whole rather
|
|
29
|
+
* than against whichever migration happens to be newest, so that adding a
|
|
30
|
+
* migration never requires editing (or hand-carrying) the guard itself.
|
|
31
|
+
*
|
|
32
|
+
* Note it does NOT assert the whole array is sorted. It is not: a handful of
|
|
33
|
+
* historical entries were registered out of timestamp order years ago and have
|
|
34
|
+
* long since run everywhere, so renumbering them now would re-run them. What
|
|
35
|
+
* is asserted is the part that is still live — the newest entry must sort
|
|
36
|
+
* above everything already registered.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
const MIGRATION_DIRECTORY: string = path.join(
|
|
40
|
+
__dirname,
|
|
41
|
+
"../../../../Server/Infrastructure/Postgres/SchemaMigrations",
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* The very first migration predates the convention and carries no timestamp in
|
|
46
|
+
* its class name. It is first in the array and can never be last, so it is
|
|
47
|
+
* simply excluded rather than special-cased in every assertion below.
|
|
48
|
+
*/
|
|
49
|
+
const UNTIMESTAMPED_MIGRATION_NAME: string = "InitialMigration";
|
|
50
|
+
|
|
51
|
+
const INITIAL_MIGRATION_TIMESTAMP: number = 1717605043663;
|
|
52
|
+
|
|
53
|
+
const TIMESTAMPED_FILE: RegExp = new RegExp("^\\d+-");
|
|
54
|
+
|
|
55
|
+
type MigrationClass = new () => MigrationInterface;
|
|
56
|
+
|
|
57
|
+
type TimestampOfFunction = (migrationClass: MigrationClass) => number | null;
|
|
58
|
+
|
|
59
|
+
const timestampOf: TimestampOfFunction = (
|
|
60
|
+
migrationClass: MigrationClass,
|
|
61
|
+
): number | null => {
|
|
62
|
+
const match: RegExpMatchArray | null = migrationClass.name.match(/(\d+)$/);
|
|
63
|
+
return match ? Number(match[1]) : null;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const registered: Array<MigrationClass> =
|
|
67
|
+
SchemaMigrations as Array<MigrationClass>;
|
|
68
|
+
|
|
69
|
+
describe("the migration registry", () => {
|
|
70
|
+
/*
|
|
71
|
+
* Math.max() of an empty list is -Infinity and every assertion below would
|
|
72
|
+
* pass vacuously against one. Prove the import actually produced a registry
|
|
73
|
+
* before leaning on anything derived from it.
|
|
74
|
+
*/
|
|
75
|
+
test("is actually populated, so nothing below passes vacuously", () => {
|
|
76
|
+
expect(registered.length).toBeGreaterThan(100);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("names every migration after its timestamp, bar the first one", () => {
|
|
80
|
+
const untimestamped: Array<string> = registered
|
|
81
|
+
.filter((migrationClass: MigrationClass): boolean => {
|
|
82
|
+
return timestampOf(migrationClass) === null;
|
|
83
|
+
})
|
|
84
|
+
.map((migrationClass: MigrationClass): string => {
|
|
85
|
+
return migrationClass.name;
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
expect(untimestamped).toEqual([UNTIMESTAMPED_MIGRATION_NAME]);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
describe("ordering", () => {
|
|
92
|
+
/*
|
|
93
|
+
* The guard that used to be hand-carried from one migration's test to the
|
|
94
|
+
* next. Whoever adds a migration adds it to the end of the array, and this
|
|
95
|
+
* is what says the timestamp has to match that position.
|
|
96
|
+
*/
|
|
97
|
+
test("gives the last-registered migration the highest timestamp", () => {
|
|
98
|
+
const last: MigrationClass = registered[registered.length - 1]!;
|
|
99
|
+
const lastTimestamp: number | null = timestampOf(last);
|
|
100
|
+
|
|
101
|
+
expect(lastTimestamp).not.toBeNull();
|
|
102
|
+
|
|
103
|
+
const earlierTimestamps: Array<number> = registered
|
|
104
|
+
.slice(0, -1)
|
|
105
|
+
.map(timestampOf)
|
|
106
|
+
.filter((timestamp: number | null): timestamp is number => {
|
|
107
|
+
return timestamp !== null;
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(earlierTimestamps.length).toBe(registered.length - 2);
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* If this fails, the migration at the end of SchemaMigrations/Index.ts
|
|
114
|
+
* carries a timestamp that sorts below one already registered — rename
|
|
115
|
+
* the new migration's file and class to a timestamp above the current
|
|
116
|
+
* maximum, rather than moving it up the array.
|
|
117
|
+
*/
|
|
118
|
+
expect(lastTimestamp).toBeGreaterThan(Math.max(...earlierTimestamps));
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test("never registers the same timestamp twice", () => {
|
|
122
|
+
const timestamps: Array<number> = registered
|
|
123
|
+
.map(timestampOf)
|
|
124
|
+
.filter((timestamp: number | null): timestamp is number => {
|
|
125
|
+
return timestamp !== null;
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const duplicates: Array<number> = timestamps.filter(
|
|
129
|
+
(timestamp: number, index: number): boolean => {
|
|
130
|
+
return timestamps.indexOf(timestamp) !== index;
|
|
131
|
+
},
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(duplicates).toEqual([]);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("never registers the same migration class twice", () => {
|
|
138
|
+
const names: Array<string> = registered.map(
|
|
139
|
+
(migrationClass: MigrationClass): string => {
|
|
140
|
+
return migrationClass.name;
|
|
141
|
+
},
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const duplicates: Array<string> = names.filter(
|
|
145
|
+
(name: string, index: number): boolean => {
|
|
146
|
+
return names.indexOf(name) !== index;
|
|
147
|
+
},
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
expect(duplicates).toEqual([]);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
/*
|
|
155
|
+
* ...and the timestamps in the class names are the ones on disk. A class
|
|
156
|
+
* renamed without renaming its file — or two files landing on the same
|
|
157
|
+
* timestamp — leaves the ordering above asserting something that is not what
|
|
158
|
+
* actually runs.
|
|
159
|
+
*/
|
|
160
|
+
test("backs every registered migration with exactly one file on disk", () => {
|
|
161
|
+
const files: Array<string> = fs.readdirSync(MIGRATION_DIRECTORY);
|
|
162
|
+
|
|
163
|
+
const unbacked: Array<string> = registered
|
|
164
|
+
.filter((migrationClass: MigrationClass): boolean => {
|
|
165
|
+
const timestamp: number | null = timestampOf(migrationClass);
|
|
166
|
+
|
|
167
|
+
if (timestamp === null) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return (
|
|
172
|
+
files.filter((file: string): boolean => {
|
|
173
|
+
return file.startsWith(`${timestamp}-`);
|
|
174
|
+
}).length !== 1
|
|
175
|
+
);
|
|
176
|
+
})
|
|
177
|
+
.map((migrationClass: MigrationClass): string => {
|
|
178
|
+
return migrationClass.name;
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
expect(unbacked).toEqual([]);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* The other direction: a migration file that nobody registered never runs at
|
|
186
|
+
* all. That is the failure mode with no symptom until a query hits a column
|
|
187
|
+
* that was never created.
|
|
188
|
+
*
|
|
189
|
+
* The registered side is read out of the exported array rather than out of
|
|
190
|
+
* Index.ts, so a file that is imported but never added to the array — which
|
|
191
|
+
* is exactly as inert as one that is not imported at all — still fails here.
|
|
192
|
+
*/
|
|
193
|
+
test("registers every migration file that exists on disk", () => {
|
|
194
|
+
const registeredTimestamps: Set<number> = new Set(
|
|
195
|
+
registered
|
|
196
|
+
.map(timestampOf)
|
|
197
|
+
.filter((timestamp: number | null): timestamp is number => {
|
|
198
|
+
return timestamp !== null;
|
|
199
|
+
}),
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* The one file whose class name carries no timestamp, so it cannot be
|
|
204
|
+
* matched by the timestamps above.
|
|
205
|
+
*/
|
|
206
|
+
registeredTimestamps.add(INITIAL_MIGRATION_TIMESTAMP);
|
|
207
|
+
|
|
208
|
+
const timestampsOnDisk: Array<string> = fs
|
|
209
|
+
.readdirSync(MIGRATION_DIRECTORY)
|
|
210
|
+
.filter((file: string): boolean => {
|
|
211
|
+
return file.endsWith(".ts") && TIMESTAMPED_FILE.test(file);
|
|
212
|
+
})
|
|
213
|
+
.map((file: string): string => {
|
|
214
|
+
return file.split("-")[0]!;
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
expect(timestampsOnDisk.length).toBeGreaterThan(100);
|
|
218
|
+
|
|
219
|
+
const unregistered: Array<string> = timestampsOnDisk.filter(
|
|
220
|
+
(timestamp: string): boolean => {
|
|
221
|
+
return !registeredTimestamps.has(Number(timestamp));
|
|
222
|
+
},
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
expect(unregistered).toEqual([]);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { describe, expect, test, beforeEach } from "@jest/globals";
|
|
2
|
+
import crypto from "crypto";
|
|
3
|
+
import SlackAuthorization from "../../../Server/Middleware/SlackAuthorization";
|
|
4
|
+
import Response from "../../../Server/Utils/Response";
|
|
5
|
+
import {
|
|
6
|
+
ExpressResponse,
|
|
7
|
+
NextFunction,
|
|
8
|
+
OneUptimeRequest,
|
|
9
|
+
} from "../../../Server/Utils/Express";
|
|
10
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
11
|
+
|
|
12
|
+
const SIGNING_SECRET: string = "slack-app-signing-secret";
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* Only the signing secret is overridden. Logger and CaptureSpan also read from
|
|
16
|
+
* EnvironmentConfig, so the rest of the module has to stay real.
|
|
17
|
+
*/
|
|
18
|
+
jest.mock("../../../Server/EnvironmentConfig", () => {
|
|
19
|
+
return {
|
|
20
|
+
__esModule: true,
|
|
21
|
+
...jest.requireActual("../../../Server/EnvironmentConfig"),
|
|
22
|
+
SlackAppSigningSecret: "slack-app-signing-secret",
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
jest.mock("../../../Server/Utils/Response", () => {
|
|
27
|
+
return {
|
|
28
|
+
__esModule: true,
|
|
29
|
+
default: {
|
|
30
|
+
sendErrorResponse: jest.fn(),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* Companion to WhatsAppAuthorization.test.ts. This middleware had the same
|
|
37
|
+
* unguarded crypto.timingSafeEqual: the value came off the attacker-controlled
|
|
38
|
+
* X-Slack-Signature header, and timingSafeEqual throws RangeError when the two
|
|
39
|
+
* buffers differ in byte length. A missing header was worse still - it reached
|
|
40
|
+
* Buffer.from(undefined) and threw a TypeError before the comparison. Both now
|
|
41
|
+
* have to come back as the intended 400.
|
|
42
|
+
*/
|
|
43
|
+
describe("SlackAuthorization.isAuthorizedSlackRequest", () => {
|
|
44
|
+
const TIMESTAMP: string = "1700000000";
|
|
45
|
+
const RAW_BODY: string = "token=abc&team_id=T123&command=%2Foneuptime";
|
|
46
|
+
|
|
47
|
+
const sendErrorResponse: jest.Mock =
|
|
48
|
+
Response.sendErrorResponse as unknown as jest.Mock;
|
|
49
|
+
|
|
50
|
+
const res: ExpressResponse = {} as ExpressResponse;
|
|
51
|
+
let next: NextFunction;
|
|
52
|
+
|
|
53
|
+
type SignFunction = (timestamp: string, body: string) => string;
|
|
54
|
+
|
|
55
|
+
const sign: SignFunction = (timestamp: string, body: string): string => {
|
|
56
|
+
return `v0=${crypto
|
|
57
|
+
.createHmac("sha256", SIGNING_SECRET)
|
|
58
|
+
.update(`v0:${timestamp}:${body}`)
|
|
59
|
+
.digest("hex")}`;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
type BuildRequestFunction = (
|
|
63
|
+
signature: string | undefined,
|
|
64
|
+
body?: string,
|
|
65
|
+
) => OneUptimeRequest;
|
|
66
|
+
|
|
67
|
+
const buildRequest: BuildRequestFunction = (
|
|
68
|
+
signature: string | undefined,
|
|
69
|
+
body: string = RAW_BODY,
|
|
70
|
+
): OneUptimeRequest => {
|
|
71
|
+
const headers: Record<string, string> = {
|
|
72
|
+
"x-slack-request-timestamp": TIMESTAMP,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
if (signature !== undefined) {
|
|
76
|
+
headers["x-slack-signature"] = signature;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return { headers, rawBody: body } as unknown as OneUptimeRequest;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
beforeEach(() => {
|
|
83
|
+
jest.clearAllMocks();
|
|
84
|
+
next = jest.fn();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("calls next when the signature matches the timestamp and body", async () => {
|
|
88
|
+
const req: OneUptimeRequest = buildRequest(sign(TIMESTAMP, RAW_BODY));
|
|
89
|
+
|
|
90
|
+
await SlackAuthorization.isAuthorizedSlackRequest(req, res, next);
|
|
91
|
+
|
|
92
|
+
expect(next).toHaveBeenCalled();
|
|
93
|
+
expect(sendErrorResponse).not.toHaveBeenCalled();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("rejects a well-formed signature computed over a different body", async () => {
|
|
97
|
+
const req: OneUptimeRequest = buildRequest(
|
|
98
|
+
sign(TIMESTAMP, `${RAW_BODY}&tampered=1`),
|
|
99
|
+
RAW_BODY,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
await SlackAuthorization.isAuthorizedSlackRequest(req, res, next);
|
|
103
|
+
|
|
104
|
+
expect(next).not.toHaveBeenCalled();
|
|
105
|
+
expect(sendErrorResponse).toHaveBeenCalledWith(
|
|
106
|
+
req,
|
|
107
|
+
res,
|
|
108
|
+
new BadDataException("Slack Signature Verification Failed."),
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* Every one of these is a byte length other than the 67 of a real
|
|
114
|
+
* "v0=" + 64 hex header, which is exactly what used to reach
|
|
115
|
+
* timingSafeEqual and throw. The absent and empty cases used to throw
|
|
116
|
+
* even earlier, inside Buffer.from.
|
|
117
|
+
*/
|
|
118
|
+
const malformedSignatures: Array<[string, string | undefined]> = [
|
|
119
|
+
["absent", undefined],
|
|
120
|
+
["an empty string", ""],
|
|
121
|
+
["a bare word", "nope"],
|
|
122
|
+
["the prefix with no digest", "v0="],
|
|
123
|
+
["a short digest", "v0=abc123"],
|
|
124
|
+
["a long digest", `v0=${"a".repeat(65)}`],
|
|
125
|
+
["the right length but non-hex characters", `v0=${"z".repeat(64)}`],
|
|
126
|
+
["64 hex characters with no prefix", "a".repeat(64)],
|
|
127
|
+
["the wrong version prefix", `v1=${"a".repeat(64)}`],
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
describe("rejects a malformed signature with 400 rather than throwing", () => {
|
|
131
|
+
test.each(malformedSignatures)(
|
|
132
|
+
"%s",
|
|
133
|
+
async (_label: string, signature: string | undefined) => {
|
|
134
|
+
const req: OneUptimeRequest = buildRequest(signature);
|
|
135
|
+
|
|
136
|
+
await expect(
|
|
137
|
+
SlackAuthorization.isAuthorizedSlackRequest(req, res, next),
|
|
138
|
+
).resolves.toBeUndefined();
|
|
139
|
+
|
|
140
|
+
expect(next).not.toHaveBeenCalled();
|
|
141
|
+
expect(sendErrorResponse).toHaveBeenCalledWith(
|
|
142
|
+
req,
|
|
143
|
+
res,
|
|
144
|
+
new BadDataException("Slack Signature Verification Failed."),
|
|
145
|
+
);
|
|
146
|
+
},
|
|
147
|
+
);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
@@ -677,9 +677,16 @@ describe("UserMiddleware", () => {
|
|
|
677
677
|
ProjectService,
|
|
678
678
|
"getRequireSsoWithSsoProviderId",
|
|
679
679
|
);
|
|
680
|
-
|
|
680
|
+
/*
|
|
681
|
+
* The enforcement entry point is `isSsoSatisfiedForProject`, not the
|
|
682
|
+
* stateless `doesSsoTokenForProjectExist`: a Global SSO token also has to
|
|
683
|
+
* clear the provider-trust and project-governance checks, which need the
|
|
684
|
+
* database. Spying here keeps these tests about the middleware's control
|
|
685
|
+
* flow rather than about SSO token internals.
|
|
686
|
+
*/
|
|
687
|
+
const spyIsSsoSatisfiedForProject: jest.SpyInstance = getJestSpyOn(
|
|
681
688
|
UserMiddleware,
|
|
682
|
-
"
|
|
689
|
+
"isSsoSatisfiedForProject",
|
|
683
690
|
);
|
|
684
691
|
const spyGetGlobalRequireSsoForLogin: jest.SpyInstance = getJestSpyOn(
|
|
685
692
|
GlobalConfigService,
|
|
@@ -717,7 +724,7 @@ describe("UserMiddleware", () => {
|
|
|
717
724
|
test("should throw SsoAuthorizationException error, when sso login is required but sso token for the projectId does not exist", async () => {
|
|
718
725
|
spyGetRequireSsoForLogin.mockResolvedValueOnce(true);
|
|
719
726
|
|
|
720
|
-
|
|
727
|
+
spyIsSsoSatisfiedForProject.mockResolvedValueOnce(false);
|
|
721
728
|
|
|
722
729
|
await expect(
|
|
723
730
|
UserMiddleware.getUserTenantAccessPermissionWithTenantId({
|
|
@@ -726,12 +733,12 @@ describe("UserMiddleware", () => {
|
|
|
726
733
|
userId,
|
|
727
734
|
}),
|
|
728
735
|
).rejects.toThrowError(new SsoAuthorizationException());
|
|
729
|
-
expect(
|
|
736
|
+
expect(spyIsSsoSatisfiedForProject).toHaveBeenCalledWith({
|
|
730
737
|
req,
|
|
731
738
|
projectId,
|
|
732
739
|
userId,
|
|
733
|
-
undefined,
|
|
734
|
-
);
|
|
740
|
+
requiredSsoProviderId: undefined,
|
|
741
|
+
});
|
|
735
742
|
});
|
|
736
743
|
|
|
737
744
|
test("should return null when getUserTenantAccessPermission returns null", async () => {
|
|
@@ -797,9 +804,16 @@ describe("UserMiddleware", () => {
|
|
|
797
804
|
ProjectService,
|
|
798
805
|
"getRequireSsoWithSsoProviderId",
|
|
799
806
|
);
|
|
800
|
-
|
|
807
|
+
/*
|
|
808
|
+
* The enforcement entry point is `isSsoSatisfiedForProject`, not the
|
|
809
|
+
* stateless `doesSsoTokenForProjectExist`: a Global SSO token also has to
|
|
810
|
+
* clear the provider-trust and project-governance checks, which need the
|
|
811
|
+
* database. Spying here keeps these tests about the middleware's control
|
|
812
|
+
* flow rather than about SSO token internals.
|
|
813
|
+
*/
|
|
814
|
+
const spyIsSsoSatisfiedForProject: jest.SpyInstance = getJestSpyOn(
|
|
801
815
|
UserMiddleware,
|
|
802
|
-
"
|
|
816
|
+
"isSsoSatisfiedForProject",
|
|
803
817
|
);
|
|
804
818
|
const spyGetGlobalRequireSsoForLogin: jest.SpyInstance = getJestSpyOn(
|
|
805
819
|
GlobalConfigService,
|
|
@@ -833,7 +847,7 @@ describe("UserMiddleware", () => {
|
|
|
833
847
|
});
|
|
834
848
|
|
|
835
849
|
test("should return default tenant access permission, when project for a projectId is found, sso is required for login, but sso token does not exist for that projectId", async () => {
|
|
836
|
-
|
|
850
|
+
spyIsSsoSatisfiedForProject.mockResolvedValueOnce(false);
|
|
837
851
|
spyGetProjectRequireSsoForLogin.mockResolvedValueOnce(true);
|
|
838
852
|
|
|
839
853
|
const spyGetDefaultUserTenantAccessPermission: jest.SpyInstance =
|
|
@@ -852,12 +866,12 @@ describe("UserMiddleware", () => {
|
|
|
852
866
|
expect(result).toEqual({
|
|
853
867
|
[projectId.toString()]: mockedUserTenantAccessPermission,
|
|
854
868
|
});
|
|
855
|
-
expect(
|
|
869
|
+
expect(spyIsSsoSatisfiedForProject).toHaveBeenCalledWith({
|
|
856
870
|
req,
|
|
857
871
|
projectId,
|
|
858
872
|
userId,
|
|
859
|
-
undefined,
|
|
860
|
-
);
|
|
873
|
+
requiredSsoProviderId: undefined,
|
|
874
|
+
});
|
|
861
875
|
expect(spyGetDefaultUserTenantAccessPermission).toHaveBeenCalledWith(
|
|
862
876
|
projectId,
|
|
863
877
|
);
|
|
@@ -879,7 +893,7 @@ describe("UserMiddleware", () => {
|
|
|
879
893
|
expect(result).toEqual({
|
|
880
894
|
[projectId.toString()]: mockedUserTenantAccessPermission,
|
|
881
895
|
});
|
|
882
|
-
expect(
|
|
896
|
+
expect(spyIsSsoSatisfiedForProject).not.toBeCalled();
|
|
883
897
|
expect(spyGetUserTenantAccessPermission).toHaveBeenCalledWith(
|
|
884
898
|
userId,
|
|
885
899
|
projectId,
|