@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
@@ -12,25 +12,58 @@ import BaseAPI from "./BaseAPI";
12
12
  import GlobalConfig from "../../Models/DatabaseModels/GlobalConfig";
13
13
  import ObjectID from "../../Types/ObjectID";
14
14
  import { JSONObject } from "../../Types/JSON";
15
- import BadDataException from "../../Types/Exception/BadDataException";
16
- import API from "../../Utils/API";
17
- import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
18
- import HTTPResponse from "../../Types/API/HTTPResponse";
19
- import PartialEntity from "../../Types/Database/PartialEntity";
20
- import {
21
- AppVersion,
22
- DisableUpdateCheck,
23
- EnterpriseLicenseValidationUrl,
24
- Host,
25
- } from "../EnvironmentConfig";
15
+ import Select from "../Types/Database/Select";
16
+ import { AppVersion, DisableUpdateCheck } from "../EnvironmentConfig";
26
17
  import EnterpriseLicenseInstanceSummary from "../../Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary";
27
18
  import VersionUtil from "../../Utils/VersionUtil";
28
19
  import UserMiddleware from "../Middleware/UserAuthorization";
29
- import MasterAdminAuthorization from "../Middleware/MasterAdminAuthorization";
30
- import EnterpriseLicenseSeatUtil from "../Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil";
31
- import { SeatUsage } from "../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";
32
- import UserService from "../Services/UserService";
33
- import PositiveNumber from "../../Types/PositiveNumber";
20
+ import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
21
+ import EnterpriseEdition from "../Enterprise/EnterpriseEdition";
22
+ import {
23
+ EnterpriseLicenseSnapshot,
24
+ EnterpriseLicenseSnapshotUtil,
25
+ SeatUsage,
26
+ } from "../Enterprise/EnterpriseLicenseSnapshot";
27
+
28
+ /*
29
+ * Who is asking for the license state, which decides how much of it they get.
30
+ *
31
+ * master-admin everything, including the license key, the token, the
32
+ * instance topology, this installation's version and seat
33
+ * usage - the things a master admin needs to manage the
34
+ * license and nobody else has any business reading.
35
+ * public anybody else, signed in or not (this route also serves the
36
+ * signed-out login page): only what the edition pill shows.
37
+ */
38
+ export type LicenseResponseAudience = "master-admin" | "public";
39
+
40
+ export interface BuildLicenseResponseData {
41
+ audience: LicenseResponseAudience;
42
+ // Whether the enterprise module is loaded in this process.
43
+ isEnterpriseEditionLoaded: boolean;
44
+ // The license snapshot, or null on the Community Edition.
45
+ snapshot: EnterpriseLicenseSnapshot | null;
46
+ /*
47
+ * The GlobalConfig row, selected with LICENSE_RESPONSE_CONFIG_SELECT. Only
48
+ * read for the master-admin audience.
49
+ */
50
+ config: GlobalConfig | null;
51
+ // Seat usage as the license client enforces it. Only for master admins.
52
+ seatUsage: SeatUsage | null;
53
+ }
54
+
55
+ // Everything buildLicenseResponse reads off the GlobalConfig row.
56
+ export const LICENSE_RESPONSE_CONFIG_SELECT: Select<GlobalConfig> = {
57
+ enterpriseLicenseKey: true,
58
+ enterpriseLicenseToken: true,
59
+ enterpriseLicenseCurrentUserCount: true,
60
+ enterpriseLicenseUserCountUpdatedAt: true,
61
+ enterpriseLicenseInstances: true,
62
+ instanceId: true,
63
+ latestReleaseVersion: true,
64
+ latestReleasePublishedAt: true,
65
+ latestReleaseCheckedAt: true,
66
+ };
34
67
 
35
68
  export default class GlobalConfigAPI extends BaseAPI<
36
69
  GlobalConfig,
@@ -65,489 +98,225 @@ export default class GlobalConfigAPI extends BaseAPI<
65
98
  },
66
99
  );
67
100
 
