@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,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const envMangr = require('../utility/environment/environmentManager.js');
|
|
4
|
+
const Joi = require('joi');
|
|
5
|
+
const validator = require('./validationWrapper.js');
|
|
6
|
+
const moment = require('moment');
|
|
7
|
+
const fs = require('fs-extra');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const _ = require('lodash');
|
|
10
|
+
const hdbTerms = require('../utility/hdbTerms.ts');
|
|
11
|
+
const { LOG_LEVELS } = require('../utility/hdbTerms.ts');
|
|
12
|
+
|
|
13
|
+
const LOG_DATE_FORMAT = 'YYYY-MM-DD hh:mm:ss';
|
|
14
|
+
const INSTALL_LOG_LOCATION = path.resolve(__dirname, `../logs`);
|
|
15
|
+
|
|
16
|
+
module.exports = function (object) {
|
|
17
|
+
return validator.validateBySchema(object, readLogSchema);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const readLogSchema = Joi.object({
|
|
21
|
+
from: Joi.custom(validateDatetime),
|
|
22
|
+
until: Joi.custom(validateDatetime),
|
|
23
|
+
to: Joi.custom(validateDatetime),
|
|
24
|
+
level: Joi.valid(
|
|
25
|
+
LOG_LEVELS.NOTIFY,
|
|
26
|
+
LOG_LEVELS.FATAL,
|
|
27
|
+
LOG_LEVELS.ERROR,
|
|
28
|
+
LOG_LEVELS.WARN,
|
|
29
|
+
LOG_LEVELS.INFO,
|
|
30
|
+
LOG_LEVELS.DEBUG,
|
|
31
|
+
LOG_LEVELS.TRACE
|
|
32
|
+
),
|
|
33
|
+
order: Joi.valid('asc', 'desc'),
|
|
34
|
+
limit: Joi.number().min(1),
|
|
35
|
+
start: Joi.number().min(0),
|
|
36
|
+
log_name: Joi.custom(validateReadLogPath),
|
|
37
|
+
filter: Joi.string(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
function validateDatetime(value, helpers) {
|
|
41
|
+
if (moment(value, moment.ISO_8601).format(LOG_DATE_FORMAT) === 'Invalid date') {
|
|
42
|
+
return helpers.message(`'${helpers.state.path[0]}' date '${value}' is invalid.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function validateReadLogPath(value, helpers) {
|
|
47
|
+
const processLogName = _.invert(hdbTerms.LOG_NAMES);
|
|
48
|
+
if (processLogName[value] === undefined) {
|
|
49
|
+
return helpers.message(`'log_name' '${value}' is invalid.`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const logPath = envMangr.get(hdbTerms.HDB_SETTINGS_NAMES.LOG_PATH_KEY);
|
|
53
|
+
const logName = value === undefined ? hdbTerms.LOG_NAMES.HDB : value;
|
|
54
|
+
const readLogPath =
|
|
55
|
+
logName === hdbTerms.LOG_NAMES.INSTALL
|
|
56
|
+
? path.join(INSTALL_LOG_LOCATION, hdbTerms.LOG_NAMES.INSTALL)
|
|
57
|
+
: path.join(logPath, logName);
|
|
58
|
+
|
|
59
|
+
let exists = fs.existsSync(readLogPath);
|
|
60
|
+
if (exists) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return helpers.message(`'log_name' '${value}' does not exist.`);
|
|
64
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
const validate = require('validate.js'),
|
|
2
|
+
validator = require('./validationWrapper.js'),
|
|
3
|
+
terms = require('../utility/hdbTerms.ts'),
|
|
4
|
+
{ validateOperations } = require('../utility/operationPermissions.ts'),
|
|
5
|
+
{ handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
6
|
+
|
|
7
|
+
const { HDB_ERROR_MSGS, HTTP_STATUS_CODES } = hdbErrors;
|
|
8
|
+
|
|
9
|
+
const constraintsTemplate = () => ({
|
|
10
|
+
role: {
|
|
11
|
+
presence: true,
|
|
12
|
+
format: '[\\w\\-\\_]+',
|
|
13
|
+
},
|
|
14
|
+
id: {
|
|
15
|
+
presence: true,
|
|
16
|
+
format: '[\\w\\-\\_]+',
|
|
17
|
+
},
|
|
18
|
+
permission: {
|
|
19
|
+
presence: true,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const STRUCTURE_USER_ENUM = {
|
|
24
|
+
STRUCTURE_USER: 'structure_user',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const OPERATIONS_KEY = 'operations';
|
|
28
|
+
|
|
29
|
+
const ROLE_TYPES = Object.values(terms.ROLE_TYPES_ENUM);
|
|
30
|
+
const ATTR_PERMS_KEY = 'attribute_permissions';
|
|
31
|
+
const ATTR_NAME_KEY = 'attribute_name';
|
|
32
|
+
const { PERMS_CRUD_ENUM } = terms;
|
|
33
|
+
const TABLE_PERM_KEYS = [ATTR_PERMS_KEY, ...Object.values(PERMS_CRUD_ENUM)];
|
|
34
|
+
const ATTR_CRU_KEYS = [PERMS_CRUD_ENUM.READ, PERMS_CRUD_ENUM.INSERT, PERMS_CRUD_ENUM.UPDATE];
|
|
35
|
+
const ATTR_PERMS_KEYS = [ATTR_NAME_KEY, ...ATTR_CRU_KEYS];
|
|
36
|
+
|
|
37
|
+
function addRoleValidation(object) {
|
|
38
|
+
const constraints = constraintsTemplate();
|
|
39
|
+
constraints.role.presence = true;
|
|
40
|
+
constraints.id.presence = false;
|
|
41
|
+
constraints.permission.presence = true;
|
|
42
|
+
return customValidate(object, constraints);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function alterRoleValidation(object) {
|
|
46
|
+
const constraints = constraintsTemplate();
|
|
47
|
+
constraints.role.presence = false;
|
|
48
|
+
constraints.id.presence = true;
|
|
49
|
+
constraints.permission.presence = true;
|
|
50
|
+
return customValidate(object, constraints);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function dropRoleValidation(object) {
|
|
54
|
+
const constraints = constraintsTemplate();
|
|
55
|
+
constraints.role.presence = false;
|
|
56
|
+
constraints.id.presence = true;
|
|
57
|
+
constraints.permission.presence = false;
|
|
58
|
+
return validator.validateObject(object, constraints);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const ALLOWED_JSON_KEYS = ['operation', 'role', 'id', 'permission', 'hdb_user', 'access'];
|
|
62
|
+
|
|
63
|
+
function customValidate(object, constraints) {
|
|
64
|
+
let validationErrors = {
|
|
65
|
+
main_permissions: [],
|
|
66
|
+
schema_permissions: {},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const jsonMsgKeys = Object.keys(object);
|
|
70
|
+
|
|
71
|
+
//Check to confirm that keys in JSON body are valid
|
|
72
|
+
const invalidKeys = [];
|
|
73
|
+
for (let i = 0, arrLength = jsonMsgKeys.length; i < arrLength; i++) {
|
|
74
|
+
if (!ALLOWED_JSON_KEYS.includes(jsonMsgKeys[i])) {
|
|
75
|
+
invalidKeys.push(jsonMsgKeys[i]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (invalidKeys.length > 0) {
|
|
79
|
+
addPermError(HDB_ERROR_MSGS.INVALID_ROLE_JSON_KEYS(invalidKeys), validationErrors);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let validateResult = validator.validateObject(object, constraints);
|
|
83
|
+
if (validateResult) {
|
|
84
|
+
validateResult.message.split(',').forEach((validationErr) => {
|
|
85
|
+
addPermError(validationErr, validationErrors);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
//need this check to avoid unexpected errors if someone doesn't have permissions key included in request
|
|
90
|
+
if (object.permission) {
|
|
91
|
+
//check if role is SU or CU and has perms included
|
|
92
|
+
const suPermsError = validateNoSUPerms(object);
|
|
93
|
+
if (suPermsError) {
|
|
94
|
+
addPermError(suPermsError, validationErrors);
|
|
95
|
+
}
|
|
96
|
+
//check if cu or su values, if included, are booleans
|
|
97
|
+
ROLE_TYPES.forEach((role) => {
|
|
98
|
+
if (object.permission[role] && !validate.isBoolean(object.permission[role])) {
|
|
99
|
+
addPermError(HDB_ERROR_MSGS.SU_CU_ROLE_BOOLEAN_ERROR(role), validationErrors);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
for (let item in object.permission) {
|
|
105
|
+
if (ROLE_TYPES.indexOf(item) < 0) {
|
|
106
|
+
//validate the user type 'structure_user'. acceptable data type is boolean or array of strings (this would be array of accepted schemas to interact with)
|
|
107
|
+
if (item === STRUCTURE_USER_ENUM.STRUCTURE_USER) {
|
|
108
|
+
let structureUserPerm = object.permission[item];
|
|
109
|
+
|
|
110
|
+
//boolean is valid, move on
|
|
111
|
+
if (typeof structureUserPerm === 'boolean') {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//array is valid check to make sure each entry is actually a schema.
|
|
116
|
+
if (Array.isArray(structureUserPerm)) {
|
|
117
|
+
for (let k = 0, length = structureUserPerm.length; k < length; k++) {
|
|
118
|
+
let schemaPerm = structureUserPerm[k];
|
|
119
|
+
if (!global.hdb_schema[schemaPerm]) {
|
|
120
|
+
addPermError(HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(schemaPerm), validationErrors);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//if we end up here then this is an invalid data type
|
|
127
|
+
addPermError(HDB_ERROR_MSGS.STRUCTURE_USER_ROLE_TYPE_ERROR(item), validationErrors);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// validate operations: must be an array of valid operation names and/or group names
|
|
132
|
+
if (item === OPERATIONS_KEY) {
|
|
133
|
+
const opUserPerm = object.permission[item];
|
|
134
|
+
|
|
135
|
+
if (!Array.isArray(opUserPerm)) {
|
|
136
|
+
addPermError(HDB_ERROR_MSGS.OPERATIONS_MUST_BE_ARRAY, validationErrors);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const invalidOp = validateOperations(opUserPerm);
|
|
141
|
+
if (invalidOp !== null) {
|
|
142
|
+
addPermError(HDB_ERROR_MSGS.INVALID_OPERATIONS_OP(invalidOp), validationErrors);
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let schema = object.permission[item];
|
|
148
|
+
//validate that schema exists
|
|
149
|
+
if (!item || !global.hdb_schema[item]) {
|
|
150
|
+
addPermError(HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(item), validationErrors);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (schema.tables) {
|
|
154
|
+
for (let t in schema.tables) {
|
|
155
|
+
let table = schema.tables[t];
|
|
156
|
+
//validate that table exists in schema
|
|
157
|
+
if (!t || !global.hdb_schema[item][t]) {
|
|
158
|
+
addPermError(HDB_ERROR_MSGS.TABLE_NOT_FOUND(item, t), validationErrors);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
//validate all table perm keys are valid
|
|
163
|
+
Object.keys(table).forEach((tableKey) => {
|
|
164
|
+
if (!TABLE_PERM_KEYS.includes(tableKey)) {
|
|
165
|
+
addPermError(HDB_ERROR_MSGS.INVALID_PERM_KEY(tableKey), validationErrors, item, t);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
//validate table CRUD perms
|
|
170
|
+
Object.values(PERMS_CRUD_ENUM).forEach((permKey) => {
|
|
171
|
+
if (!validate.isDefined(table[permKey])) {
|
|
172
|
+
addPermError(HDB_ERROR_MSGS.TABLE_PERM_MISSING(permKey), validationErrors, item, t);
|
|
173
|
+
} else if (!validate.isBoolean(table[permKey])) {
|
|
174
|
+
addPermError(HDB_ERROR_MSGS.TABLE_PERM_NOT_BOOLEAN(permKey), validationErrors, item, t);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
//validate table ATTRIBUTE_PERMISSIONS perm
|
|
179
|
+
if (table.attribute_permissions === undefined) {
|
|
180
|
+
addPermError(HDB_ERROR_MSGS.ATTR_PERMS_ARRAY_MISSING, validationErrors, item, t);
|
|
181
|
+
continue;
|
|
182
|
+
} else if (!(Array.isArray(table.attribute_permissions) || table.attribute_permissions === null)) {
|
|
183
|
+
addPermError(HDB_ERROR_MSGS.ATTR_PERMS_NOT_ARRAY, validationErrors, item, t);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
//need this check here to ensure no unexpected errors if key is missing in table perms obj
|
|
188
|
+
if (table.attribute_permissions) {
|
|
189
|
+
let tableAttributeNames = global.hdb_schema[item][t].attributes.map(({ attribute }) => attribute);
|
|
190
|
+
const attrPermsCheck = {
|
|
191
|
+
read: false,
|
|
192
|
+
insert: false,
|
|
193
|
+
update: false,
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
for (let r in table.attribute_permissions) {
|
|
197
|
+
let permission = table.attribute_permissions[r];
|
|
198
|
+
|
|
199
|
+
Object.keys(permission).forEach((key) => {
|
|
200
|
+
//Leaving this second check for "DELETE" in for now since we've decided to silently
|
|
201
|
+
// allow it to remain in the attr permission object even though we do not use it
|
|
202
|
+
if (!ATTR_PERMS_KEYS.includes(key) && key !== PERMS_CRUD_ENUM.DELETE) {
|
|
203
|
+
addPermError(HDB_ERROR_MSGS.INVALID_ATTR_PERM_KEY(key), validationErrors, item, t);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
//validate that attribute_name is included
|
|
208
|
+
if (!validate.isDefined(permission.attribute_name)) {
|
|
209
|
+
addPermError(HDB_ERROR_MSGS.ATTR_PERM_MISSING_NAME, validationErrors, item, t);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const attrName = permission.attribute_name;
|
|
214
|
+
//validate that attr exists in schema for table
|
|
215
|
+
if (!tableAttributeNames.includes(attrName)) {
|
|
216
|
+
addPermError(HDB_ERROR_MSGS.INVALID_ATTRIBUTE_IN_PERMS(attrName), validationErrors, item, t);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
//validate table attribute CRU perms
|
|
221
|
+
ATTR_CRU_KEYS.forEach((permKey) => {
|
|
222
|
+
if (!validate.isDefined(permission[permKey])) {
|
|
223
|
+
addPermError(HDB_ERROR_MSGS.ATTR_PERM_MISSING(permKey, attrName), validationErrors, item, t);
|
|
224
|
+
} else if (!validate.isBoolean(permission[permKey])) {
|
|
225
|
+
addPermError(HDB_ERROR_MSGS.ATTR_PERM_NOT_BOOLEAN(permKey, attrName), validationErrors, item, t);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
//confirm that false table perms are not set to true for an attribute
|
|
230
|
+
if (!attrPermsCheck.read && permission.read === true) {
|
|
231
|
+
attrPermsCheck.read = true;
|
|
232
|
+
}
|
|
233
|
+
if (!attrPermsCheck.insert && permission.insert === true) {
|
|
234
|
+
attrPermsCheck.insert = true;
|
|
235
|
+
}
|
|
236
|
+
if (!attrPermsCheck.update && permission.update === true) {
|
|
237
|
+
attrPermsCheck.update = true;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//validate that there is no mismatching perms between table and attrs
|
|
241
|
+
if (
|
|
242
|
+
(table.read === false && attrPermsCheck.read === true) ||
|
|
243
|
+
(table.insert === false && attrPermsCheck.insert === true) ||
|
|
244
|
+
(table.update === false && attrPermsCheck.update === true)
|
|
245
|
+
) {
|
|
246
|
+
const schemaName = `${item}.${t}`;
|
|
247
|
+
addPermError(HDB_ERROR_MSGS.MISMATCHED_TABLE_ATTR_PERMS(schemaName), validationErrors, item, t);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return generateRolePermResponse(validationErrors);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
module.exports = {
|
|
259
|
+
addRoleValidation,
|
|
260
|
+
alterRoleValidation,
|
|
261
|
+
dropRoleValidation,
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Validates that permissions object for CU or SU roles do not also include permissions
|
|
266
|
+
* @param obj
|
|
267
|
+
* @returns {string|null}
|
|
268
|
+
*/
|
|
269
|
+
function validateNoSUPerms(obj) {
|
|
270
|
+
const { operation, permission } = obj;
|
|
271
|
+
if (operation === terms.OPERATIONS_ENUM.ADD_ROLE || operation === terms.OPERATIONS_ENUM.ALTER_ROLE) {
|
|
272
|
+
//Check if role type is super user
|
|
273
|
+
const isSuRole = permission.super_user === true;
|
|
274
|
+
const hasPerms = Object.keys(permission).length > 1;
|
|
275
|
+
if (hasPerms && isSuRole) {
|
|
276
|
+
return HDB_ERROR_MSGS.SU_CU_ROLE_NO_PERMS_ALLOWED(terms.ROLE_TYPES_ENUM.SUPER_USER);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Builds final permissions object error response to return if validation fails
|
|
284
|
+
*
|
|
285
|
+
* @param validationErrors
|
|
286
|
+
* @returns {null|HdbError}
|
|
287
|
+
*/
|
|
288
|
+
function generateRolePermResponse(validationErrors) {
|
|
289
|
+
const { main_permissions, schema_permissions } = validationErrors;
|
|
290
|
+
if (main_permissions.length > 0 || Object.keys(schema_permissions).length > 0) {
|
|
291
|
+
let validationMessage = {
|
|
292
|
+
error: HDB_ERROR_MSGS.ROLE_PERMS_ERROR,
|
|
293
|
+
...validationErrors,
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
return handleHDBError(new Error(), validationMessage, HTTP_STATUS_CODES.BAD_REQUEST);
|
|
297
|
+
} else {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Adds perm validation error to the correct category for the final validation error response
|
|
304
|
+
* @param err
|
|
305
|
+
* @param invalidPermsObj
|
|
306
|
+
* @param schema
|
|
307
|
+
* @param table
|
|
308
|
+
*/
|
|
309
|
+
function addPermError(err, invalidPermsObj, schema, table) {
|
|
310
|
+
if (!schema) {
|
|
311
|
+
invalidPermsObj.main_permissions.push(err);
|
|
312
|
+
} else {
|
|
313
|
+
const schemaKey = table ? schema + '_' + table : schema;
|
|
314
|
+
if (!invalidPermsObj.schema_permissions[schemaKey]) {
|
|
315
|
+
invalidPermsObj.schema_permissions[schemaKey] = [err];
|
|
316
|
+
} else {
|
|
317
|
+
invalidPermsObj.schema_permissions[schemaKey].push(err);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const schemaDescribe = require('../dataLayer/schemaDescribe.js');
|
|
4
|
+
const { hdbErrors } = require('../utility/errors/hdbError.js');
|
|
5
|
+
const { getDatabases } = require('../resources/databases.ts');
|
|
6
|
+
|
|
7
|
+
module.exports = {
|
|
8
|
+
checkSchemaExists,
|
|
9
|
+
checkSchemaTableExists,
|
|
10
|
+
schemaDescribe,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Checks the global hdbSchema for a schema and table
|
|
15
|
+
* @param schemaName
|
|
16
|
+
* @param tableName
|
|
17
|
+
* @returns string returns a thrown message if schema and or table does not exist
|
|
18
|
+
*/
|
|
19
|
+
async function checkSchemaExists(schemaName) {
|
|
20
|
+
let databases = getDatabases();
|
|
21
|
+
if (!databases[schemaName]) {
|
|
22
|
+
return hdbErrors.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(schemaName);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Checks the global hdbSchema for a schema and table
|
|
28
|
+
* @param schemaName
|
|
29
|
+
* @param tableName
|
|
30
|
+
* @returns string returns a thrown message if schema and or table does not exist
|
|
31
|
+
*/
|
|
32
|
+
async function checkSchemaTableExists(schemaName, tableName) {
|
|
33
|
+
let invalidSchema = await checkSchemaExists(schemaName);
|
|
34
|
+
if (invalidSchema) {
|
|
35
|
+
return invalidSchema;
|
|
36
|
+
}
|
|
37
|
+
let databases = getDatabases();
|
|
38
|
+
|
|
39
|
+
if (!databases[schemaName][tableName]) {
|
|
40
|
+
return hdbErrors.HDB_ERROR_MSGS.TABLE_NOT_FOUND(schemaName, tableName);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
const _ = require('lodash'),
|
|
2
|
+
validator = require('./validationWrapper.js');
|
|
3
|
+
const Joi = require('joi');
|
|
4
|
+
const hdbUtils = require('../utility/common_utils.js');
|
|
5
|
+
const { hdbSchemaTable, checkValidTable, hdbTable, hdbDatabase } = require('./common_validators.js');
|
|
6
|
+
const { handleHDBError, hdbErrors } = require('../utility/errors/hdbError.js');
|
|
7
|
+
const { getDatabases } = require('../resources/databases.ts');
|
|
8
|
+
const { HTTP_STATUS_CODES } = hdbErrors;
|
|
9
|
+
|
|
10
|
+
const searchByValueSchema = Joi.object({
|
|
11
|
+
database: hdbDatabase,
|
|
12
|
+
schema: hdbDatabase,
|
|
13
|
+
table: hdbTable,
|
|
14
|
+
attribute: hdbSchemaTable,
|
|
15
|
+
value: Joi.any().required(),
|
|
16
|
+
get_attributes: Joi.array().min(1).items(Joi.alternatives(hdbSchemaTable, Joi.object())).optional(),
|
|
17
|
+
desc: Joi.bool(),
|
|
18
|
+
limit: Joi.number().integer().min(1),
|
|
19
|
+
offset: Joi.number().integer().min(0),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const searchByConditionsSchema = Joi.object({
|
|
23
|
+
database: hdbDatabase,
|
|
24
|
+
schema: hdbDatabase,
|
|
25
|
+
table: hdbTable,
|
|
26
|
+
operator: Joi.string().valid('and', 'or').default('and').lowercase(),
|
|
27
|
+
offset: Joi.number().integer().min(0),
|
|
28
|
+
limit: Joi.number().integer().min(1),
|
|
29
|
+
get_attributes: Joi.array().min(1).items(Joi.alternatives(hdbSchemaTable, Joi.object())).optional(),
|
|
30
|
+
sort: Joi.object({
|
|
31
|
+
attribute: Joi.alternatives(hdbSchemaTable, Joi.array().min(1)),
|
|
32
|
+
descending: Joi.bool().optional(),
|
|
33
|
+
}).optional(),
|
|
34
|
+
conditions: Joi.array()
|
|
35
|
+
.min(1)
|
|
36
|
+
.items(
|
|
37
|
+
Joi.alternatives(
|
|
38
|
+
Joi.object({ operator: Joi.string().valid('and', 'or').default('and').lowercase(), conditions: Joi.array() }),
|
|
39
|
+
Joi.object({
|
|
40
|
+
attribute: Joi.alternatives(hdbSchemaTable, Joi.array().min(1)),
|
|
41
|
+
comparator: Joi.string()
|
|
42
|
+
.valid(
|
|
43
|
+
'equals',
|
|
44
|
+
'contains',
|
|
45
|
+
'starts_with',
|
|
46
|
+
'ends_with',
|
|
47
|
+
'greater_than',
|
|
48
|
+
'greater_than_equal',
|
|
49
|
+
'less_than',
|
|
50
|
+
'less_than_equal',
|
|
51
|
+
'between',
|
|
52
|
+
'not_equal'
|
|
53
|
+
)
|
|
54
|
+
.optional(),
|
|
55
|
+
value: Joi.when('comparator', {
|
|
56
|
+
switch: [
|
|
57
|
+
{ is: 'equals', then: Joi.any() },
|
|
58
|
+
{
|
|
59
|
+
is: 'between',
|
|
60
|
+
then: Joi.array()
|
|
61
|
+
.items(Joi.alternatives([Joi.string(), Joi.number()]))
|
|
62
|
+
.length(2),
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
otherwise: Joi.alternatives(Joi.string(), Joi.number()),
|
|
66
|
+
}).required(),
|
|
67
|
+
})
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
.required(),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
module.exports = function (searchObject, type) {
|
|
74
|
+
let validationError = null;
|
|
75
|
+
switch (type) {
|
|
76
|
+
case 'value':
|
|
77
|
+
validationError = validator.validateBySchema(searchObject, searchByValueSchema);
|
|
78
|
+
break;
|
|
79
|
+
case 'hashes':
|
|
80
|
+
let errors;
|
|
81
|
+
addError(checkValidTable('database', searchObject.schema));
|
|
82
|
+
addError(checkValidTable('table', searchObject.table));
|
|
83
|
+
if (!searchObject.hash_values) addError(`'hash_values' is required`);
|
|
84
|
+
else if (!Array.isArray(searchObject.hash_values)) addError(`'hash_values' must be an array`);
|
|
85
|
+
else if (!searchObject.hash_values.every((value) => typeof value === 'string' || typeof value === 'number'))
|
|
86
|
+
addError(`'hash_values' must be strings or numbers`);
|
|
87
|
+
if (!searchObject.get_attributes) addError(`'get_attributes' is required`);
|
|
88
|
+
else if (!Array.isArray(searchObject.get_attributes)) addError(`'get_attributes' must be an array`);
|
|
89
|
+
else if (searchObject.get_attributes.length === 0) addError(`'get_attributes' must contain at least 1 item`);
|
|
90
|
+
else if (!searchObject.get_attributes.every((value) => typeof value === 'string' || typeof value === 'number'))
|
|
91
|
+
addError(`'get_attributes' must be strings or numbers`);
|
|
92
|
+
function addError(error) {
|
|
93
|
+
if (errors) errors += '. ' + error;
|
|
94
|
+
else errors = error;
|
|
95
|
+
}
|
|
96
|
+
if (errors) validationError = new Error(errors.trim());
|
|
97
|
+
break;
|
|
98
|
+
case 'conditions':
|
|
99
|
+
validationError = validator.validateBySchema(searchObject, searchByConditionsSchema);
|
|
100
|
+
break;
|
|
101
|
+
default:
|
|
102
|
+
throw new Error(`Error validating search, unknown type: ${type}`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// validate table and attribute if format validation is valid
|
|
106
|
+
if (!validationError && searchObject.schema !== 'system') {
|
|
107
|
+
// skip validation for system schema
|
|
108
|
+
//check if schema.table does not exist throw error
|
|
109
|
+
let checkSchemaTable = hdbUtils.checkGlobalSchemaTable(searchObject.schema, searchObject.table);
|
|
110
|
+
if (checkSchemaTable) {
|
|
111
|
+
return handleHDBError(new Error(), checkSchemaTable, HTTP_STATUS_CODES.NOT_FOUND);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let tableSchema = getDatabases()[searchObject.schema][searchObject.table];
|
|
115
|
+
let allTableAttributes = tableSchema.attributes;
|
|
116
|
+
|
|
117
|
+
//this clones the get_attributes array
|
|
118
|
+
let checkAttributes = searchObject.get_attributes ? [...searchObject.get_attributes] : [];
|
|
119
|
+
|
|
120
|
+
if (type === 'value') {
|
|
121
|
+
checkAttributes.push(searchObject.attribute);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
//if search type is conditions add conditions fields to see if the fields exist
|
|
125
|
+
const addConditions = (searchObject) => {
|
|
126
|
+
//this is used to validate condition attributes exist in the schema
|
|
127
|
+
for (const condition of searchObject.conditions) {
|
|
128
|
+
if (condition.conditions) addConditions(condition);
|
|
129
|
+
else checkAttributes.push(condition.attribute);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
if (type === 'conditions') {
|
|
133
|
+
addConditions(searchObject);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
let unknownAttributes = _.filter(
|
|
137
|
+
checkAttributes,
|
|
138
|
+
(attribute) =>
|
|
139
|
+
attribute !== '*' &&
|
|
140
|
+
!attribute.startsWith?.('$') && // meta attributes
|
|
141
|
+
attribute.attribute !== '*' && // skip check for asterisk attribute
|
|
142
|
+
!Array.isArray(attribute) &&
|
|
143
|
+
!attribute.name && // nested attribute
|
|
144
|
+
!_.some(
|
|
145
|
+
allTableAttributes,
|
|
146
|
+
(
|
|
147
|
+
tableAttribute // attribute should match one of the attribute in global
|
|
148
|
+
) =>
|
|
149
|
+
tableAttribute === attribute ||
|
|
150
|
+
tableAttribute.attribute === attribute ||
|
|
151
|
+
tableAttribute.attribute === attribute.attribute
|
|
152
|
+
)
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
// if any unknown attributes present in the search request then list all indicated as unknown attribute to error message at once split in well format
|
|
156
|
+
// for instance "unknown attribute a, b and c" or "unknown attribute a"
|
|
157
|
+
if (unknownAttributes && unknownAttributes.length > 0) {
|
|
158
|
+
// return error with proper message - replace last comma with and
|
|
159
|
+
let errorMsg = unknownAttributes.join(', ');
|
|
160
|
+
errorMsg = errorMsg.replace(/,([^,]*)$/, ' and$1');
|
|
161
|
+
return new Error(`unknown attribute '${errorMsg}'`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return validationError;
|
|
166
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import * as validator from './validationWrapper.js';
|
|
3
|
+
import { STATUS_DEFINITIONS, STATUS_IDS, DEFAULT_STATUS_ID, type StatusId } from '../server/status/definitions.ts';
|
|
4
|
+
|
|
5
|
+
// Re-export constants for backward compatibility
|
|
6
|
+
export const STATUS_SCHEMAS = STATUS_DEFINITIONS;
|
|
7
|
+
export const STATUS_ALLOWED = STATUS_IDS;
|
|
8
|
+
export const STATUS_DEFAULT = DEFAULT_STATUS_ID;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Pregenerate error messages to avoid repeated string concatenation
|
|
12
|
+
*/
|
|
13
|
+
const ERROR_MESSAGES = Object.entries(STATUS_DEFINITIONS).reduce(
|
|
14
|
+
(messages, [id, definition]) => {
|
|
15
|
+
if (definition.allowedValues) {
|
|
16
|
+
messages[id] = `Status "${id}" only accepts these values: ${definition.allowedValues.join(', ')}`;
|
|
17
|
+
}
|
|
18
|
+
return messages;
|
|
19
|
+
},
|
|
20
|
+
{} as Record<string, string>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Creates the status validation schema using the STATUS_DEFINITIONS
|
|
25
|
+
*/
|
|
26
|
+
const createStatusValidationSchema = () => {
|
|
27
|
+
// Start with base schema
|
|
28
|
+
let statusSchema = Joi.string().min(1).max(512);
|
|
29
|
+
|
|
30
|
+
// Add conditional validations for each status type that has allowedValues
|
|
31
|
+
(Object.entries(STATUS_DEFINITIONS) as [StatusId, (typeof STATUS_DEFINITIONS)[StatusId]][]).forEach(
|
|
32
|
+
([id, definition]) => {
|
|
33
|
+
if (definition.allowedValues) {
|
|
34
|
+
statusSchema = statusSchema.when('id', {
|
|
35
|
+
is: id,
|
|
36
|
+
then: Joi.string()
|
|
37
|
+
.valid(...definition.allowedValues)
|
|
38
|
+
.messages({
|
|
39
|
+
'any.only': ERROR_MESSAGES[id],
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
return statusSchema.required();
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Joi schema for validating status operations
|
|
51
|
+
*/
|
|
52
|
+
const setStatusSchema = Joi.object({
|
|
53
|
+
id: Joi.string()
|
|
54
|
+
.valid(...STATUS_ALLOWED)
|
|
55
|
+
.required(),
|
|
56
|
+
status: createStatusValidationSchema(),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Validates the status operation parameters
|
|
61
|
+
* @param obj The status operation parameters to validate
|
|
62
|
+
* @returns Error if validation fails, null otherwise
|
|
63
|
+
*/
|
|
64
|
+
export function validateStatus(obj: any) {
|
|
65
|
+
return validator.validateBySchema(obj, setStatusSchema);
|
|
66
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Joi = require('joi');
|
|
4
|
+
const validator = require('./validationWrapper.js');
|
|
5
|
+
|
|
6
|
+
module.exports = {
|
|
7
|
+
readTransactionLogValidator,
|
|
8
|
+
deleteTransactionLogsBeforeValidator,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
function readTransactionLogValidator(req) {
|
|
12
|
+
const schema = Joi.object({
|
|
13
|
+
schema: Joi.string(),
|
|
14
|
+
database: Joi.string(),
|
|
15
|
+
table: Joi.string().required(),
|
|
16
|
+
from: Joi.date().timestamp(),
|
|
17
|
+
to: Joi.date().timestamp(),
|
|
18
|
+
limit: Joi.number().min(1),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return validator.validateBySchema(req, schema);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function deleteTransactionLogsBeforeValidator(req) {
|
|
25
|
+
const schema = Joi.object({
|
|
26
|
+
schema: Joi.string(),
|
|
27
|
+
database: Joi.string(),
|
|
28
|
+
table: Joi.string().required(),
|
|
29
|
+
timestamp: Joi.date().timestamp().required(),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
return validator.validateBySchema(req, schema);
|
|
33
|
+
}
|