@oneuptime/common 12.0.2 → 12.0.4
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/DatabaseModels/CephCluster.ts +14 -0
- package/Models/DatabaseModels/CodeRepository.ts +14 -6
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
- package/Models/DatabaseModels/DockerHost.ts +14 -0
- package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
- package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/IoTFleet.ts +14 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
- package/Models/DatabaseModels/LogDropFilter.ts +9 -20
- package/Models/DatabaseModels/NetworkDevice.ts +14 -0
- package/Models/DatabaseModels/NetworkInterface.ts +18 -0
- package/Models/DatabaseModels/Project.ts +16 -2
- package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
- package/Models/DatabaseModels/Service.ts +30 -0
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
- package/Models/DatabaseModels/StatusPageResource.ts +73 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
- package/Models/DatabaseModels/User.ts +30 -0
- package/Server/API/AIAgentDataAPI.ts +31 -0
- package/Server/API/BaseAPI.ts +13 -2
- package/Server/API/DashboardAPI.ts +458 -12
- package/Server/API/GitHubAPI.ts +119 -283
- package/Server/API/UserAPI.ts +263 -1
- package/Server/EnvironmentConfig.ts +38 -4
- package/Server/Infrastructure/GlobalCache.ts +152 -0
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Services/AlertStateTimelineService.ts +20 -0
- package/Server/Services/AnalyticsDatabaseService.ts +72 -1
- package/Server/Services/CephClusterService.ts +26 -86
- package/Server/Services/CloudResourceService.ts +23 -83
- package/Server/Services/CodeRepositoryService.ts +105 -2
- package/Server/Services/DatabaseService.ts +296 -2
- package/Server/Services/DockerHostService.ts +19 -79
- package/Server/Services/DockerSwarmClusterService.ts +27 -88
- package/Server/Services/HostService.ts +46 -99
- package/Server/Services/IncidentStateTimelineService.ts +20 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetService.ts +19 -79
- package/Server/Services/KubernetesClusterService.ts +17 -78
- package/Server/Services/LabelService.ts +57 -10
- package/Server/Services/MetricTypeService.ts +84 -0
- package/Server/Services/MonitorService.ts +89 -14
- package/Server/Services/MonitorStatusTimelineService.ts +29 -0
- package/Server/Services/MonitorTemplateService.ts +65 -0
- package/Server/Services/OpenTelemetryIngestService.ts +230 -26
- package/Server/Services/PodmanHostService.ts +19 -79
- package/Server/Services/ProxmoxClusterService.ts +23 -83
- package/Server/Services/RumApplicationService.ts +19 -80
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
- package/Server/Services/ServerlessFunctionService.ts +24 -85
- package/Server/Services/ServiceService.ts +299 -73
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
- package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
- package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
- package/Server/Services/TelemetryEntityService.ts +1 -0
- package/Server/Services/UserService.ts +184 -0
- package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
- package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
- package/Server/Utils/Monitor/MonitorResource.ts +63 -36
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
- package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
- package/Server/Utils/PasswordHash.ts +306 -0
- package/Server/Utils/SingleFlight.ts +83 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
- package/Server/Utils/Telemetry/Telemetry.ts +351 -122
- package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
- package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
- package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
- package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
- package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
- package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
- package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
- package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
- package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
- package/Tests/Server/API/Helpers.ts +6 -1
- package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +354 -0
- package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
- package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +5 -0
- package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
- package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +870 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +163 -15
- package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
- package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
- package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +305 -56
- package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
- package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
- package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
- package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
- package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
- package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
- package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
- package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
- package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
- package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
- package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
- package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
- package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
- package/Tests/Server/Utils/PasswordHash.test.ts +555 -0
- package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
- package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
- package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
- package/Tests/Types/Database/ColumnLength.test.ts +7 -1
- package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
- package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
- package/Tests/Types/Decimal.test.ts +37 -0
- package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
- package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
- package/Tests/Types/Port.test.ts +38 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
- package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
- package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
- package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
- package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
- package/Types/Dashboard/DashboardTemplates.ts +397 -0
- package/Types/Database/BigIntColumnTransformer.ts +74 -0
- package/Types/Database/ColumnLength.ts +9 -1
- package/Types/Database/DatabaseProperty.ts +26 -0
- package/Types/Database/NumericColumnValue.ts +128 -0
- package/Types/Database/TableColumn.ts +11 -0
- package/Types/Database/UnsynchronizedIndex.ts +48 -0
- package/Types/Decimal.ts +16 -4
- package/Types/HashedString.ts +139 -4
- package/Types/Permission.ts +48 -0
- package/Types/Port.ts +16 -4
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
- package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
- package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
- package/UI/Components/Navbar/NavBar.tsx +12 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
- package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
- package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/TeamMembersByProject.ts +237 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.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/IoTFleet.js +16 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +16 -2
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +28 -1
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +32 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +21 -2
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +11 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +343 -10
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +94 -167
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +187 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +34 -4
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +120 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +57 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +26 -76
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +23 -73
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +246 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +19 -69
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -78
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +58 -102
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.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/IoTFleetService.js +19 -69
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +17 -68
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +42 -7
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MetricTypeService.js +74 -0
- package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +81 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +19 -69
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -73
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +19 -70
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +24 -75
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +236 -61
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +165 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
- package/build/dist/Server/Utils/PasswordHash.js +237 -0
- package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
- package/build/dist/Server/Utils/SingleFlight.js +76 -0
- package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
- package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
- package/build/dist/Types/Database/ColumnLength.js +9 -1
- package/build/dist/Types/Database/ColumnLength.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +25 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/NumericColumnValue.js +97 -0
- package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
- package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
- package/build/dist/Types/Decimal.js +14 -3
- package/build/dist/Types/Decimal.js.map +1 -1
- package/build/dist/Types/HashedString.js +95 -5
- package/build/dist/Types/HashedString.js.map +1 -1
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Port.js +15 -5
- package/build/dist/Types/Port.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
- package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
- package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/TeamMembersByProject.js +145 -0
- package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
- package/package.json +1 -1
|
@@ -16,10 +16,77 @@ import logger from "../Utils/Logger";
|
|
|
16
16
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
17
17
|
import { resolveRepositoryForExceptionFix, } from "../Utils/CodeRepository/StackTraceRepoResolver";
|
|
18
18
|
import GitHubUtil from "../Utils/CodeRepository/GitHub/GitHub";
|
|
19
|
+
import GitHubInstallationBinding from "../Utils/CodeRepository/GitHub/GitHubInstallationBinding";
|
|
20
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
19
21
|
export class Service extends DatabaseService {
|
|
20
22
|
constructor() {
|
|
21
23
|
super(Model);
|
|
22
24
|
}
|
|
25
|
+
/*
|
|
26
|
+
* Last line of defence for the installation-to-project binding.
|
|
27
|
+
*
|
|
28
|
+
* gitHubAppInstallationId is already closed to API callers at the column
|
|
29
|
+
* level, but that only stops requests that go through permission checks —
|
|
30
|
+
* every write here is made with `props: { isRoot: true }`, which skips them
|
|
31
|
+
* entirely. This hook runs regardless of isRoot, so any route (including one
|
|
32
|
+
* added later) that writes a row carrying another tenant's installation ID
|
|
33
|
+
* is refused at the service boundary rather than at the token endpoint.
|
|
34
|
+
*
|
|
35
|
+
* The legitimate writer is importReposFromInstallation, which the install
|
|
36
|
+
* callback and the installation webhooks only ever call for a project the
|
|
37
|
+
* installation is already bound to — so this check passes for them.
|
|
38
|
+
*/
|
|
39
|
+
async onBeforeCreate(createBy) {
|
|
40
|
+
const installationId = createBy.data.gitHubAppInstallationId;
|
|
41
|
+
if (installationId) {
|
|
42
|
+
const projectId = createBy.data.projectId || createBy.props.tenantId;
|
|
43
|
+
if (!projectId) {
|
|
44
|
+
throw new BadDataException("A project is required to connect a GitHub App installation to a repository.");
|
|
45
|
+
}
|
|
46
|
+
await GitHubInstallationBinding.assertInstallationBoundToProject({
|
|
47
|
+
projectId: projectId,
|
|
48
|
+
installationId: installationId,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return { createBy, carryForward: null };
|
|
52
|
+
}
|
|
53
|
+
/*
|
|
54
|
+
* Same rule on the update path. Clearing the installation ID is always
|
|
55
|
+
* allowed — that is how the `installation.deleted` webhook tears a
|
|
56
|
+
* disconnected installation out of the database.
|
|
57
|
+
*/
|
|
58
|
+
async onBeforeUpdate(updateBy) {
|
|
59
|
+
const installationId = updateBy.data
|
|
60
|
+
.gitHubAppInstallationId;
|
|
61
|
+
if (installationId) {
|
|
62
|
+
/*
|
|
63
|
+
* updateBy matches by query rather than by id, so check every row the
|
|
64
|
+
* write would touch: one unbound row is enough to leak a token.
|
|
65
|
+
*/
|
|
66
|
+
const repositories = await this.findBy({
|
|
67
|
+
query: updateBy.query,
|
|
68
|
+
select: {
|
|
69
|
+
_id: true,
|
|
70
|
+
projectId: true,
|
|
71
|
+
},
|
|
72
|
+
limit: LIMIT_MAX,
|
|
73
|
+
skip: 0,
|
|
74
|
+
props: {
|
|
75
|
+
isRoot: true,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
for (const repository of repositories) {
|
|
79
|
+
if (!repository.projectId) {
|
|
80
|
+
throw new BadDataException("A project is required to connect a GitHub App installation to a repository.");
|
|
81
|
+
}
|
|
82
|
+
await GitHubInstallationBinding.assertInstallationBoundToProject({
|
|
83
|
+
projectId: repository.projectId,
|
|
84
|
+
installationId: installationId,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { updateBy, carryForward: null };
|
|
89
|
+
}
|
|
23
90
|
/*
|
|
24
91
|
* Imports all repositories accessible to a GitHub App installation into a
|
|
25
92
|
* project. Repositories that already exist for the project (matched on
|
|
@@ -138,12 +205,21 @@ export class Service extends DatabaseService {
|
|
|
138
205
|
isRoot: true,
|
|
139
206
|
},
|
|
140
207
|
});
|
|
141
|
-
|
|
208
|
+
/*
|
|
209
|
+
* Only GitHub-App-connected repos can be cloned/pushed by the agent — and
|
|
210
|
+
* only ones whose installation this project actually owns. Resolution
|
|
211
|
+
* probes EVERY candidate's file tree, so an unbound row here would have
|
|
212
|
+
* the server read another tenant's private repository on its own
|
|
213
|
+
* initiative (GHSA-xx95-gmcf-7q86).
|
|
214
|
+
*/
|
|
215
|
+
const boundInstallationId = await GitHubInstallationBinding.getBoundInstallationId(data.projectId);
|
|
142
216
|
const resolvable = repositories
|
|
143
217
|
.filter((repository) => {
|
|
144
218
|
return (repository.repositoryHostedAt === CodeRepositoryType.GitHub &&
|
|
145
219
|
Boolean(repository.gitHubAppInstallationId) &&
|
|
146
|
-
Boolean(repository.id)
|
|
220
|
+
Boolean(repository.id) &&
|
|
221
|
+
Boolean(boundInstallationId) &&
|
|
222
|
+
repository.gitHubAppInstallationId === boundInstallationId);
|
|
147
223
|
})
|
|
148
224
|
.map((repository) => {
|
|
149
225
|
return {
|
|
@@ -173,6 +249,18 @@ export class Service extends DatabaseService {
|
|
|
173
249
|
});
|
|
174
250
|
}
|
|
175
251
|
}
|
|
252
|
+
__decorate([
|
|
253
|
+
CaptureSpan(),
|
|
254
|
+
__metadata("design:type", Function),
|
|
255
|
+
__metadata("design:paramtypes", [Object]),
|
|
256
|
+
__metadata("design:returntype", Promise)
|
|
257
|
+
], Service.prototype, "onBeforeCreate", null);
|
|
258
|
+
__decorate([
|
|
259
|
+
CaptureSpan(),
|
|
260
|
+
__metadata("design:type", Function),
|
|
261
|
+
__metadata("design:paramtypes", [Object]),
|
|
262
|
+
__metadata("design:returntype", Promise)
|
|
263
|
+
], Service.prototype, "onBeforeUpdate", null);
|
|
176
264
|
__decorate([
|
|
177
265
|
CaptureSpan(),
|
|
178
266
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeRepositoryService.js","sourceRoot":"","sources":["../../../../Server/Services/CodeRepositoryService.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,MAAM,4CAA4C,CAAC;AAE/D,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,kBAAkB,MAAM,+CAA+C,CAAC;AAC/E,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAGL,gCAAgC,GACjC,MAAM,gDAAgD,CAAC;AACxD,OAAO,UAEN,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"CodeRepositoryService.js","sourceRoot":"","sources":["../../../../Server/Services/CodeRepositoryService.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ import ClusterKeyAuthorization from "../Middleware/ClusterKeyAuthorization";
|
|
|
24
24
|
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
25
25
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
26
26
|
import Encryption from "../Utils/Encryption";
|
|
27
|
+
import PasswordHash from "../Utils/PasswordHash";
|
|
27
28
|
import PostgresErrorTranslator from "../Utils/Database/PostgresErrorTranslator";
|
|
28
29
|
import logger from "../Utils/Logger";
|
|
29
30
|
import BaseService from "./BaseService";
|
|
@@ -222,16 +223,135 @@ class DatabaseService extends BaseService {
|
|
|
222
223
|
}
|
|
223
224
|
return data;
|
|
224
225
|
}
|
|
226
|
+
/*
|
|
227
|
+
* Hash one HashedString column in place.
|
|
228
|
+
*
|
|
229
|
+
* Declaring `hashSaltColumn` on a column is what marks it a CREDENTIAL —
|
|
230
|
+
* a low-entropy, human-chosen secret. Those go through scrypt (see
|
|
231
|
+
* PasswordHash): deliberately slow and memory-hard, with a fresh per-record
|
|
232
|
+
* salt minted into the sibling column named by the metadata.
|
|
233
|
+
*
|
|
234
|
+
* Columns without a salt column are high-entropy values the server itself
|
|
235
|
+
* generated — session refresh tokens and the like. They keep the fast
|
|
236
|
+
* SHA-256 hash, which is the right tool for them: there is nothing to guess,
|
|
237
|
+
* and they have to stay searchable by hash because that is how they are
|
|
238
|
+
* looked up.
|
|
239
|
+
*
|
|
240
|
+
* The salt is written onto the SAME payload as the hash, so the pair can
|
|
241
|
+
* never be persisted out of step with each other.
|
|
242
|
+
*
|
|
243
|
+
* The salt column grants nobody create or update rights, so it has to get
|
|
244
|
+
* past the column-permission check some other way on each path. On update
|
|
245
|
+
* it does so by timing — sanitizeCreateOrUpdate runs after the check. On
|
|
246
|
+
* create the check runs after `hash()`, so the salt column relies on being
|
|
247
|
+
* declared `computed: true`, which checkDataColumnPermissions skips on
|
|
248
|
+
* create. A salt column that forgets that flag breaks every non-root
|
|
249
|
+
* create of a row carrying a password.
|
|
250
|
+
*/
|
|
251
|
+
async hashColumnValue(data) {
|
|
252
|
+
var _a;
|
|
253
|
+
const saltColumnName = (_a = this.model.getTableColumnMetadata(data.columnName)) === null || _a === void 0 ? void 0 : _a.hashSaltColumn;
|
|
254
|
+
if (!saltColumnName) {
|
|
255
|
+
await data.columnValue.hashValue(EncryptionSecret);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const salt = PasswordHash.generateSalt();
|
|
259
|
+
data.payload[saltColumnName] = salt;
|
|
260
|
+
data.columnValue.setHashedValue(await PasswordHash.hash({
|
|
261
|
+
plainValue: data.columnValue.toString(),
|
|
262
|
+
salt: salt,
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
225
265
|
async hash(data) {
|
|
226
266
|
const columns = data.getHashedColumns();
|
|
227
267
|
for (const key of columns.columns) {
|
|
228
268
|
if (data.hasValue(key) &&
|
|
229
269
|
!data.getValue(key).isValueHashed()) {
|
|
230
|
-
await
|
|
270
|
+
await this.hashColumnValue({
|
|
271
|
+
payload: data,
|
|
272
|
+
columnName: key,
|
|
273
|
+
columnValue: data[key],
|
|
274
|
+
});
|
|
231
275
|
}
|
|
232
276
|
}
|
|
233
277
|
return data;
|
|
234
278
|
}
|
|
279
|
+
/*
|
|
280
|
+
* Check a plaintext secret (a password) against a hashed column on a row
|
|
281
|
+
* that has already been read out of the database, and re-hash the stored
|
|
282
|
+
* value in place when it was not written by today's scheme.
|
|
283
|
+
*
|
|
284
|
+
* The row must have been selected with BOTH the hashed column and its salt
|
|
285
|
+
* column. Without the salt a scrypt hash cannot be checked at all, and an
|
|
286
|
+
* older SHA-256 one would be checked against the wrong scheme — either way
|
|
287
|
+
* a perfectly good password gets rejected. PasswordHash.verify throws
|
|
288
|
+
* rather than silently returning false for the scrypt case, because a
|
|
289
|
+
* missing SELECT is a bug and must not look like a bad password.
|
|
290
|
+
*
|
|
291
|
+
* Why the caller cannot just query by the hash any more: with a per-user
|
|
292
|
+
* salt the hash is not computable until the row's own salt is known, so
|
|
293
|
+
* `WHERE password = <hash>` has nothing to bind. Read the row by its
|
|
294
|
+
* identity (email, id) and verify here.
|
|
295
|
+
*
|
|
296
|
+
* THE UPGRADE. Anything that is not exactly what PasswordHash writes today
|
|
297
|
+
* is re-hashed once the password is known to be correct: the two SHA-256
|
|
298
|
+
* schemes that preceded scrypt, and any scrypt hash whose cost parameters
|
|
299
|
+
* have since been raised. That is what makes raising the cost a one-line
|
|
300
|
+
* change — users migrate as they log in, with no reset and no migration.
|
|
301
|
+
*
|
|
302
|
+
* The write is deliberately hook-free and leaves updatedAt alone: the user
|
|
303
|
+
* did not change their password, the server changed how it stores it.
|
|
304
|
+
* Firing the password-change hooks would revoke every session and mail the
|
|
305
|
+
* user about a change they did not make. A failed upgrade is logged and
|
|
306
|
+
* swallowed — a correct password must not be rejected because a
|
|
307
|
+
* bookkeeping write lost a race.
|
|
308
|
+
*/
|
|
309
|
+
async verifyHashedColumnValue(data) {
|
|
310
|
+
var _a, _b;
|
|
311
|
+
const storedHash = (_a = data.item[data.columnName]) === null || _a === void 0 ? void 0 : _a.toString();
|
|
312
|
+
if (!storedHash || !data.plainValue) {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
const saltColumnName = (_b = this.model.getTableColumnMetadata(data.columnName)) === null || _b === void 0 ? void 0 : _b.hashSaltColumn;
|
|
316
|
+
const salt = saltColumnName
|
|
317
|
+
? data.item[saltColumnName] || null
|
|
318
|
+
: null;
|
|
319
|
+
const isValid = await PasswordHash.verify({
|
|
320
|
+
plainValue: data.plainValue,
|
|
321
|
+
storedValue: storedHash,
|
|
322
|
+
salt: salt,
|
|
323
|
+
});
|
|
324
|
+
if (!isValid) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
if (saltColumnName &&
|
|
328
|
+
data.item.id &&
|
|
329
|
+
PasswordHash.needsUpgrade(storedHash)) {
|
|
330
|
+
try {
|
|
331
|
+
const newSalt = PasswordHash.generateSalt();
|
|
332
|
+
await this.updateColumnsByIdWithoutHooks({
|
|
333
|
+
id: data.item.id,
|
|
334
|
+
data: {
|
|
335
|
+
[data.columnName]: await PasswordHash.hash({
|
|
336
|
+
plainValue: data.plainValue,
|
|
337
|
+
salt: newSalt,
|
|
338
|
+
}),
|
|
339
|
+
[saltColumnName]: newSalt,
|
|
340
|
+
},
|
|
341
|
+
skipUpdateDateColumn: true,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
/*
|
|
346
|
+
* `data.item` is deliberately left holding the old hash and old salt,
|
|
347
|
+
* so it stays an internally consistent pair whether or not the write
|
|
348
|
+
* above landed.
|
|
349
|
+
*/
|
|
350
|
+
logger.error(err);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
235
355
|
async decrypt(data) {
|
|
236
356
|
for (const key of data.getEncryptedColumns().columns) {
|
|
237
357
|
if (!data.hasValue(key)) {
|
|
@@ -326,6 +446,7 @@ class DatabaseService extends BaseService {
|
|
|
326
446
|
return createBy;
|
|
327
447
|
}
|
|
328
448
|
async sanitizeCreateOrUpdate(data, props, isUpdate = false) {
|
|
449
|
+
var _a;
|
|
329
450
|
data = this.checkMaxLengthOfFields(data);
|
|
330
451
|
const columns = this.model.getTableColumns();
|
|
331
452
|
for (const columnName of columns.columns) {
|
|
@@ -380,12 +501,43 @@ class DatabaseService extends BaseService {
|
|
|
380
501
|
}
|
|
381
502
|
if (this.model.isHashedStringColumn(columnName)) {
|
|
382
503
|
const columnValue = data[columnName];
|
|
504
|
+
/*
|
|
505
|
+
* A salted column's hash and its salt are only ever correct as a
|
|
506
|
+
* pair. A write that supplies the column as a bare string skips the
|
|
507
|
+
* hashing branch below, leaving the row's existing salt attached to
|
|
508
|
+
* a value it was not computed from — which locks the account out
|
|
509
|
+
* silently, at the next login, far from whatever wrote it. Refuse
|
|
510
|
+
* instead. Callers pass a HashedString; the write path hashes it.
|
|
511
|
+
*/
|
|
512
|
+
if (data &&
|
|
513
|
+
columnName &&
|
|
514
|
+
columnValue &&
|
|
515
|
+
!(columnValue instanceof HashedString) &&
|
|
516
|
+
((_a = this.model.getTableColumnMetadata(columnName)) === null || _a === void 0 ? void 0 : _a.hashSaltColumn)) {
|
|
517
|
+
throw new BadDataException(`${columnName} is a salted column and must be supplied as a HashedString, not a pre-hashed value.`);
|
|
518
|
+
}
|
|
383
519
|
if (data &&
|
|
384
520
|
columnName &&
|
|
385
521
|
columnValue &&
|
|
386
522
|
columnValue instanceof HashedString) {
|
|
387
523
|
if (!columnValue.isValueHashed()) {
|
|
388
|
-
|
|
524
|
+
/*
|
|
525
|
+
* The update path never runs `hash()`, so this is where an
|
|
526
|
+
* updated password gets both hashed and salted. The salt lands
|
|
527
|
+
* on `data`, which the caller turns into the SET list, so the
|
|
528
|
+
* new hash and the salt it was computed with are written by the
|
|
529
|
+
* same statement.
|
|
530
|
+
*
|
|
531
|
+
* An update matching several rows writes the same salt to all of
|
|
532
|
+
* them, which is correct: they are all being set to the same
|
|
533
|
+
* value by one statement. Per-row salts come from per-row
|
|
534
|
+
* writes.
|
|
535
|
+
*/
|
|
536
|
+
await this.hashColumnValue({
|
|
537
|
+
payload: data,
|
|
538
|
+
columnName: columnName,
|
|
539
|
+
columnValue: columnValue,
|
|
540
|
+
});
|
|
389
541
|
}
|
|
390
542
|
data[columnName] = columnValue.toString();
|
|
391
543
|
}
|
|
@@ -1698,6 +1850,86 @@ class DatabaseService extends BaseService {
|
|
|
1698
1850
|
const sql = `UPDATE "${metadata.tableName}" SET ${setClauses.join(", ")} WHERE "${primaryColumnName}" = $${params.length}`;
|
|
1699
1851
|
await repository.manager.query(sql, params);
|
|
1700
1852
|
}
|
|
1853
|
+
/*
|
|
1854
|
+
* Same single-statement, hook-free, no-version-bump write as
|
|
1855
|
+
* `updateColumnsByIdWithoutHooks`, except it YIELDS instead of queueing:
|
|
1856
|
+
* if another transaction already holds the row's lock, this write is
|
|
1857
|
+
* abandoned and the method returns false. It never waits.
|
|
1858
|
+
*
|
|
1859
|
+
* Why this exists. A single-statement UPDATE holds its row lock for a very
|
|
1860
|
+
* short time, but "short" does not mean "safe" once the arrival rate on ONE
|
|
1861
|
+
* row exceeds the service rate. Postgres queues lock waiters strictly, so
|
|
1862
|
+
* every waiter pins a backend for the sum of everyone ahead of it — the
|
|
1863
|
+
* classic convoy. In the outage this was written for, ~25K concurrent
|
|
1864
|
+
* ingest jobs across 100 worker pods funnelled onto ~2,300 Service rows and
|
|
1865
|
+
* produced 1,017 active connections with 892 of them parked on row locks;
|
|
1866
|
+
* the tail had been waiting 3.7 hours. Nothing about that is fixable by
|
|
1867
|
+
* making the statement faster, and no Postgres tier changes it: the queue
|
|
1868
|
+
* is the bug.
|
|
1869
|
+
*
|
|
1870
|
+
* `FOR UPDATE SKIP LOCKED` inverts it. A contended writer does zero work
|
|
1871
|
+
* and returns immediately, so the number of backends blocked on any single
|
|
1872
|
+
* row is capped at ONE no matter how many workers arrive together. The
|
|
1873
|
+
* convoy cannot form — and cannot form even if every upstream throttle
|
|
1874
|
+
* fails open at once (Redis down, fence bug, cache flush). That is the
|
|
1875
|
+
* point: this is the structural backstop underneath the throttles, not a
|
|
1876
|
+
* second copy of them.
|
|
1877
|
+
*
|
|
1878
|
+
* Use ONLY where losing the write is harmless because a concurrent writer
|
|
1879
|
+
* is writing the same thing — liveness timestamps and other idempotent
|
|
1880
|
+
* bookkeeping, whose contended value is by construction the value the
|
|
1881
|
+
* winner is already storing. It is the WRONG primitive for a write carrying
|
|
1882
|
+
* information the winner does not have (a changed attribute); for those the
|
|
1883
|
+
* caller must re-attempt, and `false` is the signal to do it. Returning a
|
|
1884
|
+
* boolean rather than swallowing the skip is deliberate: a silent drop here
|
|
1885
|
+
* would be indistinguishable from a successful write at the call site,
|
|
1886
|
+
* which is exactly how a "reliable" heartbeat quietly stops beating.
|
|
1887
|
+
*
|
|
1888
|
+
* Returns true when the row was updated, false when it was locked (or no
|
|
1889
|
+
* longer exists).
|
|
1890
|
+
*/
|
|
1891
|
+
async updateColumnsByIdIfUnlockedWithoutHooks(input) {
|
|
1892
|
+
var _a;
|
|
1893
|
+
if (!input.id) {
|
|
1894
|
+
throw new BadDataException("id is required");
|
|
1895
|
+
}
|
|
1896
|
+
const repository = this.getRepository();
|
|
1897
|
+
const metadata = repository.metadata;
|
|
1898
|
+
const driver = repository.manager.connection.driver;
|
|
1899
|
+
const setClauses = [];
|
|
1900
|
+
const params = [];
|
|
1901
|
+
// Clamp on a shallow COPY — see updateColumnsByIdWithoutHooks.
|
|
1902
|
+
const data = this.truncateStringColumnsToMaxLength(Object.assign({}, input.data));
|
|
1903
|
+
for (const [propertyName, value] of Object.entries(data)) {
|
|
1904
|
+
const column = metadata.findColumnWithPropertyName(propertyName);
|
|
1905
|
+
if (!column) {
|
|
1906
|
+
throw new BadDataException(`updateColumnsByIdIfUnlockedWithoutHooks: unknown column "${propertyName}" on "${metadata.tableName}"`);
|
|
1907
|
+
}
|
|
1908
|
+
if (typeof value === "function") {
|
|
1909
|
+
throw new BadDataException(`updateColumnsByIdIfUnlockedWithoutHooks: SQL-expression values are not supported (column "${propertyName}"); pass a literal value.`);
|
|
1910
|
+
}
|
|
1911
|
+
params.push(driver.preparePersistentValue(value, column));
|
|
1912
|
+
setClauses.push(`"${column.databaseName}" = $${params.length}`);
|
|
1913
|
+
}
|
|
1914
|
+
if (setClauses.length === 0) {
|
|
1915
|
+
return false;
|
|
1916
|
+
}
|
|
1917
|
+
if (metadata.updateDateColumn && !input.skipUpdateDateColumn) {
|
|
1918
|
+
setClauses.push(`"${metadata.updateDateColumn.databaseName}" = CURRENT_TIMESTAMP`);
|
|
1919
|
+
}
|
|
1920
|
+
const primaryColumnName = ((_a = metadata.primaryColumns[0]) === null || _a === void 0 ? void 0 : _a.databaseName) || "_id";
|
|
1921
|
+
params.push(input.id.toString());
|
|
1922
|
+
/*
|
|
1923
|
+
* The lock is taken by the sub-SELECT and inherited by the UPDATE within
|
|
1924
|
+
* the same implicit transaction, so the outer write never blocks either.
|
|
1925
|
+
* RETURNING is how the affected-row count comes back: TypeORM's `query()`
|
|
1926
|
+
* surfaces the driver's rows and a bare UPDATE returns none, so without it
|
|
1927
|
+
* a skipped write is indistinguishable from an applied one.
|
|
1928
|
+
*/
|
|
1929
|
+
const sql = `UPDATE "${metadata.tableName}" SET ${setClauses.join(", ")} WHERE "${primaryColumnName}" IN (SELECT "${primaryColumnName}" FROM "${metadata.tableName}" WHERE "${primaryColumnName}" = $${params.length} FOR UPDATE SKIP LOCKED) RETURNING "${primaryColumnName}"`;
|
|
1930
|
+
const result = await repository.manager.query(sql, params);
|
|
1931
|
+
return Array.isArray(result) && result.length > 0;
|
|
1932
|
+
}
|
|
1701
1933
|
/*
|
|
1702
1934
|
* Atomically add to numeric columns and set literal columns for one row,
|
|
1703
1935
|
* in a SINGLE auto-committed UPDATE, with no hooks and no `version` bump.
|
|
@@ -1805,6 +2037,12 @@ class DatabaseService extends BaseService {
|
|
|
1805
2037
|
return { items, count };
|
|
1806
2038
|
}
|
|
1807
2039
|
}
|
|
2040
|
+
__decorate([
|
|
2041
|
+
CaptureSpan(),
|
|
2042
|
+
__metadata("design:type", Function),
|
|
2043
|
+
__metadata("design:paramtypes", [Object]),
|
|
2044
|
+
__metadata("design:returntype", Promise)
|
|
2045
|
+
], DatabaseService.prototype, "verifyHashedColumnValue", null);
|
|
1808
2046
|
__decorate([
|
|
1809
2047
|
CaptureSpan(),
|
|
1810
2048
|
__metadata("design:type", Function),
|
|
@@ -1909,6 +2147,12 @@ __decorate([
|
|
|
1909
2147
|
__metadata("design:paramtypes", [Object]),
|
|
1910
2148
|
__metadata("design:returntype", Promise)
|
|
1911
2149
|
], DatabaseService.prototype, "updateColumnsByIdWithoutHooks", null);
|
|
2150
|
+
__decorate([
|
|
2151
|
+
CaptureSpan(),
|
|
2152
|
+
__metadata("design:type", Function),
|
|
2153
|
+
__metadata("design:paramtypes", [Object]),
|
|
2154
|
+
__metadata("design:returntype", Promise)
|
|
2155
|
+
], DatabaseService.prototype, "updateColumnsByIdIfUnlockedWithoutHooks", null);
|
|
1912
2156
|
__decorate([
|
|
1913
2157
|
CaptureSpan(),
|
|
1914
2158
|
__metadata("design:type", Function),
|