@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/bin/BinObjects.js +17 -0
  2. package/bin/cliOperations.js +157 -0
  3. package/bin/copyDb.ts +280 -0
  4. package/bin/harper.js +156 -0
  5. package/bin/install.js +15 -0
  6. package/bin/lite.js +5 -0
  7. package/bin/restart.js +201 -0
  8. package/bin/run.js +409 -0
  9. package/bin/status.js +65 -0
  10. package/bin/stop.js +22 -0
  11. package/bin/upgrade.js +134 -0
  12. package/components/Application.ts +646 -0
  13. package/components/ApplicationScope.ts +49 -0
  14. package/components/Component.ts +53 -0
  15. package/components/ComponentV1.ts +342 -0
  16. package/components/DEFAULT_CONFIG.ts +18 -0
  17. package/components/EntryHandler.ts +227 -0
  18. package/components/Logger.ts +14 -0
  19. package/components/OptionsWatcher.ts +354 -0
  20. package/components/PluginModule.ts +6 -0
  21. package/components/Scope.ts +329 -0
  22. package/components/componentLoader.ts +529 -0
  23. package/components/deriveCommonPatternBase.ts +31 -0
  24. package/components/deriveGlobOptions.ts +44 -0
  25. package/components/deriveURLPath.ts +57 -0
  26. package/components/operations.js +658 -0
  27. package/components/operationsValidation.js +246 -0
  28. package/components/packageComponent.ts +39 -0
  29. package/components/requestRestart.ts +26 -0
  30. package/components/resolveBaseURLPath.ts +38 -0
  31. package/components/status/ComponentStatus.ts +110 -0
  32. package/components/status/ComponentStatusRegistry.ts +251 -0
  33. package/components/status/api.ts +153 -0
  34. package/components/status/crossThread.ts +405 -0
  35. package/components/status/errors.ts +152 -0
  36. package/components/status/index.ts +44 -0
  37. package/components/status/internal.ts +65 -0
  38. package/components/status/registry.ts +12 -0
  39. package/components/status/types.ts +96 -0
  40. package/config/RootConfigWatcher.ts +59 -0
  41. package/config/configHelpers.ts +11 -0
  42. package/config/configUtils.js +967 -0
  43. package/config/harperConfigEnvVars.ts +641 -0
  44. package/dataLayer/CreateAttributeObject.js +25 -0
  45. package/dataLayer/CreateTableObject.js +11 -0
  46. package/dataLayer/DataLayerObjects.js +43 -0
  47. package/dataLayer/DeleteBeforeObject.js +22 -0
  48. package/dataLayer/DeleteObject.js +25 -0
  49. package/dataLayer/DropAttributeObject.js +11 -0
  50. package/dataLayer/GetBackupObject.js +22 -0
  51. package/dataLayer/InsertObject.js +24 -0
  52. package/dataLayer/ReadAuditLogObject.js +24 -0
  53. package/dataLayer/SQLSearch.js +1335 -0
  54. package/dataLayer/SearchByConditionsObject.js +61 -0
  55. package/dataLayer/SearchByHashObject.js +21 -0
  56. package/dataLayer/SearchObject.js +45 -0
  57. package/dataLayer/SqlSearchObject.js +14 -0
  58. package/dataLayer/UpdateObject.js +23 -0
  59. package/dataLayer/UpsertObject.js +23 -0
  60. package/dataLayer/bulkLoad.js +813 -0
  61. package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
  62. package/dataLayer/dataObjects/UpsertObject.js +23 -0
  63. package/dataLayer/delete.js +164 -0
  64. package/dataLayer/export.js +381 -0
  65. package/dataLayer/getBackup.js +40 -0
  66. package/dataLayer/harperBridge/BridgeMethods.js +81 -0
  67. package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
  68. package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
  69. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
  70. package/dataLayer/harperBridge/harperBridge.js +21 -0
  71. package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
  72. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
  73. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
  74. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
  75. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
  76. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
  77. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
  78. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
  79. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
  80. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
  81. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
  82. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
  83. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
  84. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
  85. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
  86. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
  87. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
  88. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
  89. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
  90. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
  91. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
  92. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
  93. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
  94. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
  95. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
  96. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
  97. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
  98. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
  99. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
  108. package/dataLayer/hdbInfoController.js +254 -0
  109. package/dataLayer/insert.js +266 -0
  110. package/dataLayer/readAuditLog.js +59 -0
  111. package/dataLayer/schema.js +366 -0
  112. package/dataLayer/schemaDescribe.js +289 -0
  113. package/dataLayer/search.js +60 -0
  114. package/dataLayer/transaction.js +17 -0
  115. package/dataLayer/update.js +124 -0
  116. package/dist/components/Logger.d.ts +12 -0
  117. package/dist/components/Logger.js +3 -0
  118. package/dist/components/Logger.js.map +1 -0
  119. package/dist/components/Scope.d.ts +14 -4
  120. package/dist/components/Scope.js +18 -10
  121. package/dist/components/Scope.js.map +1 -1
  122. package/dist/components/componentLoader.js +16 -9
  123. package/dist/components/componentLoader.js.map +1 -1
  124. package/dist/components/operations.js +2 -2
  125. package/dist/components/operations.js.map +1 -1
  126. package/dist/config/configUtils.d.ts +1 -1
  127. package/dist/config/configUtils.js +1 -1
  128. package/dist/config/configUtils.js.map +1 -1
  129. package/dist/dataLayer/CreateTableObject.d.ts +2 -2
  130. package/dist/dataLayer/CreateTableObject.js +2 -2
  131. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  132. package/dist/dataLayer/delete.d.ts +1 -1
  133. package/dist/dataLayer/schema.js +6 -5
  134. package/dist/dataLayer/schema.js.map +1 -1
  135. package/dist/dataLayer/schemaDescribe.js +1 -1
  136. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  137. package/dist/index.d.ts +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/resources/DatabaseTransaction.d.ts +1 -1
  141. package/dist/resources/IterableEventQueue.d.ts +1 -1
  142. package/dist/resources/LMDBTransaction.d.ts +5 -1
  143. package/dist/resources/Resource.d.ts +1 -1
  144. package/dist/resources/RocksIndexStore.d.ts +3 -3
  145. package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
  146. package/dist/resources/Table.d.ts +15 -6
  147. package/dist/resources/Table.js +4 -1
  148. package/dist/resources/Table.js.map +1 -1
  149. package/dist/resources/analytics/read.js +32 -22
  150. package/dist/resources/analytics/read.js.map +1 -1
  151. package/dist/resources/analytics/write.js +3 -6
  152. package/dist/resources/analytics/write.js.map +1 -1
  153. package/dist/resources/auditStore.d.ts +3 -3
  154. package/dist/resources/blob.d.ts +25 -2
  155. package/dist/resources/databases.d.ts +12 -2
  156. package/dist/resources/databases.js +22 -19
  157. package/dist/resources/databases.js.map +1 -1
  158. package/dist/resources/search.js +11 -5
  159. package/dist/resources/search.js.map +1 -1
  160. package/dist/resources/transaction.d.ts +2 -1
  161. package/dist/security/auth.js +1 -1
  162. package/dist/security/auth.js.map +1 -1
  163. package/dist/security/cryptoHash.d.ts +2 -2
  164. package/dist/security/jsLoader.js +243 -66
  165. package/dist/security/jsLoader.js.map +1 -1
  166. package/dist/security/keys.js +4 -5
  167. package/dist/security/keys.js.map +1 -1
  168. package/dist/security/user.js +3 -3
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +16 -2
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/Server.d.ts +2 -1
  173. package/dist/server/Server.js.map +1 -1
  174. package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
  175. package/dist/server/fastifyRoutes.js +2 -0
  176. package/dist/server/fastifyRoutes.js.map +1 -1
  177. package/dist/server/http.js +12 -6
  178. package/dist/server/http.js.map +1 -1
  179. package/dist/server/jobs/JobObject.d.ts +3 -3
  180. package/dist/server/loadRootComponents.js +1 -0
  181. package/dist/server/loadRootComponents.js.map +1 -1
  182. package/dist/server/operationsServer.js +3 -1
  183. package/dist/server/operationsServer.js.map +1 -1
  184. package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
  185. package/dist/server/serverHelpers/Request.d.ts +5 -5
  186. package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
  187. package/dist/server/threads/manageThreads.d.ts +2 -2
  188. package/dist/server/threads/manageThreads.js +50 -35
  189. package/dist/server/threads/manageThreads.js.map +1 -1
  190. package/dist/server/threads/socketRouter.d.ts +1 -1
  191. package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
  192. package/dist/utility/AWS/AWSConnector.d.ts +3 -2
  193. package/dist/utility/common_utils.d.ts +3 -3
  194. package/dist/utility/environment/systemInformation.d.ts +1 -0
  195. package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
  196. package/dist/utility/globalSchema.d.ts +1 -1
  197. package/dist/utility/hdbTerms.d.ts +3 -0
  198. package/dist/utility/hdbTerms.js +3 -0
  199. package/dist/utility/hdbTerms.js.map +1 -1
  200. package/dist/utility/installation.d.ts +2 -4
  201. package/dist/utility/installation.js.map +1 -1
  202. package/dist/utility/lmdb/commonUtility.d.ts +1 -0
  203. package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
  204. package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
  205. package/dist/utility/lmdb/searchUtility.d.ts +2 -1
  206. package/dist/utility/lmdb/writeUtility.d.ts +1 -0
  207. package/dist/utility/logging/harper_logger.d.ts +6 -6
  208. package/dist/utility/processManagement/processManagement.d.ts +1 -1
  209. package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
  210. package/dist/validation/common_validators.d.ts +4 -3
  211. package/dist/validation/configValidator.d.ts +3 -2
  212. package/index.d.ts +56 -0
  213. package/index.js +41 -0
  214. package/json/systemSchema.json +373 -0
  215. package/launchServiceScripts/launchHarperDB.js +3 -0
  216. package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
  217. package/package.json +21 -3
  218. package/resources/DatabaseTransaction.ts +378 -0
  219. package/resources/ErrorResource.ts +57 -0
  220. package/resources/IterableEventQueue.ts +94 -0
  221. package/resources/LMDBTransaction.ts +349 -0
  222. package/resources/RecordEncoder.ts +702 -0
  223. package/resources/RequestTarget.ts +134 -0
  224. package/resources/Resource.ts +789 -0
  225. package/resources/ResourceInterface.ts +221 -0
  226. package/resources/ResourceInterfaceV2.ts +53 -0
  227. package/resources/ResourceV2.ts +67 -0
  228. package/resources/Resources.ts +162 -0
  229. package/resources/RocksIndexStore.ts +70 -0
  230. package/resources/RocksTransactionLogStore.ts +352 -0
  231. package/resources/Table.ts +4527 -0
  232. package/resources/analytics/hostnames.ts +72 -0
  233. package/resources/analytics/metadata.ts +10 -0
  234. package/resources/analytics/read.ts +252 -0
  235. package/resources/analytics/write.ts +803 -0
  236. package/resources/auditStore.ts +556 -0
  237. package/resources/blob.ts +1268 -0
  238. package/resources/crdt.ts +125 -0
  239. package/resources/dataLoader.ts +527 -0
  240. package/resources/databases.ts +1290 -0
  241. package/resources/graphql.ts +221 -0
  242. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
  243. package/resources/indexes/customIndexes.ts +7 -0
  244. package/resources/indexes/vector.ts +38 -0
  245. package/resources/jsResource.ts +86 -0
  246. package/resources/loadEnv.ts +22 -0
  247. package/resources/login.ts +18 -0
  248. package/resources/openApi.ts +409 -0
  249. package/resources/registrationDeprecated.ts +8 -0
  250. package/resources/replayLogs.ts +136 -0
  251. package/resources/roles.ts +98 -0
  252. package/resources/search.ts +1301 -0
  253. package/resources/tracked.ts +584 -0
  254. package/resources/transaction.ts +89 -0
  255. package/resources/transactionBroadcast.ts +258 -0
  256. package/security/auth.ts +376 -0
  257. package/security/certificateVerification/certificateVerificationSource.ts +84 -0
  258. package/security/certificateVerification/configValidation.ts +107 -0
  259. package/security/certificateVerification/crlVerification.ts +623 -0
  260. package/security/certificateVerification/index.ts +121 -0
  261. package/security/certificateVerification/ocspVerification.ts +148 -0
  262. package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
  263. package/security/certificateVerification/types.ts +128 -0
  264. package/security/certificateVerification/verificationConfig.ts +138 -0
  265. package/security/certificateVerification/verificationUtils.ts +447 -0
  266. package/security/cryptoHash.js +42 -0
  267. package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
  268. package/security/data_objects/PermissionResponseObject.js +115 -0
  269. package/security/data_objects/PermissionTableResponseObject.js +20 -0
  270. package/security/fastifyAuth.js +169 -0
  271. package/security/impersonation.ts +160 -0
  272. package/security/jsLoader.ts +716 -0
  273. package/security/keys.js +948 -0
  274. package/security/permissionsTranslator.js +300 -0
  275. package/security/role.js +218 -0
  276. package/security/tokenAuthentication.ts +228 -0
  277. package/security/user.ts +449 -0
  278. package/server/DurableSubscriptionsSession.ts +503 -0
  279. package/server/REST.ts +407 -0
  280. package/server/Server.ts +89 -0
  281. package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
  282. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
  283. package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
  284. package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
  285. package/server/fastifyRoutes.ts +205 -0
  286. package/server/graphqlQuerying.ts +700 -0
  287. package/server/http.ts +640 -0
  288. package/server/itc/serverHandlers.js +161 -0
  289. package/server/itc/utility/ITCEventObject.js +10 -0
  290. package/server/jobs/JobObject.js +24 -0
  291. package/server/jobs/jobProcess.js +69 -0
  292. package/server/jobs/jobRunner.js +162 -0
  293. package/server/jobs/jobs.js +304 -0
  294. package/server/loadRootComponents.js +44 -0
  295. package/server/mqtt.ts +485 -0
  296. package/server/nodeName.ts +75 -0
  297. package/server/operationsServer.ts +313 -0
  298. package/server/serverHelpers/Headers.ts +108 -0
  299. package/server/serverHelpers/JSONStream.ts +269 -0
  300. package/server/serverHelpers/OperationFunctionObject.ts +13 -0
  301. package/server/serverHelpers/Request.ts +158 -0
  302. package/server/serverHelpers/contentTypes.ts +637 -0
  303. package/server/serverHelpers/requestTimePlugin.js +57 -0
  304. package/server/serverHelpers/serverHandlers.js +148 -0
  305. package/server/serverHelpers/serverUtilities.ts +473 -0
  306. package/server/serverRegistry.ts +8 -0
  307. package/server/static.ts +187 -0
  308. package/server/status/definitions.ts +37 -0
  309. package/server/status/index.ts +125 -0
  310. package/server/storageReclamation.ts +93 -0
  311. package/server/threads/itc.js +89 -0
  312. package/server/threads/manageThreads.js +594 -0
  313. package/server/threads/socketRouter.ts +360 -0
  314. package/server/threads/threadServer.js +279 -0
  315. package/server/throttle.ts +73 -0
  316. package/sqlTranslator/SelectValidator.js +330 -0
  317. package/sqlTranslator/alasqlFunctionImporter.js +62 -0
  318. package/sqlTranslator/deleteTranslator.js +67 -0
  319. package/sqlTranslator/index.js +242 -0
  320. package/sqlTranslator/sql_statement_bucket.js +472 -0
  321. package/static/defaultConfig.yaml +3 -0
  322. package/studio/web/HDBDogOnly.svg +78 -0
  323. package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
  324. package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
  325. package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
  326. package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
  327. package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
  328. package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
  329. package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
  330. package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
  331. package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
  332. package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
  333. package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
  334. package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
  335. package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
  336. package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
  337. package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
  338. package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
  339. package/studio/web/assets/index-BTgXJX9d.js +235 -0
  340. package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
  341. package/studio/web/assets/index-C-GXfcup.js +37 -0
  342. package/studio/web/assets/index-C-GXfcup.js.map +1 -0
  343. package/studio/web/assets/index-PFlNdimM.js +2 -0
  344. package/studio/web/assets/index-PFlNdimM.js.map +1 -0
  345. package/studio/web/assets/index-Y2g_iFpU.css +1 -0
  346. package/studio/web/assets/index-jiPwkrsB.css +1 -0
  347. package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
  348. package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
  349. package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
  350. package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
  351. package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
  352. package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
  353. package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
  354. package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
  355. package/studio/web/fabric-signup-background.webp +0 -0
  356. package/studio/web/fabric-signup-text.png +0 -0
  357. package/studio/web/favicon_purple.png +0 -0
  358. package/studio/web/github-icon.svg +15 -0
  359. package/studio/web/harper-fabric_black.png +0 -0
  360. package/studio/web/harper-fabric_white.png +0 -0
  361. package/studio/web/harper-studio_white.png +0 -0
  362. package/studio/web/index.html +16 -0
  363. package/studio/web/running.css +148 -0
  364. package/studio/web/running.html +147 -0
  365. package/studio/web/running.js +111 -0
  366. package/upgrade/UpgradeObjects.js +13 -0
  367. package/upgrade/directives/directivesController.js +90 -0
  368. package/upgrade/directivesManager.js +139 -0
  369. package/upgrade/upgradePrompt.js +124 -0
  370. package/upgrade/upgradeUtilities.js +28 -0
  371. package/utility/AWS/AWSConnector.js +29 -0
  372. package/utility/OperationFunctionCaller.js +63 -0
  373. package/utility/assignCmdEnvVariables.js +62 -0
  374. package/utility/common_utils.js +867 -0
  375. package/utility/environment/environmentManager.js +208 -0
  376. package/utility/environment/systemInformation.js +355 -0
  377. package/utility/errors/commonErrors.js +267 -0
  378. package/utility/errors/hdbError.js +146 -0
  379. package/utility/functions/date/dateFunctions.js +65 -0
  380. package/utility/functions/geo.js +355 -0
  381. package/utility/functions/sql/alaSQLExtension.js +104 -0
  382. package/utility/globalSchema.js +35 -0
  383. package/utility/hdbTerms.ts +819 -0
  384. package/utility/install/checkJWTTokensExist.js +62 -0
  385. package/utility/install/harperdb.conf +15 -0
  386. package/utility/install/harperdb.service +14 -0
  387. package/utility/install/installer.js +635 -0
  388. package/utility/installation.ts +30 -0
  389. package/utility/lmdb/DBIDefinition.js +20 -0
  390. package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
  391. package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
  392. package/utility/lmdb/OpenDBIObject.js +31 -0
  393. package/utility/lmdb/OpenEnvironmentObject.js +41 -0
  394. package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
  395. package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
  396. package/utility/lmdb/cleanLMDBMap.js +65 -0
  397. package/utility/lmdb/commonUtility.js +119 -0
  398. package/utility/lmdb/deleteUtility.js +128 -0
  399. package/utility/lmdb/environmentUtility.js +477 -0
  400. package/utility/lmdb/searchCursorFunctions.js +187 -0
  401. package/utility/lmdb/searchUtility.js +918 -0
  402. package/utility/lmdb/terms.js +57 -0
  403. package/utility/lmdb/writeUtility.js +407 -0
  404. package/utility/logging/harper_logger.js +876 -0
  405. package/utility/logging/logRotator.js +157 -0
  406. package/utility/logging/logger.ts +24 -0
  407. package/utility/logging/readLog.js +355 -0
  408. package/utility/logging/transactionLog.js +57 -0
  409. package/utility/mount_hdb.js +59 -0
  410. package/utility/npmUtilities.js +102 -0
  411. package/utility/operationPermissions.ts +112 -0
  412. package/utility/operation_authorization.js +836 -0
  413. package/utility/packageUtils.js +55 -0
  414. package/utility/password.ts +99 -0
  415. package/utility/processManagement/processManagement.js +187 -0
  416. package/utility/processManagement/servicesConfig.js +56 -0
  417. package/utility/scripts/restartHdb.js +24 -0
  418. package/utility/scripts/user_data.sh +13 -0
  419. package/utility/signalling.js +36 -0
  420. package/utility/terms/certificates.js +81 -0
  421. package/utility/when.ts +20 -0
  422. package/v1.d.ts +39 -0
  423. package/v1.js +41 -0
  424. package/v2.d.ts +39 -0
  425. package/v2.js +41 -0
  426. package/validation/bulkDeleteValidator.js +24 -0
  427. package/validation/check_permissions.js +19 -0
  428. package/validation/common_validators.js +95 -0
  429. package/validation/configValidator.js +331 -0
  430. package/validation/deleteValidator.js +15 -0
  431. package/validation/fileLoadValidator.js +153 -0
  432. package/validation/insertValidator.js +40 -0
  433. package/validation/installValidator.js +37 -0
  434. package/validation/readLogValidator.js +64 -0
  435. package/validation/role_validation.js +320 -0
  436. package/validation/schemaMetadataValidator.js +42 -0
  437. package/validation/searchValidator.js +166 -0
  438. package/validation/statusValidator.ts +66 -0
  439. package/validation/transactionLogValidator.js +33 -0
  440. package/validation/user_validation.js +55 -0
  441. package/validation/validationWrapper.js +105 -0
  442. package/dist/resources/analytics/profile.d.ts +0 -2
  443. package/dist/resources/analytics/profile.js +0 -144
  444. package/dist/resources/analytics/profile.js.map +0 -1
