@oneuptime/common 12.0.30 → 12.0.32

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 (645) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/AlertState.ts +0 -2
  5. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  6. package/Models/DatabaseModels/Domain.ts +1 -1
  7. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  8. package/Models/DatabaseModels/Incident.ts +1 -1
  9. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  10. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  11. package/Models/DatabaseModels/Index.ts +4 -0
  12. package/Models/DatabaseModels/MetricType.ts +0 -2
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
  14. package/Models/DatabaseModels/MonitorTest.ts +0 -2
  15. package/Models/DatabaseModels/NetworkDevice.ts +234 -5
  16. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  17. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  18. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +501 -0
  19. package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
  20. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
  21. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
  23. package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
  24. package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
  25. package/Models/DatabaseModels/StatusPageResource.ts +0 -2
  26. package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
  27. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  28. package/Server/API/GlobalConfigAPI.ts +362 -183
  29. package/Server/API/TelemetryAPI.ts +42 -4
  30. package/Server/EnvironmentConfig.ts +112 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  35. package/Server/Middleware/MultipartFormData.ts +118 -32
  36. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  37. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  38. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  40. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  41. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  43. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  44. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  45. package/Server/Services/AlertReminderRuleService.ts +9 -1
  46. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  47. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  48. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  49. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  50. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  52. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  53. package/Server/Services/DatabaseService.ts +39 -9
  54. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  57. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  58. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  59. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  60. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  61. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  64. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  66. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  68. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  69. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  70. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  71. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  72. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  73. package/Server/Services/Index.ts +4 -0
  74. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/KubernetesResourceService.ts +5 -1
  79. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  80. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  81. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  82. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  83. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  86. package/Server/Services/NetworkDeviceRoleService.ts +90 -0
  87. package/Server/Services/NetworkDeviceService.ts +209 -1
  88. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  92. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  93. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  94. package/Server/Services/ProjectService.ts +85 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  97. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  98. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  99. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  100. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  101. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  102. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  103. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  104. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  108. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  109. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  110. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  111. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  112. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  113. package/Server/Services/UserNotificationSettingService.ts +0 -6
  114. package/Server/Services/UserService.ts +27 -0
  115. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  116. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  117. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  118. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  119. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  120. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  121. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  122. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  123. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  124. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  125. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  126. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  127. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  128. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  129. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  130. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  131. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +31 -1
  132. package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
  133. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
  134. package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
  135. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  136. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  137. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
  138. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
  139. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +590 -0
  140. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  141. package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
  142. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  143. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  144. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  145. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +543 -0
  146. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  147. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  148. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  149. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  151. package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
  152. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  153. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  154. package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
  155. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  156. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  157. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  158. package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
  159. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
  160. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
  161. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  162. package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
  163. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  164. package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
  165. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +43 -2
  166. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  167. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  168. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  169. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  170. package/Tests/Server/Utils/BasicCron.test.ts +283 -0
  171. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  172. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  173. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  174. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
  175. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  176. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  177. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  178. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  179. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  180. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  181. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  182. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  183. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  184. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  185. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  186. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  187. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  188. package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
  189. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  190. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  191. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  192. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  193. package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
  194. package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
  195. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  196. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  197. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  198. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  199. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
  201. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  202. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  205. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  206. package/Tests/UI/Components/SideMenuItem.test.tsx +30 -0
  207. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  208. package/Tests/UI/Components/XAxis.test.ts +270 -5
  209. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  210. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  211. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  212. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  213. package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
  214. package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
  215. package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
  216. package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
  217. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  218. package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
  219. package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
  220. package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
  221. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  222. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  223. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  224. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  225. package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
  226. package/Tests/Utils/Slug.test.ts +61 -1
  227. package/Tests/jest.setup.ts +19 -0
  228. package/Types/Date.ts +39 -0
  229. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
  230. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  231. package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
  232. package/Types/Permission.ts +141 -0
  233. package/Types/Rum/SessionReplay.ts +21 -0
  234. package/Types/Telemetry/SourceMap.ts +8 -0
  235. package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
  236. package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
  237. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
  238. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  239. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  240. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  241. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  242. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +554 -545
  243. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +337 -371
  244. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +549 -540
  245. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  246. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  247. package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
  248. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  249. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  250. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  251. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  252. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  253. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  254. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  255. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  256. package/UI/Components/Feed/FeedItem.tsx +4 -5
  257. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  258. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  259. package/UI/Components/Image/Image.tsx +20 -3
  260. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  261. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  262. package/UI/Components/ModelTable/BaseModelTable.tsx +200 -39
  263. package/UI/Components/Navbar/NavBar.tsx +62 -13
  264. package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
  265. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
  266. package/UI/Components/SideMenu/SideMenu.tsx +12 -2
  267. package/UI/Components/SideMenu/SideMenuItem.tsx +4 -1
  268. package/UI/Components/SideMenu/SideMenuSection.tsx +14 -2
  269. package/UI/Components/Table/TableHeader.tsx +64 -48
  270. package/UI/Components/Table/TableRow.tsx +13 -3
  271. package/UI/Styles/Theme.css +38 -0
  272. package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
  273. package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
  274. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  275. package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
  276. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
  277. package/Utils/Monitor/NetworkTopologyUtil.ts +116 -33
  278. package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
  279. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  280. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  281. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  282. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  283. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  284. package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
  285. package/Utils/Slug.ts +34 -1
  286. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  287. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  288. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  289. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  290. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  291. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
  293. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  295. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Domain.js +1 -1
  297. package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  299. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  300. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  301. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  303. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  305. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  307. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
  309. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
  311. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
  313. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/NetworkDevice.js +239 -6
  315. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  317. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +521 -0
  320. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  321. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
  322. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
  323. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
  324. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
  326. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
  328. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
  330. package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
  331. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
  332. package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
  333. package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
  334. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
  336. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  338. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  339. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  340. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/EnvironmentConfig.js +83 -0
  344. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  353. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  354. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  355. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  356. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  357. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  358. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  359. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  360. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  361. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  362. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  364. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  366. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  367. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  368. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  369. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  370. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  371. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  372. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  373. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  374. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  375. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  376. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  377. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  378. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  379. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  380. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  381. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  382. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  383. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  384. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  385. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  386. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  387. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  388. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  389. package/build/dist/Server/Services/DatabaseService.js +31 -5
  390. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  391. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  392. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  393. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  394. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  395. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  396. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  397. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  398. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  399. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  400. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  401. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  402. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  404. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  406. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  407. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  408. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  409. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  410. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  411. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  412. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  414. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  416. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  417. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  418. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  419. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  420. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  421. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  422. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  423. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  424. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  425. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  426. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  427. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  428. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  429. package/build/dist/Server/Services/Index.js +4 -0
  430. package/build/dist/Server/Services/Index.js.map +1 -1
  431. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  432. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  433. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  434. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  435. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  436. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  437. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  438. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  439. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  440. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  441. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  442. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  443. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  444. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  445. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  446. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  447. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  448. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  449. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  450. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  451. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  452. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  453. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  454. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  455. package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
  456. package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
  457. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  458. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  459. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  460. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  461. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  462. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  463. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  464. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  465. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  466. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  467. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  468. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  469. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  470. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  471. package/build/dist/Server/Services/ProjectService.js +65 -0
  472. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  473. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  474. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  475. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  476. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  477. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  478. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  479. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  480. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  481. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  482. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  483. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  484. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  485. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  486. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  487. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  488. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  489. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  490. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  491. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  492. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  493. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  494. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  495. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  496. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  497. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  498. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  499. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  500. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  501. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  502. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  503. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  504. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  505. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  506. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  507. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  508. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  509. package/build/dist/Server/Services/UserNotificationSettingService.js +0 -1
  510. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  511. package/build/dist/Server/Services/UserService.js +25 -0
  512. package/build/dist/Server/Services/UserService.js.map +1 -1
  513. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  514. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  516. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  518. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  519. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  520. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  521. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  522. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  523. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  524. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  525. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  526. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  527. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  528. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  529. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  530. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  531. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  532. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  533. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  534. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  535. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  536. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  537. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  538. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  539. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  540. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  541. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  542. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  543. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  544. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  545. package/build/dist/Types/Date.js +27 -0
  546. package/build/dist/Types/Date.js.map +1 -1
  547. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  548. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  549. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
  550. package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
  551. package/build/dist/Types/Permission.js +126 -0
  552. package/build/dist/Types/Permission.js.map +1 -1
  553. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  554. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  555. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  556. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  558. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
  560. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  562. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  563. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  564. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  565. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  566. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  567. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  568. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  569. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +262 -234
  570. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  571. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +146 -153
  572. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  573. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +261 -233
  574. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  575. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
  576. package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
  577. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  579. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  580. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  581. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  582. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  583. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  584. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  585. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  586. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  587. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  588. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  589. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  590. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  592. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  593. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  594. package/build/dist/UI/Components/Image/Image.js +6 -1
  595. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  596. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  597. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  598. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  599. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  600. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +143 -36
  601. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  602. package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
  603. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  604. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  605. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  606. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
  607. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  608. package/build/dist/UI/Components/SideMenu/SideMenu.js +9 -6
  609. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  610. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +1 -1
  611. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  612. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +7 -2
  613. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  614. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  615. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  616. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  617. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  618. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
  619. package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
  620. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
  621. package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
  622. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  623. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  624. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
  625. package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
  626. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
  627. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  628. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +67 -32
  629. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  630. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
  631. package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
  632. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  633. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  636. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  637. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  638. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  639. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  640. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  641. package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
  642. package/build/dist/Utils/Slug.js +31 -1
  643. package/build/dist/Utils/Slug.js.map +1 -1
  644. package/jest.config.json +1 -0
  645. package/package.json +2 -2