101
+ /*
102
+ * The license state of this installation, for the edition pill and the
103
+ * license dialog.
104
+ *
105
+ * This route stays in core so the Community Edition can still serve the
106
+ * version and update-check half of the dialog. The license half comes
107
+ * from the Enterprise license client through EnterpriseEdition; activating
108
+ * and refreshing a license (the POSTs on this path) are served by the
109
+ * Enterprise module itself (ee/Server/License).
110
+ *
111
+ * This route also serves the login page (before sign-in), so it cannot
112
+ * require authentication outright. Anybody but a master admin gets only
113
+ * what the edition pill shows - see buildLicenseResponse.
114
+ */
68
115
  this.router.get(
69
116
  `${new this.entityType().getCrudApiPath()?.toString()}/license`,
70
117
  UserMiddleware.getUserMiddleware,
71
118
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
72
119
  try {
73
- const config: GlobalConfig | null =
74
- await GlobalConfigService.findOneById({
75
- id: ObjectID.getZeroObjectID(),
76
- select: {
77
- enterpriseCompanyName: true,
78
- enterpriseLicenseExpiresAt: true,
79
- enterpriseLicenseKey: true,
80
- enterpriseLicenseToken: true,
81
- enterpriseLicenseIsEvaluation: true,
82
- enterpriseLicenseUserLimit: true,
83
- enterpriseLicenseCurrentUserCount: true,
84
- enterpriseLicenseUserCountUpdatedAt: true,
85
- enterpriseLicenseInstances: true,
86
- instanceId: true,
87
- latestReleaseVersion: true,
88
- latestReleasePublishedAt: true,
89
- latestReleaseCheckedAt: true,
90
- },
91
- props: {
92
- isRoot: true,
93
- },
94
- });
95
-
96
120
  /*
97
- * This route also serves the login page (before sign-in), so it
98
- * cannot require authentication outright. Anonymous callers only
99
- * get enough to render the edition pill — the license key, token
100
- * and instance topology require a signed-in user.
121
+ * This route also serves the login page, so a caller with no session
122
+ * normally gets the reduced anonymous payload below. Unless it says
123
+ * it is signed in (the dashboards do): then no session means an
124
+ * expired one, and the anonymous payload would read as "unlicensed".
125
+ * Answer 401 so the client refreshes and asks again.
101
126
  */
102
- const isAuthenticatedUser: boolean = Boolean(
103
- (req as OneUptimeRequest).userAuthorization?.userId,
104
- );
127
+ if (
128
+ req.query["signedIn"] === "true" &&
129
+ UserMiddleware.isAnonymousRequest(req as OneUptimeRequest)
130
+ ) {
131
+ throw new NotAuthenticatedException(
132
+ UserMiddleware.AUTHENTICATION_REQUIRED_MESSAGE,
133
+ );
134
+ }
105
135
 
106
- const licenseValid: boolean = Boolean(
107
- config?.enterpriseLicenseToken &&
108
- config?.enterpriseLicenseExpiresAt &&
109
- config.enterpriseLicenseExpiresAt.getTime() > Date.now(),
110
- );
136
+ const audience: LicenseResponseAudience =
137
+ GlobalConfigAPI.getLicenseResponseAudience(req);
138
+ const isEnterpriseEditionLoaded: boolean =
139
+ EnterpriseEdition.isLoaded();
140
+
141
+ const snapshot: EnterpriseLicenseSnapshot | null =
142
+ isEnterpriseEditionLoaded
143
+ ? await EnterpriseEdition.getLicenseSnapshot()
144
+ : null;
111
145
 
112
146
  /*
113
- * What the seat limit actually means on this installation right now,
114
- * as opposed to what oneuptime.com last reported. Only for signed-in
115
- * callers: it is derived from the live User table, and an anonymous
116
- * visitor on the login page has no business being told how close this
117
- * server is to refusing new accounts.
147
+ * Only a master admin's response carries anything read from the row
148
+ * or derived from the live User table, so nobody else costs a read.
118
149
  */
119
- const seatUsage: SeatUsage | null = isAuthenticatedUser
120
- ? await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig(
121
- {
122
- config: config,
123
- getLocalUserCount: GlobalConfigAPI.getLocalUserCount,
124
- },
125
- )
126
- : null;
127
-
128
- const responseBody: JSONObject = {
129
- companyName: config?.enterpriseCompanyName || null,
130
- expiresAt: config?.enterpriseLicenseExpiresAt
131
- ? config.enterpriseLicenseExpiresAt.toISOString()
132
- : null,
133
- licenseKey: isAuthenticatedUser
134
- ? config?.enterpriseLicenseKey || null
135
- : null,
136
- token: isAuthenticatedUser
137
- ? config?.enterpriseLicenseToken || null
138
- : null,
139
- licenseValid: licenseValid,
140
- /*
141
- * Whether this is an evaluation/testing license. Benign like the
142
- * company name and expiry, so it is not gated behind sign-in — the
143
- * edition modal shows the evaluation notice to anyone who opens it.
144
- */
145
- isEvaluationLicense: Boolean(config?.enterpriseLicenseIsEvaluation),
146
- userLimit:
147
- typeof config?.enterpriseLicenseUserLimit === "number"
148
- ? config.enterpriseLicenseUserLimit
149
- : null,
150
- currentUserCount:
151
- typeof config?.enterpriseLicenseCurrentUserCount === "number"
152
- ? config.enterpriseLicenseCurrentUserCount
153
- : null,
154
- userCountUpdatedAt: config?.enterpriseLicenseUserCountUpdatedAt
155
- ? config.enterpriseLicenseUserCountUpdatedAt.toISOString()
156
- : null,
157
- instances:
158
- isAuthenticatedUser &&
159
- Array.isArray(config?.enterpriseLicenseInstances)
160
- ? config.enterpriseLicenseInstances
161
- : [],
162
- instanceId:
163
- isAuthenticatedUser && config?.instanceId
164
- ? config.instanceId.toString()
165
- : null,
166
- /*
167
- * Which build this installation runs, and whether a newer one has
168
- * been released, are gated the same way as the instance topology:
169
- * telling an anonymous visitor on the login page that this server
170
- * is behind on patches advertises an unpatched target.
171
- */
172
- currentVersion: isAuthenticatedUser ? AppVersion : null,
173
- latestVersion: isAuthenticatedUser
174
- ? config?.latestReleaseVersion || null
175
- : null,
176
- latestVersionPublishedAt:
177
- isAuthenticatedUser && config?.latestReleasePublishedAt
178
- ? config.latestReleasePublishedAt.toISOString()
179
- : null,
180
- latestVersionCheckedAt:
181
- isAuthenticatedUser && config?.latestReleaseCheckedAt
182
- ? config.latestReleaseCheckedAt.toISOString()
183
- : null,
184
- isUpdateAvailable: isAuthenticatedUser
185
- ? VersionUtil.isUpdateAvailable({
186
- currentVersion: AppVersion,
187
- latestVersion: config?.latestReleaseVersion,
150
+ const config: GlobalConfig | null =
151
+ audience === "master-admin"
152
+ ? await GlobalConfigService.findOneById({
153
+ id: ObjectID.getZeroObjectID(),
154
+ select: LICENSE_RESPONSE_CONFIG_SELECT,
155
+ props: {
156
+ isRoot: true,
157
+ },
188
158
  })
189
- : false,
190
- /*
191
- * Lets the modal say "update checks are off" instead of "has not
192
- * checked yet", which would be a promise the installation is never
193
- * going to keep.
194
- */
195
- isUpdateCheckDisabled: isAuthenticatedUser
196
- ? DisableUpdateCheck
197
- : false,
198
- ...GlobalConfigAPI.getSeatUsageResponseFields(seatUsage),
199
- };
200
-
201
- return Response.sendJsonObjectResponse(req, res, responseBody);
202
- } catch (err) {
203
- next(err);
204
- }
205
- },
206
- );
207
-
208
- /*
209
- * Activating (or replacing) the license key for the whole installation.
210
- *
211
- * Master admin only. This writes the terms that bound how many users the
212
- * installation may have, so anyone who can reach it can change the seat
213
- * limit UserService now enforces. It used to run on
214
- * UserMiddleware.getUserMiddleware, which lets anonymous callers through
215
- * (it has to — the GET above serves the signed-out login page), so the
216
- * route was in practice unauthenticated.
217
- */
218
- this.router.post(
219
- `${new this.entityType().getCrudApiPath()?.toString()}/license`,
220
- MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware,
221
- async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
222
- try {
223
- const licenseKey: string =
224
- (req.body["licenseKey"] as string | undefined)?.trim() || "";
225
-
226
- if (!licenseKey) {
227
- throw new BadDataException("License key is required");
228
- }
229
-
230
- const responseBody: JSONObject =
231
- await this.validateAndStoreLicenseKey(licenseKey);
232
-
233
- return Response.sendJsonObjectResponse(req, res, responseBody);
159
+ : null;
160
+
161
+ const seatUsage: SeatUsage | null =
162
+ audience === "master-admin" && isEnterpriseEditionLoaded
163
+ ? await EnterpriseEdition.getSeatUsage()
164
+ : null;
165
+
166
+ return Response.sendJsonObjectResponse(
167
+ req,
168
+ res,
169
+ GlobalConfigAPI.buildLicenseResponse({
170
+ audience,
171
+ isEnterpriseEditionLoaded,
172
+ snapshot,
173
+ config,
174
+ seatUsage,
175
+ }),
176
+ );
234
177
  } catch (err) {
235
178
  next(err);
236
179
  }
237
180
  },
238
181
  );