@@ -0,0 +1,153 @@
1
+ const clone = require('clone');
2
+ const validator = require('./validationWrapper.js');
3
+ const commonUtils = require('../utility/common_utils.js');
4
+ const hdbTerms = require('../utility/hdbTerms.ts');
5
+ const fs = require('fs');
6
+ const joi = require('joi');
7
+ const { string } = joi.types();
8
+ const { hdbErrors, handleHDBError } = require('../utility/errors/hdbError.js');
9
+ const { HTTP_STATUS_CODES } = hdbErrors;
10
+
11
+ const { commonValidators } = require('./common_validators.js');
12
+
13
+ const isRequiredString = ' is required';
14
+
15
+ const actions = ['insert', 'update', 'upsert'];
16
+ const constraints = {
17
+ database: {
18
+ presence: false,
19
+ format: commonValidators.schema_format,
20
+ length: commonValidators.schema_length,
21
+ },
22
+ schema: {
23
+ presence: false,
24
+ format: commonValidators.schema_format,
25
+ length: commonValidators.schema_length,
26
+ },
27
+ table: {
28
+ presence: true,
29
+ format: commonValidators.schema_format,
30
+ length: commonValidators.schema_length,
31
+ },
32
+ action: {
33
+ inclusion: {
34
+ within: actions,
35
+ message: 'is required and must be either insert, update, or upsert',
36
+ },
37
+ },
38
+ file_path: {},
39
+ csv_url: {
40
+ url: {
41
+ allowLocal: true,
42
+ },
43
+ },
44
+ data: {},
45
+ passthrough_headers: {},
46
+ };
47
+
48
+ const baseJoiSchema = {
49
+ schema: string.required(),
50
+ table: string.required(),
51
+ action: string.valid('insert', 'update', 'upsert'),
52
+ };
53
+
54
+ const { AWS_ACCESS_KEY, AWS_SECRET, AWS_BUCKET, AWS_FILE_KEY, REGION } = hdbTerms.S3_BUCKET_AUTH_KEYS;
55
+
56
+ const s3Constraints = {
57
+ s3: {
58
+ presence: true,
59
+ },
60
+ [`s3.${AWS_ACCESS_KEY}`]: {
61
+ presence: true,
62
+ type: 'String',
63
+ },
64
+ [`s3.${AWS_SECRET}`]: {
65
+ presence: true,
66
+ type: 'String',
67
+ },
68
+ [`s3.${AWS_BUCKET}`]: {
69
+ presence: true,
70
+ type: 'String',
71
+ },
72
+ [`s3.${AWS_FILE_KEY}`]: {
73
+ presence: true,
74
+ type: 'String',
75
+ hasValidFileExt: ['.csv', '.json'],
76
+ },
77
+ [`s3.${REGION}`]: {
78
+ presence: true,
79
+ type: 'String',
80
+ },
81
+ };
82
+
83
+ const dataConstraints = clone(constraints);
84
+ dataConstraints.data.presence = {
85
+ message: isRequiredString,
86
+ };
87
+
88
+ const fileConstraints = clone(constraints);
89
+ fileConstraints.file_path.presence = {
90
+ message: isRequiredString,
91
+ };
92
+
93
+ const s3FileConstraints = Object.assign(clone(constraints), s3Constraints);
94
+
95
+ const urlSchema = clone(baseJoiSchema);
96
+ urlSchema.csv_url = string.uri().messages({ 'string.uri': "'csv_url' must be a valid url" }).required();
97
+ urlSchema.passthrough_headers = joi.object();
98
+
99
+ function dataObject(object) {
100
+ let validateRes = validator.validateObject(object, dataConstraints);
101
+ return postValidateChecks(object, validateRes);
102
+ }
103
+
104
+ function urlObject(object) {
105
+ let validateRes = validator.validateBySchema(object, joi.object(urlSchema));
106
+ return postValidateChecks(object, validateRes);
107
+ }
108
+
109
+ function fileObject(object) {
110
+ let validateRes = validator.validateObject(object, fileConstraints);
111
+ return postValidateChecks(object, validateRes);
112
+ }
113
+
114
+ function s3FileObject(object) {
115
+ let validateRes = validator.validateObject(object, s3FileConstraints);
116
+ return postValidateChecks(object, validateRes);
117
+ }
118
+
119
+ /**
120
+ * Post validate module checks, confirms schema and table exist.
121
+ * If file upload - checks that it exists, permissions and size.
122
+ */
123
+ function postValidateChecks(object, validateRes) {
124
+ if (!validateRes) {
125
+ let msg = commonUtils.checkGlobalSchemaTable(object.schema, object.table);
126
+ if (msg) {
127
+ return handleHDBError(new Error(), msg, HTTP_STATUS_CODES.BAD_REQUEST);
128
+ }
129
+
130
+ if (object.operation === hdbTerms.OPERATIONS_ENUM.CSV_FILE_LOAD) {
131
+ try {
132
+ fs.accessSync(object.file_path, fs.constants.R_OK | fs.constants.F_OK);
133
+ } catch (err) {
134
+ if (err.code === hdbTerms.NODE_ERROR_CODES.ENOENT) {
135
+ return handleHDBError(err, `No such file or directory ${err.path}`, HTTP_STATUS_CODES.BAD_REQUEST);
136
+ }
137
+
138
+ if (err.code === hdbTerms.NODE_ERROR_CODES.EACCES) {
139
+ return handleHDBError(err, `Permission denied ${err.path}`, HTTP_STATUS_CODES.BAD_REQUEST);
140
+ }
141
+ return handleHDBError(err);
142
+ }
143
+ }
144
+ }
145
+ return validateRes;
146
+ }
147
+
148
+ module.exports = {
149
+ dataObject,
150
+ urlObject,
151
+ fileObject,
152
+ s3FileObject,
153
+ };
@@ -0,0 +1,40 @@
1
+ const { hdbTable, hdbDatabase } = require('./common_validators.js');
2
+ const validator = require('./validationWrapper.js');
3
+ const Joi = require('joi');
4
+ const INVALID_ATTRIBUTE_NAMES = {
5
+ undefined: 'undefined',
6
+ null: 'null',
7
+ };
8
+
9
+ const customRecordsVal = (value, helpers) => {
10
+ const attributes = Object.keys(value);
11
+ const attributesLength = attributes.length;
12
+ let errorMsg = undefined;
13
+ for (let i = 0; i < attributesLength; i++) {
14
+ const attribute = attributes[i];
15
+ if (!attribute || attribute.length === 0 || INVALID_ATTRIBUTE_NAMES[attribute] !== undefined) {
16
+ if (errorMsg === undefined) {
17
+ errorMsg = `Invalid attribute name: '${attribute}'`;
18
+ } else {
19
+ errorMsg += `. Invalid attribute name: '${attribute}'`;
20
+ }
21
+ }
22
+ }
23
+
24
+ if (errorMsg) {
25
+ return helpers.message(errorMsg);
26
+ }
27
+
28
+ return value;
29
+ };
30
+
31
+ const insertSchema = Joi.object({
32
+ database: hdbDatabase,
33
+ schema: hdbDatabase,
34
+ table: hdbTable,
35
+ records: Joi.array().items(Joi.object().custom(customRecordsVal)).required(),
36
+ });
37
+
38
+ module.exports = function (insertObject) {
39
+ return validator.validateBySchema(insertObject, insertSchema);
40
+ };
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ const Joi = require('joi');
4
+ const { string, number } = Joi.types();
5
+ const fs = require('fs-extra');
6
+ const hdbTerms = require('../utility/hdbTerms.ts');
7
+ const path = require('path');
8
+ const validator = require('../validation/validationWrapper.js');
9
+
10
+ module.exports = installValidator;
11
+
12
+ /**
13
+ * Used to validate any command or environment variables used passed to install.
14
+ * @param param
15
+ * @returns {*}
16
+ */
17
+ function installValidator(param) {
18
+ const installSchema = Joi.object({
19
+ [hdbTerms.INSTALL_PROMPTS.ROOTPATH]: Joi.custom(validateRootAvailable),
20
+ [hdbTerms.INSTALL_PROMPTS.OPERATIONSAPI_NETWORK_PORT]: Joi.alternatives([number.min(0), string]).allow(
21
+ 'null',
22
+ null
23
+ ),
24
+ [hdbTerms.INSTALL_PROMPTS.TC_AGREEMENT]: string.valid('yes', 'YES', 'Yes'),
25
+ });
26
+
27
+ return validator.validateBySchema(param, installSchema);
28
+ }
29
+
30
+ function validateRootAvailable(value, helpers) {
31
+ if (
32
+ fs.existsSync(path.join(value, 'system/hdb_user/data.mdb')) ||
33
+ fs.existsSync(path.join(value, 'system/hdb_user.mdb'))
34
+ ) {
35
+ return helpers.message(`'${value}' is already in use. Please enter a different path.`);
36
+ }
37
+ }
@@ -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
+ }