@@ -14,7 +14,6 @@ import ColumnType from "../../Types/Database/ColumnType";
14
14
  import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
15
15
  import EnableDocumentation from "../../Types/Database/EnableDocumentation";
16
16
  import EnableWorkflow from "../../Types/Database/EnableWorkflow";
17
- import SlugifyColumn from "../../Types/Database/SlugifyColumn";
18
17
  import TableColumn from "../../Types/Database/TableColumn";
19
18
  import TableColumnType from "../../Types/Database/TableColumnType";
20
19
  import TableMetadata from "../../Types/Database/TableMetadata";
@@ -78,7 +77,6 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
78
77
  read: true,
79
78
  })
80
79
  @CrudApiEndpoint(new Route("/status-page-private-user"))
81
- @SlugifyColumn("name", "slug")
82
80
  @TableMetadata({
83
81
  tableName: "StatusPagePrivateUser",
84
82
  singularName: "Status Page Private User",
@@ -15,7 +15,6 @@ import ColumnType from "../../Types/Database/ColumnType";
15
15
  import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
16
16
  import EnableDocumentation from "../../Types/Database/EnableDocumentation";
17
17
  import EnableWorkflow from "../../Types/Database/EnableWorkflow";
18
- import SlugifyColumn from "../../Types/Database/SlugifyColumn";
19
18
  import TableColumn from "../../Types/Database/TableColumn";
20
19
  import TableColumnType from "../../Types/Database/TableColumnType";
21
20
  import TableMetadata from "../../Types/Database/TableMetadata";
@@ -72,7 +71,6 @@ import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
72
71
  read: true,
73
72
  })