182
+ }
239
183
 
240
- /*
241
- * Re-fetch the license this installation already holds.
242
- *
243
- * The seat limit and the expiry live on oneuptime.com and can change on
244
- * any day — a customer buys ten more seats at noon. The daily report job
245
- * picks that up eventually; this is the button an administrator presses
246
- * when "eventually" is not good enough, and it is the only way to apply a
247
- * change without re-typing the key.
248
- *
249
- * Deliberately takes no license key: it uses the stored one. A refresh
250
- * that accepted a key would be an activation with a friendlier name, and
251
- * would let a mistyped key replace a working license by accident.
252
- */
253
- this.router.post(
254
- `${new this.entityType().getCrudApiPath()?.toString()}/license/refresh`,
255
- MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware,
256
- async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
257
- try {
258
- const config: GlobalConfig | null =
259
- await GlobalConfigService.findOneById({
260
- id: ObjectID.getZeroObjectID(),
261
- select: {
262
- enterpriseLicenseKey: true,
263
- },
264
- props: {
265
- isRoot: true,
266
- },
267
- });
268
-
269
- const licenseKey: string = config?.enterpriseLicenseKey?.trim() || "";
270
-
271
- if (!licenseKey) {
272
- throw new BadDataException(
273
- "This installation does not have an enterprise license key yet. Enter a license key to activate it first.",
274
- );
275
- }
276
-
277
- const responseBody: JSONObject =
278
- await this.validateAndStoreLicenseKey(licenseKey);
279
-
280
- return Response.sendJsonObjectResponse(req, res, responseBody);
281
- } catch (err) {
282
- next(err);
283
- }
284
- },
285
- );
184
+ /*
185
+ * A master admin is recognised from the verified access token that
186
+ * UserMiddleware.getUserMiddleware decoded. Anything else - no token, an
187
+ * API key, a status-page user, a signed-in project member - is "public".
188
+ */
189
+ public static getLicenseResponseAudience(
190
+ req: ExpressRequest,
191
+ ): LicenseResponseAudience {
192
+ return (req as OneUptimeRequest).userAuthorization?.isMasterAdmin === true
193
+ ? "master-admin"
194
+ : "public";
286
195
  }
