@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.
Files changed (759) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
  6. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
  7. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
  8. package/Scripts/generate-service-worker.js +65 -4
  9. package/Server/API/AIBillingAPI.ts +1 -0
  10. package/Server/API/AIInsightAPI.ts +1 -4
  11. package/Server/API/AIInvestigationAPI.ts +1 -4
  12. package/Server/API/AIReadinessAPI.ts +4 -5
  13. package/Server/API/AlertAPI.ts +1 -0
  14. package/Server/API/AutoRemediationAPI.ts +1 -4
  15. package/Server/API/BaseAPI.ts +34 -0
  16. package/Server/API/BaseAnalyticsAPI.ts +80 -9
  17. package/Server/API/BillingAPI.ts +2 -0
  18. package/Server/API/BillingInvoiceAPI.ts +1 -0
  19. package/Server/API/BillingPaymentMethodAPI.ts +2 -0
  20. package/Server/API/CodeFixRunAPI.ts +1 -3
  21. package/Server/API/CommonAPI.ts +68 -4
  22. package/Server/API/DashboardAPI.ts +12 -12
  23. package/Server/API/GlobalConfigAPI.ts +243 -460
  24. package/Server/API/IncidentAPI.ts +2 -0
  25. package/Server/API/IncidentEpisodeAPI.ts +1 -0
  26. package/Server/API/NotificationAPI.ts +1 -0
  27. package/Server/API/OnCallCalendarAPI.ts +4 -5
  28. package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
  29. package/Server/API/OnCallReadinessAPI.ts +4 -1
  30. package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
  31. package/Server/API/ProjectAPI.ts +1 -0
  32. package/Server/API/ProjectOIDC.ts +25 -16
  33. package/Server/API/ProjectSSO.ts +24 -16
  34. package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
  35. package/Server/API/StatusPageAPI.ts +261 -74
  36. package/Server/API/TeamMemberAPI.ts +13 -1
  37. package/Server/API/UserCallAPI.ts +2 -0
  38. package/Server/API/UserEmailAPI.ts +2 -0
  39. package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
  40. package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
  41. package/Server/API/UserSlackAPI.ts +1 -0
  42. package/Server/API/UserSmsAPI.ts +2 -0
  43. package/Server/API/UserTotpAuthAPI.ts +1 -0
  44. package/Server/API/UserWebAuthnAPI.ts +2 -0
  45. package/Server/API/UserWebhookAPI.ts +1 -0
  46. package/Server/API/UserWhatsAppAPI.ts +2 -0
  47. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  48. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  49. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  50. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  51. package/Server/EnvironmentConfig.ts +147 -2
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  54. package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
  55. package/Server/Middleware/UserAuthorization.ts +117 -21
  56. package/Server/Services/ApiKeyPermissionService.ts +101 -4
  57. package/Server/Services/AuditLogService.ts +84 -1079
  58. package/Server/Services/DatabaseService.ts +245 -0
  59. package/Server/Services/DetectionRuleService.ts +5 -4
  60. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  61. package/Server/Services/GlobalConfigService.ts +80 -1
  62. package/Server/Services/MonitorProbeService.ts +116 -20
  63. package/Server/Services/MonitorService.ts +56 -4
  64. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  65. package/Server/Services/MonitorTemplateService.ts +26 -0
  66. package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
  67. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
  68. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
  69. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
  70. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
  71. package/Server/Services/PayAsYouGoBillingService.ts +23 -28
  72. package/Server/Services/ProjectService.ts +302 -0
  73. package/Server/Services/RumSessionPinService.ts +293 -22
  74. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  75. package/Server/Services/StatusPageService.ts +78 -1
  76. package/Server/Services/TeamMemberService.ts +11 -0
  77. package/Server/Services/TeamPermissionService.ts +120 -26
  78. package/Server/Services/TeamService.ts +10 -0
  79. package/Server/Services/ThreatIntelFeedService.ts +6 -3
  80. package/Server/Services/UserService.ts +10 -17
  81. package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
  82. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  83. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  84. package/Server/Types/Database/Permissions/Index.ts +75 -11
  85. package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
  86. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  87. package/Server/Types/Markdown.ts +41 -0
  88. package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
  89. package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
  90. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  91. package/Server/Utils/EditionEnforcement.ts +233 -0
  92. package/Server/Utils/FrontendEnvironment.ts +41 -2
  93. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  94. package/Server/Utils/MasterAdminPageAccess.ts +61 -0
  95. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  96. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  97. package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
  98. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  99. package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
  100. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  101. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
  102. package/Server/Utils/Realtime.ts +163 -45
  103. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
  104. package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
  105. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
  106. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
  107. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
  108. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  109. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  110. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  111. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  112. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  113. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  114. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  115. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  116. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
  117. package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
  118. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
  119. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
  120. package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
  121. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  122. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
  123. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
  124. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
  125. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
  126. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  127. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  128. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
  129. package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
  130. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
  131. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  132. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
  133. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  134. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
  135. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
  136. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
  137. package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
  138. package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
  139. package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
  140. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +133 -70
  141. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  142. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  143. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
  144. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
  145. package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
  146. package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
  147. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  148. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
  149. package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
  150. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  151. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
  152. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
  153. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
  154. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  155. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
  156. package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
  157. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  158. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  159. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  160. package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
  161. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  162. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
  163. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
  164. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
  165. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
  166. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  167. package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
  168. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
  169. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
  170. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
  171. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
  172. package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
  173. package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
  174. package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
  175. package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
  176. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
  177. package/Tests/Server/API/GlobalConfigLicense.test.ts +766 -381
  178. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
  179. package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
  180. package/Tests/Server/API/OnCallReadinessAPI.test.ts +196 -912
  181. package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
  182. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
  183. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
  184. package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
  185. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
  186. package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
  187. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  188. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
  189. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
  190. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
  191. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  192. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
  193. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
  194. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
  195. package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
  196. package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
  197. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
  198. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
  199. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
  200. package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
  201. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  202. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  203. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  204. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  205. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  206. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  207. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  208. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  209. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  210. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  211. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  212. package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
  213. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
  214. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
  215. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  216. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  217. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
  218. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
  219. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
  220. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  221. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  222. package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
  223. package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
  224. package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
  225. package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
  226. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  227. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  228. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  229. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
  230. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  231. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  232. package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
  233. package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
  234. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
  235. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
  236. package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
  237. package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
  238. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  239. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  240. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
  241. package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
  242. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  243. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  244. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  245. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  246. package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
  247. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
  248. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
  249. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  250. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
  251. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  252. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  253. package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
  254. package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
  255. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
  256. package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
  257. package/Tests/Server/Types/Markdown.test.ts +181 -0
  258. package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
  259. package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
  260. package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
  261. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
  262. package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
  263. package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
  264. package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
  265. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  266. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  267. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  268. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  269. package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
  270. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  271. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  272. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
  273. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  274. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  275. package/Tests/Server/Utils/Realtime.test.ts +502 -0
  276. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
  277. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
  278. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
  279. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
  280. package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
  281. package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
  282. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
  283. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
  284. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
  285. package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
  286. package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
  287. package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
  288. package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
  289. package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
  290. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  291. package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
  292. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  293. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  294. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
  295. package/Tests/Types/Call/CallProvider.test.ts +528 -0
  296. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  297. package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
  298. package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
  299. package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
  300. package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
  301. package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
  302. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
  303. package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
  304. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  305. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  306. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
  307. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  308. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  309. package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
  310. package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
  311. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
  312. package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
  313. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  314. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  315. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  316. package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
  317. package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
  318. package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
  319. package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
  320. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  321. package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
  322. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  323. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
  324. package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
  325. package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
  326. package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
  327. package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
  328. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  329. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  330. package/Tests/UI/Utils/Cookie.test.ts +440 -0
  331. package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
  332. package/Tests/UI/Utils/Navigation.test.ts +33 -0
  333. package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
  334. package/Tests/UI/Utils/Realtime.test.ts +759 -0
  335. package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
  336. package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
  337. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  338. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  339. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  340. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
  341. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  342. package/Types/API/Hostname.ts +63 -16
  343. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
  344. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  345. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  346. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  347. package/Types/Database/CanonicalModelInstance.ts +102 -0
  348. package/Types/Database/TableColumn.ts +20 -6
  349. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  350. package/Types/IP/IPv6.ts +6 -1
  351. package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
  352. package/Types/Monitor/MonitorStep.ts +6 -1
  353. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  354. package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
  355. package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
  356. package/Types/Realtime/EventName.ts +11 -0
  357. package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
  358. package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
  359. package/Types/SecurityEvent/SigmaRule.ts +51 -0
  360. package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
  361. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  362. package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
  363. package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
  364. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  365. package/UI/Components/EditionLabel/EditionLabel.tsx +808 -1195
  366. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  367. package/UI/Components/EventItem/EventItem.tsx +12 -1
  368. package/UI/Components/Forms/BasicForm.tsx +151 -126
  369. package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
  370. package/UI/Components/Forms/Fields/FormField.tsx +10 -4
  371. package/UI/Components/Forms/FormSummary.tsx +7 -0
  372. package/UI/Components/Forms/Types/Field.ts +10 -0
  373. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  374. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  375. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
  376. package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
  377. package/UI/Components/ModelList/ModelList.tsx +11 -1
  378. package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
  379. package/UI/Components/ModelTable/TableView.tsx +1 -1
  380. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  381. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  382. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
  383. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  384. package/UI/Utils/API/API.ts +173 -12
  385. package/UI/Utils/API/RequestOptions.ts +11 -0
  386. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
  387. package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
  388. package/UI/Utils/Navigation.ts +9 -0
  389. package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
  390. package/UI/Utils/Realtime.ts +176 -30
  391. package/UI/esbuild-enterprise.js +263 -0
  392. package/Utils/API.ts +14 -5
  393. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  394. package/Utils/HostAddressUtil.ts +94 -0
  395. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  396. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  397. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
  398. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
  399. package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
  400. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  401. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  402. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  404. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  406. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  408. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
  410. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
  412. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
  414. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
  415. package/build/dist/Server/API/AIBillingAPI.js +1 -1
  416. package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
  417. package/build/dist/Server/API/AIInsightAPI.js +1 -4
  418. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  419. package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
  420. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  421. package/build/dist/Server/API/AIReadinessAPI.js +1 -3
  422. package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
  423. package/build/dist/Server/API/AlertAPI.js +1 -1
  424. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  425. package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
  426. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  427. package/build/dist/Server/API/BaseAPI.js +33 -0
  428. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  429. package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
  430. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  431. package/build/dist/Server/API/BillingAPI.js +2 -2
  432. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  433. package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
  434. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  435. package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
  436. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  437. package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
  438. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
  439. package/build/dist/Server/API/CommonAPI.js +50 -5
  440. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  441. package/build/dist/Server/API/DashboardAPI.js +12 -12
  442. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  443. package/build/dist/Server/API/GlobalConfigAPI.js +158 -342
  444. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  445. package/build/dist/Server/API/IncidentAPI.js +2 -2
  446. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  447. package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
  448. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  449. package/build/dist/Server/API/NotificationAPI.js +1 -1
  450. package/build/dist/Server/API/NotificationAPI.js.map +1 -1
  451. package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
  452. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
  453. package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
  454. package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
  455. package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
  456. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
  457. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
  458. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
  459. package/build/dist/Server/API/ProjectAPI.js +1 -1
  460. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  461. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  462. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  463. package/build/dist/Server/API/ProjectSSO.js +24 -16
  464. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  465. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
  466. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  467. package/build/dist/Server/API/StatusPageAPI.js +218 -76
  468. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  469. package/build/dist/Server/API/TeamMemberAPI.js +11 -4
  470. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  471. package/build/dist/Server/API/UserCallAPI.js +2 -2
  472. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  473. package/build/dist/Server/API/UserEmailAPI.js +2 -2
  474. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  475. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
  476. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  477. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
  478. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
  479. package/build/dist/Server/API/UserSlackAPI.js +1 -1
  480. package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
  481. package/build/dist/Server/API/UserSmsAPI.js +2 -2
  482. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  483. package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
  484. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  485. package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
  486. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  487. package/build/dist/Server/API/UserWebhookAPI.js +1 -1
  488. package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
  489. package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
  490. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  491. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  492. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  493. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  494. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  495. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  496. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  497. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  498. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  499. package/build/dist/Server/EnvironmentConfig.js +84 -2
  500. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  501. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  502. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  504. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  505. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
  506. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  507. package/build/dist/Server/Middleware/UserAuthorization.js +94 -15
  508. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  509. package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
  510. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  511. package/build/dist/Server/Services/AuditLogService.js +71 -740
  512. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  513. package/build/dist/Server/Services/DatabaseService.js +171 -0
  514. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  515. package/build/dist/Server/Services/DetectionRuleService.js +4 -4
  516. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  517. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  518. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  519. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  520. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  521. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  522. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  523. package/build/dist/Server/Services/MonitorService.js +45 -4
  524. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  525. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  526. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  527. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  528. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  529. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
  530. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
  531. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
  532. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  533. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
  534. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  535. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
  536. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  537. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
  538. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  539. package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
  540. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
  541. package/build/dist/Server/Services/ProjectService.js +231 -0
  542. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  543. package/build/dist/Server/Services/RumSessionPinService.js +198 -16
  544. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  545. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  546. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  547. package/build/dist/Server/Services/StatusPageService.js +71 -0
  548. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  549. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  550. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  551. package/build/dist/Server/Services/TeamPermissionService.js +89 -27
  552. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  553. package/build/dist/Server/Services/TeamService.js +9 -0
  554. package/build/dist/Server/Services/TeamService.js.map +1 -1
  555. package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
  556. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
  557. package/build/dist/Server/Services/UserService.js +10 -16
  558. package/build/dist/Server/Services/UserService.js.map +1 -1
  559. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
  560. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  561. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  562. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  563. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  564. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  565. package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
  566. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  567. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +24 -16
  568. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  569. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  570. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  571. package/build/dist/Server/Types/Markdown.js +31 -0
  572. package/build/dist/Server/Types/Markdown.js.map +1 -1
  573. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
  574. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
  575. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
  576. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
  577. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  578. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  579. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  580. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  581. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  582. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  583. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  584. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  585. package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
  586. package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
  587. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  588. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  589. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  590. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  591. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
  592. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  593. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  594. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  595. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
  596. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  597. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  598. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  599. package/build/dist/Server/Utils/Realtime.js +126 -37
  600. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  601. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
  602. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  603. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
  604. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
  605. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
  606. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  607. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
  608. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
  609. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
  610. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
  611. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  612. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  613. package/build/dist/Types/API/Hostname.js +59 -11
  614. package/build/dist/Types/API/Hostname.js.map +1 -1
  615. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
  616. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  617. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  618. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  619. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  620. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  621. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  622. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  623. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  624. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  625. package/build/dist/Types/Database/TableColumn.js +19 -6
  626. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  627. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  628. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  629. package/build/dist/Types/IP/IPv6.js +6 -1
  630. package/build/dist/Types/IP/IPv6.js.map +1 -1
  631. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  632. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  633. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  634. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
  635. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
  636. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
  637. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
  638. package/build/dist/Types/Realtime/EventName.js +10 -0
  639. package/build/dist/Types/Realtime/EventName.js.map +1 -1
  640. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
  641. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  642. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
  643. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
  644. package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
  645. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
  646. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
  647. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
  648. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  649. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  650. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
  651. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
  652. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
  653. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
  654. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
  655. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  656. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +425 -585
  657. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  658. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  659. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  660. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  661. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  662. package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
  663. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  664. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
  665. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
  666. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
  667. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  668. package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
  669. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  670. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  671. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  672. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  673. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  674. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
  675. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  676. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
  677. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
  678. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  679. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  680. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
  681. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  682. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  683. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  684. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  685. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  686. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  687. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  688. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
  689. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  690. package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
  691. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  692. package/build/dist/UI/Utils/API/API.js +143 -19
  693. package/build/dist/UI/Utils/API/API.js.map +1 -1
  694. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
  695. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  696. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
  697. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  698. package/build/dist/UI/Utils/Navigation.js +8 -0
  699. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  700. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
  701. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
  702. package/build/dist/UI/Utils/Realtime.js +120 -15
  703. package/build/dist/UI/Utils/Realtime.js.map +1 -1
  704. package/build/dist/Utils/API.js +13 -5
  705. package/build/dist/Utils/API.js.map +1 -1
  706. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  707. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  708. package/build/dist/Utils/HostAddressUtil.js +80 -0
  709. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  710. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  711. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  712. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  713. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  714. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
  715. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  716. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
  717. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
  718. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
  719. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  720. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  721. package/jest.config.json +3 -1
  722. package/package.json +1 -1
  723. package/test-setup.sh +103 -34
  724. package/tsconfig.json +13 -0
  725. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  726. package/Server/API/TeamComplianceAPI.ts +0 -158
  727. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  728. package/Server/Services/TeamComplianceService.ts +0 -733
  729. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  730. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  731. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  732. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  733. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  734. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  735. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  736. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  737. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  738. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  739. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  740. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  741. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  742. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  743. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  744. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  745. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  746. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  747. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  748. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  749. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  750. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  751. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  752. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  753. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  754. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  755. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  756. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  757. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  758. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  759. 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
- test.each(["anonymous", "project API key"])(
132
- "rejects a %s without an authenticated user",
133
- async () => {
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(NotAuthorizedException));
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: NotAuthorizedException | undefined;
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 NotAuthorizedException | undefined,
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
- expect(result.errorSentToClient).toBeInstanceOf(NotAuthorizedException);
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.length).toBe(
364
- 1,
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([UserMiddleware.getUserMiddleware]);
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 at one.
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([UserMiddleware.getUserMiddleware]);
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", () => {