74
73
  @CrudApiEndpoint(new Route("/status-page-resource"))
75
- @SlugifyColumn("name", "slug")
76
74
  @TableMetadata({
77
75
  tableName: "StatusPageResource",
78
76
  singularName: "Status Page Resource",
@@ -14,7 +14,6 @@ import ColumnType from "../../Types/Database/ColumnType";
14
14
  import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
15
15
  import EnableDocumentation from "../../Types/Database/EnableDocumentation";
16
16
  import EnableWorkflow from "../../Types/Database/EnableWorkflow";
17
- import SlugifyColumn from "../../Types/Database/SlugifyColumn";
18
17
  import TableColumn from "../../Types/Database/TableColumn";
19
18
  import TableColumnType from "../../Types/Database/TableColumnType";
20
19
  import TableMetadata from "../../Types/Database/TableMetadata";
@@ -82,7 +81,6 @@ import StatusPageEventType from "../../Types/StatusPage/StatusPageEventType";
82
81
  ],
83
82
  })
84
83
  @CrudApiEndpoint(new Route("/status-page-subscriber"))
85
- @SlugifyColumn("name", "slug")
86
84
  @TableMetadata({
87
85
  tableName: "StatusPageSubscriber",
88
86
  singularName: "Status Page Subscriber",
@@ -22,26 +22,35 @@ import Permission from "../../Types/Permission";
22
22
  import { PlanType } from "../../Types/Billing/SubscriptionPlan";
23
23
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
24
24
 
25
+ /*
26
+ * Part of the SIEM, so it reads and is administered through the Security
27
+ * tiers rather than the Telemetry ones it used to share a list with. A
28
+ * detection rule and a threat-intel subscription describe what a project is
29
+ * watching for and what it believes it is up against, which is security
30
+ * posture rather than observability configuration.
31
+ */
25
32
  const createPermissions: Array<Permission> = [
26
33
  Permission.ProjectOwner,
27
34
  Permission.ProjectAdmin,
35
+ Permission.SecurityAdmin,
36
+ Permission.SecurityMember,
28
37
  Permission.CreateProjectThreatIntelFeed,
29
38
  ];
30
39
 
31
40
  const readPermissions: Array<Permission> = [
32
41
  Permission.ProjectOwner,
33
42
  Permission.ProjectAdmin,
34
- Permission.ProjectMember,
35
- Permission.Viewer,
36
- Permission.TelemetryAdmin,
37
- Permission.TelemetryMember,
38
- Permission.TelemetryViewer,
43
+ Permission.SecurityAdmin,
44
+ Permission.SecurityMember,
45
+ Permission.SecurityViewer,
39
46
  Permission.ReadProjectThreatIntelFeed,
40
47
  ];
41
48
 
42
49
  const updatePermissions: Array<Permission> = [
43
50
  Permission.ProjectOwner,
44
51
  Permission.ProjectAdmin,
52
+ Permission.SecurityAdmin,
53
+ Permission.SecurityMember,
45
54
  Permission.EditProjectThreatIntelFeed,
46
55
  ];
47
56
 
@@ -86,6 +95,8 @@ const updatePermissions: Array<Permission> = [
86
95
  delete: [
87
96
  Permission.ProjectOwner,
88
97
  Permission.ProjectAdmin,
98
+ Permission.SecurityAdmin,
99
+ Permission.SecurityMember,
89
100
  Permission.DeleteProjectThreatIntelFeed,
90
101
  ],
91
102
  update: updatePermissions,
@@ -26,6 +26,11 @@ import {
26
26
  import EnterpriseLicenseInstanceSummary from "../../Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary";
27
27
  import VersionUtil from "../../Utils/VersionUtil";
28
28
  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";
29
34
 
30
35
  export default class GlobalConfigAPI extends BaseAPI<
31
36
  GlobalConfig,
@@ -104,6 +109,22 @@ export default class GlobalConfigAPI extends BaseAPI<
104
109
  config.enterpriseLicenseExpiresAt.getTime() > Date.now(),
105
110
  );
106
111
 
112
+ /*
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.
118
+ */
119
+ const seatUsage: SeatUsage | null = isAuthenticatedUser
120
+ ? await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig(
121
+ {
122
+ config: config,
123
+ getLocalUserCount: GlobalConfigAPI.getLocalUserCount,
124
+ },
125
+ )
126
+ : null;
127
+
107
128
  const responseBody: JSONObject = {
108
129
  companyName: config?.enterpriseCompanyName || null,
109
130
  expiresAt: config?.enterpriseLicenseExpiresAt
@@ -174,6 +195,7 @@ export default class GlobalConfigAPI extends BaseAPI<
174
195
  isUpdateCheckDisabled: isAuthenticatedUser
175
196
  ? DisableUpdateCheck
176
197
  : false,
198
+ ...GlobalConfigAPI.getSeatUsageResponseFields(seatUsage),
177
199
  };
178
200
 
179
201
  return Response.sendJsonObjectResponse(req, res, responseBody);
@@ -183,9 +205,19 @@ export default class GlobalConfigAPI extends BaseAPI<
183
205
  },
184
206
  );
185
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
+ */
186
218
  this.router.post(
187
219
  `${new this.entityType().getCrudApiPath()?.toString()}/license`,
188
- UserMiddleware.getUserMiddleware,
220
+ MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware,
189
221
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
190
222
  try {
191
223
  const licenseKey: string =
@@ -195,205 +227,352 @@ export default class GlobalConfigAPI extends BaseAPI<
195
227
  throw new BadDataException("License key is required");
196
228
  }
197
229
 
198
- const globalConfigId: ObjectID = ObjectID.getZeroObjectID();
230
+ const responseBody: JSONObject =
231
+ await this.validateAndStoreLicenseKey(licenseKey);
232
+
233
+ return Response.sendJsonObjectResponse(req, res, responseBody);
234
+ } catch (err) {
235
+ next(err);
236
+ }
237
+ },
238
+ );
199
239
 
