@oneuptime/common 12.0.30 → 12.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/NetworkDevice.ts +113 -3
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +112 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Types/Date.ts +39 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/Permission.ts +96 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +83 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +86 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +2 -2
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
260
|
+
id: ObjectID.getZeroObjectID(),
|
|
203
261
|
select: {
|
|
204
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
|
297
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -14,7 +14,9 @@ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCom
|
|
|
14
14
|
import TelemetryType from "../../Types/Telemetry/TelemetryType";
|
|
15
15
|
import TelemetryAttributeService from "../Services/TelemetryAttributeService";
|
|
16
16
|
import TelemetrySourceMapService from "../Services/TelemetrySourceMapService";
|
|
17
|
-
import SourceMapResolver
|
|
17
|
+
import SourceMapResolver, {
|
|
18
|
+
MAX_FRAMES_PER_RESOLVE_REQUEST,
|
|
19
|
+
} from "../Utils/Telemetry/SourceMapResolver";
|
|
18
20
|
import {
|
|
19
21
|
MinifiedStackFrame,
|
|
20
22
|
ResolveStackTraceResult,
|
|
@@ -214,10 +216,28 @@ const requireProfileReadAccess: Array<RequestHandler> =
|
|
|
214
216
|
|
|
215
217
|
/*
|
|
216
218
|
* Mirrors the read access control declared on the SecurityEvent analytics
|
|
217
|
-
* model.
|
|
219
|
+
* model - which, unlike every other signal above, is NOT the telemetry list.
|
|
220
|
+
* Security events read through the Security tiers only, so this route cannot
|
|
221
|
+
* be built from createTelemetryReadAccessGuard: doing so would leave the
|
|
222
|
+
* attribute endpoints open to ProjectMember and the Telemetry tiers while the
|
|
223
|
+
* model-backed CRUD API refused them, and the attribute keys and values of a
|
|
224
|
+
* SIEM table are themselves the sensitive part - usernames, hostnames, source
|
|
225
|
+
* IPs, and every value seen for them.
|
|
218
226
|
*/
|
|
219
|
-
const requireSecurityEventReadAccess: Array<RequestHandler> =
|
|
220
|
-
|
|
227
|
+
const requireSecurityEventReadAccess: Array<RequestHandler> = [
|
|
228
|
+
UserMiddleware.getUserMiddleware,
|
|
229
|
+
UserMiddleware.requireUserAuthentication,
|
|
230
|
+
UserMiddleware.requirePermission({
|
|
231
|
+
permissions: [
|
|
232
|
+
Permission.ProjectOwner,
|
|
233
|
+
Permission.ProjectAdmin,
|
|
234
|
+
Permission.SecurityAdmin,
|
|
235
|
+
Permission.SecurityMember,
|
|
236
|
+
Permission.SecurityViewer,
|
|
237
|
+
Permission.ReadSecurityEvent,
|
|
238
|
+
],
|
|
239
|
+
}),
|
|
240
|
+
];
|
|
221
241
|
|
|
222
242
|
router.post(
|
|
223
243
|
"/telemetry/metrics/get-attributes",
|
|
@@ -346,6 +366,24 @@ router.post(
|
|
|
346
366
|
);
|
|
347
367
|
}
|
|
348
368
|
|
|
369
|
+
/*
|
|
370
|
+
* Bound the array before sanitizing it. sanitizeMinifiedStackFrames
|
|
371
|
+
* never throws and never truncates, so without this the only limit on
|
|
372
|
+
* the work a caller can ask for is the body-size cap.
|
|
373
|
+
*/
|
|
374
|
+
if (
|
|
375
|
+
(body["frames"] as Array<unknown>).length >
|
|
376
|
+
MAX_FRAMES_PER_RESOLVE_REQUEST
|
|
377
|
+
) {
|
|
378
|
+
return Response.sendErrorResponse(
|
|
379
|
+
req,
|
|
380
|
+
res,
|
|
381
|
+
new BadDataException(
|
|
382
|
+
`frames must contain at most ${MAX_FRAMES_PER_RESOLVE_REQUEST} stack frames.`,
|
|
383
|
+
),
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
|
|
349
387
|
const frames: Array<MinifiedStackFrame> =
|
|
350
388
|
SourceMapResolver.sanitizeMinifiedStackFrames(body["frames"]);
|
|
351
389
|
|