@harperfast/harper 5.2.13 → 5.3.0-beta.1
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/agent/mcpTools.ts +1 -1
- package/agent/session.ts +25 -14
- package/bin/cliOperations.ts +58 -9
- package/bin/copyDb.ts +282 -59
- package/bin/deploySetup.ts +16 -5
- package/bin/harper.ts +1 -1
- package/bin/help.ts +4 -1
- package/bin/lite.ts +4 -1
- package/bin/restart.ts +120 -4
- package/bin/run.ts +6 -11
- package/bin/upgrade.js +7 -3
- package/bin/workloadIdentity.ts +119 -0
- package/components/Application.ts +3436 -242
- package/components/ApplicationScope.ts +8 -0
- package/components/EntryHandler.ts +59 -39
- package/components/OptionsWatcher.ts +440 -98
- package/components/RuntimeModuleTracker.ts +38 -7
- package/components/Scope.ts +56 -15
- package/components/awaitRestart.ts +84 -0
- package/components/componentLoader.ts +381 -32
- package/components/componentPreparationLock.ts +16 -5
- package/components/deploymentOperations.ts +4 -1
- package/components/deploymentRecorder.ts +9 -2
- package/components/mcp/adapters/harperHttp.ts +4 -0
- package/components/mcp/listChanged.ts +4 -0
- package/components/mcp/toolRegistry.ts +2 -0
- package/components/mcp/tools/operations.ts +9 -0
- package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
- package/components/operations.js +537 -113
- package/components/operationsValidation.js +98 -3
- package/components/packageComponent.ts +25 -1
- package/components/requestRestart.ts +11 -0
- package/components/status/ComponentStatusRegistry.ts +59 -0
- package/config/RootConfigWatcher.ts +240 -40
- package/config/configReadRetry.ts +62 -0
- package/config/configUtils.ts +357 -48
- package/config/harperConfigEnvVars.ts +170 -27
- package/config/parseConfigFile.ts +34 -0
- package/config/readConfigFileSync.ts +44 -0
- package/config/watcherArming.ts +59 -0
- package/config-root.schema.json +33 -0
- package/dataLayer/blobBackup.ts +160 -50
- package/dataLayer/delete.ts +6 -1
- package/dataLayer/harperBridge/ResourceBridge.ts +80 -10
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dataLayer/hdbInfoController.ts +34 -1
- package/dataLayer/insert.ts +44 -1
- package/dataLayer/rocksdbBackup.ts +53 -10
- package/dataLayer/schema.ts +11 -1
- package/dataLayer/schemaDescribe.ts +8 -1
- package/dist/agent/mcpTools.js +1 -1
- package/dist/agent/mcpTools.js.map +1 -1
- package/dist/agent/session.d.ts +22 -0
- package/dist/agent/session.js +26 -15
- package/dist/agent/session.js.map +1 -1
- package/dist/bin/cliOperations.js +61 -9
- package/dist/bin/cliOperations.js.map +1 -1
- package/dist/bin/copyDb.d.ts +12 -1
- package/dist/bin/copyDb.js +248 -60
- package/dist/bin/copyDb.js.map +1 -1
- package/dist/bin/deploySetup.d.ts +2 -0
- package/dist/bin/deploySetup.js +11 -3
- package/dist/bin/deploySetup.js.map +1 -1
- package/dist/bin/harper.js +1 -1
- package/dist/bin/harper.js.map +1 -1
- package/dist/bin/help.js +4 -1
- package/dist/bin/help.js.map +1 -1
- package/dist/bin/lite.js +4 -1
- package/dist/bin/lite.js.map +1 -1
- package/dist/bin/restart.js +91 -6
- package/dist/bin/restart.js.map +1 -1
- package/dist/bin/run.js +4 -10
- package/dist/bin/run.js.map +1 -1
- package/dist/bin/upgrade.js +4 -3
- package/dist/bin/upgrade.js.map +1 -1
- package/dist/bin/workloadIdentity.d.ts +18 -0
- package/dist/bin/workloadIdentity.js +100 -0
- package/dist/bin/workloadIdentity.js.map +1 -0
- package/dist/components/Application.d.ts +235 -17
- package/dist/components/Application.js +3038 -238
- package/dist/components/Application.js.map +1 -1
- package/dist/components/ApplicationScope.d.ts +8 -0
- package/dist/components/ApplicationScope.js +7 -0
- package/dist/components/ApplicationScope.js.map +1 -1
- package/dist/components/EntryHandler.js +26 -10
- package/dist/components/EntryHandler.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +4 -0
- package/dist/components/OptionsWatcher.js +440 -99
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/RuntimeModuleTracker.js +40 -6
- package/dist/components/RuntimeModuleTracker.js.map +1 -1
- package/dist/components/Scope.js +52 -13
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/awaitRestart.d.ts +33 -0
- package/dist/components/awaitRestart.js +61 -0
- package/dist/components/awaitRestart.js.map +1 -0
- package/dist/components/componentLoader.d.ts +38 -1
- package/dist/components/componentLoader.js +313 -24
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentPreparationLock.d.ts +5 -0
- package/dist/components/componentPreparationLock.js +14 -6
- package/dist/components/componentPreparationLock.js.map +1 -1
- package/dist/components/deploymentOperations.js +4 -1
- package/dist/components/deploymentOperations.js.map +1 -1
- package/dist/components/deploymentRecorder.d.ts +4 -2
- package/dist/components/deploymentRecorder.js +1 -0
- package/dist/components/deploymentRecorder.js.map +1 -1
- package/dist/components/mcp/adapters/harperHttp.js +4 -0
- package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
- package/dist/components/mcp/listChanged.js +5 -0
- package/dist/components/mcp/listChanged.js.map +1 -1
- package/dist/components/mcp/toolRegistry.d.ts +1 -0
- package/dist/components/mcp/toolRegistry.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +5 -0
- package/dist/components/mcp/tools/operations.js +9 -0
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
- package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
- package/dist/components/operations.d.ts +28 -0
- package/dist/components/operations.js +476 -113
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +97 -3
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/packageComponent.js +24 -0
- package/dist/components/packageComponent.js.map +1 -1
- package/dist/components/requestRestart.d.ts +1 -0
- package/dist/components/requestRestart.js +7 -0
- package/dist/components/requestRestart.js.map +1 -1
- package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
- package/dist/components/status/ComponentStatusRegistry.js +63 -0
- package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
- package/dist/config/RootConfigWatcher.d.ts +9 -1
- package/dist/config/RootConfigWatcher.js +228 -37
- package/dist/config/RootConfigWatcher.js.map +1 -1
- package/dist/config/configReadRetry.d.ts +8 -0
- package/dist/config/configReadRetry.js +62 -0
- package/dist/config/configReadRetry.js.map +1 -0
- package/dist/config/configUtils.d.ts +11 -2
- package/dist/config/configUtils.js +304 -47
- package/dist/config/configUtils.js.map +1 -1
- package/dist/config/harperConfigEnvVars.d.ts +16 -0
- package/dist/config/harperConfigEnvVars.js +162 -25
- package/dist/config/harperConfigEnvVars.js.map +1 -1
- package/dist/config/parseConfigFile.d.ts +4 -0
- package/dist/config/parseConfigFile.js +35 -0
- package/dist/config/parseConfigFile.js.map +1 -0
- package/dist/config/readConfigFileSync.d.ts +1 -0
- package/dist/config/readConfigFileSync.js +47 -0
- package/dist/config/readConfigFileSync.js.map +1 -0
- package/dist/config/watcherArming.d.ts +15 -0
- package/dist/config/watcherArming.js +59 -0
- package/dist/config/watcherArming.js.map +1 -0
- package/dist/dataLayer/blobBackup.d.ts +49 -20
- package/dist/dataLayer/blobBackup.js +139 -50
- package/dist/dataLayer/blobBackup.js.map +1 -1
- package/dist/dataLayer/delete.js +1 -1
- package/dist/dataLayer/delete.js.map +1 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.js +72 -12
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
- package/dist/dataLayer/hdbInfoController.d.ts +10 -0
- package/dist/dataLayer/hdbInfoController.js +30 -1
- package/dist/dataLayer/hdbInfoController.js.map +1 -1
- package/dist/dataLayer/insert.d.ts +9 -1
- package/dist/dataLayer/insert.js +30 -0
- package/dist/dataLayer/insert.js.map +1 -1
- package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
- package/dist/dataLayer/rocksdbBackup.js +45 -8
- package/dist/dataLayer/rocksdbBackup.js.map +1 -1
- package/dist/dataLayer/schema.js +8 -0
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +8 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +55 -0
- package/dist/resources/DatabaseTransaction.d.ts +77 -0
- package/dist/resources/DatabaseTransaction.js +586 -54
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.d.ts +2 -1
- package/dist/resources/LMDBTransaction.js +43 -6
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
- package/dist/resources/PrimaryRocksDatabase.js +49 -5
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +20 -0
- package/dist/resources/RecordEncoder.js +110 -9
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/RequestTarget.d.ts +2 -0
- package/dist/resources/RequestTarget.js.map +1 -1
- package/dist/resources/Resource.js +117 -24
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +28 -1
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/RocksIndexStore.d.ts +6 -1
- package/dist/resources/RocksIndexStore.js +24 -9
- package/dist/resources/RocksIndexStore.js.map +1 -1
- package/dist/resources/RocksTransactionLogStore.d.ts +24 -1
- package/dist/resources/RocksTransactionLogStore.js +160 -49
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +165 -10
- package/dist/resources/Table.js +1805 -303
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/write.js +10 -3
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +181 -2
- package/dist/resources/auditStore.js +640 -29
- package/dist/resources/auditStore.js.map +1 -1
- package/dist/resources/blob.d.ts +129 -9
- package/dist/resources/blob.js +992 -114
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/branchDatabase.d.ts +48 -0
- package/dist/resources/branchDatabase.js +892 -0
- package/dist/resources/branchDatabase.js.map +1 -0
- package/dist/resources/crdt.js +50 -12
- package/dist/resources/crdt.js.map +1 -1
- package/dist/resources/dataLoader.js +3 -4
- package/dist/resources/dataLoader.js.map +1 -1
- package/dist/resources/databases.d.ts +157 -14
- package/dist/resources/databases.js +1462 -325
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/defineTable.d.ts +10 -2
- package/dist/resources/defineTable.js +9 -1
- package/dist/resources/defineTable.js.map +1 -1
- package/dist/resources/derivedIndexRegistry.d.ts +5 -0
- package/dist/resources/derivedIndexRegistry.js +68 -0
- package/dist/resources/derivedIndexRegistry.js.map +1 -0
- package/dist/resources/derivedIndexRuntime.d.ts +215 -0
- package/dist/resources/derivedIndexRuntime.js +2027 -0
- package/dist/resources/derivedIndexRuntime.js.map +1 -0
- package/dist/resources/graphql.d.ts +1 -1
- package/dist/resources/graphql.js +52 -16
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +103 -9
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +854 -41
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/indexes/hnswDerivedIndex.d.ts +67 -0
- package/dist/resources/indexes/hnswDerivedIndex.js +464 -0
- package/dist/resources/indexes/hnswDerivedIndex.js.map +1 -0
- package/dist/resources/indexes/hnswPlaneBinding.d.ts +65 -0
- package/dist/resources/indexes/hnswPlaneBinding.js +91 -0
- package/dist/resources/indexes/hnswPlaneBinding.js.map +1 -0
- package/dist/resources/longLivedTransactions.d.ts +71 -0
- package/dist/resources/longLivedTransactions.js +358 -0
- package/dist/resources/longLivedTransactions.js.map +1 -0
- package/dist/resources/models/backendRegistry.d.ts +26 -0
- package/dist/resources/models/backendRegistry.js +60 -2
- package/dist/resources/models/backendRegistry.js.map +1 -1
- package/dist/resources/models/bootstrap.d.ts +33 -1
- package/dist/resources/models/bootstrap.js +416 -31
- package/dist/resources/models/bootstrap.js.map +1 -1
- package/dist/resources/nodeIdMapping.d.ts +5 -0
- package/dist/resources/nodeIdMapping.js +49 -0
- package/dist/resources/nodeIdMapping.js.map +1 -1
- package/dist/resources/recordLock.d.ts +123 -0
- package/dist/resources/recordLock.js +315 -0
- package/dist/resources/recordLock.js.map +1 -0
- package/dist/resources/recordLockCoordinator.d.ts +557 -0
- package/dist/resources/recordLockCoordinator.js +2565 -0
- package/dist/resources/recordLockCoordinator.js.map +1 -0
- package/dist/resources/replayLogs.d.ts +14 -1
- package/dist/resources/replayLogs.js +157 -24
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/replayLogsGuards.d.ts +94 -7
- package/dist/resources/replayLogsGuards.js +111 -7
- package/dist/resources/replayLogsGuards.js.map +1 -1
- package/dist/resources/replicatedApplyFailure.d.ts +16 -0
- package/dist/resources/replicatedApplyFailure.js +63 -0
- package/dist/resources/replicatedApplyFailure.js.map +1 -0
- package/dist/resources/scheduler/scheduler.js +3 -3
- package/dist/resources/scheduler/scheduler.js.map +1 -1
- package/dist/resources/search.d.ts +10 -4
- package/dist/resources/search.js +283 -37
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/tracked.d.ts +5 -1
- package/dist/resources/tracked.js +74 -23
- package/dist/resources/tracked.js.map +1 -1
- package/dist/resources/transactionBroadcast.d.ts +1 -1
- package/dist/resources/transactionBroadcast.js +2 -2
- package/dist/resources/transactionBroadcast.js.map +1 -1
- package/dist/security/auth.js +61 -30
- package/dist/security/auth.js.map +1 -1
- package/dist/security/authn/oidc/claims.d.ts +22 -0
- package/dist/security/authn/oidc/claims.js +71 -0
- package/dist/security/authn/oidc/claims.js.map +1 -0
- package/dist/security/authn/oidc/identityToken.d.ts +27 -0
- package/dist/security/authn/oidc/identityToken.js +111 -0
- package/dist/security/authn/oidc/identityToken.js.map +1 -0
- package/dist/security/authn/oidc/jwks.d.ts +25 -0
- package/dist/security/authn/oidc/jwks.js +261 -0
- package/dist/security/authn/oidc/jwks.js.map +1 -0
- package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
- package/dist/security/authn/oidc/providers/generic.js +34 -0
- package/dist/security/authn/oidc/providers/generic.js.map +1 -0
- package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
- package/dist/security/authn/oidc/providers/githubActions.js +129 -0
- package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
- package/dist/security/authn/oidc/providers/index.d.ts +37 -0
- package/dist/security/authn/oidc/providers/index.js +24 -0
- package/dist/security/authn/oidc/providers/index.js.map +1 -0
- package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
- package/dist/security/authn/oidc/tokenExchange.js +306 -0
- package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
- package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
- package/dist/security/authn/oidc/types.d.ts +38 -0
- package/dist/security/authn/oidc/types.js +6 -0
- package/dist/security/authn/oidc/types.js.map +1 -0
- package/dist/security/certificateVerification/index.js +40 -11
- package/dist/security/certificateVerification/index.js.map +1 -1
- package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
- package/dist/security/certificateVerification/trustedIssuers.js +79 -0
- package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
- package/dist/security/certificateVerification/types.d.ts +1 -0
- package/dist/security/credentialProvenance.d.ts +35 -0
- package/dist/security/credentialProvenance.js +51 -0
- package/dist/security/credentialProvenance.js.map +1 -0
- package/dist/security/credentialRejection.d.ts +4 -0
- package/dist/security/credentialRejection.js +24 -0
- package/dist/security/credentialRejection.js.map +1 -0
- package/dist/security/deferredAuthentication.d.ts +36 -0
- package/dist/security/deferredAuthentication.js +70 -0
- package/dist/security/deferredAuthentication.js.map +1 -0
- package/dist/security/impersonation.d.ts +21 -0
- package/dist/security/impersonation.js +108 -9
- package/dist/security/impersonation.js.map +1 -1
- package/dist/security/jsLoader.d.ts +6 -0
- package/dist/security/jsLoader.js +77 -15
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +301 -71
- package/dist/security/keys.js.map +1 -1
- package/dist/security/operationScope.d.ts +21 -0
- package/dist/security/operationScope.js +36 -0
- package/dist/security/operationScope.js.map +1 -0
- package/dist/security/permissionsTranslator.js +21 -0
- package/dist/security/permissionsTranslator.js.map +1 -1
- package/dist/security/tokenAuthentication.d.ts +19 -1
- package/dist/security/tokenAuthentication.js +191 -10
- package/dist/security/tokenAuthentication.js.map +1 -1
- package/dist/security/user.js +4 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
- package/dist/server/DurableSubscriptionsSession.js +67 -10
- package/dist/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/server/REST.js +106 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -0
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +16 -1
- package/dist/server/http.js +122 -17
- package/dist/server/http.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +8 -1
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/jobs/jobProcess.js +6 -2
- package/dist/server/jobs/jobProcess.js.map +1 -1
- package/dist/server/jobs/jobs.js +4 -1
- package/dist/server/jobs/jobs.js.map +1 -1
- package/dist/server/liveSubscriptionAuth.d.ts +26 -4
- package/dist/server/liveSubscriptionAuth.js +105 -39
- package/dist/server/liveSubscriptionAuth.js.map +1 -1
- package/dist/server/loadRootComponents.js +49 -10
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/mqtt.d.ts +2 -0
- package/dist/server/mqtt.js +165 -30
- package/dist/server/mqtt.js.map +1 -1
- package/dist/server/nodeName.d.ts +2 -0
- package/dist/server/nodeName.js +107 -23
- package/dist/server/nodeName.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +27 -0
- package/dist/server/serverHelpers/Headers.js +145 -1
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/NodeAdapterResponse.d.ts +48 -0
- package/dist/server/serverHelpers/NodeAdapterResponse.js +220 -0
- package/dist/server/serverHelpers/NodeAdapterResponse.js.map +1 -0
- package/dist/server/serverHelpers/Request.d.ts +5 -10
- package/dist/server/serverHelpers/Request.js +38 -136
- package/dist/server/serverHelpers/Request.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +11 -0
- package/dist/server/serverHelpers/contentTypes.js +221 -40
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
- package/dist/server/serverHelpers/deployValidationState.js +9 -19
- package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
- package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
- package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
- package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
- package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
- package/dist/server/serverHelpers/registeredOperations.js +74 -21
- package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
- package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
- package/dist/server/serverHelpers/requestSanitization.js +20 -0
- package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
- package/dist/server/serverHelpers/serverHandlers.js +6 -3
- package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
- package/dist/server/serverHelpers/serverUtilities.js +178 -29
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
- package/dist/server/serverHelpers/uwsServer.js +19 -1
- package/dist/server/serverHelpers/uwsServer.js.map +1 -1
- package/dist/server/static.js +24 -28
- package/dist/server/static.js.map +1 -1
- package/dist/server/storageReclamation.d.ts +5 -0
- package/dist/server/storageReclamation.js +17 -1
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/isolatedApplications.d.ts +47 -0
- package/dist/server/threads/isolatedApplications.js +171 -0
- package/dist/server/threads/isolatedApplications.js.map +1 -0
- package/dist/server/threads/itc.d.ts +7 -2
- package/dist/server/threads/itc.js +5 -1
- package/dist/server/threads/itc.js.map +1 -1
- package/dist/server/threads/logRotationTransport.d.ts +1 -0
- package/dist/server/threads/logRotationTransport.js +33 -0
- package/dist/server/threads/logRotationTransport.js.map +1 -0
- package/dist/server/threads/manageThreads.d.ts +83 -3
- package/dist/server/threads/manageThreads.js +769 -75
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -0
- package/dist/server/threads/socketRouter.js +277 -31
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadHeapMemory.d.ts +2 -0
- package/dist/server/threads/threadHeapMemory.js +31 -0
- package/dist/server/threads/threadHeapMemory.js.map +1 -0
- package/dist/server/threads/threadServer.js +76 -22
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/sqlEngine/config.d.ts +1 -3
- package/dist/sqlEngine/config.js +19 -16
- package/dist/sqlEngine/config.js.map +1 -1
- package/dist/sqlTranslator/index.d.ts +1 -1
- package/dist/sqlTranslator/index.js +30 -7
- package/dist/sqlTranslator/index.js.map +1 -1
- package/dist/upgrade/directives/5-3-0.d.ts +7 -0
- package/dist/upgrade/directives/5-3-0.js +148 -0
- package/dist/upgrade/directives/5-3-0.js.map +1 -0
- package/dist/upgrade/directives/directivesController.js +2 -1
- package/dist/upgrade/directives/directivesController.js.map +1 -1
- package/dist/utility/OperationFunctionCaller.js +2 -1
- package/dist/utility/OperationFunctionCaller.js.map +1 -1
- package/dist/utility/common_utils.d.ts +16 -0
- package/dist/utility/common_utils.js +32 -6
- package/dist/utility/common_utils.js.map +1 -1
- package/dist/utility/componentNames.d.ts +8 -0
- package/dist/utility/componentNames.js +12 -1
- package/dist/utility/componentNames.js.map +1 -1
- package/dist/utility/environment/environmentManager.js +3 -6
- package/dist/utility/environment/environmentManager.js.map +1 -1
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/environment/systemInformation.js +1 -0
- package/dist/utility/environment/systemInformation.js.map +1 -1
- package/dist/utility/errors/commonErrors.d.ts +2 -0
- package/dist/utility/errors/commonErrors.js +2 -0
- package/dist/utility/errors/commonErrors.js.map +1 -1
- package/dist/utility/errors/hdbError.d.ts +33 -0
- package/dist/utility/errors/hdbError.js +58 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/globalSchema.d.ts +18 -0
- package/dist/utility/hdbTerms.d.ts +18 -0
- package/dist/utility/hdbTerms.js +20 -2
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.d.ts +2 -0
- package/dist/utility/logging/harper_logger.js +286 -30
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logGenerationCoordinator.d.ts +35 -0
- package/dist/utility/logging/logGenerationCoordinator.js +184 -0
- package/dist/utility/logging/logGenerationCoordinator.js.map +1 -0
- package/dist/utility/logging/logRotation.d.ts +46 -0
- package/dist/utility/logging/logRotation.js +365 -0
- package/dist/utility/logging/logRotation.js.map +1 -0
- package/dist/utility/logging/logRotator.d.ts +1 -1
- package/dist/utility/logging/logRotator.js +192 -85
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/nodeIdentity.d.ts +9 -0
- package/dist/utility/nodeIdentity.js +58 -0
- package/dist/utility/nodeIdentity.js.map +1 -0
- package/dist/utility/npmUtilities.js +11 -7
- package/dist/utility/npmUtilities.js.map +1 -1
- package/dist/utility/operationPermissions.d.ts +3 -1
- package/dist/utility/operationPermissions.js +16 -1
- package/dist/utility/operationPermissions.js.map +1 -1
- package/dist/utility/operation_authorization.d.ts +10 -7
- package/dist/utility/operation_authorization.js +212 -41
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/watchPath.d.ts +29 -0
- package/dist/utility/watchPath.js +68 -0
- package/dist/utility/watchPath.js.map +1 -0
- package/dist/utility/watcherFallback.d.ts +41 -0
- package/dist/utility/watcherFallback.js +153 -0
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.d.ts +12 -0
- package/dist/validation/configValidator.js +205 -75
- package/dist/validation/configValidator.js.map +1 -1
- package/dist/validation/installValidator.js +12 -0
- package/dist/validation/installValidator.js.map +1 -1
- package/dist/validation/validationWrapper.d.ts +11 -0
- package/dist/validation/validationWrapper.js +16 -3
- package/dist/validation/validationWrapper.js.map +1 -1
- package/index.ts +8 -0
- package/json/systemSchema.json +55 -0
- package/npm-shrinkwrap.json +286 -194
- package/package.json +15 -7
- package/resources/DESIGN.md +219 -52
- package/resources/DatabaseTransaction.ts +657 -52
- package/resources/LMDBTransaction.ts +46 -6
- package/resources/PrimaryRocksDatabase.ts +46 -7
- package/resources/RecordEncoder.ts +124 -9
- package/resources/RequestTarget.ts +2 -0
- package/resources/Resource.ts +114 -22
- package/resources/ResourceInterface.ts +31 -0
- package/resources/RocksIndexStore.ts +30 -9
- package/resources/RocksTransactionLogStore.ts +188 -51
- package/resources/Table.ts +1960 -301
- package/resources/analytics/write.ts +10 -3
- package/resources/auditStore.ts +647 -32
- package/resources/blob.ts +1029 -110
- package/resources/branchDatabase.ts +941 -0
- package/resources/crdt.ts +76 -12
- package/resources/dataLoader.ts +3 -4
- package/resources/databases.ts +1584 -320
- package/resources/defineTable.ts +18 -2
- package/resources/derivedIndexRegistry.ts +56 -0
- package/resources/derivedIndexRuntime.ts +2292 -0
- package/resources/graphql.ts +72 -17
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +911 -48
- package/resources/indexes/hnswDerivedIndex.ts +531 -0
- package/resources/indexes/hnswPlaneBinding.ts +174 -0
- package/resources/longLivedTransactions.ts +360 -0
- package/resources/models/backendRegistry.ts +84 -2
- package/resources/models/bootstrap.ts +473 -28
- package/resources/nodeIdMapping.ts +50 -0
- package/resources/recordLock.ts +419 -0
- package/resources/recordLockCoordinator.ts +3043 -0
- package/resources/replayLogs.ts +152 -26
- package/resources/replayLogsGuards.ts +171 -8
- package/resources/replicatedApplyFailure.ts +77 -0
- package/resources/scheduler/scheduler.ts +4 -4
- package/resources/search.ts +288 -46
- package/resources/tracked.ts +73 -22
- package/resources/transactionBroadcast.ts +3 -3
- package/security/auth.ts +68 -29
- package/security/authn/oidc/claims.ts +72 -0
- package/security/authn/oidc/identityToken.ts +129 -0
- package/security/authn/oidc/jwks.ts +260 -0
- package/security/authn/oidc/providers/generic.ts +40 -0
- package/security/authn/oidc/providers/githubActions.ts +137 -0
- package/security/authn/oidc/providers/index.ts +52 -0
- package/security/authn/oidc/tokenExchange.ts +300 -0
- package/security/authn/oidc/trustPolicyOperations.ts +343 -0
- package/security/authn/oidc/types.ts +41 -0
- package/security/certificateVerification/index.ts +54 -13
- package/security/certificateVerification/trustedIssuers.ts +76 -0
- package/security/certificateVerification/types.ts +1 -0
- package/security/credentialProvenance.ts +47 -0
- package/security/credentialRejection.ts +22 -0
- package/security/deferredAuthentication.ts +71 -0
- package/security/impersonation.ts +117 -12
- package/security/jsLoader.ts +83 -18
- package/security/keys.ts +298 -72
- package/security/operationScope.ts +33 -0
- package/security/permissionsTranslator.js +23 -0
- package/security/tokenAuthentication.ts +233 -12
- package/security/user.ts +4 -3
- package/server/DESIGN.md +194 -16
- package/server/DurableSubscriptionsSession.ts +71 -11
- package/server/REST.ts +115 -4
- package/server/graphqlQuerying.ts +4 -0
- package/server/http.ts +133 -20
- package/server/itc/serverHandlers.js +8 -1
- package/server/jobs/jobProcess.ts +8 -2
- package/server/jobs/jobs.ts +4 -1
- package/server/liveSubscriptionAuth.ts +129 -46
- package/server/loadRootComponents.js +50 -8
- package/server/mqtt.ts +179 -38
- package/server/nodeName.ts +103 -21
- package/server/serverHelpers/Headers.ts +135 -0
- package/server/serverHelpers/NodeAdapterResponse.ts +221 -0
- package/server/serverHelpers/Request.ts +33 -131
- package/server/serverHelpers/contentTypes.ts +217 -36
- package/server/serverHelpers/deployValidationState.ts +24 -13
- package/server/serverHelpers/operationAuthorizationState.ts +34 -3
- package/server/serverHelpers/registeredOperations.ts +79 -22
- package/server/serverHelpers/requestSanitization.ts +15 -0
- package/server/serverHelpers/serverHandlers.js +6 -3
- package/server/serverHelpers/serverUtilities.ts +232 -40
- package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
- package/server/serverHelpers/uwsServer.ts +17 -2
- package/server/static.ts +23 -29
- package/server/storageReclamation.ts +15 -2
- package/server/threads/isolatedApplications.ts +157 -0
- package/server/threads/itc.js +11 -1
- package/server/threads/logRotationTransport.ts +40 -0
- package/server/threads/manageThreads.js +771 -66
- package/server/threads/socketRouter.ts +291 -30
- package/server/threads/threadHeapMemory.ts +26 -0
- package/server/threads/threadServer.js +73 -22
- package/sqlTranslator/index.ts +31 -8
- package/studio/web/assets/{Chat-4RrB5134.js → Chat-D3j-1yY1.js} +1 -1
- package/studio/web/assets/{FloatingChat-omlNMDcJ.js → FloatingChat-BxJGYcfB.js} +3 -3
- package/studio/web/assets/{apiToken-Bke3wvfZ.js → apiToken-CT55oWOe.js} +1 -1
- package/studio/web/assets/{applications-DvFDYJgK.js → applications-D9Ct9_vm.js} +1 -1
- package/studio/web/assets/{cssMode-C1vRa7zh.js → cssMode-DV8H7VwA.js} +1 -1
- package/studio/web/assets/{editor-3XRWEDWX.js → editor-uatc0unt.js} +1 -1
- package/studio/web/assets/{html-CTY5tdMr.js → html-Bm6D6paN.js} +1 -1
- package/studio/web/assets/{htmlMode-CG1vSD9t.js → htmlMode-CEn7tpLG.js} +1 -1
- package/studio/web/assets/{index-Dfpeofdu.js → index-BIXW6Pu4.js} +5 -5
- package/studio/web/assets/{index.lazy-B1VOIv-t.js → index.lazy-UI7L-Vrk.js} +1 -1
- package/studio/web/assets/{javascript-CJeJzGnI.js → javascript-CJ0G3AFZ.js} +1 -1
- package/studio/web/assets/{jsonMode-CYPBwM82.js → jsonMode-DQADAYEa.js} +1 -1
- package/studio/web/assets/{languageServices-IKH4GUHl.js → languageServices-CAQJXWcI.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-BC8_gxKG.js → lspLanguageFeatures-CCQ8P5sY.js} +1 -1
- package/studio/web/assets/{notifications-BfKBpYcq.js → notifications-BbxTU6Aw.js} +1 -1
- package/studio/web/assets/{notifications-DFbArTfC.js → notifications-Cvb3P1lB.js} +1 -1
- package/studio/web/assets/{profile-Q4-T6c-S.js → profile-Yyb7gsvL.js} +1 -1
- package/studio/web/assets/{regions-CtkV0xje.js → regions-OgjGHlU5.js} +1 -1
- package/studio/web/assets/{register-1ZZuMsiA.js → register-6qwNEOY3.js} +2 -2
- package/studio/web/assets/{setComponentFile-ZWLcWv5X.js → setComponentFile-BilDMtgB.js} +1 -1
- package/studio/web/assets/{setup-DWprJyJy.js → setup-J6qJ7OIU.js} +2 -2
- package/studio/web/assets/{status--aNm8isn.js → status-0RWGcfyD.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-Cq_lt3XD.js → toggleHighContrast-BIn-vErT.js} +1 -1
- package/studio/web/assets/{tsMode-pjgytARx.js → tsMode-DgUXku4d.js} +1 -1
- package/studio/web/assets/{typescript-Cdg0mqUh.js → typescript-C9orXcsM.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-RZhaY8Rn.js → useEntityRestURL-BEoXXbUB.js} +1 -1
- package/studio/web/assets/{workers-BgoXIqQe.js → workers-JVzSDmgx.js} +1 -1
- package/studio/web/assets/{xml-BwSeDMiP.js → xml-Cq-S8S4X.js} +1 -1
- package/studio/web/assets/{yaml-DotCUG5l.js → yaml-sfoRdh1M.js} +1 -1
- package/studio/web/index.html +1 -1
- package/upgrade/directives/5-3-0.ts +132 -0
- package/upgrade/directives/directivesController.ts +2 -1
- package/utility/OperationFunctionCaller.ts +2 -1
- package/utility/common_utils.ts +30 -5
- package/utility/componentNames.ts +12 -0
- package/utility/environment/environmentManager.ts +3 -7
- package/utility/environment/systemInformation.ts +7 -0
- package/utility/errors/commonErrors.ts +4 -0
- package/utility/errors/hdbError.ts +57 -0
- package/utility/hdbTerms.ts +19 -0
- package/utility/logging/harper_logger.ts +278 -26
- package/utility/logging/logGenerationCoordinator.ts +196 -0
- package/utility/logging/logRotation.ts +367 -0
- package/utility/logging/logRotator.ts +213 -81
- package/utility/nodeIdentity.ts +45 -0
- package/utility/npmUtilities.ts +12 -8
- package/utility/operationPermissions.ts +18 -1
- package/utility/operation_authorization.ts +231 -42
- package/utility/watchPath.ts +63 -0
- package/utility/watcherFallback.ts +148 -0
- package/validation/configValidator.ts +215 -75
- package/validation/installValidator.ts +15 -0
- package/validation/validationWrapper.ts +18 -4
|
@@ -41,6 +41,8 @@ import * as status from '../status/index.ts';
|
|
|
41
41
|
import * as regDeprecated from '../../resources/registrationDeprecated.ts';
|
|
42
42
|
import * as deploymentOperations from '../../components/deploymentOperations.ts';
|
|
43
43
|
import * as secretOperations from '../../components/secretOperations.ts';
|
|
44
|
+
import * as trustPolicyOperations from '../../security/authn/oidc/trustPolicyOperations.ts';
|
|
45
|
+
import * as tokenExchange from '../../security/authn/oidc/tokenExchange.ts';
|
|
44
46
|
import { contextStorage } from '../../resources/transaction.ts';
|
|
45
47
|
import { isMainThread } from 'node:worker_threads';
|
|
46
48
|
import {
|
|
@@ -49,6 +51,7 @@ import {
|
|
|
49
51
|
setLocalOperationDispatch,
|
|
50
52
|
} from './registeredOperations.ts';
|
|
51
53
|
import { runWithOperationAuthorizationBypass } from './operationAuthorizationState.ts';
|
|
54
|
+
import { stripSuppliedParsedSqlObject } from './requestSanitization.ts';
|
|
52
55
|
|
|
53
56
|
const pSearchSearch = util.promisify(search.search);
|
|
54
57
|
let pEvaluateSql: (sql: string) => Promise<any>;
|
|
@@ -79,6 +82,42 @@ export type OperationFunctionName = ValueOf<typeof terms.OPERATIONS_ENUM>;
|
|
|
79
82
|
* handles the response to the sender.
|
|
80
83
|
*/
|
|
81
84
|
// TODO: Replace Function type with an actual function type (e.g. (): Thingy)
|
|
85
|
+
/**
|
|
86
|
+
* Fields stripped from an operation body before it reaches the operations log.
|
|
87
|
+
*
|
|
88
|
+
* `credentials` carries a transient token on deploy_component (`registryAuth` is its pre-rename
|
|
89
|
+
* name — still stripped, since this runs ahead of the validation that now rejects it). `value` /
|
|
90
|
+
* `values` carry .env secrets from set_env_value; `value` / `envelope` carry secrets from
|
|
91
|
+
* set_secret. `token` is the login-purpose token (login) and the CI identity token
|
|
92
|
+
* (exchange_oidc_token), and is also stripped defensively — no operation declares a top-level `token`,
|
|
93
|
+
* but validation allows unknown keys, so a mistyped `harper deploy setup token=…` must not log a live
|
|
94
|
+
* credential. `refresh_token` is the 30-day credential (refresh_operation_token).
|
|
95
|
+
*
|
|
96
|
+
* Redaction runs *before* the handler, so a rejected request logs a still-spendable credential —
|
|
97
|
+
* which is why a new secret-bearing field belongs here rather than left to the default (harper#1527
|
|
98
|
+
* was this same miss for set_env_value).
|
|
99
|
+
*/
|
|
100
|
+
export const UNLOGGABLE_OPERATION_FIELDS = [
|
|
101
|
+
'hdb_user',
|
|
102
|
+
'hdbAuthHeader',
|
|
103
|
+
'password',
|
|
104
|
+
'payload',
|
|
105
|
+
'credentials',
|
|
106
|
+
'registryAuth',
|
|
107
|
+
'value',
|
|
108
|
+
'values',
|
|
109
|
+
'envelope',
|
|
110
|
+
'token',
|
|
111
|
+
'refresh_token',
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
/** Callers gate this on log level: it allocates, and the operations log is often off. */
|
|
115
|
+
export function redactForOperationLog(body: Record<string, any>): Record<string, any> {
|
|
116
|
+
const clean = { ...body };
|
|
117
|
+
for (const field of UNLOGGABLE_OPERATION_FIELDS) delete clean[field];
|
|
118
|
+
return clean;
|
|
119
|
+
}
|
|
120
|
+
|
|
82
121
|
export async function processLocalTransaction(req: OperationRequest, operationFunction: Function) {
|
|
83
122
|
try {
|
|
84
123
|
if (
|
|
@@ -87,31 +126,7 @@ export async function processLocalTransaction(req: OperationRequest, operationFu
|
|
|
87
126
|
harperLogger.logLevel === terms.LOG_LEVELS.DEBUG ||
|
|
88
127
|
harperLogger.logLevel === terms.LOG_LEVELS.TRACE)
|
|
89
128
|
) {
|
|
90
|
-
|
|
91
|
-
// an object unless the logging is actually going to happen. credentials carries a
|
|
92
|
-
// transient token on deploy_component (registryAuth is its pre-rename name — still
|
|
93
|
-
// stripped, since this runs ahead of the validation that now rejects it, and a stale
|
|
94
|
-
// caller's token must not reach the log); value/values carry .env secrets from
|
|
95
|
-
// set_env_value; value/envelope carry secrets from set_secret — none may reach the
|
|
96
|
-
// operations log. `token` is stripped defensively: no operation declares one at the top
|
|
97
|
-
// level today, but validation allows unknown keys, so a caller that sends one anyway (a
|
|
98
|
-
// mistyped `harper deploy setup token=…`) would otherwise log a live credential.
|
|
99
|
-
/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
|
|
100
|
-
const {
|
|
101
|
-
hdb_user,
|
|
102
|
-
hdbAuthHeader,
|
|
103
|
-
password,
|
|
104
|
-
payload,
|
|
105
|
-
credentials,
|
|
106
|
-
registryAuth,
|
|
107
|
-
value,
|
|
108
|
-
values,
|
|
109
|
-
envelope,
|
|
110
|
-
token,
|
|
111
|
-
...cleanBody
|
|
112
|
-
} = req.body;
|
|
113
|
-
/* eslint-enable no-unused-vars, @typescript-eslint/no-unused-vars */
|
|
114
|
-
operationLog.info(cleanBody);
|
|
129
|
+
operationLog.info(redactForOperationLog(req.body));
|
|
115
130
|
}
|
|
116
131
|
} catch (e) {
|
|
117
132
|
operationLog.error(e);
|
|
@@ -172,6 +187,10 @@ export type OperationDefinition = {
|
|
|
172
187
|
requiresSuperUser?: boolean;
|
|
173
188
|
};
|
|
174
189
|
|
|
190
|
+
// Operation names this API installed a permission entry for, so a later registration that drops
|
|
191
|
+
// `requiresSuperUser` can retract exactly that entry and nothing else.
|
|
192
|
+
const declaredPermissionNames = new Set<string>();
|
|
193
|
+
|
|
175
194
|
/**
|
|
176
195
|
* Register an operation function with the server.
|
|
177
196
|
* @param operationDefinition
|
|
@@ -181,7 +200,14 @@ server.registerOperation = (operationDefinition: OperationDefinition) => {
|
|
|
181
200
|
if (isDeployValidating()) return;
|
|
182
201
|
const { name, execute, requiresSuperUser } = operationDefinition;
|
|
183
202
|
let handler = execute;
|
|
184
|
-
if (requiresSuperUser
|
|
203
|
+
if (requiresSuperUser === undefined) {
|
|
204
|
+
// A re-registration that drops the flag must also drop the entry the earlier one installed, or
|
|
205
|
+
// declaration and enforcement disagree: main retracts the grantable mark while this worker keeps
|
|
206
|
+
// honouring an already-persisted role grant. Scoped to names declared through this API, so one it
|
|
207
|
+
// never declared is untouched — a component that declared a built-in's name already overwrote
|
|
208
|
+
// that entry by declaring it, and this only follows.
|
|
209
|
+
if (declaredPermissionNames.delete(name)) opAuth.unregisterOperationPermission(name);
|
|
210
|
+
} else {
|
|
185
211
|
// verifyPerms keys requiredPermissions by the handler's function `.name`, but registered ops
|
|
186
212
|
// are typically anonymous arrows (all named "execute") which collide and can't be keyed. Wrap
|
|
187
213
|
// in a FRESH function named after the op so the lookup resolves the right entry. Wrap rather
|
|
@@ -191,12 +217,14 @@ server.registerOperation = (operationDefinition: OperationDefinition) => {
|
|
|
191
217
|
handler = (...args: any[]) => (execute as any)(...args);
|
|
192
218
|
Object.defineProperty(handler, 'name', { value: name, configurable: true });
|
|
193
219
|
opAuth.registerOperationPermission(name, { requiresSu: requiresSuperUser });
|
|
220
|
+
declaredPermissionNames.add(name);
|
|
194
221
|
}
|
|
195
222
|
OPERATION_FUNCTION_MAP.set(name as any, new OperationFunctionObject(handler));
|
|
196
223
|
// Components load per-worker, so a registration made there is invisible to the main-thread
|
|
197
224
|
// ops-API dispatcher (each thread has its own OPERATION_FUNCTION_MAP instance). Announce it
|
|
198
|
-
// so the main thread can forward calls
|
|
199
|
-
|
|
225
|
+
// so the main thread can forward calls here (#1736), and can mirror the role-allowlist mark that
|
|
226
|
+
// registerOperationPermission above made only in this thread's scope.
|
|
227
|
+
if (!isMainThread) announceRegisteredOperation(name, requiresSuperUser !== undefined);
|
|
200
228
|
};
|
|
201
229
|
|
|
202
230
|
// Register the durable MCP quota policy as a function (see components/mcp/quota.ts). Worker-local,
|
|
@@ -207,6 +235,17 @@ server.setMcpQuotaHandler = (handler) => {
|
|
|
207
235
|
setMcpQuotaHandler(handler);
|
|
208
236
|
};
|
|
209
237
|
|
|
238
|
+
// The nested `search_operation` operations dataLayer/export.ts's getRecords can actually run (its
|
|
239
|
+
// VALID_SEARCH_OPERATIONS). Validated at dispatch so an unsupported or missing nested operation is a
|
|
240
|
+
// request-time 400 rather than an async job failure, and so the nested authorization below always
|
|
241
|
+
// resolves a real handler.
|
|
242
|
+
const EXPORT_SEARCH_OPERATIONS = new Set<string>([
|
|
243
|
+
terms.OPERATIONS_ENUM.SEARCH_BY_VALUE,
|
|
244
|
+
terms.OPERATIONS_ENUM.SEARCH_BY_HASH,
|
|
245
|
+
terms.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS,
|
|
246
|
+
terms.OPERATIONS_ENUM.SQL,
|
|
247
|
+
]);
|
|
248
|
+
|
|
210
249
|
export function chooseOperation(json: OperationRequestBody, bypassAuth = false) {
|
|
211
250
|
let getOpResult: OperationFunctionObject;
|
|
212
251
|
try {
|
|
@@ -227,16 +266,116 @@ export function chooseOperation(json: OperationRequestBody, bypassAuth = false)
|
|
|
227
266
|
|
|
228
267
|
const { operation_function, job_operation_function } = getOpResult;
|
|
229
268
|
|
|
230
|
-
|
|
231
|
-
//
|
|
269
|
+
const isSqlOperation = json.operation === terms.OPERATIONS_ENUM.SQL;
|
|
270
|
+
// `verifyPerms` derives the tables it checks from the object it is handed, so the caller-supplied
|
|
271
|
+
// `search_operation` may only stand in as the permission subject for the operations that actually
|
|
272
|
+
// run it (dataLayer/export.ts is its only consumer). For anything else it would check the nested
|
|
273
|
+
// tables while the handler runs against the top-level ones.
|
|
274
|
+
const nestedSearch =
|
|
275
|
+
json.operation === terms.OPERATIONS_ENUM.EXPORT_LOCAL || json.operation === terms.OPERATIONS_ENUM.EXPORT_TO_S3
|
|
276
|
+
? json.search_operation
|
|
277
|
+
: undefined;
|
|
278
|
+
if (nestedSearch !== undefined) {
|
|
279
|
+
// It becomes the permission subject below, and a primitive would throw on the principal
|
|
280
|
+
// assignment — a 400 rather than a wrapped 500.
|
|
281
|
+
if (nestedSearch === null || typeof nestedSearch !== 'object' || Array.isArray(nestedSearch)) {
|
|
282
|
+
throw handleHDBError(
|
|
283
|
+
new Error(),
|
|
284
|
+
`'search_operation' must be an object`,
|
|
285
|
+
hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,
|
|
286
|
+
undefined,
|
|
287
|
+
undefined,
|
|
288
|
+
true
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
// The object check alone lets `{}` and unsupported operations through — they would then fail
|
|
292
|
+
// asynchronously in the export worker (or dereference `search_operation.operation`). Require a
|
|
293
|
+
// supported operation at request time; the nested authorization below relies on it resolving.
|
|
294
|
+
if (typeof nestedSearch.operation !== 'string' || !EXPORT_SEARCH_OPERATIONS.has(nestedSearch.operation)) {
|
|
295
|
+
throw handleHDBError(
|
|
296
|
+
new Error(),
|
|
297
|
+
`'search_operation.operation' must be one of: ${[...EXPORT_SEARCH_OPERATIONS].join(', ')}`,
|
|
298
|
+
hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,
|
|
299
|
+
undefined,
|
|
300
|
+
undefined,
|
|
301
|
+
true
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
// Dispatch state, never client input: the export worker re-reads `parsed_sql_object` off this
|
|
305
|
+
// same object (evaluateSQL), and it carries `permissions_checked`, so a body-supplied one would
|
|
306
|
+
// execute an AST no check ever saw. Deleting it rather than replacing it with the authorized
|
|
307
|
+
// parse is deliberate — the worker then re-parses and re-runs the check itself.
|
|
308
|
+
delete nestedSearch.parsed_sql_object;
|
|
309
|
+
}
|
|
310
|
+
// The AST check below covers only the statement's tables, never the caller's right to invoke the
|
|
311
|
+
// job operation, so it is additive to verifyPerms rather than an alternative to it.
|
|
312
|
+
const hasNestedSqlSearch = nestedSearch?.operation === terms.OPERATIONS_ENUM.SQL;
|
|
313
|
+
|
|
232
314
|
try {
|
|
233
|
-
if (
|
|
315
|
+
if (isSqlOperation || hasNestedSqlSearch) {
|
|
234
316
|
const sql = require('../../sqlTranslator/index');
|
|
235
|
-
const sqlStatement =
|
|
317
|
+
const sqlStatement = isSqlOperation ? json.sql : nestedSearch.sql;
|
|
318
|
+
// Before this dispatch's own parse is assigned, so a body-supplied object cannot survive it.
|
|
319
|
+
stripSuppliedParsedSqlObject(json);
|
|
236
320
|
const parsedSqlObject = sql.convertSQLToAST(sqlStatement);
|
|
237
|
-
|
|
321
|
+
if (hasNestedSqlSearch && parsedSqlObject.variant !== terms.VALID_SQL_OPS_ENUM.SELECT) {
|
|
322
|
+
throw handleHDBError(
|
|
323
|
+
new Error(),
|
|
324
|
+
`'search_operation.sql' must be a SELECT statement`,
|
|
325
|
+
hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,
|
|
326
|
+
undefined,
|
|
327
|
+
undefined,
|
|
328
|
+
true
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
// Only the direct-SQL path consumes `json.parsed_sql_object` (evaluateSQL). A nested export
|
|
332
|
+
// re-parses off `search_operation` — whose `parsed_sql_object` was deleted above — so setting
|
|
333
|
+
// it here for a job would be inert.
|
|
334
|
+
if (isSqlOperation) {
|
|
335
|
+
json.parsed_sql_object = parsedSqlObject;
|
|
336
|
+
}
|
|
238
337
|
if (!bypassAuth) {
|
|
239
|
-
|
|
338
|
+
if (hasNestedSqlSearch) {
|
|
339
|
+
// A nested-SQL export's outer op (export_local/export_to_s3) is `requires_su`, which the
|
|
340
|
+
// AST table check below does not enforce. Authorize invoking it through verifyPerms
|
|
341
|
+
// exactly as the non-SQL job path does — otherwise SQL is a way around the requires_su
|
|
342
|
+
// gate that path enforces. The nested table reads are then covered additively by the AST
|
|
343
|
+
// check. verifyPerms also runs the allowlist (gate 1) and the export token scope.
|
|
344
|
+
const functionToCheck = job_operation_function === undefined ? operation_function : job_operation_function;
|
|
345
|
+
const outerDenial = opAuth.verifyPerms(json, functionToCheck, { apiOperation: json.operation });
|
|
346
|
+
if (outerDenial) {
|
|
347
|
+
operationLog.error(`${HTTP_STATUS_CODES.FORBIDDEN} from operation ${json.operation}`);
|
|
348
|
+
operationLog.warn(`User '${json.hdb_user?.username}' is not permitted to ${json.operation}`);
|
|
349
|
+
throw handleHDBError(
|
|
350
|
+
new Error(),
|
|
351
|
+
outerDenial,
|
|
352
|
+
hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,
|
|
353
|
+
undefined,
|
|
354
|
+
false,
|
|
355
|
+
true
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
} else {
|
|
359
|
+
// Direct SQL: the invoked operation IS `sql`, so the role `operations` allowlist is the
|
|
360
|
+
// operation-invocation check — otherwise an allowlisted role reaches unlisted operations
|
|
361
|
+
// via `sql`. json.operation is already the API name.
|
|
362
|
+
const allowlistDenial = opAuth.verifyOperationsAllowlist(json, json.operation);
|
|
363
|
+
if (allowlistDenial) {
|
|
364
|
+
operationLog.error(`${HTTP_STATUS_CODES.FORBIDDEN} from operation ${json.operation}`);
|
|
365
|
+
operationLog.warn(`User '${json.hdb_user?.username}' is not permitted to ${json.operation}`);
|
|
366
|
+
throw handleHDBError(
|
|
367
|
+
new Error(),
|
|
368
|
+
allowlistDenial,
|
|
369
|
+
hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,
|
|
370
|
+
undefined,
|
|
371
|
+
undefined,
|
|
372
|
+
true
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// `json.operation` explicitly — the operation this dispatch already resolved, not a
|
|
377
|
+
// field read back off the request body.
|
|
378
|
+
const astPermCheck = sql.checkASTPermissions(json, parsedSqlObject, json.operation);
|
|
240
379
|
if (astPermCheck) {
|
|
241
380
|
operationLog.error(`${HTTP_STATUS_CODES.FORBIDDEN} from operation ${json.operation}`);
|
|
242
381
|
operationLog.warn(`User '${json.hdb_user?.username}' is not permitted to ${json.operation}`);
|
|
@@ -255,15 +394,22 @@ export function chooseOperation(json: OperationRequestBody, bypassAuth = false)
|
|
|
255
394
|
!bypassAuth &&
|
|
256
395
|
json.operation !== terms.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS &&
|
|
257
396
|
json.operation !== terms.OPERATIONS_ENUM.LOGIN &&
|
|
258
|
-
json.operation !== terms.OPERATIONS_ENUM.LOGOUT
|
|
397
|
+
json.operation !== terms.OPERATIONS_ENUM.LOGOUT &&
|
|
398
|
+
// Same rationale: the OIDC exchange authenticates its own caller (#2171), so there is no
|
|
399
|
+
// hdb_user for verifyPerms to check against.
|
|
400
|
+
json.operation !== terms.OPERATIONS_ENUM.EXCHANGE_OIDC_TOKEN
|
|
259
401
|
) {
|
|
260
402
|
const functionToCheck = job_operation_function === undefined ? operation_function : job_operation_function;
|
|
261
|
-
const operation_json =
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
403
|
+
const operation_json = nestedSearch ?? json;
|
|
404
|
+
// Authentication is the only source of the principal; a nested one is overwritten, not honored.
|
|
405
|
+
operation_json.hdb_user = json.hdb_user;
|
|
265
406
|
|
|
266
|
-
|
|
407
|
+
// Pass the top-level operation for the token-scope check: for an export job, operation_json
|
|
408
|
+
// is the nested search_operation, so json.operation (export_local/export_to_s3) is the op the
|
|
409
|
+
// scope must gate — not the inner search.
|
|
410
|
+
const verifyPermsResult = opAuth.verifyPerms(operation_json, functionToCheck, {
|
|
411
|
+
apiOperation: json.operation,
|
|
412
|
+
});
|
|
267
413
|
|
|
268
414
|
if (verifyPermsResult) {
|
|
269
415
|
operationLog.error(`${HTTP_STATUS_CODES.FORBIDDEN} from operation ${json.operation}`);
|
|
@@ -279,6 +425,35 @@ export function chooseOperation(json: OperationRequestBody, bypassAuth = false)
|
|
|
279
425
|
true
|
|
280
426
|
);
|
|
281
427
|
}
|
|
428
|
+
|
|
429
|
+
// The check above authorizes invoking the operation, but for a non-SQL export it returns
|
|
430
|
+
// before any table check — a requires_su export is granted the moment its `operations`
|
|
431
|
+
// allowlist lists it (verifyPerms gate 2) — and the job worker then runs `search_operation`
|
|
432
|
+
// through searchByValue/Hash/Conditions, none of which check permissions. So the nested read
|
|
433
|
+
// is only enforceable here: authorize it additively against its real search handler and the
|
|
434
|
+
// authenticated principal (assigned above via operation_json), so a role that may invoke the
|
|
435
|
+
// export but lacks read on the table is denied. A nested SQL search is covered by the AST
|
|
436
|
+
// branch above instead.
|
|
437
|
+
if (nestedSearch) {
|
|
438
|
+
const nestedFunction = getOperationFunction(nestedSearch).operation_function;
|
|
439
|
+
const nestedPermsResult = opAuth.verifyPerms(nestedSearch, nestedFunction, {
|
|
440
|
+
apiOperation: json.operation,
|
|
441
|
+
});
|
|
442
|
+
if (nestedPermsResult) {
|
|
443
|
+
operationLog.error(`${HTTP_STATUS_CODES.FORBIDDEN} from operation ${json.operation}`);
|
|
444
|
+
operationLog.warn(
|
|
445
|
+
`User '${operation_json.hdb_user?.username}' is not permitted to ${nestedSearch.operation} within ${json.operation}`
|
|
446
|
+
);
|
|
447
|
+
throw handleHDBError(
|
|
448
|
+
new Error(),
|
|
449
|
+
nestedPermsResult,
|
|
450
|
+
hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,
|
|
451
|
+
undefined,
|
|
452
|
+
false,
|
|
453
|
+
true
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
282
457
|
}
|
|
283
458
|
} catch (err) {
|
|
284
459
|
throw handleHDBError(err, `There was an error when trying to choose an operation path`, 500);
|
|
@@ -357,6 +532,9 @@ async function catchup(req: CatchupOperationRequest) {
|
|
|
357
532
|
case terms.OPERATIONS_ENUM.UPSERT:
|
|
358
533
|
await insert.upsert(transaction);
|
|
359
534
|
break;
|
|
535
|
+
case terms.OPERATIONS_ENUM.PUT:
|
|
536
|
+
await insert.put(transaction);
|
|
537
|
+
break;
|
|
360
538
|
case terms.OPERATIONS_ENUM.DELETE:
|
|
361
539
|
await delete_.deleteRecord(transaction);
|
|
362
540
|
break;
|
|
@@ -411,6 +589,7 @@ function initializeOperationFunctionMap(): Map<OperationFunctionName, OperationF
|
|
|
411
589
|
opFuncMap.set(terms.OPERATIONS_ENUM.INSERT, new OperationFunctionObject(insert.insert));
|
|
412
590
|
opFuncMap.set(terms.OPERATIONS_ENUM.UPDATE, new OperationFunctionObject(insert.update));
|
|
413
591
|
opFuncMap.set(terms.OPERATIONS_ENUM.UPSERT, new OperationFunctionObject(insert.upsert));
|
|
592
|
+
opFuncMap.set(terms.OPERATIONS_ENUM.PUT, new OperationFunctionObject(insert.put));
|
|
414
593
|
opFuncMap.set(terms.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS, new OperationFunctionObject(search.searchByConditions));
|
|
415
594
|
opFuncMap.set(terms.OPERATIONS_ENUM.SEARCH_BY_HASH, new OperationFunctionObject(search.searchByHash));
|
|
416
595
|
opFuncMap.set(terms.OPERATIONS_ENUM.SEARCH_BY_ID, new OperationFunctionObject(search.searchByHash));
|
|
@@ -581,6 +760,19 @@ function initializeOperationFunctionMap(): Map<OperationFunctionName, OperationF
|
|
|
581
760
|
terms.OPERATIONS_ENUM.GET_SECRETS_PUBLIC_KEY,
|
|
582
761
|
new OperationFunctionObject(secretOperations.getSecretsPublicKey)
|
|
583
762
|
);
|
|
763
|
+
opFuncMap.set(terms.OPERATIONS_ENUM.ADD_OIDC_TRUST, new OperationFunctionObject(trustPolicyOperations.addOidcTrust));
|
|
764
|
+
opFuncMap.set(
|
|
765
|
+
terms.OPERATIONS_ENUM.LIST_OIDC_TRUST,
|
|
766
|
+
new OperationFunctionObject(trustPolicyOperations.listOidcTrust)
|
|
767
|
+
);
|
|
768
|
+
opFuncMap.set(
|
|
769
|
+
terms.OPERATIONS_ENUM.DROP_OIDC_TRUST,
|
|
770
|
+
new OperationFunctionObject(trustPolicyOperations.dropOidcTrust)
|
|
771
|
+
);
|
|
772
|
+
opFuncMap.set(
|
|
773
|
+
terms.OPERATIONS_ENUM.EXCHANGE_OIDC_TOKEN,
|
|
774
|
+
new OperationFunctionObject(tokenExchange.exchangeOidcToken)
|
|
775
|
+
);
|
|
584
776
|
opFuncMap.set(
|
|
585
777
|
terms.OPERATIONS_ENUM.READ_TRANSACTION_LOG,
|
|
586
778
|
new OperationFunctionObject(transactionLog.readTransactionLog)
|