200
- const existingConfig: GlobalConfig | null =
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 =
201
259
  await GlobalConfigService.findOneById({
202
- id: globalConfigId,
260
+ id: ObjectID.getZeroObjectID(),
203
261
  select: {
204
- _id: true,
205
- instanceId: true,
262
+ enterpriseLicenseKey: true,
206
263
  },
207
264
  props: {
208
265
  isRoot: true,
209
- ignoreHooks: true,
210
266
  },
211
267
  });
212
268
 
213
- /*
214
- * Send this instance's id and host along with the key so the
215
- * license server registers this instance against the license and
216
- * it shows up in the instance list on all instances that share
217
- * the license.
218
- */
219
- const instanceId: ObjectID =
220
- existingConfig?.instanceId || ObjectID.generate();
221
-
222
- const validationResponse:
223
- | HTTPResponse<JSONObject>
224
- | HTTPErrorResponse = await API.post<JSONObject>({
225
- url: EnterpriseLicenseValidationUrl,
226
- data: {
227
- licenseKey,
228
- instanceId: instanceId.toString(),
229
- host: Host,
230
- /*
231
- * Sent here as well as from the daily report job so the version
232
- * lands on the license server the moment the key is validated,
233
- * rather than up to 24 hours later.
234
- */
235
- version: AppVersion,
236
- },
237
- });
238
-
239
- if (!validationResponse.isSuccess()) {
240
- const errorMessage: string =
241
- validationResponse instanceof HTTPErrorResponse
242
- ? validationResponse.message ||
243
- "Failed to validate license key."
244
- : "Failed to validate license key.";
245
- throw new BadDataException(errorMessage);
246
- }
247
-
248
- const payload: JSONObject = validationResponse.data as JSONObject;
249
-
250
- const companyNameRaw: string =
251
- (payload["companyName"] as string | undefined)?.trim() || "";
252
- const expiresAtRaw: string =
253
- (payload["expiresAt"] as string | undefined) || "";
254
- const licenseKeyRaw: string =
255
- (payload["licenseKey"] as string | undefined)?.trim() || licenseKey;
256
- const licenseToken: string =
257
- (payload["token"] as string | undefined) || "";
258
-
259
- let licenseExpiry: Date | undefined = undefined;
260
- if (expiresAtRaw) {
261
- const parsedDate: Date = new Date(expiresAtRaw);
262
-
263
- if (Number.isNaN(parsedDate.getTime())) {
264
- throw new BadDataException(
265
- "License expiration returned from server is invalid.",
266
- );
267
- }
269
+ const licenseKey: string = config?.enterpriseLicenseKey?.trim() || "";
268
270
 
269
- licenseExpiry = parsedDate;
270
- }
271
-
272
- const userLimitRaw: unknown = payload["userLimit"];
273
- const userLimit: number | null =
274
- typeof userLimitRaw === "number" && Number.isFinite(userLimitRaw)
275
- ? userLimitRaw
276
- : null;
277
-
278
- const currentUserCountRaw: unknown = payload["currentUserCount"];
279
- const currentUserCount: number | null =
280
- typeof currentUserCountRaw === "number" &&
281
- Number.isFinite(currentUserCountRaw)
282
- ? currentUserCountRaw
283
- : null;
284
-
285
- const userCountUpdatedAtRaw: string | undefined = payload[
286
- "userCountUpdatedAt"
287
- ] as string | undefined;
288
- let userCountUpdatedAt: Date | null = null;
289
- if (userCountUpdatedAtRaw) {
290
- const parsedReportedAt: Date = new Date(userCountUpdatedAtRaw);
291
- if (!Number.isNaN(parsedReportedAt.getTime())) {
292
- userCountUpdatedAt = parsedReportedAt;
293
- }
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
+ );
294
275
  }