287
196
 
288
197
  /*
289
- * Ask oneuptime.com what this license key is worth today, and mirror the
290
- * answer into GlobalConfig.
198
+ * The body of GET /global-config/license, and of the Enterprise license
199
+ * client's activation and refresh responses, so the three can never
200
+ * disagree on a field.
291
201
  *
292
- * Shared by activation and refresh so the two cannot drift: the whole point
293
- * of refresh is that it applies exactly what activation would have applied,
294
- * and a second hand-written copy of this mapping is how the seat limit came
295
- * to be dropped on the floor by the daily report job before.
202
+ * licenseValid is true for a valid license AND one in its grace period:
203
+ * grace means nothing has changed yet, and the dialog must not tell an
204
+ * administrator the license is gone while everything still works.
296
205
  */
297
- private async validateAndStoreLicenseKey(
298
- licenseKey: string,
299
- ): Promise<JSONObject> {
300
- const globalConfigId: ObjectID = ObjectID.getZeroObjectID();
301
-
302
- const existingConfig: GlobalConfig | null =
303
- await GlobalConfigService.findOneById({
304
- id: globalConfigId,
305
- select: {
306
- _id: true,
307
- instanceId: true,
308
- },
309
- props: {
310
- isRoot: true,
311
- ignoreHooks: true,
312
- },
313
- });
314
-
315
- /*
316
- * Send this instance's id and host along with the key so the
317
- * license server registers this instance against the license and
318
- * it shows up in the instance list on all instances that share
319
- * the license.
320
- */
321
- const instanceId: ObjectID =
322
- existingConfig?.instanceId || ObjectID.generate();
323
-
324
- const validationResponse: HTTPResponse<JSONObject> | HTTPErrorResponse =
325
- await API.post<JSONObject>({
326
- url: EnterpriseLicenseValidationUrl,
327
- data: {
328
- licenseKey,
329
- instanceId: instanceId.toString(),
330
- host: Host,
331
- /*
332
- * Sent here as well as from the daily report job so the version
333
- * lands on the license server the moment the key is validated,
334
- * rather than up to 24 hours later.
335
- */
336
- version: AppVersion,
337
- },
338
- });
339
-
340
- if (!validationResponse.isSuccess()) {
341
- const errorMessage: string =
342
- validationResponse instanceof HTTPErrorResponse
343
- ? validationResponse.message || "Failed to validate license key."
344
- : "Failed to validate license key.";
345
- throw new BadDataException(errorMessage);
346
- }
347
-
348
- const payload: JSONObject = validationResponse.data as JSONObject;
349
-
350
- const companyNameRaw: string =
351
- (payload["companyName"] as string | undefined)?.trim() || "";
352
- const expiresAtRaw: string =
353
- (payload["expiresAt"] as string | undefined) || "";
354
- const licenseKeyRaw: string =
355
- (payload["licenseKey"] as string | undefined)?.trim() || licenseKey;
356
- const licenseToken: string = (payload["token"] as string | undefined) || "";
357
-
358
- let licenseExpiry: Date | undefined = undefined;
359
- if (expiresAtRaw) {
360
- const parsedDate: Date = new Date(expiresAtRaw);
361
-
362
- if (Number.isNaN(parsedDate.getTime())) {
363
- throw new BadDataException(
364
- "License expiration returned from server is invalid.",
365
- );
366
- }
367
-
368
- licenseExpiry = parsedDate;
369
- }
370
-
371
- const userLimitRaw: unknown = payload["userLimit"];
372
- const userLimit: number | null =
373
- typeof userLimitRaw === "number" && Number.isFinite(userLimitRaw)
374
- ? userLimitRaw
375
- : null;
376
-
377
- const currentUserCountRaw: unknown = payload["currentUserCount"];
378
- const currentUserCount: number | null =
379
- typeof currentUserCountRaw === "number" &&
380
- Number.isFinite(currentUserCountRaw)
381
- ? currentUserCountRaw
382
- : null;
383
-
384
- const userCountUpdatedAtRaw: string | undefined = payload[
385
- "userCountUpdatedAt"
386
- ] as string | undefined;
387
- let userCountUpdatedAt: Date | null = null;
388
- if (userCountUpdatedAtRaw) {
389
- const parsedReportedAt: Date = new Date(userCountUpdatedAtRaw);
390
- if (!Number.isNaN(parsedReportedAt.getTime())) {
391
- userCountUpdatedAt = parsedReportedAt;
392
- }
393
- }
394
-
395
- const isEvaluationLicense: boolean =
396
- payload["isEvaluationLicense"] === true;
397
-
398
- const instances: Array<EnterpriseLicenseInstanceSummary> = Array.isArray(
399
- payload["instances"],
400
- )
401
- ? (payload["instances"] as Array<EnterpriseLicenseInstanceSummary>)
402
- : [];
403
-
404
- const updatePayload: PartialEntity<GlobalConfig> = {
405
- enterpriseCompanyName: companyNameRaw || null,
406
- enterpriseLicenseKey: licenseKeyRaw || null,
407
- enterpriseLicenseExpiresAt: licenseExpiry || null,
408
- enterpriseLicenseToken: licenseToken || null,
409
- enterpriseLicenseIsEvaluation: isEvaluationLicense,
410
- enterpriseLicenseUserLimit: userLimit,
411
- enterpriseLicenseCurrentUserCount: currentUserCount,
412
- enterpriseLicenseUserCountUpdatedAt: userCountUpdatedAt,
413
- enterpriseLicenseInstances: instances,
206
+ public static buildLicenseResponse(
207
+ data: BuildLicenseResponseData,
208
+ ): JSONObject {
209
+ const snapshot: EnterpriseLicenseSnapshot | null =
210
+ data.isEnterpriseEditionLoaded ? data.snapshot : null;
211
+
212
+ const publicFields: JSONObject = {
213
+ edition: data.isEnterpriseEditionLoaded ? "enterprise" : "community",
214
+ status: snapshot ? snapshot.status : null,
215
+ verification: snapshot ? snapshot.verification : null,
216
+ graceReason: snapshot?.graceReason || null,
217
+ licenseValid: EnterpriseLicenseSnapshotUtil.isUsable(snapshot),
218
+ companyName: snapshot?.companyName || null,
219
+ expiresAt: GlobalConfigAPI.toIsoString(snapshot?.expiresAt),
220
+ graceEndsAt: GlobalConfigAPI.toIsoString(snapshot?.graceEndsAt),
221
+ isEvaluation: Boolean(snapshot?.isEvaluation),
222
+ // The name older dialogs read; same value as isEvaluation.
223
+ isEvaluationLicense: Boolean(snapshot?.isEvaluation),
224
+ /*
225
+ * Which enterprise features the license covers: "all", or the
226
+ * EnterpriseFeature values it lists (null on the Community Edition).
227
+ * A valid license that leaves a feature out stops that feature (see
228
+ * EnterpriseEdition.isFeatureActive), which licenseValid alone cannot
229
+ * tell a screen.
230
+ */
231
+ features: GlobalConfigAPI.toFeaturesResponse(snapshot),
414
232
  };
415
233
 
416
- if (!existingConfig?.instanceId) {
417
- // Installs that predate instance ids: persist the one we generated.
418
- updatePayload.instanceId = instanceId;
234
+ if (data.audience !== "master-admin") {
235
+ return publicFields;
419
236
  }
420
237
 
421
- if (existingConfig) {
422
- await GlobalConfigService.updateOneById({
423
- id: globalConfigId,
424
- data: updatePayload,
425
- props: {
426
- isRoot: true,
427
- ignoreHooks: true,
428
- },
429
- });
430
- } else {
431
- const newConfig: GlobalConfig = new GlobalConfig();
432
- newConfig.id = globalConfigId;
433
-
434
- if (companyNameRaw) {
435
- newConfig.enterpriseCompanyName = companyNameRaw;
436
- }
437
-
438
- if (licenseKeyRaw) {
439
- newConfig.enterpriseLicenseKey = licenseKeyRaw;
440
- }
441
-
442
- if (licenseToken) {
443
- newConfig.enterpriseLicenseToken = licenseToken;
444
- }
445
-
446
- newConfig.enterpriseLicenseIsEvaluation = isEvaluationLicense;
447
-
448
- if (licenseExpiry) {
449
- newConfig.enterpriseLicenseExpiresAt = licenseExpiry;
450
- }
451
-
452
- if (userLimit !== null) {
453
- newConfig.enterpriseLicenseUserLimit = userLimit;
454
- }
455
-
456
- if (currentUserCount !== null) {
457
- newConfig.enterpriseLicenseCurrentUserCount = currentUserCount;
458
- }
459
-
460
- if (userCountUpdatedAt) {
461
- newConfig.enterpriseLicenseUserCountUpdatedAt = userCountUpdatedAt;
462
- }
463
-
464
- newConfig.enterpriseLicenseInstances = instances;
465
- newConfig.instanceId = instanceId;
466
-
467
- await GlobalConfigService.create({
468
- data: newConfig,
469
- props: {
470
- isRoot: true,
471
- ignoreHooks: true,
472
- },
473
- });
474
- }
238
+ const config: GlobalConfig | null = data.config;
475
239
 
476
240
  /*
477
- * Seat usage recomputed from what was just stored, so the dialog that
478
- * triggered this can show the new limit against the real user count
479
- * without a second round trip - and so an administrator who just bought
480
- * seats sees them land.
241
+ * The license columns mean nothing on the Community Edition (a leftover
242
+ * key from an earlier Enterprise image licenses nothing here), so only
243
+ * the version half of the dialog is filled in there.
481
244
  */
482
- const seatUsage: SeatUsage | null =
483
- await GlobalConfigAPI.getSeatUsageForResponse({
484
- userLimit: userLimit,
485
- currentUserCount: currentUserCount,
486
- instances: instances,
487
- instanceId: instanceId,
488
- });
245
+ const licenseConfig: GlobalConfig | null = snapshot ? config : null;
246
+
247
+ const licenseToken: string | null =
248
+ licenseConfig?.enterpriseLicenseToken || null;
249
+ const licenseKey: string | null =
250
+ licenseConfig?.enterpriseLicenseKey || null;
489
251
 
490
252
  return {
491
- companyName: companyNameRaw || null,
492
- expiresAt: licenseExpiry ? licenseExpiry.toISOString() : null,
493
- licenseKey: licenseKeyRaw || null,
494
- token: licenseToken || null,
495
- isEvaluationLicense: isEvaluationLicense,
496
- userLimit: userLimit,
497
- currentUserCount: currentUserCount,
498
- userCountUpdatedAt: userCountUpdatedAt
499
- ? userCountUpdatedAt.toISOString()
253
+ ...publicFields,
254
+ message: snapshot?.message || null,
255
+ licenseKey: licenseKey,
256
+ token: licenseToken,
257
+ /*
258
+ * "offline" when the license was activated by pasting a signed token:
259
+ * such an installation holds no license key and never calls home.
260
+ */
261
+ activationMode: licenseToken ? (licenseKey ? "online" : "offline") : null,
262
+ // From the signed claims for a verified license, else the stored column.
263
+ userLimit:
264
+ typeof snapshot?.userLimit === "number" ? snapshot.userLimit : null,
265
+ currentUserCount:
266
+ typeof licenseConfig?.enterpriseLicenseCurrentUserCount === "number"
267
+ ? licenseConfig.enterpriseLicenseCurrentUserCount
268
+ : null,
269
+ userCountUpdatedAt: GlobalConfigAPI.toIsoString(
270
+ licenseConfig?.enterpriseLicenseUserCountUpdatedAt,
271
+ ),
272
+ instances: Array.isArray(licenseConfig?.enterpriseLicenseInstances)
273
+ ? (licenseConfig?.enterpriseLicenseInstances as Array<EnterpriseLicenseInstanceSummary>)
274
+ : [],
275
+ instanceId: licenseConfig?.instanceId
276
+ ? licenseConfig.instanceId.toString()
500
277
  : null,
501
- instances: instances,
502
- instanceId: instanceId.toString(),
503
- ...GlobalConfigAPI.getSeatUsageResponseFields(seatUsage),
278
+ /*
279
+ * Which build this installation runs, and whether a newer one has been
280
+ * released. Master admins only: telling anybody else that this server
281
+ * is behind on patches advertises an unpatched target.
282
+ */
283
+ currentVersion: AppVersion,
284
+ latestVersion: config?.latestReleaseVersion || null,
285
+ latestVersionPublishedAt: GlobalConfigAPI.toIsoString(
286
+ config?.latestReleasePublishedAt,
287
+ ),
288
+ latestVersionCheckedAt: GlobalConfigAPI.toIsoString(
289
+ config?.latestReleaseCheckedAt,
290
+ ),
291
+ isUpdateAvailable: VersionUtil.isUpdateAvailable({
292
+ currentVersion: AppVersion,
293
+ latestVersion: config?.latestReleaseVersion,
294
+ }),
295
+ /*
296
+ * Lets the dialog say "update checks are off" instead of "has not
297
+ * checked yet", which would be a promise the installation is never
298
+ * going to keep.
299
+ */
300
+ isUpdateCheckDisabled: DisableUpdateCheck,
301
+ ...GlobalConfigAPI.getSeatUsageResponseFields(
302
+ snapshot ? data.seatUsage : null,
303
+ ),
504
304
  };
505
305
  }
506
306
 
507
- /*
508
- * Seat usage built from license terms held in memory rather than re-read
509
- * from the database. Used right after a write, where re-reading would race
510
- * the write it is describing.
511
- */
512
- private static async getSeatUsageForResponse(data: {
513
- userLimit: number | null;
514
- currentUserCount: number | null;
515
- instances: Array<EnterpriseLicenseInstanceSummary>;
516
- instanceId: ObjectID;
517
- }): Promise<SeatUsage | null> {
518
- const config: GlobalConfig = new GlobalConfig();
519
- config.instanceId = data.instanceId;
520
- config.enterpriseLicenseInstances = data.instances;
521
-
522
- if (data.userLimit !== null) {
523
- config.enterpriseLicenseUserLimit = data.userLimit;
307
+ // The license's features for a response: "all", a copy of the list, or null.
308
+ public static toFeaturesResponse(
309
+ snapshot: EnterpriseLicenseSnapshot | null,
310
+ ): "all" | Array<string> | null {
311
+ if (!snapshot) {
312
+ return null;
524
313
  }
525
314
 
526
- if (data.currentUserCount !== null) {
527
- config.enterpriseLicenseCurrentUserCount = data.currentUserCount;
315
+ if (snapshot.features === "all") {
316
+ return "all";
528
317
  }
529
318
 
530
- return EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
531
- config: config,
532
- getLocalUserCount: GlobalConfigAPI.getLocalUserCount,
533
- });
534
- }
535
-
536
- /*
537
- * How many users exist on this installation right now. Deliberately the live
538
- * count rather than the last reported one: the number an administrator is
539
- * about to act on is the number that decides whether the next invitation
540
- * goes through.
541
- */
542
- private static async getLocalUserCount(): Promise<number> {
543
- const userCount: PositiveNumber = await UserService.countBy({
544
- query: {},
545
- props: {
546
- isRoot: true,
547
- },
548
- });
549
-
550
- return userCount.toNumber();
319
+ return Array.isArray(snapshot.features) ? [...snapshot.features] : [];
551
320
  }
552
321
 
553
322
  /*
@@ -556,7 +325,7 @@ export default class GlobalConfigAPI extends BaseAPI<
556
325
  * "this installation does not enforce them" by which fields are missing:
557
326
  * isSeatLimitEnforced is the single flag that answers that.
558
327
  */
559
- private static getSeatUsageResponseFields(
328
+ public static getSeatUsageResponseFields(
560
329
  seatUsage: SeatUsage | null,
561
330
  ): JSONObject {
562
331
  if (!seatUsage || !seatUsage.isEnforced) {
@@ -575,4 +344,18 @@ export default class GlobalConfigAPI extends BaseAPI<
575
344
  canAddMoreUsers: seatUsage.hasSeatForNewUser,
576
345
  };
577
346
  }
347
+
348
+ private static toIsoString(value: Date | null | undefined): string | null {
349
+ if (!value) {
350
+ return null;
351
+ }
352
+
353
+ const date: Date = value instanceof Date ? value : new Date(value);
354
+
355
+ if (Number.isNaN(date.getTime())) {
356
+ return null;
357
+ }
358
+
359
+ return date.toISOString();
360
+ }
578
361
  }