@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
|
@@ -317,15 +317,27 @@ class UserSMS extends BaseModel {
|
|
|
317
317
|
@OwnerOnlyColumn()
|
|
318
318
|
@TableColumn({
|
|
319
319
|
title: "Verification Code",
|
|
320
|
-
description:
|
|
320
|
+
description:
|
|
321
|
+
"Keyed digest of the temporary verification code — never the code itself",
|
|
321
322
|
isDefaultValueColumn: true,
|
|
322
323
|
computed: true,
|
|
323
324
|
required: true,
|
|
324
325
|
type: TableColumnType.ShortText,
|
|
326
|
+
/*
|
|
327
|
+
* A row is born with NO usable code on it: a 64-character random
|
|
328
|
+
* placeholder that no six-digit code can ever hash to. The real code is
|
|
329
|
+
* generated, hashed and sent by this channel's service once the row
|
|
330
|
+
* exists — the row id is part of the hashed message, so the digest cannot
|
|
331
|
+
* be computed before the insert has assigned one.
|
|
332
|
+
*
|
|
333
|
+
* This stays a forced default rather than moving wholly into the service
|
|
334
|
+
* hook because the column is NOT NULL and must be satisfied on every
|
|
335
|
+
* create path, including those that pass props.ignoreHooks.
|
|
336
|
+
*/
|
|
325
337
|
forceGetDefaultValueOnCreate: () => {
|
|
326
|
-
return Text.
|
|
338
|
+
return Text.generateRandomText(64);
|
|
327
339
|
},
|
|
328
|
-
example: "
|
|
340
|
+
example: "9f2c1b4a7d3e6058c1f0a9b8d7e6f5c4b3a291807f6e5d4c3b2a19081726354",
|
|
329
341
|
})
|
|
330
342
|
@Column({
|
|
331
343
|
type: ColumnType.ShortText,
|
|
@@ -333,6 +345,85 @@ class UserSMS extends BaseModel {
|
|
|
333
345
|
length: ColumnLength.ShortText,
|
|
334
346
|
})
|
|
335
347
|
public verificationCode?: string = undefined;
|
|
348
|
+
|
|
349
|
+
@ColumnAccessControl({
|
|
350
|
+
create: [],
|
|
351
|
+
read: [],
|
|
352
|
+
update: [],
|
|
353
|
+
})
|
|
354
|
+
/*
|
|
355
|
+
* When the code currently on this row stops being accepted.
|
|
356
|
+
*
|
|
357
|
+
* NULL means there is no live code: none was ever issued, or the last one
|
|
358
|
+
* was used, or it was burned by the attempt limit — or the row predates
|
|
359
|
+
* this column, which is read the same conservative way. Without an expiry
|
|
360
|
+
* the six-digit code space stood open indefinitely, which is what made
|
|
361
|
+
* walking it worthwhile.
|
|
362
|
+
*/
|
|
363
|
+
@TableColumn({
|
|
364
|
+
title: "Verification Code Expires At",
|
|
365
|
+
description: "When the verification code on this row stops being accepted",
|
|
366
|
+
computed: true,
|
|
367
|
+
type: TableColumnType.Date,
|
|
368
|
+
})
|
|
369
|
+
@Column({
|
|
370
|
+
type: ColumnType.Date,
|
|
371
|
+
nullable: true,
|
|
372
|
+
})
|
|
373
|
+
public verificationCodeExpiresAt?: Date = undefined;
|
|
374
|
+
|
|
375
|
+
@ColumnAccessControl({
|
|
376
|
+
create: [],
|
|
377
|
+
read: [],
|
|
378
|
+
update: [],
|
|
379
|
+
})
|
|
380
|
+
/*
|
|
381
|
+
* Wrong guesses made against the code currently on this row, reset to zero
|
|
382
|
+
* each time a code is issued.
|
|
383
|
+
*
|
|
384
|
+
* This is the counter that stops /verify being an unlimited oracle over a
|
|
385
|
+
* space small enough to walk in minutes. It is incremented with a single
|
|
386
|
+
* atomic UPDATE ... RETURNING rather than a read-modify-write, because
|
|
387
|
+
* requests racing each other are the normal shape of the attack.
|
|
388
|
+
*/
|
|
389
|
+
@TableColumn({
|
|
390
|
+
title: "Verification Failed Attempts",
|
|
391
|
+
description:
|
|
392
|
+
"Incorrect verification attempts made against the current verification code",
|
|
393
|
+
computed: true,
|
|
394
|
+
type: TableColumnType.Number,
|
|
395
|
+
})
|
|
396
|
+
@Column({
|
|
397
|
+
type: ColumnType.Number,
|
|
398
|
+
nullable: false,
|
|
399
|
+
default: 0,
|
|
400
|
+
})
|
|
401
|
+
public verificationFailedAttempts?: number = undefined;
|
|
402
|
+
|
|
403
|
+
@ColumnAccessControl({
|
|
404
|
+
create: [],
|
|
405
|
+
read: [],
|
|
406
|
+
update: [],
|
|
407
|
+
})
|
|
408
|
+
/*
|
|
409
|
+
* When a verification code was last sent for this row.
|
|
410
|
+
*
|
|
411
|
+
* Drives the resend cooldown. Without it, "spend the five attempts, ask for
|
|
412
|
+
* a fresh code, repeat" costs an attacker nothing — and the resend control
|
|
413
|
+
* doubles as a way to send somebody unsolicited messages at whatever rate
|
|
414
|
+
* the network allows, at the project's expense.
|
|
415
|
+
*/
|
|
416
|
+
@TableColumn({
|
|
417
|
+
title: "Verification Code Sent At",
|
|
418
|
+
description: "When a verification code was last sent for this row",
|
|
419
|
+
computed: true,
|
|
420
|
+
type: TableColumnType.Date,
|
|
421
|
+
})
|
|
422
|
+
@Column({
|
|
423
|
+
type: ColumnType.Date,
|
|
424
|
+
nullable: true,
|
|
425
|
+
})
|
|
426
|
+
public verificationCodeSentAt?: Date = undefined;
|
|
336
427
|
}
|
|
337
428
|
|
|
338
429
|
export default UserSMS;
|
|
@@ -309,13 +309,25 @@ class UserWhatsApp extends BaseModel {
|
|
|
309
309
|
@OwnerOnlyColumn()
|
|
310
310
|
@TableColumn({
|
|
311
311
|
title: "Verification Code",
|
|
312
|
-
description:
|
|
312
|
+
description:
|
|
313
|
+
"Keyed digest of the temporary verification code — never the code itself",
|
|
313
314
|
isDefaultValueColumn: true,
|
|
314
315
|
computed: true,
|
|
315
316
|
required: true,
|
|
316
317
|
type: TableColumnType.ShortText,
|
|
318
|
+
/*
|
|
319
|
+
* A row is born with NO usable code on it: a 64-character random
|
|
320
|
+
* placeholder that no six-digit code can ever hash to. The real code is
|
|
321
|
+
* generated, hashed and sent by this channel's service once the row
|
|
322
|
+
* exists — the row id is part of the hashed message, so the digest cannot
|
|
323
|
+
* be computed before the insert has assigned one.
|
|
324
|
+
*
|
|
325
|
+
* This stays a forced default rather than moving wholly into the service
|
|
326
|
+
* hook because the column is NOT NULL and must be satisfied on every
|
|
327
|
+
* create path, including those that pass props.ignoreHooks.
|
|
328
|
+
*/
|
|
317
329
|
forceGetDefaultValueOnCreate: () => {
|
|
318
|
-
return Text.
|
|
330
|
+
return Text.generateRandomText(64);
|
|
319
331
|
},
|
|
320
332
|
})
|
|
321
333
|
@Column({
|
|
@@ -324,6 +336,85 @@ class UserWhatsApp extends BaseModel {
|
|
|
324
336
|
length: ColumnLength.ShortText,
|
|
325
337
|
})
|
|
326
338
|
public verificationCode?: string = undefined;
|
|
339
|
+
|
|
340
|
+
@ColumnAccessControl({
|
|
341
|
+
create: [],
|
|
342
|
+
read: [],
|
|
343
|
+
update: [],
|
|
344
|
+
})
|
|
345
|
+
/*
|
|
346
|
+
* When the code currently on this row stops being accepted.
|
|
347
|
+
*
|
|
348
|
+
* NULL means there is no live code: none was ever issued, or the last one
|
|
349
|
+
* was used, or it was burned by the attempt limit — or the row predates
|
|
350
|
+
* this column, which is read the same conservative way. Without an expiry
|
|
351
|
+
* the six-digit code space stood open indefinitely, which is what made
|
|
352
|
+
* walking it worthwhile.
|
|
353
|
+
*/
|
|
354
|
+
@TableColumn({
|
|
355
|
+
title: "Verification Code Expires At",
|
|
356
|
+
description: "When the verification code on this row stops being accepted",
|
|
357
|
+
computed: true,
|
|
358
|
+
type: TableColumnType.Date,
|
|
359
|
+
})
|
|
360
|
+
@Column({
|
|
361
|
+
type: ColumnType.Date,
|
|
362
|
+
nullable: true,
|
|
363
|
+
})
|
|
364
|
+
public verificationCodeExpiresAt?: Date = undefined;
|
|
365
|
+
|
|
366
|
+
@ColumnAccessControl({
|
|
367
|
+
create: [],
|
|
368
|
+
read: [],
|
|
369
|
+
update: [],
|
|
370
|
+
})
|
|
371
|
+
/*
|
|
372
|
+
* Wrong guesses made against the code currently on this row, reset to zero
|
|
373
|
+
* each time a code is issued.
|
|
374
|
+
*
|
|
375
|
+
* This is the counter that stops /verify being an unlimited oracle over a
|
|
376
|
+
* space small enough to walk in minutes. It is incremented with a single
|
|
377
|
+
* atomic UPDATE ... RETURNING rather than a read-modify-write, because
|
|
378
|
+
* requests racing each other are the normal shape of the attack.
|
|
379
|
+
*/
|
|
380
|
+
@TableColumn({
|
|
381
|
+
title: "Verification Failed Attempts",
|
|
382
|
+
description:
|
|
383
|
+
"Incorrect verification attempts made against the current verification code",
|
|
384
|
+
computed: true,
|
|
385
|
+
type: TableColumnType.Number,
|
|
386
|
+
})
|
|
387
|
+
@Column({
|
|
388
|
+
type: ColumnType.Number,
|
|
389
|
+
nullable: false,
|
|
390
|
+
default: 0,
|
|
391
|
+
})
|
|
392
|
+
public verificationFailedAttempts?: number = undefined;
|
|
393
|
+
|
|
394
|
+
@ColumnAccessControl({
|
|
395
|
+
create: [],
|
|
396
|
+
read: [],
|
|
397
|
+
update: [],
|
|
398
|
+
})
|
|
399
|
+
/*
|
|
400
|
+
* When a verification code was last sent for this row.
|
|
401
|
+
*
|
|
402
|
+
* Drives the resend cooldown. Without it, "spend the five attempts, ask for
|
|
403
|
+
* a fresh code, repeat" costs an attacker nothing — and the resend control
|
|
404
|
+
* doubles as a way to send somebody unsolicited messages at whatever rate
|
|
405
|
+
* the network allows, at the project's expense.
|
|
406
|
+
*/
|
|
407
|
+
@TableColumn({
|
|
408
|
+
title: "Verification Code Sent At",
|
|
409
|
+
description: "When a verification code was last sent for this row",
|
|
410
|
+
computed: true,
|
|
411
|
+
type: TableColumnType.Date,
|
|
412
|
+
})
|
|
413
|
+
@Column({
|
|
414
|
+
type: ColumnType.Date,
|
|
415
|
+
nullable: true,
|
|
416
|
+
})
|
|
417
|
+
public verificationCodeSentAt?: Date = undefined;
|
|
327
418
|
}
|
|
328
419
|
|
|
329
420
|
export default UserWhatsApp;
|
|
@@ -45,9 +45,26 @@ export interface MicrosoftTeamsChat {
|
|
|
45
45
|
* roster member of. Listing a team is therefore NOT evidence that we can post
|
|
46
46
|
* to it — this record is, which is why channel sends check it before calling
|
|
47
47
|
* the Bot Framework.
|
|
48
|
+
*
|
|
49
|
+
* A Teams team has TWO ids and they are not interchangeable. Bot activities
|
|
50
|
+
* carry the thread id (channelData.team.id, "19:...@thread.tacv2"); Graph — and
|
|
51
|
+
* therefore every team picker, notification rule and channel URL in OneUptime —
|
|
52
|
+
* uses the AAD group id (a GUID, channelData.team.aadGroupId). Records used to
|
|
53
|
+
* be keyed by the thread id and looked up by the group id, so the lookup could
|
|
54
|
+
* never hit. Both are stored explicitly now so neither side has to guess which
|
|
55
|
+
* one it holds.
|
|
48
56
|
*/
|
|
49
57
|
export interface MicrosoftTeamsInstalledTeam {
|
|
50
|
-
|
|
58
|
+
/*
|
|
59
|
+
* Map key. The Graph team id when we could resolve it, otherwise the Teams
|
|
60
|
+
* thread id — a record written before this shipped, or one whose group id
|
|
61
|
+
* could not be resolved, keeps the thread id here so uninstall still matches.
|
|
62
|
+
* Read it through MicrosoftTeamsUtil.indexInstalledTeamsByGraphTeamId rather
|
|
63
|
+
* than assuming which id space it is in.
|
|
64
|
+
*/
|
|
65
|
+
id: string;
|
|
66
|
+
graphTeamId?: string | undefined; // AAD group id — what Graph and notification rules use. Absent on unresolved records.
|
|
67
|
+
teamsThreadId?: string | undefined; // channelData.team.id ("19:...@thread.tacv2") — what bot activities carry.
|
|
51
68
|
name?: string | undefined;
|
|
52
69
|
serviceUrl?: string | undefined; // Bot Framework service URL captured on install. Required for GCC/DoD.
|
|
53
70
|
addedAt?: string | undefined;
|
|
@@ -79,7 +96,7 @@ export interface MicrosoftTeamsMiscData extends MiscData {
|
|
|
79
96
|
availableTeams?: Record<string, MicrosoftTeamsTeam>; // keyed by team id. Every team Graph can see in the tenant.
|
|
80
97
|
appAccessTokenExpiresAt?: string;
|
|
81
98
|
availableChats?: Record<string, MicrosoftTeamsChat>; // keyed by chat id. Chats the OneUptime app has been added to.
|
|
82
|
-
installedTeams?: Record<string, MicrosoftTeamsInstalledTeam>; // keyed by
|
|
99
|
+
installedTeams?: Record<string, MicrosoftTeamsInstalledTeam>; // keyed by MicrosoftTeamsInstalledTeam.id — see that type, the key is not always a Graph team id.
|
|
83
100
|
}
|
|
84
101
|
|
|
85
102
|
export type WorkspaceMiscData = SlackMiscData | MicrosoftTeamsMiscData;
|
package/Server/API/AIChatAPI.ts
CHANGED
|
@@ -9,7 +9,6 @@ import Express, {
|
|
|
9
9
|
import Response from "../Utils/Response";
|
|
10
10
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
11
11
|
import PaymentRequiredException from "../../Types/Exception/PaymentRequiredException";
|
|
12
|
-
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
13
12
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
14
13
|
import ObjectID from "../../Types/ObjectID";
|
|
15
14
|
import OneUptimeDate from "../../Types/Date";
|
|
@@ -89,18 +88,16 @@ router.post(
|
|
|
89
88
|
const props: DatabaseCommonInteractionProps =
|
|
90
89
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
91
90
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const projectId: ObjectID = props.tenantId;
|
|
103
|
-
const userId: ObjectID = props.userId;
|
|
91
|
+
/*
|
|
92
|
+
* Membership, not just a session. getUserMiddleware admits an
|
|
93
|
+
* unauthenticated request as "public" and reads the tenant id straight
|
|
94
|
+
* out of the caller-supplied `tenantid` header, so the pair of checks
|
|
95
|
+
* this replaces proved only that SOMEBODY was logged in and had named
|
|
96
|
+
* SOME project - never that they belonged to the project they named.
|
|
97
|
+
*/
|
|
98
|
+
const projectId: ObjectID =
|
|
99
|
+
CommonAPI.assertAuthenticatedProjectMember(props);
|
|
100
|
+
const userId: ObjectID = props.userId!;
|
|
104
101
|
|
|
105
102
|
const content: string = (req.body["content"] as string) || "";
|
|
106
103
|
|
|
@@ -502,17 +499,30 @@ router.post(
|
|
|
502
499
|
const props: DatabaseCommonInteractionProps =
|
|
503
500
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
504
501
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
502
|
+
/*
|
|
503
|
+
* Membership, not just a session - see the note on send-message. This
|
|
504
|
+
* route is where that distinction was load-bearing: it took the project
|
|
505
|
+
* id straight from the header and handed it to root-privileged reads,
|
|
506
|
+
* so any logged-in user could name ANY project's UUID and be told which
|
|
507
|
+
* LLM providers that project has - their names, descriptions, types and
|
|
508
|
+
* models (GHSA-hm7m-9qjj-xj5x).
|
|
509
|
+
*/
|
|
510
|
+
const projectId: ObjectID =
|
|
511
|
+
CommonAPI.assertAuthenticatedProjectMember(props);
|
|
514
512
|
|
|
515
|
-
|
|
513
|
+
/*
|
|
514
|
+
* Membership is still not read authorisation. The very same rows served
|
|
515
|
+
* by a plain GET /llm-provider are gated there by LlmProvider's own read
|
|
516
|
+
* list, and a member whose teams grant none of those permissions has no
|
|
517
|
+
* business reading them through the chat picker instead. Asking the
|
|
518
|
+
* model for that list keeps the two paths from drifting apart.
|
|
519
|
+
*/
|
|
520
|
+
CommonAPI.assertPermittedInProject({
|
|
521
|
+
databaseProps: props,
|
|
522
|
+
allowedPermissions: new LlmProvider().getReadPermissions(),
|
|
523
|
+
errorMessage:
|
|
524
|
+
"You do not have permission to read this project's AI providers.",
|
|
525
|
+
});
|
|
516
526
|
|
|
517
527
|
const [providers, defaultProvider]: [
|
|
518
528
|
Array<LlmProvider>,
|
|
@@ -561,18 +571,16 @@ router.post(
|
|
|
561
571
|
const props: DatabaseCommonInteractionProps =
|
|
562
572
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
563
573
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
const projectId: ObjectID = props.tenantId;
|
|
575
|
-
const userId: ObjectID = props.userId;
|
|
574
|
+
/*
|
|
575
|
+
* Membership, not just a session. getUserMiddleware admits an
|
|
576
|
+
* unauthenticated request as "public" and reads the tenant id straight
|
|
577
|
+
* out of the caller-supplied `tenantid` header, so the pair of checks
|
|
578
|
+
* this replaces proved only that SOMEBODY was logged in and had named
|
|
579
|
+
* SOME project - never that they belonged to the project they named.
|
|
580
|
+
*/
|
|
581
|
+
const projectId: ObjectID =
|
|
582
|
+
CommonAPI.assertAuthenticatedProjectMember(props);
|
|
583
|
+
const userId: ObjectID = props.userId!;
|
|
576
584
|
|
|
577
585
|
const conversationIdString: string = req.body["conversationId"] as string;
|
|
578
586
|
const assistantMessageIdString: string = req.body[
|
|
@@ -743,18 +751,16 @@ router.post(
|
|
|
743
751
|
const props: DatabaseCommonInteractionProps =
|
|
744
752
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
745
753
|
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
const projectId: ObjectID = props.tenantId;
|
|
757
|
-
const userId: ObjectID = props.userId;
|
|
754
|
+
/*
|
|
755
|
+
* Membership, not just a session. getUserMiddleware admits an
|
|
756
|
+
* unauthenticated request as "public" and reads the tenant id straight
|
|
757
|
+
* out of the caller-supplied `tenantid` header, so the pair of checks
|
|
758
|
+
* this replaces proved only that SOMEBODY was logged in and had named
|
|
759
|
+
* SOME project - never that they belonged to the project they named.
|
|
760
|
+
*/
|
|
761
|
+
const projectId: ObjectID =
|
|
762
|
+
CommonAPI.assertAuthenticatedProjectMember(props);
|
|
763
|
+
const userId: ObjectID = props.userId!;
|
|
758
764
|
|
|
759
765
|
const conversationIdString: string = req.body["conversationId"] as string;
|
|
760
766
|
|
|
@@ -913,15 +919,8 @@ router.post(
|
|
|
913
919
|
const props: DatabaseCommonInteractionProps =
|
|
914
920
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
915
921
|
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
"AI chat requires a logged-in user session.",
|
|
919
|
-
);
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
if (!props.tenantId) {
|
|
923
|
-
throw new BadDataException("Project ID is required (tenantid header).");
|
|
924
|
-
}
|
|
922
|
+
// Membership, not just a session - see the note on send-message.
|
|
923
|
+
CommonAPI.assertAuthenticatedProjectMember(props);
|
|
925
924
|
|
|
926
925
|
const messageIdString: string = req.body["messageId"] as string;
|
|
927
926
|
|
package/Server/API/BaseAPI.ts
CHANGED
|
@@ -298,20 +298,85 @@ export default class BaseAPI<
|
|
|
298
298
|
const databaseProps: DatabaseCommonInteractionProps =
|
|
299
299
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
300
300
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
301
|
+
/*
|
|
302
|
+
* findBy and countBy are independent reads, so run them in parallel to
|
|
303
|
+
* cut list latency where the count is costly. The one thing that makes
|
|
304
|
+
* the sequential order load-bearing is a service-level onBeforeFind
|
|
305
|
+
* override that mutates the shared query/props objects in place (e.g.
|
|
306
|
+
* ProjectService elevates props.isRoot and pins query._id for users with
|
|
307
|
+
* no projects; the incident/alert privacy filters rewrite query keys):
|
|
308
|
+
* countBy historically ran after findBy and inherited those mutations.
|
|
309
|
+
* Services on the stock hook cannot mutate anything (and the permission
|
|
310
|
+
* pipeline copies the query before touching it, ReadPermission.ts:33),
|
|
311
|
+
* so only they run in parallel; hook-overriding services keep the
|
|
312
|
+
* sequential order and its exact semantics.
|
|
313
|
+
*/
|
|
314
|
+
const usesStockOnBeforeFindHook: boolean =
|
|
315
|
+
(this.service as unknown as { onBeforeFind: unknown }).onBeforeFind ===
|
|
316
|
+
(DatabaseService.prototype as unknown as { onBeforeFind: unknown })
|
|
317
|
+
.onBeforeFind;
|
|
318
|
+
|
|
319
|
+
let list: Array<BaseModel>;
|
|
320
|
+
let count: PositiveNumber;
|
|
321
|
+
|
|
322
|
+
if (usesStockOnBeforeFindHook) {
|
|
323
|
+
const listPromise: Promise<Array<BaseModel>> = this.service.findBy({
|
|
324
|
+
query,
|
|
325
|
+
select,
|
|
326
|
+
skip: skip,
|
|
327
|
+
limit: limit,
|
|
328
|
+
groupBy: groupBy,
|
|
329
|
+
sort: sort,
|
|
330
|
+
props: databaseProps,
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
/*
|
|
334
|
+
* Shallow copies so a countBy override that rewrites top-level query
|
|
335
|
+
* keys (the established privacy-filter pattern) can never race the
|
|
336
|
+
* concurrent findBy's reads of the shared objects.
|
|
337
|
+
*/
|
|
338
|
+
const countPromise: Promise<PositiveNumber> = this.service.countBy({
|
|
339
|
+
query: { ...query },
|
|
340
|
+
props: { ...databaseProps },
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
/*
|
|
344
|
+
* allSettled instead of Promise.all: a findBy rejection must not leave
|
|
345
|
+
* countPromise as an unhandled rejection, and findBy's error keeps
|
|
346
|
+
* priority when both fail - the same failure the sequential code
|
|
347
|
+
* surfaced.
|
|
348
|
+
*/
|
|
349
|
+
const [listResult, countResult]: [
|
|
350
|
+
PromiseSettledResult<Array<BaseModel>>,
|
|
351
|
+
PromiseSettledResult<PositiveNumber>,
|
|
352
|
+
] = await Promise.allSettled([listPromise, countPromise]);
|
|
353
|
+
|
|
354
|
+
if (listResult.status === "rejected") {
|
|
355
|
+
throw listResult.reason;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (countResult.status === "rejected") {
|
|
359
|
+
throw countResult.reason;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
list = listResult.value;
|
|
363
|
+
count = countResult.value;
|
|
364
|
+
} else {
|
|
365
|
+
list = await this.service.findBy({
|
|
366
|
+
query,
|
|
367
|
+
select,
|
|
368
|
+
skip: skip,
|
|
369
|
+
limit: limit,
|
|
370
|
+
groupBy: groupBy,
|
|
371
|
+
sort: sort,
|
|
372
|
+
props: databaseProps,
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
count = await this.service.countBy({
|
|
376
|
+
query,
|
|
377
|
+
props: databaseProps,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
315
380
|
|
|
316
381
|
return Response.sendEntityArrayResponse(
|
|
317
382
|
req,
|
package/Server/API/CommonAPI.ts
CHANGED
|
@@ -9,6 +9,14 @@ import SpanUtil from "../Utils/Telemetry/SpanUtil";
|
|
|
9
9
|
import ObjectID from "../../Types/ObjectID";
|
|
10
10
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
11
11
|
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
12
|
+
import Permission, {
|
|
13
|
+
PermissionHelper,
|
|
14
|
+
PermissionProps,
|
|
15
|
+
UserPermission,
|
|
16
|
+
} from "../../Types/Permission";
|
|
17
|
+
import DatabaseCommonInteractionPropsUtil, {
|
|
18
|
+
PermissionType,
|
|
19
|
+
} from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
|
|
12
20
|
|
|
13
21
|
export default class CommonAPI {
|
|
14
22
|
/*
|
|
@@ -132,6 +140,87 @@ export default class CommonAPI {
|
|
|
132
140
|
}
|
|
133
141
|
}
|
|
134
142
|
|
|
143
|
+
/*
|
|
144
|
+
* Membership is not read authorisation.
|
|
145
|
+
*
|
|
146
|
+
* assertAuthenticatedProjectMember proves the caller belongs to the project
|
|
147
|
+
* they named in the `tenantid` header; it says nothing about WHICH of that
|
|
148
|
+
* project's data they may see. A custom route that then reads with
|
|
149
|
+
* `isRoot: true` has skipped the permission check the equivalent CRUD read
|
|
150
|
+
* would have run, so the route has to make that check itself - otherwise a
|
|
151
|
+
* member whose teams grant nothing but, say, ReadProjectIncident still reads
|
|
152
|
+
* everything else the route happens to touch.
|
|
153
|
+
*
|
|
154
|
+
* The permissions consulted are the caller's grants in props.tenantId, so
|
|
155
|
+
* this must be called after assertAuthenticatedProjectMember has confirmed
|
|
156
|
+
* that tenant is one the caller actually belongs to.
|
|
157
|
+
*
|
|
158
|
+
* `allowedPermissions` is normally the model's own declared list, e.g.
|
|
159
|
+
* `new LlmProvider().getReadPermissions()`, so the custom route stays in
|
|
160
|
+
* step with the CRUD endpoint for the same data instead of inventing a
|
|
161
|
+
* second, quietly diverging rule.
|
|
162
|
+
*
|
|
163
|
+
* Permissions that are never assigned INSIDE a project are stripped from
|
|
164
|
+
* that list first. This matters: getUserPermissions merges the caller's
|
|
165
|
+
* global permissions in, and every caller - including an anonymous one -
|
|
166
|
+
* carries Permission.Public, which a model's read list very often contains
|
|
167
|
+
* (LlmProvider has it so the shared global providers stay readable). Left
|
|
168
|
+
* in, it would make this guard pass for anyone. What remains is the
|
|
169
|
+
* tenant-assignable subset, which is exactly what a team can grant.
|
|
170
|
+
*
|
|
171
|
+
* Stripping can empty the list, and an empty list denies everyone rather
|
|
172
|
+
* than admitting them - a model whose read access is purely public has no
|
|
173
|
+
* business behind this guard, and failing closed is the safe direction.
|
|
174
|
+
*
|
|
175
|
+
* Master admins bypass, matching every other permission gate in the API.
|
|
176
|
+
*/
|
|
177
|
+
public static assertPermittedInProject(data: {
|
|
178
|
+
databaseProps: DatabaseCommonInteractionProps;
|
|
179
|
+
allowedPermissions: Array<Permission>;
|
|
180
|
+
errorMessage?: string | undefined;
|
|
181
|
+
}): void {
|
|
182
|
+
if (data.databaseProps.isMasterAdmin) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const tenantAssignablePermissions: Array<Permission> =
|
|
187
|
+
PermissionHelper.getTenantPermissionProps().map(
|
|
188
|
+
(permissionProps: PermissionProps) => {
|
|
189
|
+
return permissionProps.permission;
|
|
190
|
+
},
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
const requiredPermissions: Array<Permission> =
|
|
194
|
+
data.allowedPermissions.filter((permission: Permission) => {
|
|
195
|
+
return tenantAssignablePermissions.includes(permission);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* Allow-only: getUserPermissions discriminates grants from denials by
|
|
200
|
+
* isBlockPermission, so a team's explicit BLOCK row for one of these
|
|
201
|
+
* permissions must never be counted as a grant of it.
|
|
202
|
+
*/
|
|
203
|
+
const grantedPermissions: Array<Permission> =
|
|
204
|
+
DatabaseCommonInteractionPropsUtil.getUserPermissions(
|
|
205
|
+
data.databaseProps,
|
|
206
|
+
PermissionType.Allow,
|
|
207
|
+
).map((userPermission: UserPermission) => {
|
|
208
|
+
return userPermission.permission;
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
if (
|
|
212
|
+
!PermissionHelper.doesPermissionsIntersect(
|
|
213
|
+
grantedPermissions,
|
|
214
|
+
requiredPermissions,
|
|
215
|
+
)
|
|
216
|
+
) {
|
|
217
|
+
throw new NotAuthorizedException(
|
|
218
|
+
data.errorMessage ||
|
|
219
|
+
"You do not have permission to access this project's data.",
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
135
224
|
@CaptureSpan()
|
|
136
225
|
public static async getDatabaseCommonInteractionProps(
|
|
137
226
|
req: ExpressRequest,
|