295
276
 
296
- const isEvaluationLicense: boolean =
297
- payload["isEvaluationLicense"] === true;
298
-
299
- const instances: Array<EnterpriseLicenseInstanceSummary> =
300
- Array.isArray(payload["instances"])
301
- ? (payload[
302
- "instances"
303
- ] as Array<EnterpriseLicenseInstanceSummary>)
304
- : [];
305
-
306
- const updatePayload: PartialEntity<GlobalConfig> = {
307
- enterpriseCompanyName: companyNameRaw || null,
308
- enterpriseLicenseKey: licenseKeyRaw || null,
309
- enterpriseLicenseExpiresAt: licenseExpiry || null,
310
- enterpriseLicenseToken: licenseToken || null,
311
- enterpriseLicenseIsEvaluation: isEvaluationLicense,
312
- enterpriseLicenseUserLimit: userLimit,
313
- enterpriseLicenseCurrentUserCount: currentUserCount,
314
- enterpriseLicenseUserCountUpdatedAt: userCountUpdatedAt,
315
- enterpriseLicenseInstances: instances,
316
- };
317
-
318
- if (!existingConfig?.instanceId) {
319
- // Installs that predate instance ids: persist the one we generated.
320
- updatePayload.instanceId = instanceId;
321
- }
277
+ const responseBody: JSONObject =
278
+ await this.validateAndStoreLicenseKey(licenseKey);
322
279
 
