@oneuptime/common 13.0.7 → 14.0.0
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/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Scripts/generate-service-worker.js +65 -4
- 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 +34 -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 +243 -460
- 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/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +261 -74
- package/Server/API/TeamMemberAPI.ts +13 -1
- 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/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +117 -21
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +56 -4
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- 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 +302 -0
- package/Server/Services/RumSessionPinService.ts +293 -22
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- 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/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- 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/AuditLogsAndComplianceShells.test.tsx +572 -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/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- 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/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- 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 +133 -70
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -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/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- 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/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- 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 +766 -381
- 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 +196 -912
- 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/SsoProviderListingsEdition.test.ts +432 -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/TeamMemberLeaveScimLockEdition.test.ts +252 -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/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- 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/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -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/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- 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/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- 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/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -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/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- 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/Types/Markdown.test.ts +181 -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/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -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/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -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/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- 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/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -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/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -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/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- 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/Types/StatusPage/UptimeDailyAggregate.ts +110 -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 +808 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -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/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- 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/UI/esbuild-enterprise.js +263 -0
- package/Utils/API.ts +14 -5
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- 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 +33 -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 +158 -342
- 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/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.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 +218 -76
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +11 -4
- 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/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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 +94 -15
- 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/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.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/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -4
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.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 +231 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +198 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.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/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.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/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.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/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.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 +24 -16
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.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/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.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/AffectedResourceList.js +96 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- 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/MonitorCriteriaEvaluator.js +449 -261
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- 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/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.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/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +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/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- 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 +425 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- 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/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.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/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- 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/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.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/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- 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/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import TeamMemberAPI from "../../../Server/API/TeamMemberAPI";
|
|
2
|
+
import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
|
|
3
|
+
import TeamMemberService from "../../../Server/Services/TeamMemberService";
|
|
4
|
+
import {
|
|
5
|
+
ExpressRequest,
|
|
6
|
+
ExpressResponse,
|
|
7
|
+
NextFunction,
|
|
8
|
+
} from "../../../Server/Utils/Express";
|
|
9
|
+
import Response from "../../../Server/Utils/Response";
|
|
10
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
11
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
12
|
+
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
13
|
+
import TeamMember from "../../../Models/DatabaseModels/TeamMember";
|
|
14
|
+
import FakeEnterpriseModule, {
|
|
15
|
+
createEditionStateCases,
|
|
16
|
+
createLicenseSnapshotWithStatus,
|
|
17
|
+
EditionStateCase,
|
|
18
|
+
installFakeEnterpriseModule,
|
|
19
|
+
uninstallEnterpriseModule,
|
|
20
|
+
} from "../Enterprise/FakeEnterpriseModule";
|
|
21
|
+
import logger from "../../../Server/Utils/Logger";
|
|
22
|
+
import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
|
|
23
|
+
import { getJestSpyOn } from "../../Spy";
|
|
24
|
+
import { mockRouter } from "./Helpers";
|
|
25
|
+
import {
|
|
26
|
+
afterEach,
|
|
27
|
+
beforeAll,
|
|
28
|
+
beforeEach,
|
|
29
|
+
describe,
|
|
30
|
+
expect,
|
|
31
|
+
jest,
|
|
32
|
+
test,
|
|
33
|
+
} from "@jest/globals";
|
|
34
|
+
|
|
35
|
+
type SpyInstance = ReturnType<typeof getJestSpyOn>;
|
|
36
|
+
|
|
37
|
+
jest.mock("../../../Server/Utils/Express", () => {
|
|
38
|
+
return {
|
|
39
|
+
getRouter: () => {
|
|
40
|
+
return mockRouter;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
jest.mock("../../../Server/Utils/Response", () => {
|
|
46
|
+
return {
|
|
47
|
+
sendEntityArrayResponse: jest.fn(),
|
|
48
|
+
sendJsonObjectResponse: jest.fn(),
|
|
49
|
+
sendEmptySuccessResponse: jest.fn(),
|
|
50
|
+
sendEntityResponse: jest.fn(),
|
|
51
|
+
sendErrorResponse: jest.fn(),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
jest.mock("../../../Server/EnvironmentConfig", () => {
|
|
56
|
+
const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
|
|
57
|
+
jest.requireActual(
|
|
58
|
+
"../Enterprise/TestBillingFlag",
|
|
59
|
+
) as typeof import("../Enterprise/TestBillingFlag");
|
|
60
|
+
|
|
61
|
+
return billingFlag.withLiveBillingFlag(
|
|
62
|
+
jest.requireActual("../../../Server/EnvironmentConfig") as Record<
|
|
63
|
+
string,
|
|
64
|
+
unknown
|
|
65
|
+
>,
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
* POST /team-member/:id/leave lets a member leave a team. While SCIM Push
|
|
71
|
+
* Groups owns the project's teams, only the identity provider may remove
|
|
72
|
+
* members, so the route refuses - while SCIM is active
|
|
73
|
+
* (EnterpriseEdition.isFeatureActive(SCIM)). The Community Edition has no
|
|
74
|
+
* SCIM endpoint, and an Enterprise install whose license lapsed answers none,
|
|
75
|
+
* so there a Push Groups setting left on must not trap the member in the team.
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
const ROUTE: string = "/team-member/:id/leave";
|
|
79
|
+
|
|
80
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
81
|
+
"11111111-1111-4111-8111-111111111111",
|
|
82
|
+
);
|
|
83
|
+
const MEMBERSHIP_ID: ObjectID = new ObjectID(
|
|
84
|
+
"66666666-6666-4666-8666-666666666666",
|
|
85
|
+
);
|
|
86
|
+
const USER_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
87
|
+
|
|
88
|
+
const EDITION_CASES: Array<EditionStateCase> = createEditionStateCases();
|
|
89
|
+
|
|
90
|
+
const toMatrix: (
|
|
91
|
+
cases: Array<EditionStateCase>,
|
|
92
|
+
) => Array<[string, EditionStateCase]> = (
|
|
93
|
+
cases: Array<EditionStateCase>,
|
|
94
|
+
): Array<[string, EditionStateCase]> => {
|
|
95
|
+
return cases.map(
|
|
96
|
+
(editionCase: EditionStateCase): [string, EditionStateCase] => {
|
|
97
|
+
return [editionCase.label, editionCase];
|
|
98
|
+
},
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const LOCKED_MATRIX: Array<[string, EditionStateCase]> = toMatrix(
|
|
103
|
+
EDITION_CASES.filter((editionCase: EditionStateCase): boolean => {
|
|
104
|
+
return editionCase.isActive;
|
|
105
|
+
}),
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const UNLOCKED_MATRIX: Array<[string, EditionStateCase]> = toMatrix(
|
|
109
|
+
EDITION_CASES.filter((editionCase: EditionStateCase): boolean => {
|
|
110
|
+
return !editionCase.isActive;
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
let scimCount: SpyInstance;
|
|
115
|
+
let deleteMembership: SpyInstance;
|
|
116
|
+
|
|
117
|
+
const leave: () => Promise<void> = async (): Promise<void> => {
|
|
118
|
+
const req: ExpressRequest = {
|
|
119
|
+
params: { id: MEMBERSHIP_ID.toString() },
|
|
120
|
+
query: {},
|
|
121
|
+
body: {},
|
|
122
|
+
headers: {},
|
|
123
|
+
userAuthorization: { userId: USER_ID },
|
|
124
|
+
} as unknown as ExpressRequest;
|
|
125
|
+
|
|
126
|
+
const res: ExpressResponse = {
|
|
127
|
+
send: jest.fn(),
|
|
128
|
+
json: jest.fn(),
|
|
129
|
+
status: jest.fn().mockReturnThis(),
|
|
130
|
+
} as unknown as ExpressResponse;
|
|
131
|
+
|
|
132
|
+
const next: NextFunction = jest.fn() as unknown as NextFunction;
|
|
133
|
+
|
|
134
|
+
await mockRouter.match("POST", ROUTE).handlerFunction(req, res, next);
|
|
135
|
+
|
|
136
|
+
expect(next).not.toHaveBeenCalled();
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const expectRefusedBecauseOfScim: () => void = (): void => {
|
|
140
|
+
expect(Response.sendErrorResponse).toHaveBeenCalledWith(
|
|
141
|
+
expect.anything(),
|
|
142
|
+
expect.anything(),
|
|
143
|
+
new BadDataException(
|
|
144
|
+
"Team membership is managed by SCIM Push Groups for this project. Please contact your administrator to be removed.",
|
|
145
|
+
),
|
|
146
|
+
);
|
|
147
|
+
expect(deleteMembership).not.toHaveBeenCalled();
|
|
148
|
+
expect(Response.sendEmptySuccessResponse).not.toHaveBeenCalled();
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const expectLeft: () => void = (): void => {
|
|
152
|
+
expect(Response.sendErrorResponse).not.toHaveBeenCalled();
|
|
153
|
+
expect(deleteMembership).toHaveBeenCalledWith({
|
|
154
|
+
id: MEMBERSHIP_ID,
|
|
155
|
+
props: { isRoot: true },
|
|
156
|
+
});
|
|
157
|
+
expect(Response.sendEmptySuccessResponse).toHaveBeenCalledTimes(1);
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
describe("POST /team-member/:id/leave and SCIM Push Groups, by edition", () => {
|
|
161
|
+
beforeAll(() => {
|
|
162
|
+
mockRouter.routes.length = 0;
|
|
163
|
+
new TeamMemberAPI();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
beforeEach(() => {
|
|
167
|
+
jest.clearAllMocks();
|
|
168
|
+
setTestBillingEnabled(false);
|
|
169
|
+
uninstallEnterpriseModule();
|
|
170
|
+
|
|
171
|
+
const membership: TeamMember = new TeamMember();
|
|
172
|
+
membership.userId = USER_ID;
|
|
173
|
+
membership.projectId = PROJECT_ID;
|
|
174
|
+
|
|
175
|
+
getJestSpyOn(TeamMemberService, "findOneById").mockResolvedValue(
|
|
176
|
+
membership,
|
|
177
|
+
);
|
|
178
|
+
deleteMembership = getJestSpyOn(
|
|
179
|
+
TeamMemberService,
|
|
180
|
+
"deleteOneById",
|
|
181
|
+
).mockResolvedValue(1);
|
|
182
|
+
getJestSpyOn(logger, "warn").mockImplementation((): void => {
|
|
183
|
+
return undefined;
|
|
184
|
+
});
|
|
185
|
+
getJestSpyOn(logger, "info").mockImplementation((): void => {
|
|
186
|
+
return undefined;
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Push Groups is ON for the project.
|
|
190
|
+
scimCount = getJestSpyOn(ProjectSCIMService, "countBy").mockResolvedValue(
|
|
191
|
+
new PositiveNumber(1),
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
afterEach(() => {
|
|
196
|
+
uninstallEnterpriseModule();
|
|
197
|
+
setTestBillingEnabled(false);
|
|
198
|
+
jest.restoreAllMocks();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test.each(LOCKED_MATRIX)(
|
|
202
|
+
"SCIM active (%s): leaving is refused",
|
|
203
|
+
async (_label: string, editionCase: EditionStateCase) => {
|
|
204
|
+
editionCase.apply();
|
|
205
|
+
|
|
206
|
+
await leave();
|
|
207
|
+
|
|
208
|
+
expect(scimCount).toHaveBeenCalledWith(
|
|
209
|
+
expect.objectContaining({
|
|
210
|
+
query: { projectId: PROJECT_ID, enablePushGroups: true },
|
|
211
|
+
}),
|
|
212
|
+
);
|
|
213
|
+
expectRefusedBecauseOfScim();
|
|
214
|
+
},
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
test.each(UNLOCKED_MATRIX)(
|
|
218
|
+
"SCIM not active (%s): the member can leave",
|
|
219
|
+
async (_label: string, editionCase: EditionStateCase) => {
|
|
220
|
+
editionCase.apply();
|
|
221
|
+
|
|
222
|
+
await leave();
|
|
223
|
+
|
|
224
|
+
expect(scimCount).not.toHaveBeenCalled();
|
|
225
|
+
expectLeft();
|
|
226
|
+
},
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
test("the lock follows the license at request time: a lapse lets the member leave, a renewal locks again", async () => {
|
|
230
|
+
const fake: FakeEnterpriseModule = installFakeEnterpriseModule({
|
|
231
|
+
snapshot: createLicenseSnapshotWithStatus("valid"),
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
await leave();
|
|
235
|
+
expectRefusedBecauseOfScim();
|
|
236
|
+
|
|
237
|
+
jest.clearAllMocks();
|
|
238
|
+
fake.setSnapshot(createLicenseSnapshotWithStatus("expired"));
|
|
239
|
+
|
|
240
|
+
await leave();
|
|
241
|
+
expectLeft();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test("with Push Groups off the Enterprise Edition lets the member leave", async () => {
|
|
245
|
+
installFakeEnterpriseModule();
|
|
246
|
+
scimCount.mockResolvedValue(new PositiveNumber(0));
|
|
247
|
+
|
|
248
|
+
await leave();
|
|
249
|
+
|
|
250
|
+
expectLeft();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
@@ -242,6 +242,13 @@ describe("POST /team-member/remove-user-from-project", () => {
|
|
|
242
242
|
);
|
|
243
243
|
});
|
|
244
244
|
|
|
245
|
+
/*
|
|
246
|
+
* The handler's own check, called directly. On the router an anonymous
|
|
247
|
+
* request (an expired session) never gets this far any more:
|
|
248
|
+
* requireUserAuthentication answers it with a 401 first, which is pinned
|
|
249
|
+
* in ExpiredSessionRouteGuards.test.ts. This stays as defence in depth for
|
|
250
|
+
* a credentialed caller with no user id, such as a project API key.
|
|
251
|
+
*/
|
|
245
252
|
test("rejects an unauthenticated caller without deleting anything", async () => {
|
|
246
253
|
await callRoute({ body: { userId: targetUserId.toString() } });
|
|
247
254
|
|
|
@@ -157,6 +157,12 @@ describe("UserIncomingCallNumberAPI", () => {
|
|
|
157
157
|
expect(Response.sendEmptySuccessResponse).not.toHaveBeenCalled();
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
+
/*
|
|
161
|
+
* The handler's own check, reached directly. Through the router, a
|
|
162
|
+
* request with no session is answered 401 by requireUserAuthentication
|
|
163
|
+
* before the limiter or this handler runs (see
|
|
164
|
+
* ExpiredSessionRouteGuards.test.ts); this pins the defence in depth.
|
|
165
|
+
*/
|
|
160
166
|
it("should reject when the request carries no user authorization", async () => {
|
|
161
167
|
mockRequest.body = { itemId: ITEM_ID };
|
|
162
168
|
UserIncomingCallNumberService.findOneById = jest
|
|
@@ -12,9 +12,13 @@ import Response from "../../../Server/Utils/Response";
|
|
|
12
12
|
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
13
13
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
14
14
|
import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
|
|
15
|
+
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
16
|
+
import Exception from "../../../Types/Exception/Exception";
|
|
17
|
+
import ExceptionCode from "../../../Types/Exception/ExceptionCode";
|
|
15
18
|
import { ROUTINE_EMAIL_EVENT_TYPES } from "../../../Types/NotificationSetting/RoutineEmailEvents";
|
|
16
19
|
import ObjectID from "../../../Types/ObjectID";
|
|
17
20
|
import Permission from "../../../Types/Permission";
|
|
21
|
+
import UserType from "../../../Types/UserType";
|
|
18
22
|
|
|
19
23
|
jest.mock("../../../Server/Utils/Express", () => {
|
|
20
24
|
return {
|
|
@@ -29,6 +33,15 @@ const USER_ID: ObjectID = ObjectID.generate();
|
|
|
29
33
|
const PROJECT_ID: ObjectID = ObjectID.generate();
|
|
30
34
|
const OTHER_PROJECT_ID: ObjectID = ObjectID.generate();
|
|
31
35
|
|
|
36
|
+
/*
|
|
37
|
+
* The exception the handler handed to next(). Its code is the HTTP status the
|
|
38
|
+
* client sees, and the browser client refreshes the session on 401 only, so
|
|
39
|
+
* the code is asserted alongside the class.
|
|
40
|
+
*/
|
|
41
|
+
function errorPassedTo(next: jest.Mock): Exception {
|
|
42
|
+
return next.mock.calls[0]![0] as Exception;
|
|
43
|
+
}
|
|
44
|
+
|
|
32
45
|
describe("POST reduce routine emails", () => {
|
|
33
46
|
let props: DatabaseCommonInteractionProps;
|
|
34
47
|
let reduceSpy: jest.SpyInstance;
|
|
@@ -128,21 +141,67 @@ describe("POST reduce routine emails", () => {
|
|
|
128
141
|
});
|
|
129
142
|
});
|
|
130
143
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
144
|
+
/*
|
|
145
|
+
* Both callers are refused, but differently. The anonymous one - no user, no
|
|
146
|
+
* key, typically a dashboard tab whose access-token cookie expired - gets
|
|
147
|
+
* NotAuthenticatedException (401), which is what makes the browser refresh
|
|
148
|
+
* the session and resend; it used to get the 422 below. A project API key
|
|
149
|
+
* is authenticated but is nobody's preferences, so it keeps the 422: a 401
|
|
150
|
+
* would send its client off to refresh a session it never had.
|
|
151
|
+
*/
|
|
152
|
+
test.each([
|
|
153
|
+
{
|
|
154
|
+
caller: "an anonymous caller",
|
|
155
|
+
userType: undefined,
|
|
156
|
+
exception: NotAuthenticatedException,
|
|
157
|
+
code: ExceptionCode.NotAuthenticatedException,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
caller: "an explicitly Public caller",
|
|
161
|
+
userType: UserType.Public,
|
|
162
|
+
exception: NotAuthenticatedException,
|
|
163
|
+
code: ExceptionCode.NotAuthenticatedException,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
caller: "a project API key",
|
|
167
|
+
userType: UserType.API,
|
|
168
|
+
exception: NotAuthorizedException,
|
|
169
|
+
code: ExceptionCode.NotAuthorizedException,
|
|
170
|
+
},
|
|
171
|
+
])(
|
|
172
|
+
"rejects $caller without an authenticated user",
|
|
173
|
+
async (testCase: {
|
|
174
|
+
caller: string;
|
|
175
|
+
userType: UserType | undefined;
|
|
176
|
+
exception:
|
|
177
|
+
| typeof NotAuthenticatedException
|
|
178
|
+
| typeof NotAuthorizedException;
|
|
179
|
+
code: ExceptionCode;
|
|
180
|
+
}) => {
|
|
134
181
|
props.userId = undefined;
|
|
182
|
+
props.userType = testCase.userType;
|
|
135
183
|
const next: jest.Mock = await call({ userId: USER_ID.toString() });
|
|
136
|
-
expect(next).toHaveBeenCalledWith(expect.any(
|
|
184
|
+
expect(next).toHaveBeenCalledWith(expect.any(testCase.exception));
|
|
185
|
+
expect(errorPassedTo(next).code).toBe(testCase.code);
|
|
137
186
|
expect(reduceSpy).not.toHaveBeenCalled();
|
|
138
187
|
expect(responseSpy).not.toHaveBeenCalled();
|
|
139
188
|
},
|
|
140
189
|
);
|
|
141
190
|
|
|
191
|
+
test("an anonymous caller with no tenant is asked to log in before the missing project is reported", async () => {
|
|
192
|
+
props.userId = undefined;
|
|
193
|
+
props.tenantId = undefined;
|
|
194
|
+
const next: jest.Mock = await call();
|
|
195
|
+
expect(next).toHaveBeenCalledWith(expect.any(NotAuthenticatedException));
|
|
196
|
+
expect(errorPassedTo(next).code).toBe(401);
|
|
197
|
+
expect(reduceSpy).not.toHaveBeenCalled();
|
|
198
|
+
});
|
|
199
|
+
|
|
142
200
|
test("rejects missing project context before changing preferences", async () => {
|
|
143
201
|
props.tenantId = undefined;
|
|
144
202
|
const next: jest.Mock = await call({ projectId: PROJECT_ID.toString() });
|
|
145
203
|
expect(next).toHaveBeenCalledWith(expect.any(BadDataException));
|
|
204
|
+
expect(errorPassedTo(next).code).toBe(ExceptionCode.BadDataException);
|
|
146
205
|
expect(reduceSpy).not.toHaveBeenCalled();
|
|
147
206
|
});
|
|
148
207
|
|
|
@@ -150,6 +209,7 @@ describe("POST reduce routine emails", () => {
|
|
|
150
209
|
props.userTenantAccessPermission = undefined;
|
|
151
210
|
const next: jest.Mock = await call();
|
|
152
211
|
expect(next).toHaveBeenCalledWith(expect.any(NotAuthorizedException));
|
|
212
|
+
expect(errorPassedTo(next).code).toBe(ExceptionCode.NotAuthorizedException);
|
|
153
213
|
expect(reduceSpy).not.toHaveBeenCalled();
|
|
154
214
|
});
|
|
155
215
|
|
|
@@ -157,6 +217,7 @@ describe("POST reduce routine emails", () => {
|
|
|
157
217
|
props.tenantId = OTHER_PROJECT_ID;
|
|
158
218
|
const next: jest.Mock = await call();
|
|
159
219
|
expect(next).toHaveBeenCalledWith(expect.any(NotAuthorizedException));
|
|
220
|
+
expect(errorPassedTo(next).code).toBe(ExceptionCode.NotAuthorizedException);
|
|
160
221
|
expect(reduceSpy).not.toHaveBeenCalled();
|
|
161
222
|
});
|
|
162
223
|
|
|
@@ -18,6 +18,10 @@ import TeamMember from "../../../Models/DatabaseModels/TeamMember";
|
|
|
18
18
|
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
19
19
|
import { DEFAULT_LIMIT } from "../../../Types/Database/LimitMax";
|
|
20
20
|
import Dictionary from "../../../Types/Dictionary";
|
|
21
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
22
|
+
import Exception from "../../../Types/Exception/Exception";
|
|
23
|
+
import ExceptionCode from "../../../Types/Exception/ExceptionCode";
|
|
24
|
+
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
21
25
|
import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
|
|
22
26
|
import { JSONObject } from "../../../Types/JSON";
|
|
23
27
|
import JSONWebTokenData from "../../../Types/JsonWebTokenData";
|
|
@@ -916,7 +920,7 @@ describe("POST /user/:userId/projects — the master API key path", () => {
|
|
|
916
920
|
type MiddlewareCallResult = {
|
|
917
921
|
// Whether the gate let the request through to the read.
|
|
918
922
|
reachedHandler: boolean;
|
|
919
|
-
errorSentToClient:
|
|
923
|
+
errorSentToClient: Exception | undefined;
|
|
920
924
|
// The request object as the handler saw it, to inspect what the gate set.
|
|
921
925
|
request: ExpressRequest;
|
|
922
926
|
};
|
|
@@ -974,7 +978,7 @@ describe("POST /user/:userId/projects — the master API key path", () => {
|
|
|
974
978
|
|
|
975
979
|
return {
|
|
976
980
|
reachedHandler: reachedHandler,
|
|
977
|
-
errorSentToClient: errorCall?.[2] as
|
|
981
|
+
errorSentToClient: errorCall?.[2] as Exception | undefined,
|
|
978
982
|
request: req,
|
|
979
983
|
};
|
|
980
984
|
}
|
|
@@ -1145,7 +1149,19 @@ describe("POST /user/:userId/projects — the master API key path", () => {
|
|
|
1145
1149
|
expect(findBySpy).not.toHaveBeenCalled();
|
|
1146
1150
|
expect(Response.sendJsonArrayResponse).not.toHaveBeenCalled();
|
|
1147
1151
|
|
|
1148
|
-
|
|
1152
|
+
/*
|
|
1153
|
+
* An unusable key falls through to the session check, and with no
|
|
1154
|
+
* session that is the no-token refusal - a 401 now, where it used to
|
|
1155
|
+
* be a NotAuthorizedException (422). Still a refusal, and still AT the
|
|
1156
|
+
* gate; only the status changed, so that an Admin Dashboard tab whose
|
|
1157
|
+
* session cookie has expired refreshes instead of showing an error.
|
|
1158
|
+
*/
|
|
1159
|
+
expect(result.errorSentToClient).toBeInstanceOf(
|
|
1160
|
+
NotAuthenticatedException,
|
|
1161
|
+
);
|
|
1162
|
+
expect(result.errorSentToClient?.code).toBe(
|
|
1163
|
+
ExceptionCode.NotAuthenticatedException,
|
|
1164
|
+
);
|
|
1149
1165
|
expect(result.errorSentToClient?.message).toBe(
|
|
1150
1166
|
"Unauthorized: Access token is required.",
|
|
1151
1167
|
);
|
|
@@ -1159,6 +1175,41 @@ describe("POST /user/:userId/projects — the master API key path", () => {
|
|
|
1159
1175
|
|
|
1160
1176
|
expect(result.reachedHandler).toBe(false);
|
|
1161
1177
|
expect(findBySpy).not.toHaveBeenCalled();
|
|
1178
|
+
|
|
1179
|
+
/*
|
|
1180
|
+
* This is what the Admin Dashboard's User > Projects page sends once
|
|
1181
|
+
* its session cookie has expired. Only a 401 makes the browser client
|
|
1182
|
+
* refresh the session and replay the read.
|
|
1183
|
+
*/
|
|
1184
|
+
expect(result.errorSentToClient).toBeInstanceOf(
|
|
1185
|
+
NotAuthenticatedException,
|
|
1186
|
+
);
|
|
1187
|
+
expect(result.errorSentToClient?.code).toBe(
|
|
1188
|
+
ExceptionCode.NotAuthenticatedException,
|
|
1189
|
+
);
|
|
1190
|
+
});
|
|
1191
|
+
|
|
1192
|
+
test("refuses an expired session with no key with a 401, without reading anything", async () => {
|
|
1193
|
+
jest
|
|
1194
|
+
.spyOn(UserMiddleware, "getAccessTokenFromExpressRequest")
|
|
1195
|
+
.mockReturnValue("an.expired.token" as never);
|
|
1196
|
+
|
|
1197
|
+
jest.spyOn(JSONWebToken, "decode").mockImplementation(() => {
|
|
1198
|
+
throw new BadDataException("AccessToken is invalid or expired");
|
|
1199
|
+
});
|
|
1200
|
+
|
|
1201
|
+
const result: MiddlewareCallResult = await callThroughMiddleware({
|
|
1202
|
+
headers: {},
|
|
1203
|
+
});
|
|
1204
|
+
|
|
1205
|
+
expect(result.reachedHandler).toBe(false);
|
|
1206
|
+
expect(findBySpy).not.toHaveBeenCalled();
|
|
1207
|
+
expect(result.errorSentToClient).toBeInstanceOf(
|
|
1208
|
+
NotAuthenticatedException,
|
|
1209
|
+
);
|
|
1210
|
+
expect(result.errorSentToClient?.message).toBe(
|
|
1211
|
+
"Unauthorized: Invalid or expired access token.",
|
|
1212
|
+
);
|
|
1162
1213
|
});
|
|
1163
1214
|
|
|
1164
1215
|
/*
|
|
@@ -1231,6 +1282,15 @@ describe("POST /user/:userId/projects — the master API key path", () => {
|
|
|
1231
1282
|
expect(result.errorSentToClient?.message).toBe(
|
|
1232
1283
|
"Unauthorized: Only master admins can perform this action.",
|
|
1233
1284
|
);
|
|
1285
|
+
|
|
1286
|
+
/*
|
|
1287
|
+
* Still a 422, unlike the missing-token case: this caller is signed in,
|
|
1288
|
+
* and refreshing their session would not make them a master admin.
|
|
1289
|
+
*/
|
|
1290
|
+
expect(result.errorSentToClient).toBeInstanceOf(NotAuthorizedException);
|
|
1291
|
+
expect(result.errorSentToClient?.code).toBe(
|
|
1292
|
+
ExceptionCode.NotAuthorizedException,
|
|
1293
|
+
);
|
|
1234
1294
|
});
|
|
1235
1295
|
|
|
1236
1296
|
/*
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import UserTotpAuthAPI from "../../../Server/API/UserTotpAuthAPI";
|
|
2
|
+
import UserMiddleware from "../../../Server/Middleware/UserAuthorization";
|
|
2
3
|
import UserTotpAuthService from "../../../Server/Services/UserTotpAuthService";
|
|
3
4
|
import UserService from "../../../Server/Services/UserService";
|
|
4
5
|
import UserTwoFactorBackupCodeService from "../../../Server/Services/UserTwoFactorBackupCodeService";
|
|
@@ -17,6 +18,8 @@ import Dictionary from "../../../Types/Dictionary";
|
|
|
17
18
|
import Email from "../../../Types/Email";
|
|
18
19
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
19
20
|
import Exception from "../../../Types/Exception/Exception";
|
|
21
|
+
import ExceptionCode from "../../../Types/Exception/ExceptionCode";
|
|
22
|
+
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
20
23
|
import { JSONObject } from "../../../Types/JSON";
|
|
21
24
|
import ObjectID from "../../../Types/ObjectID";
|
|
22
25
|
import UserTotpAuth from "../../../Models/DatabaseModels/UserTotpAuth";
|
|
@@ -358,11 +361,54 @@ describe("POST /user-totp-auth/validate", () => {
|
|
|
358
361
|
* `userAuthorization` off an unauthenticated request, the ownership
|
|
359
362
|
* comparison below would compare against `undefined`, and anybody could
|
|
360
363
|
* verify anybody's TOTP row.
|
|
364
|
+
*
|
|
365
|
+
* Two middlewares now, asserted by identity (a count of two would not
|
|
366
|
+
* notice one being swapped for another). getUserMiddleware resolves the
|
|
367
|
+
* session, but lets a request with NO session through as Public;
|
|
368
|
+
* requireUserAuthentication is what turns that request into a 401. It was
|
|
369
|
+
* added because an enrolment page left open past the session lifetime
|
|
370
|
+
* sends exactly that request - the access-token cookie expires with the
|
|
371
|
+
* token - and the handler answered it with a "Two factor auth not found"
|
|
372
|
+
* 400 (after reading the row as root), which the browser client does not
|
|
373
|
+
* treat as a cue to refresh the session and retry.
|
|
361
374
|
*/
|
|
362
375
|
test("is behind an authentication middleware", () => {
|
|
363
|
-
expect(mockRouter.match("post", VALIDATE_ROUTE).middlewares
|
|
364
|
-
|
|
376
|
+
expect(mockRouter.match("post", VALIDATE_ROUTE).middlewares).toEqual([
|
|
377
|
+
UserMiddleware.getUserMiddleware,
|
|
378
|
+
UserMiddleware.requireUserAuthentication,
|
|
379
|
+
]);
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
test("answers a request with no session 401 before any row is read", async () => {
|
|
383
|
+
const req: OneUptimeRequest = {
|
|
384
|
+
body: { id: TOTP_ID.toString(), code: "123456" },
|
|
385
|
+
params: {},
|
|
386
|
+
query: {},
|
|
387
|
+
headers: {},
|
|
388
|
+
} as unknown as OneUptimeRequest;
|
|
389
|
+
|
|
390
|
+
const res: OneUptimeResponse = {
|
|
391
|
+
status: jest.fn().mockReturnThis(),
|
|
392
|
+
} as unknown as OneUptimeResponse;
|
|
393
|
+
|
|
394
|
+
const next: jest.Mock = jest.fn();
|
|
395
|
+
|
|
396
|
+
await mockRouter.match("post", VALIDATE_ROUTE).middlewares[1]!(
|
|
397
|
+
req,
|
|
398
|
+
res,
|
|
399
|
+
next as unknown as NextFunction,
|
|
365
400
|
);
|
|
401
|
+
|
|
402
|
+
expect(next).not.toHaveBeenCalled();
|
|
403
|
+
|
|
404
|
+
const error: Exception = asMock(Response.sendErrorResponse).mock
|
|
405
|
+
.calls[0]![2] as Exception;
|
|
406
|
+
|
|
407
|
+
expect(error).toBeInstanceOf(NotAuthenticatedException);
|
|
408
|
+
expect(error.code).toBe(ExceptionCode.NotAuthenticatedException);
|
|
409
|
+
expect(findTotpById).not.toHaveBeenCalled();
|
|
410
|
+
expect(updateTotpById).not.toHaveBeenCalled();
|
|
411
|
+
expect(generateForUserIfNoneSpy).not.toHaveBeenCalled();
|
|
366
412
|
});
|
|
367
413
|
});
|
|
368
414
|
|
|
@@ -281,20 +281,29 @@ describe("POST /user-webauthn/generate-authentication-options", () => {
|
|
|
281
281
|
["registration options", REGISTRATION_OPTIONS_ROUTE],
|
|
282
282
|
["verify registration", VERIFY_REGISTRATION_ROUTE],
|
|
283
283
|
])(
|
|
284
|
-
"%s stays behind the user middleware alone",
|
|
284
|
+
"%s stays behind the user middleware and its authentication guard alone",
|
|
285
285
|
(_name: string, uri: string) => {
|
|
286
286
|
/*
|
|
287
287
|
* Both are authenticated, and neither carries an email in its body --
|
|
288
288
|
* so the limiter's account key would collapse to the same value for
|
|
289
289
|
* every caller and one user's enrolment attempts would throttle
|
|
290
290
|
* everybody's.
|
|
291
|
+
*
|
|
292
|
+
* The second entry is requireUserAuthentication, not a limiter. It
|
|
293
|
+
* turns a request with no session (the access-token cookie expired
|
|
294
|
+
* while the enrolment dialog was open) into a 401 the browser client
|
|
295
|
+
* refreshes on. It is the only thing allowed after getUserMiddleware.
|
|
291
296
|
*/
|
|
292
297
|
const route: { middlewares: Array<unknown> } = mockRouter.match(
|
|
293
298
|
"post",
|
|
294
299
|
uri,
|
|
295
300
|
);
|
|
296
301
|
|
|
297
|
-
expect(route.middlewares).toEqual([
|
|
302
|
+
expect(route.middlewares).toEqual([
|
|
303
|
+
UserMiddleware.getUserMiddleware,
|
|
304
|
+
UserMiddleware.requireUserAuthentication,
|
|
305
|
+
]);
|
|
306
|
+
expect(route.middlewares).not.toContain(mountedMiddleware);
|
|
298
307
|
},
|
|
299
308
|
);
|
|
300
309
|
});
|
|
@@ -13,6 +13,9 @@ import { mockRouter } from "./Helpers";
|
|
|
13
13
|
import { getJestSpyOn } from "../../Spy";
|
|
14
14
|
import Dictionary from "../../../Types/Dictionary";
|
|
15
15
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
16
|
+
import Exception from "../../../Types/Exception/Exception";
|
|
17
|
+
import ExceptionCode from "../../../Types/Exception/ExceptionCode";
|
|
18
|
+
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
16
19
|
import { JSONObject } from "../../../Types/JSON";
|
|
17
20
|
import ObjectID from "../../../Types/ObjectID";
|
|
18
21
|
import {
|
|
@@ -336,20 +339,60 @@ afterEach(() => {
|
|
|
336
339
|
|
|
337
340
|
describe("POST /user-webauthn/verify-registration", () => {
|
|
338
341
|
describe("the route itself", () => {
|
|
339
|
-
test("is registered as a POST behind the user middleware", () => {
|
|
342
|
+
test("is registered as a POST behind the user middleware and the authentication guard", () => {
|
|
340
343
|
/*
|
|
341
344
|
* The handler takes the owning user from `userAuthorization`, which is
|
|
342
345
|
* put on the request by this middleware and by nothing else. Without it
|
|
343
346
|
* the id would be undefined for every caller, and asserted by IDENTITY
|
|
344
347
|
* rather than by counting because swapping in a different middleware
|
|
345
|
-
* keeps the count
|
|
348
|
+
* keeps the count the same.
|
|
349
|
+
*
|
|
350
|
+
* getUserMiddleware lets a request with NO session through as Public,
|
|
351
|
+
* so requireUserAuthentication follows it and answers that request with
|
|
352
|
+
* a 401. A key-enrolment dialog left open until the access-token cookie
|
|
353
|
+
* expired sends exactly that request, and only a 401 makes the browser
|
|
354
|
+
* client refresh the session and replay the registration.
|
|
346
355
|
*/
|
|
347
356
|
const route: { middlewares: Array<unknown> } = mockRouter.match(
|
|
348
357
|
"post",
|
|
349
358
|
VERIFY_REGISTRATION_ROUTE,
|
|
350
359
|
);
|
|
351
360
|
|
|
352
|
-
expect(route.middlewares).toEqual([
|
|
361
|
+
expect(route.middlewares).toEqual([
|
|
362
|
+
UserMiddleware.getUserMiddleware,
|
|
363
|
+
UserMiddleware.requireUserAuthentication,
|
|
364
|
+
]);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test("answers a request with no session 401 before registering or minting anything", async () => {
|
|
368
|
+
const req: OneUptimeRequest = {
|
|
369
|
+
params: {},
|
|
370
|
+
query: {},
|
|
371
|
+
body: { credential: CREDENTIAL_FROM_THE_BROWSER, name: KEY_NAME },
|
|
372
|
+
headers: {},
|
|
373
|
+
} as unknown as OneUptimeRequest;
|
|
374
|
+
|
|
375
|
+
const res: OneUptimeResponse = {
|
|
376
|
+
status: jest.fn().mockReturnThis(),
|
|
377
|
+
} as unknown as OneUptimeResponse;
|
|
378
|
+
|
|
379
|
+
const next: jest.Mock = jest.fn();
|
|
380
|
+
|
|
381
|
+
await mockRouter.match("post", VERIFY_REGISTRATION_ROUTE).middlewares[1]!(
|
|
382
|
+
req,
|
|
383
|
+
res,
|
|
384
|
+
next as unknown as NextFunction,
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
expect(next).not.toHaveBeenCalled();
|
|
388
|
+
|
|
389
|
+
const error: Exception = asMock(Response.sendErrorResponse).mock
|
|
390
|
+
.calls[0]![2] as Exception;
|
|
391
|
+
|
|
392
|
+
expect(error).toBeInstanceOf(NotAuthenticatedException);
|
|
393
|
+
expect(error.code).toBe(ExceptionCode.NotAuthenticatedException);
|
|
394
|
+
expect(verifyRegistrationSpy).not.toHaveBeenCalled();
|
|
395
|
+
expect(mintSpy).not.toHaveBeenCalled();
|
|
353
396
|
});
|
|
354
397
|
|
|
355
398
|
test("carries no route parameter that could name a user", () => {
|