@oneuptime/common 13.0.7 → 13.0.8
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/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Server/API/AIBillingAPI.ts +1 -0
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +1 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +13 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +17 -0
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +161 -32
- package/Server/API/TeamMemberAPI.ts +3 -0
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +79 -5
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/ProjectService.ts +18 -0
- package/Server/Services/RumSessionPinService.ts +274 -22
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
- package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +12 -0
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/Utils/API.ts +14 -5
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Server/API/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +125 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +3 -3
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +64 -4
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +171 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +17 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +180 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +14 -13
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +11 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +13 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- package/package.json +1 -1
|
@@ -56,6 +56,9 @@ import Dictionary from "../../../Types/Dictionary";
|
|
|
56
56
|
import Email from "../../../Types/Email";
|
|
57
57
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
58
58
|
import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
|
|
59
|
+
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
60
|
+
import Exception from "../../../Types/Exception/Exception";
|
|
61
|
+
import ExceptionCode from "../../../Types/Exception/ExceptionCode";
|
|
59
62
|
import NotificationRuleType from "../../../Types/NotificationRule/NotificationRuleType";
|
|
60
63
|
import ObjectID from "../../../Types/ObjectID";
|
|
61
64
|
import Permission, {
|
|
@@ -64,6 +67,7 @@ import Permission, {
|
|
|
64
67
|
} from "../../../Types/Permission";
|
|
65
68
|
import Phone from "../../../Types/Phone";
|
|
66
69
|
import ComplianceRuleType from "../../../Types/Team/ComplianceRuleType";
|
|
70
|
+
import UserType from "../../../Types/UserType";
|
|
67
71
|
import {
|
|
68
72
|
afterEach,
|
|
69
73
|
beforeAll,
|
|
@@ -104,6 +108,14 @@ import {
|
|
|
104
108
|
* caller-supplied `tenantid` header, and everything underneath reads with
|
|
105
109
|
* isRoot: true. The handlers are therefore the only gate there is, which is why
|
|
106
110
|
* a disproportionate share of this file is spent on who gets refused.
|
|
111
|
+
*
|
|
112
|
+
* And on HOW they are refused. A caller with no credentials at all is answered
|
|
113
|
+
* with NotAuthenticatedException (401) before the tenant header or the path is
|
|
114
|
+
* looked at; an authenticated caller who may not see the data keeps the 422.
|
|
115
|
+
* In practice the anonymous caller is an admin whose access-token cookie
|
|
116
|
+
* expired while the page sat open, and the dashboard refreshes the session and
|
|
117
|
+
* resends only on a 401 - a 422 left them looking at "not authorized" on their
|
|
118
|
+
* own project.
|
|
107
119
|
*/
|
|
108
120
|
|
|
109
121
|
jest.mock("../../../Server/Utils/Express", () => {
|
|
@@ -148,6 +160,24 @@ const COMPLIANCE_ROUTE: string = "/team/compliance-status/:teamId";
|
|
|
148
160
|
*/
|
|
149
161
|
const REFUSAL: string = "You are not authorized to access this project's data.";
|
|
150
162
|
|
|
163
|
+
/*
|
|
164
|
+
* The refusal for a caller with no credentials. Deliberately NOT the sentence
|
|
165
|
+
* above: it is decided before anything project-specific is consulted, so it is
|
|
166
|
+
* the same answer for every project and every id and discloses nothing - and
|
|
167
|
+
* it has to be a 401, because that is the only status the browser client
|
|
168
|
+
* answers by refreshing the session.
|
|
169
|
+
*/
|
|
170
|
+
function expectAuthenticationRequired(thrown: unknown): void {
|
|
171
|
+
expect(thrown).toBeInstanceOf(NotAuthenticatedException);
|
|
172
|
+
expect((thrown as Exception).code).toBe(
|
|
173
|
+
ExceptionCode.NotAuthenticatedException,
|
|
174
|
+
);
|
|
175
|
+
expect((thrown as Exception).code).toBe(401);
|
|
176
|
+
expect((thrown as Exception).message).toBe(
|
|
177
|
+
CommonAPI.AUTHENTICATION_REQUIRED_MESSAGE,
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
151
181
|
/** Enough of a findBy argument to assert on, without importing FindBy generics. */
|
|
152
182
|
interface CapturedFindBy {
|
|
153
183
|
query: Record<string, unknown>;
|
|
@@ -910,7 +940,12 @@ describe("GET /on-call-readiness/policy/:policyId", () => {
|
|
|
910
940
|
expect(read.props.isRoot).toBe(true);
|
|
911
941
|
});
|
|
912
942
|
|
|
913
|
-
|
|
943
|
+
/*
|
|
944
|
+
* No session and no tenant header. This was a BadDataException (400,
|
|
945
|
+
* "Project ID is required") until the guards learned to ask "who are you?"
|
|
946
|
+
* before "which project?"; a 400 never made the dashboard refresh.
|
|
947
|
+
*/
|
|
948
|
+
test("refuses an unauthenticated caller with 401 before reading anything", async () => {
|
|
914
949
|
propsSpy.mockResolvedValue({} as never);
|
|
915
950
|
|
|
916
951
|
const result: RouteCallResult = await callGetRoute({
|
|
@@ -918,17 +953,21 @@ describe("GET /on-call-readiness/policy/:policyId", () => {
|
|
|
918
953
|
params: { policyId: policyId.toString() },
|
|
919
954
|
});
|
|
920
955
|
|
|
921
|
-
|
|
956
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
922
957
|
expect(policyFindOneById).not.toHaveBeenCalled();
|
|
923
958
|
expect(policySpy).not.toHaveBeenCalled();
|
|
924
959
|
});
|
|
925
960
|
|
|
926
|
-
test("refuses a public caller that merely supplies a tenantid header", async () => {
|
|
961
|
+
test("refuses a public caller that merely supplies a tenantid header with 401", async () => {
|
|
927
962
|
/*
|
|
928
963
|
* The exact shape getUserMiddleware produces for an anonymous request that
|
|
929
964
|
* carried a `tenantid` header: a project id, no user, no permissions. If
|
|
930
965
|
* this got through, one header would be the whole authentication story for
|
|
931
966
|
* every responder's configuration in that project.
|
|
967
|
+
*
|
|
968
|
+
* It is also the shape of an admin's request once their access-token
|
|
969
|
+
* cookie has expired, which is why the refusal is a 401 (it used to be the
|
|
970
|
+
* 422 "not authorized") - the dashboard refreshes and resends on a 401.
|
|
932
971
|
*/
|
|
933
972
|
propsSpy.mockResolvedValue({
|
|
934
973
|
tenantId: projectId,
|
|
@@ -941,11 +980,43 @@ describe("GET /on-call-readiness/policy/:policyId", () => {
|
|
|
941
980
|
params: { policyId: policyId.toString() },
|
|
942
981
|
});
|
|
943
982
|
|
|
944
|
-
|
|
983
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
945
984
|
expect(policyFindOneById).not.toHaveBeenCalled();
|
|
946
985
|
expect(policySpy).not.toHaveBeenCalled();
|
|
947
986
|
});
|
|
948
987
|
|
|
988
|
+
test("an anonymous caller is refused before the path is validated", async () => {
|
|
989
|
+
/*
|
|
990
|
+
* A malformed id from a logged-in member is a 400 (below). From a caller
|
|
991
|
+
* with no credentials it must still be the 401, so the refresh-and-replay
|
|
992
|
+
* happens and the replayed request gets the real answer.
|
|
993
|
+
*/
|
|
994
|
+
propsSpy.mockResolvedValue({ tenantId: projectId } as never);
|
|
995
|
+
|
|
996
|
+
const result: RouteCallResult = await callGetRoute({
|
|
997
|
+
uri: POLICY_ROUTE,
|
|
998
|
+
params: { policyId: "not-a-uuid" },
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
1002
|
+
expect(policyFindOneById).not.toHaveBeenCalled();
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
test("a logged-in caller with no tenant header is still the 400", async () => {
|
|
1006
|
+
propsSpy.mockResolvedValue({ userId: callerUserId } as never);
|
|
1007
|
+
|
|
1008
|
+
const result: RouteCallResult = await callGetRoute({
|
|
1009
|
+
uri: POLICY_ROUTE,
|
|
1010
|
+
params: { policyId: policyId.toString() },
|
|
1011
|
+
});
|
|
1012
|
+
|
|
1013
|
+
expect(result.thrownToNext).toBeInstanceOf(BadDataException);
|
|
1014
|
+
expect((result.thrownToNext as Exception).code).toBe(
|
|
1015
|
+
ExceptionCode.BadDataException,
|
|
1016
|
+
);
|
|
1017
|
+
expect(policyFindOneById).not.toHaveBeenCalled();
|
|
1018
|
+
});
|
|
1019
|
+
|
|
949
1020
|
test("a member of one project cannot read another project's policy", async () => {
|
|
950
1021
|
policyFindOneById.mockResolvedValue({
|
|
951
1022
|
id: policyId,
|
|
@@ -1057,12 +1128,36 @@ describe("GET /on-call-readiness/project", () => {
|
|
|
1057
1128
|
expect(projectSpy.mock.calls[0]).toEqual([projectId]);
|
|
1058
1129
|
});
|
|
1059
1130
|
|
|
1060
|
-
|
|
1131
|
+
// Was a BadDataException (400) before the credential check.
|
|
1132
|
+
test("refuses an unauthenticated caller with 401", async () => {
|
|
1061
1133
|
propsSpy.mockResolvedValue({} as never);
|
|
1062
1134
|
|
|
1063
1135
|
const result: RouteCallResult = await callGetRoute({ uri: PROJECT_ROUTE });
|
|
1064
1136
|
|
|
1065
|
-
|
|
1137
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
1138
|
+
expect(projectSpy).not.toHaveBeenCalled();
|
|
1139
|
+
});
|
|
1140
|
+
|
|
1141
|
+
test("refuses an anonymous caller carrying a tenantid header with 401, and does not clear the cache for it", async () => {
|
|
1142
|
+
/*
|
|
1143
|
+
* ?refresh=true drops the readiness cache for everyone. It sits after the
|
|
1144
|
+
* guard, so a caller with no session cannot use it to make every other
|
|
1145
|
+
* viewer's next page load recompute.
|
|
1146
|
+
*/
|
|
1147
|
+
const clearSpy: jest.SpyInstance = jest.spyOn(
|
|
1148
|
+
OnCallReadinessService,
|
|
1149
|
+
"clearCache",
|
|
1150
|
+
);
|
|
1151
|
+
|
|
1152
|
+
propsSpy.mockResolvedValue({ tenantId: projectId } as never);
|
|
1153
|
+
|
|
1154
|
+
const result: RouteCallResult = await callGetRoute({
|
|
1155
|
+
uri: PROJECT_ROUTE,
|
|
1156
|
+
query: { refresh: "true" },
|
|
1157
|
+
});
|
|
1158
|
+
|
|
1159
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
1160
|
+
expect(clearSpy).not.toHaveBeenCalled();
|
|
1066
1161
|
expect(projectSpy).not.toHaveBeenCalled();
|
|
1067
1162
|
});
|
|
1068
1163
|
|
|
@@ -1261,7 +1356,12 @@ describe("paging the readiness summaries", () => {
|
|
|
1261
1356
|
expect(payload["skip"]).toBe(200);
|
|
1262
1357
|
});
|
|
1263
1358
|
|
|
1264
|
-
|
|
1359
|
+
/*
|
|
1360
|
+
* The caller here has no session at all, so the refusal is the 401 (it was
|
|
1361
|
+
* the 422 before the credential check). The point of the test is unchanged:
|
|
1362
|
+
* the paging parameters buy nothing before authorisation.
|
|
1363
|
+
*/
|
|
1364
|
+
test("paging is refused for a caller with no session (401), before any readiness work", async () => {
|
|
1265
1365
|
propsSpy.mockResolvedValue({
|
|
1266
1366
|
tenantId: projectId,
|
|
1267
1367
|
userId: undefined,
|
|
@@ -1273,7 +1373,26 @@ describe("paging the readiness summaries", () => {
|
|
|
1273
1373
|
query: { limit: "10" },
|
|
1274
1374
|
});
|
|
1275
1375
|
|
|
1376
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
1377
|
+
expect(projectSpy).not.toHaveBeenCalled();
|
|
1378
|
+
});
|
|
1379
|
+
|
|
1380
|
+
test("paging is refused for a logged-in caller who is not a member (422), before any readiness work", async () => {
|
|
1381
|
+
propsSpy.mockResolvedValue({
|
|
1382
|
+
tenantId: projectId,
|
|
1383
|
+
userId: callerUserId,
|
|
1384
|
+
userTenantAccessPermission: {},
|
|
1385
|
+
} as never);
|
|
1386
|
+
|
|
1387
|
+
const result: RouteCallResult = await callGetRoute({
|
|
1388
|
+
uri: PROJECT_ROUTE,
|
|
1389
|
+
query: { limit: "10" },
|
|
1390
|
+
});
|
|
1391
|
+
|
|
1276
1392
|
expect(result.thrownToNext).toBeInstanceOf(NotAuthorizedException);
|
|
1393
|
+
expect((result.thrownToNext as Exception).code).toBe(
|
|
1394
|
+
ExceptionCode.NotAuthorizedException,
|
|
1395
|
+
);
|
|
1277
1396
|
expect(projectSpy).not.toHaveBeenCalled();
|
|
1278
1397
|
});
|
|
1279
1398
|
});
|
|
@@ -1393,7 +1512,8 @@ describe("GET /on-call-readiness/user/:userId", () => {
|
|
|
1393
1512
|
expect(userSpy).not.toHaveBeenCalled();
|
|
1394
1513
|
});
|
|
1395
1514
|
|
|
1396
|
-
|
|
1515
|
+
// Was a BadDataException (400) before the credential check.
|
|
1516
|
+
test("refuses an unauthenticated caller with 401 before the membership query", async () => {
|
|
1397
1517
|
propsSpy.mockResolvedValue({} as never);
|
|
1398
1518
|
|
|
1399
1519
|
const result: RouteCallResult = await callGetRoute({
|
|
@@ -1401,12 +1521,13 @@ describe("GET /on-call-readiness/user/:userId", () => {
|
|
|
1401
1521
|
params: { userId: subjectUserId.toString() },
|
|
1402
1522
|
});
|
|
1403
1523
|
|
|
1404
|
-
|
|
1524
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
1405
1525
|
expect(teamMemberFindBy).not.toHaveBeenCalled();
|
|
1406
1526
|
expect(userSpy).not.toHaveBeenCalled();
|
|
1407
1527
|
});
|
|
1408
1528
|
|
|
1409
|
-
|
|
1529
|
+
// Was a NotAuthorizedException (422) before the credential check.
|
|
1530
|
+
test("refuses a public caller that merely supplies a tenantid header with 401", async () => {
|
|
1410
1531
|
propsSpy.mockResolvedValue({
|
|
1411
1532
|
tenantId: projectId,
|
|
1412
1533
|
userId: undefined,
|
|
@@ -1418,7 +1539,37 @@ describe("GET /on-call-readiness/user/:userId", () => {
|
|
|
1418
1539
|
params: { userId: subjectUserId.toString() },
|
|
1419
1540
|
});
|
|
1420
1541
|
|
|
1542
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
1543
|
+
expect(teamMemberFindBy).not.toHaveBeenCalled();
|
|
1544
|
+
expect(userSpy).not.toHaveBeenCalled();
|
|
1545
|
+
});
|
|
1546
|
+
|
|
1547
|
+
test("a project API key is authenticated but not a member: still the 422", async () => {
|
|
1548
|
+
/*
|
|
1549
|
+
* The readiness routes are for people inside the project. A key is a
|
|
1550
|
+
* credential, so it must NOT get the 401 - an API client would answer it
|
|
1551
|
+
* by trying to refresh a session it never had.
|
|
1552
|
+
*/
|
|
1553
|
+
propsSpy.mockResolvedValue({
|
|
1554
|
+
tenantId: projectId,
|
|
1555
|
+
userId: undefined,
|
|
1556
|
+
userType: UserType.API,
|
|
1557
|
+
userTenantAccessPermission: buildMemberProps({
|
|
1558
|
+
projectId: projectId,
|
|
1559
|
+
userId: callerUserId,
|
|
1560
|
+
}).userTenantAccessPermission,
|
|
1561
|
+
} as never);
|
|
1562
|
+
|
|
1563
|
+
const result: RouteCallResult = await callGetRoute({
|
|
1564
|
+
uri: USER_ROUTE,
|
|
1565
|
+
params: { userId: subjectUserId.toString() },
|
|
1566
|
+
});
|
|
1567
|
+
|
|
1421
1568
|
expect(result.thrownToNext).toBeInstanceOf(NotAuthorizedException);
|
|
1569
|
+
expect((result.thrownToNext as Exception).code).toBe(
|
|
1570
|
+
ExceptionCode.NotAuthorizedException,
|
|
1571
|
+
);
|
|
1572
|
+
expect((result.thrownToNext as Exception).message).toBe(REFUSAL);
|
|
1422
1573
|
expect(teamMemberFindBy).not.toHaveBeenCalled();
|
|
1423
1574
|
expect(userSpy).not.toHaveBeenCalled();
|
|
1424
1575
|
});
|
|
@@ -2622,7 +2773,8 @@ describe("GET /team/compliance-status/:teamId - authorisation", () => {
|
|
|
2622
2773
|
);
|
|
2623
2774
|
});
|
|
2624
2775
|
|
|
2625
|
-
|
|
2776
|
+
// Was a BadDataException (400) before the credential check.
|
|
2777
|
+
test("refuses an unauthenticated caller with 401 before reading anything", async () => {
|
|
2626
2778
|
propsSpy.mockResolvedValue({} as never);
|
|
2627
2779
|
|
|
2628
2780
|
const result: RouteCallResult = await callGetRoute({
|
|
@@ -2630,16 +2782,21 @@ describe("GET /team/compliance-status/:teamId - authorisation", () => {
|
|
|
2630
2782
|
params: { teamId: teamId.toString() },
|
|
2631
2783
|
});
|
|
2632
2784
|
|
|
2633
|
-
|
|
2785
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
2634
2786
|
expect(teamFindOneById).not.toHaveBeenCalled();
|
|
2635
2787
|
expect(complianceSpy).not.toHaveBeenCalled();
|
|
2636
2788
|
});
|
|
2637
2789
|
|
|
2638
|
-
test("refuses a public caller that merely supplies a tenantid header", async () => {
|
|
2790
|
+
test("refuses a public caller that merely supplies a tenantid header with 401", async () => {
|
|
2639
2791
|
/*
|
|
2640
2792
|
* THE hole, in its exact shape: the request getUserMiddleware produces for
|
|
2641
2793
|
* an anonymous caller who sent a `tenantid` header. A project id, no user,
|
|
2642
2794
|
* no permissions - and, until this change, a complete compliance report.
|
|
2795
|
+
*
|
|
2796
|
+
* Refused as unauthenticated (401), not with the member refusal it used to
|
|
2797
|
+
* get: this is also what a signed-in admin's request looks like once the
|
|
2798
|
+
* access-token cookie has expired, and only a 401 makes the dashboard
|
|
2799
|
+
* refresh the session and resend.
|
|
2643
2800
|
*/
|
|
2644
2801
|
propsSpy.mockResolvedValue({
|
|
2645
2802
|
tenantId: projectId,
|
|
@@ -2652,10 +2809,7 @@ describe("GET /team/compliance-status/:teamId - authorisation", () => {
|
|
|
2652
2809
|
params: { teamId: teamId.toString() },
|
|
2653
2810
|
});
|
|
2654
2811
|
|
|
2655
|
-
|
|
2656
|
-
expect((result.thrownToNext as NotAuthorizedException).message).toBe(
|
|
2657
|
-
REFUSAL,
|
|
2658
|
-
);
|
|
2812
|
+
expectAuthenticationRequired(result.thrownToNext);
|
|
2659
2813
|
expect(teamFindOneById).not.toHaveBeenCalled();
|
|
2660
2814
|
expect(complianceSpy).not.toHaveBeenCalled();
|
|
2661
2815
|
});
|
|
@@ -2673,7 +2827,11 @@ describe("GET /team/compliance-status/:teamId - authorisation", () => {
|
|
|
2673
2827
|
params: { teamId: teamId.toString() },
|
|
2674
2828
|
});
|
|
2675
2829
|
|
|
2830
|
+
// Authenticated, so the refusal keeps its 422 - only anonymity is a 401.
|
|
2676
2831
|
expect(result.thrownToNext).toBeInstanceOf(NotAuthorizedException);
|
|
2832
|
+
expect((result.thrownToNext as Exception).code).toBe(
|
|
2833
|
+
ExceptionCode.NotAuthorizedException,
|
|
2834
|
+
);
|
|
2677
2835
|
expect(complianceSpy).not.toHaveBeenCalled();
|
|
2678
2836
|
});
|
|
2679
2837
|
|