323
- if (existingConfig) {
324
- await GlobalConfigService.updateOneById({
325
- id: globalConfigId,
326
- data: updatePayload,
327
- props: {
328
- isRoot: true,
329
- ignoreHooks: true,
330
- },
331
- });
332
- } else {
333
- const newConfig: GlobalConfig = new GlobalConfig();
334
- newConfig.id = globalConfigId;
335
-
336
- if (companyNameRaw) {
337
- newConfig.enterpriseCompanyName = companyNameRaw;
338
- }
339
-
340
- if (licenseKeyRaw) {
341
- newConfig.enterpriseLicenseKey = licenseKeyRaw;
342
- }
343
-
344
- if (licenseToken) {
345
- newConfig.enterpriseLicenseToken = licenseToken;
346
- }
347
-
348
- newConfig.enterpriseLicenseIsEvaluation = isEvaluationLicense;
349
-
350
- if (licenseExpiry) {
351
- newConfig.enterpriseLicenseExpiresAt = licenseExpiry;
352
- }
353
-
354
- if (userLimit !== null) {
355
- newConfig.enterpriseLicenseUserLimit = userLimit;
356
- }
357
-
358
- if (currentUserCount !== null) {
359
- newConfig.enterpriseLicenseCurrentUserCount = currentUserCount;
360
- }
361
-
362
- if (userCountUpdatedAt) {
363
- newConfig.enterpriseLicenseUserCountUpdatedAt =
364
- userCountUpdatedAt;
365
- }
366
-
367
- newConfig.enterpriseLicenseInstances = instances;
368
- newConfig.instanceId = instanceId;
369
-
370
- await GlobalConfigService.create({
371
- data: newConfig,
372
- props: {
373
- isRoot: true,
374
- ignoreHooks: true,
375
- },
376
- });
377
- }
378
-
379
- return Response.sendJsonObjectResponse(req, res, {
380
- companyName: companyNameRaw || null,
381
- expiresAt: licenseExpiry ? licenseExpiry.toISOString() : null,
382
- licenseKey: licenseKeyRaw || null,
383
- token: licenseToken || null,
384
- isEvaluationLicense: isEvaluationLicense,
385
- userLimit: userLimit,
386
- currentUserCount: currentUserCount,
387
- userCountUpdatedAt: userCountUpdatedAt
388
- ? userCountUpdatedAt.toISOString()
389
- : null,
390
- instances: instances,
391
- instanceId: instanceId.toString(),
392
- });
280
+ return Response.sendJsonObjectResponse(req, res, responseBody);
393
281
  } catch (err) {
394
282
  next(err);
395
283
  }
