@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.3
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/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +17 -10
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/ResourceInterface.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +12 -4
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +265 -73
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +11 -12
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +52 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +2 -1
- package/dist/utility/lmdb/commonUtility.js +20 -13
- package/dist/utility/lmdb/commonUtility.js.map +1 -1
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +35 -16
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4531 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +733 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +596 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-C1G-Jo6n.js +37 -0
- package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
- package/studio/web/assets/index-D-CahN0-.js +2 -0
- package/studio/web/assets/index-D-CahN0-.js.map +1 -0
- package/studio/web/assets/index-DxlZI0PX.js +235 -0
- package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
- package/studio/web/assets/profiler-CU93QiSW.js +2 -0
- package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +130 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
- package/dist/resources/ResourceInterfaceV2.js.map +0 -1
- package/dist/resources/ResourceV2.d.ts +0 -30
- package/dist/resources/ResourceV2.js +0 -27
- package/dist/resources/ResourceV2.js.map +0 -1
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const PermissionTableResponseObject = require('./PermissionTableResponseObject.js');
|
|
4
|
+
const PermissionAttributeResponseObject = require('./PermissionAttributeResponseObject.js');
|
|
5
|
+
const { HDB_ERROR_MSGS } = require('../../utility/errors/commonErrors.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* This object organizes permission checks into a cohesive response object that will be returned to
|
|
9
|
+
* the user in the case of a failed permissions check.
|
|
10
|
+
*/
|
|
11
|
+
class PermissionResponseObject {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.error = HDB_ERROR_MSGS.OP_AUTH_PERMS_ERROR;
|
|
14
|
+
this.unauthorized_access = {};
|
|
15
|
+
this.invalid_schema_items = [];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* This method sets the passed error message to the unauthorizedAccess array and returns the perms response object
|
|
20
|
+
* to be returned to the API - i.e. operation requires SU role so response is sent back immediately with that error message
|
|
21
|
+
* @param errMsg
|
|
22
|
+
* @returns { PermissionResponseObject }
|
|
23
|
+
*/
|
|
24
|
+
handleUnauthorizedItem(errMsg) {
|
|
25
|
+
this.invalid_schema_items = [];
|
|
26
|
+
this.unauthorized_access = [errMsg];
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This method sets the passed error message to the invalidSchemaItems array and returns the perms response object
|
|
32
|
+
* to be returned to the API - i.e. operation on schema that user does not have access to or doesn't exist so response
|
|
33
|
+
* is sent back immediately with that error message
|
|
34
|
+
* @param errMsg
|
|
35
|
+
* @returns { PermissionResponseObject }
|
|
36
|
+
*/
|
|
37
|
+
handleInvalidItem(errMsg) {
|
|
38
|
+
this.invalid_schema_items = [errMsg];
|
|
39
|
+
this.unauthorized_access = [];
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* This method is used to add an invalid schema item message to the invalidSchemaItems array if there is not an
|
|
45
|
+
* unauthorizedAccess value already tracked for the table - this ensures that we are not providing schema meta-data
|
|
46
|
+
* to the user that they should not have
|
|
47
|
+
* @param item - error string to add to array
|
|
48
|
+
* @param schema - schema that the item is a part of
|
|
49
|
+
* @param table - table that the item is a part of
|
|
50
|
+
*/
|
|
51
|
+
addInvalidItem(item, schema, table) {
|
|
52
|
+
if (schema && table) {
|
|
53
|
+
const schemaTable = `${schema}_${table}`;
|
|
54
|
+
if (this.unauthorized_access[schemaTable]) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
this.invalid_schema_items.push(item);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* This method is used to add an unauthorized table object to the unauthorizedAccess array
|
|
63
|
+
* @param schema - schema that table is under
|
|
64
|
+
* @param table - table name that user does not have correct perms on
|
|
65
|
+
* @param requiredPerms - permission/s that user does not have on the table to complete the operation
|
|
66
|
+
*/
|
|
67
|
+
addUnauthorizedTable(schema, table, requiredTablePerms) {
|
|
68
|
+
const failedTable = new PermissionTableResponseObject(schema, table, requiredTablePerms);
|
|
69
|
+
|
|
70
|
+
const schemaTable = `${schema}_${table}`;
|
|
71
|
+
this.unauthorized_access[schemaTable] = failedTable;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* This method is used to add unauthorized table attribute objects to a new or, if already tracked, an existing table
|
|
76
|
+
* object tracked in the unauthorizedAccess array
|
|
77
|
+
* @param attrKeys - attribute names that are restricted
|
|
78
|
+
* @param schema - schema of table where attr restrictions exist
|
|
79
|
+
* @param table - table where attr restrictions exist
|
|
80
|
+
* @param restrictedAttrs - the perms restrictions for each attr
|
|
81
|
+
*/
|
|
82
|
+
addUnauthorizedAttributes(attrKeys, schema, table, restrictedAttrs) {
|
|
83
|
+
const unauthorizedTableAttributes = [];
|
|
84
|
+
attrKeys.forEach((attr) => {
|
|
85
|
+
const attributeObject = new PermissionAttributeResponseObject(attr, restrictedAttrs[attr]);
|
|
86
|
+
unauthorizedTableAttributes.push(attributeObject);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const schemaTable = `${schema}_${table}`;
|
|
90
|
+
|
|
91
|
+
if (this.unauthorized_access[schemaTable]) {
|
|
92
|
+
this.unauthorized_access[schemaTable].required_attribute_permissions = unauthorizedTableAttributes;
|
|
93
|
+
} else {
|
|
94
|
+
const failedPermObject = new PermissionTableResponseObject(schema, table, [], unauthorizedTableAttributes);
|
|
95
|
+
this.unauthorized_access[schemaTable] = failedPermObject;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* This method is used to evaluate whether or not there are permissions issues tracked and, if so, returns the response
|
|
101
|
+
* object and, if not, returns a null value meaning the validation step has passed
|
|
102
|
+
*
|
|
103
|
+
* @returns { null| PermissionResponseObject }
|
|
104
|
+
*/
|
|
105
|
+
getPermsResponse() {
|
|
106
|
+
const unauthorizedAccessArr = Object.values(this.unauthorized_access);
|
|
107
|
+
if (unauthorizedAccessArr.length > 0 || this.invalid_schema_items.length > 0) {
|
|
108
|
+
this.unauthorized_access = unauthorizedAccessArr;
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = PermissionResponseObject;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class PermissionTableResponseObject {
|
|
4
|
+
/**
|
|
5
|
+
* Organizes permission checks into a cohesive response object that will be returned to
|
|
6
|
+
* the user in the case of a failed permissions check.
|
|
7
|
+
* @param schema {String}
|
|
8
|
+
* @param table {String}
|
|
9
|
+
* @param requiredTablePerms {Array}
|
|
10
|
+
* @param requiredAttrPerms {Array}
|
|
11
|
+
*/
|
|
12
|
+
constructor(schema, table, requiredTablePerms = [], requiredAttrPerms = []) {
|
|
13
|
+
this.schema = schema;
|
|
14
|
+
this.table = table;
|
|
15
|
+
this.required_table_permissions = requiredTablePerms;
|
|
16
|
+
this.required_attribute_permissions = requiredAttrPerms;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
module.exports = PermissionTableResponseObject;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const validation = require('../validation/check_permissions.js');
|
|
4
|
+
const passport = require('passport');
|
|
5
|
+
const LocalStrategy = require('passport-local').Strategy;
|
|
6
|
+
const BasicStrategy = require('passport-http').BasicStrategy;
|
|
7
|
+
const util = require('util');
|
|
8
|
+
const userFunctions = require('./user.ts');
|
|
9
|
+
const cbFindValidateUsers = util.callbackify(userFunctions.findAndValidateUser);
|
|
10
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
11
|
+
const tokenAuthentication = require('./tokenAuthentication.ts');
|
|
12
|
+
const { AccessViolation } = require('../utility/errors/hdbError');
|
|
13
|
+
|
|
14
|
+
passport.use(
|
|
15
|
+
new LocalStrategy(function (username, password, done) {
|
|
16
|
+
cbFindValidateUsers(username, password, done);
|
|
17
|
+
})
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
passport.use(
|
|
21
|
+
new BasicStrategy(function (username, password, done) {
|
|
22
|
+
cbFindValidateUsers(username, password, done);
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
passport.serializeUser(function (user, done) {
|
|
27
|
+
done(null, user);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
passport.deserializeUser(function (user, done) {
|
|
31
|
+
done(null, user);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function authorize(req, res, next) {
|
|
35
|
+
if (req.raw?.user !== undefined) return next(null, req.raw.user);
|
|
36
|
+
let strategy;
|
|
37
|
+
let token;
|
|
38
|
+
if (req.headers?.authorization) {
|
|
39
|
+
let splitAuthHeader = req.headers.authorization.split(' ');
|
|
40
|
+
strategy = splitAuthHeader[0];
|
|
41
|
+
token = splitAuthHeader[1];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function handleResponse(err, user) {
|
|
45
|
+
if (err) {
|
|
46
|
+
return next(err);
|
|
47
|
+
}
|
|
48
|
+
if (!user) {
|
|
49
|
+
return next(new AccessViolation());
|
|
50
|
+
}
|
|
51
|
+
return next(null, user);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
switch (strategy) {
|
|
55
|
+
case 'Basic':
|
|
56
|
+
passport.authenticate('basic', { session: false }, (err, user) => {
|
|
57
|
+
handleResponse(err, user);
|
|
58
|
+
})(req, res, next);
|
|
59
|
+
break;
|
|
60
|
+
case 'Bearer':
|
|
61
|
+
if (req.body?.operation && req.body.operation === hdbTerms.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN) {
|
|
62
|
+
tokenAuthentication
|
|
63
|
+
.validateRefreshToken(token)
|
|
64
|
+
.then((user) => {
|
|
65
|
+
req.body.refresh_token = token;
|
|
66
|
+
next(null, user);
|
|
67
|
+
})
|
|
68
|
+
.catch((e) => {
|
|
69
|
+
next(e);
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
tokenAuthentication
|
|
73
|
+
.validateOperationToken(token)
|
|
74
|
+
.then((user) => {
|
|
75
|
+
next(null, user);
|
|
76
|
+
})
|
|
77
|
+
.catch((e) => {
|
|
78
|
+
next(e);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
passport.authenticate('local', { session: false }, function (err, user) {
|
|
84
|
+
handleResponse(err, user);
|
|
85
|
+
})(req, res, next);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function checkPermissions(checkPermissionObj, callback) {
|
|
91
|
+
let validationResults = validation(checkPermissionObj);
|
|
92
|
+
|
|
93
|
+
if (validationResults) {
|
|
94
|
+
callback(validationResults);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let authoriziationObj = {
|
|
99
|
+
authorized: true,
|
|
100
|
+
messages: [],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
let role = checkPermissionObj.user.role;
|
|
104
|
+
|
|
105
|
+
if (!role?.permission) {
|
|
106
|
+
return callback('Invalid role');
|
|
107
|
+
}
|
|
108
|
+
let permission = JSON.parse(role.permission);
|
|
109
|
+
|
|
110
|
+
if (permission.super_user) {
|
|
111
|
+
return callback(null, authoriziationObj);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (!permission[checkPermissionObj.schema]) {
|
|
115
|
+
authoriziationObj.authorized = false;
|
|
116
|
+
authoriziationObj.messages.push(`Not authorized to access ${checkPermissionObj.schema} schema`);
|
|
117
|
+
return callback(null, authoriziationObj);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (!permission[checkPermissionObj.schema].tables[checkPermissionObj.table]) {
|
|
121
|
+
authoriziationObj.authorized = false;
|
|
122
|
+
authoriziationObj.messages.push(`Not authorized to access ${checkPermissionObj.table} table`);
|
|
123
|
+
return callback(null, authoriziationObj);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (!permission[checkPermissionObj.schema].tables[checkPermissionObj.table][checkPermissionObj.operation]) {
|
|
127
|
+
authoriziationObj.authorized = false;
|
|
128
|
+
authoriziationObj.messages.push(
|
|
129
|
+
`Not authorized to access ${checkPermissionObj.operation} on ${checkPermissionObj.table} table`
|
|
130
|
+
);
|
|
131
|
+
return callback(null, authoriziationObj);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (
|
|
135
|
+
permission[checkPermissionObj.schema].tables[checkPermissionObj.table].attribute_permissions &&
|
|
136
|
+
!checkPermissionObj.attributes
|
|
137
|
+
) {
|
|
138
|
+
authoriziationObj.authorized = false;
|
|
139
|
+
authoriziationObj.messages.push(
|
|
140
|
+
`${checkPermissionObj.schema}.${checkPermissionObj.table} has attribute permissions. Missing attributes to validate`
|
|
141
|
+
);
|
|
142
|
+
return callback(null, authoriziationObj);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (
|
|
146
|
+
permission[checkPermissionObj.schema].tables[checkPermissionObj.table].attribute_permissions &&
|
|
147
|
+
checkPermissionObj.attributes
|
|
148
|
+
) {
|
|
149
|
+
let restrictedAttrs = permission[checkPermissionObj.schema].tables[checkPermissionObj.table].attribute_permissions;
|
|
150
|
+
for (let rAttr in restrictedAttrs) {
|
|
151
|
+
if (
|
|
152
|
+
checkPermissionObj.attributes.indexOf(restrictedAttrs[rAttr].attribute_name) > -1 &&
|
|
153
|
+
!restrictedAttrs[rAttr][checkPermissionObj.operation]
|
|
154
|
+
) {
|
|
155
|
+
authoriziationObj.authorized = false;
|
|
156
|
+
authoriziationObj.messages.push(
|
|
157
|
+
`Not authorized to ${checkPermissionObj.operation} ${restrictedAttrs[rAttr].attribute_name} `
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return callback(null, authoriziationObj);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
module.exports = {
|
|
167
|
+
authorize,
|
|
168
|
+
checkPermissions,
|
|
169
|
+
};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type { User } from './user.ts';
|
|
2
|
+
import type { ImpersonatePayload } from '../server/operationsServer.ts';
|
|
3
|
+
import { getUsersWithRolesCache } from './user.ts';
|
|
4
|
+
import { validateOperations } from '../utility/operationPermissions.ts';
|
|
5
|
+
import { ClientError } from '../utility/errors/hdbError.js';
|
|
6
|
+
import harperLogger from '../utility/logging/harper_logger.js';
|
|
7
|
+
import { getRoleByName } from './role.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Applies impersonation to a request. The authenticated user must be a super_user.
|
|
11
|
+
* Returns a new User object with downgraded permissions based on the impersonate payload.
|
|
12
|
+
*
|
|
13
|
+
* Mode A (inline role): `impersonate.role` is present — builds a synthetic user with the given permissions.
|
|
14
|
+
* Mode B (existing user): `impersonate.username` is present (no role/role_name) — looks up the user from cache.
|
|
15
|
+
* Mode C (existing role): `impersonate.role_name` is present (no role) — looks up the role by name and builds a synthetic user.
|
|
16
|
+
*/
|
|
17
|
+
export async function applyImpersonation(authenticatedUser: User, payload: ImpersonatePayload): Promise<User> {
|
|
18
|
+
// Gate: only super_user can impersonate
|
|
19
|
+
if (!authenticatedUser?.role?.permission?.super_user) {
|
|
20
|
+
throw new ClientError('Only super_user can use impersonation', 403);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
validatePayload(payload);
|
|
24
|
+
|
|
25
|
+
let impersonatedUser: User;
|
|
26
|
+
|
|
27
|
+
if (payload.role) {
|
|
28
|
+
// Mode A: inline permissions
|
|
29
|
+
impersonatedUser = buildInlineUser(authenticatedUser, payload);
|
|
30
|
+
} else if (payload.role_name) {
|
|
31
|
+
// Mode C: look up existing role by name
|
|
32
|
+
impersonatedUser = await lookupRole(authenticatedUser, payload);
|
|
33
|
+
} else {
|
|
34
|
+
// Mode B: look up existing user by username
|
|
35
|
+
impersonatedUser = await lookupUser(payload.username!);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Enforce downgrade: never allow escalation
|
|
39
|
+
enforceDowngrade(impersonatedUser);
|
|
40
|
+
|
|
41
|
+
// Tag for audit trail
|
|
42
|
+
impersonatedUser._impersonated = true;
|
|
43
|
+
impersonatedUser._impersonatedBy = authenticatedUser.username;
|
|
44
|
+
|
|
45
|
+
harperLogger.info(
|
|
46
|
+
`Impersonation applied: "${authenticatedUser.username}" impersonating as "${impersonatedUser.username}"`
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
return impersonatedUser;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function validatePayload(payload: ImpersonatePayload): void {
|
|
53
|
+
if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
|
|
54
|
+
throw new ClientError('Invalid impersonate payload: must be an object');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const hasRole = payload.role !== undefined;
|
|
58
|
+
const hasUsername = typeof payload.username === 'string' && payload.username.length > 0;
|
|
59
|
+
const hasRoleName = typeof payload.role_name === 'string' && payload.role_name.length > 0;
|
|
60
|
+
|
|
61
|
+
if (!hasRole && !hasUsername && !hasRoleName) {
|
|
62
|
+
throw new ClientError(
|
|
63
|
+
"Invalid impersonate payload: must include 'username', 'role_name', or 'role' with 'permission'"
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (hasRole) {
|
|
68
|
+
if (typeof payload.role !== 'object' || payload.role === null) {
|
|
69
|
+
throw new ClientError("Invalid impersonate payload: 'role' must be an object");
|
|
70
|
+
}
|
|
71
|
+
if (typeof payload.role.permission !== 'object' || payload.role.permission === null) {
|
|
72
|
+
throw new ClientError("Invalid impersonate payload: 'role.permission' must be an object");
|
|
73
|
+
}
|
|
74
|
+
validateOperationsField(payload.role.permission);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function validateOperationsField(permission: Record<string, unknown>): void {
|
|
79
|
+
const operations = permission.operations;
|
|
80
|
+
if (operations === undefined) return;
|
|
81
|
+
|
|
82
|
+
if (!Array.isArray(operations)) {
|
|
83
|
+
throw new ClientError("Invalid impersonate payload: 'operations' must be an array");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const invalidOp = validateOperations(operations);
|
|
87
|
+
if (invalidOp !== null) {
|
|
88
|
+
throw new ClientError(`Invalid impersonate payload: unknown operation '${invalidOp}'`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function buildInlineUser(authenticatedUser: User, payload: ImpersonatePayload): User {
|
|
93
|
+
const username = payload.username || authenticatedUser.username;
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
username,
|
|
97
|
+
active: true,
|
|
98
|
+
role: {
|
|
99
|
+
permission: { ...payload.role!.permission },
|
|
100
|
+
role: `_impersonated`,
|
|
101
|
+
id: `_impersonated_${username}`,
|
|
102
|
+
__updatedtime__: Date.now(),
|
|
103
|
+
__createdtime__: Date.now(),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function lookupUser(username: string): Promise<User> {
|
|
109
|
+
const cache = await getUsersWithRolesCache();
|
|
110
|
+
const cachedUser = cache.get(username);
|
|
111
|
+
|
|
112
|
+
if (!cachedUser) {
|
|
113
|
+
throw new ClientError(`Impersonation target user '${username}' not found`, 404);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (cachedUser.active === false) {
|
|
117
|
+
throw new ClientError(`Impersonation target user '${username}' is inactive`, 403);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Shallow-clone to avoid mutating cache (same pattern as auth.ts)
|
|
121
|
+
const cloned: User = {
|
|
122
|
+
...cachedUser,
|
|
123
|
+
role: cachedUser.role
|
|
124
|
+
? {
|
|
125
|
+
...cachedUser.role,
|
|
126
|
+
permission: { ...cachedUser.role.permission },
|
|
127
|
+
id: `_impersonated_${username}`,
|
|
128
|
+
}
|
|
129
|
+
: cachedUser.role,
|
|
130
|
+
};
|
|
131
|
+
return cloned;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function lookupRole(authenticatedUser: User, payload: ImpersonatePayload): Promise<User> {
|
|
135
|
+
const role = await getRoleByName(payload.role_name);
|
|
136
|
+
|
|
137
|
+
if (!role) {
|
|
138
|
+
throw new ClientError(`Impersonation target role '${payload.role_name}' not found`, 404);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const username = payload.username || authenticatedUser.username;
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
username,
|
|
145
|
+
active: true,
|
|
146
|
+
role: {
|
|
147
|
+
permission: { ...role.permission },
|
|
148
|
+
role: role.role,
|
|
149
|
+
id: `_impersonated_${username}`,
|
|
150
|
+
__updatedtime__: Date.now(),
|
|
151
|
+
__createdtime__: Date.now(),
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function enforceDowngrade(user: User): void {
|
|
157
|
+
if (!user.role?.permission) return;
|
|
158
|
+
user.role.permission.super_user = false;
|
|
159
|
+
user.role.permission.cluster_user = false;
|
|
160
|
+
}
|