396
284
  },
397
285
  );
398
286
  }
287
+
288
+ /*
289
+ * Ask oneuptime.com what this license key is worth today, and mirror the
290
+ * answer into GlobalConfig.
291
+ *
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.
296
+ */
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,
414
+ };
415
+
416
+ if (!existingConfig?.instanceId) {
417
+ // Installs that predate instance ids: persist the one we generated.
418
+ updatePayload.instanceId = instanceId;
419
+ }
420
+
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
+ }
475
+
476
+ /*
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.
481
+ */
482
+ const seatUsage: SeatUsage | null =
483
+ await GlobalConfigAPI.getSeatUsageForResponse({
484
+ userLimit: userLimit,
485
+ currentUserCount: currentUserCount,
486
+ instances: instances,
487
+ instanceId: instanceId,
488
+ });
489
+
490
+ 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()
500
+ : null,
501
+ instances: instances,
502
+ instanceId: instanceId.toString(),
503
+ ...GlobalConfigAPI.getSeatUsageResponseFields(seatUsage),
504
+ };
505
+ }
506
+
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;
524
+ }
525
+
526
+ if (data.currentUserCount !== null) {
527
+ config.enterpriseLicenseCurrentUserCount = data.currentUserCount;
528
+ }
529
+
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();
551
+ }
552
+
553
+ /*
554
+ * The seat-enforcement half of a license response. Always the same keys, so
555
+ * a client never has to tell "this build does not report seats" apart from
556
+ * "this installation does not enforce them" by which fields are missing:
557
+ * isSeatLimitEnforced is the single flag that answers that.
558
+ */
559
+ private static getSeatUsageResponseFields(
560
+ seatUsage: SeatUsage | null,
561
+ ): JSONObject {
562
+ if (!seatUsage || !seatUsage.isEnforced) {
563
+ return {
564
+ isSeatLimitEnforced: false,
565
+ seatsInUse: null,
566
+ seatsRemaining: null,
567
+ canAddMoreUsers: true,
568
+ };
569
+ }
570
+
571
+ return {
572
+ isSeatLimitEnforced: true,
573
+ seatsInUse: seatUsage.seatsInUse,
574
+ seatsRemaining: seatUsage.seatsRemaining,
575
+ canAddMoreUsers: seatUsage.hasSeatForNewUser,
576
+ };
577
+ }
399
578
  }