@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,138 @@
1
+ /**
2
+ * Configuration parsing and default values for certificate verification
3
+ */
4
+
5
+ import { loggerWithTag } from '../../utility/logging/logger.ts';
6
+ import { packageJson } from '../../utility/packageUtils.js';
7
+ import type { CertificateVerificationConfig } from './types.ts';
8
+ import { validateAndParseCertificateVerificationConfig } from './configValidation.ts';
9
+
10
+ const logger = loggerWithTag('cert-verification-config');
11
+
12
+ // Constants for hardcoded values
13
+ export const CRL_DEFAULT_VALIDITY_PERIOD = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds
14
+ export const ERROR_CACHE_TTL = 300000; // 5 minutes for error caching
15
+ export const CRL_USER_AGENT = `Harper/${packageJson.version} CRL-Client`;
16
+
17
+ // Configuration cache to avoid redundant parsing on every certificate verification
18
+ // Using WeakMap to prevent memory leaks from holding strong references to config objects
19
+ // This allows garbage collection of config objects when they're no longer referenced elsewhere
20
+ const configCache = new WeakMap<Record<string, any>, CertificateVerificationConfig | false>();
21
+ let lastPrimitiveConfig: boolean | null | undefined = null;
22
+ let lastPrimitiveResult: CertificateVerificationConfig | false | null = null;
23
+
24
+ // Track validation errors to prevent repeated error logging and provide graceful degradation
25
+ // Maps config object to the error that occurred during validation
26
+ const validationErrorCache = new WeakMap<Record<string, any>, Error>();
27
+ let lastPrimitiveValidationError: Error | null = null;
28
+
29
+ /**
30
+ * Cached version of getCertificateVerificationConfig to avoid redundant parsing
31
+ * This is the recommended function to use in hot paths like certificate verification.
32
+ *
33
+ * MEMORY SAFETY:
34
+ * - Uses WeakMap for object configs to prevent memory leaks
35
+ * - Config objects can be garbage collected when no longer referenced elsewhere
36
+ * - Primitive values (boolean, null, undefined) use simple reference equality
37
+ * - No strong references held to config objects, preventing memory accumulation
38
+ *
39
+ * ERROR HANDLING:
40
+ * - Invalid config causes validation errors to be thrown on first access
41
+ * - Validation errors are logged once and then cached
42
+ * - Subsequent accesses with the same invalid config return false (disabled) to prevent
43
+ * repeated error logging and allow the application to continue running
44
+ * - This provides fail-safe behavior: invalid security config defaults to disabled
45
+ * rather than crashing on every request
46
+ *
47
+ * @param mtlsConfig - The mTLS configuration from env.get()
48
+ * @returns Configuration object or false if verification is disabled or invalid
49
+ */
50
+ export function getCachedCertificateVerificationConfig(
51
+ mtlsConfig?: boolean | Record<string, any> | null
52
+ ): false | CertificateVerificationConfig {
53
+ // Handle primitive values (boolean, null, undefined) with simple caching
54
+ if (typeof mtlsConfig === 'boolean' || mtlsConfig == null) {
55
+ // Check if we've already seen a validation error for this primitive config
56
+ if (mtlsConfig === lastPrimitiveConfig && lastPrimitiveValidationError) {
57
+ logger.trace?.('Using cached validation error result (primitive) - returning disabled');
58
+ return false;
59
+ }
60
+
61
+ if (mtlsConfig === lastPrimitiveConfig && lastPrimitiveResult !== null) {
62
+ logger.trace?.('Using cached certificate verification config (primitive)');
63
+ return lastPrimitiveResult;
64
+ }
65
+
66
+ logger.trace?.('Parsing and caching certificate verification config (primitive)');
67
+ lastPrimitiveConfig = mtlsConfig as boolean | null | undefined;
68
+ try {
69
+ lastPrimitiveResult = getCertificateVerificationConfig(mtlsConfig);
70
+ lastPrimitiveValidationError = null; // Clear any previous error
71
+ return lastPrimitiveResult;
72
+ } catch (error) {
73
+ // Cache the validation error to prevent repeated logging
74
+ lastPrimitiveValidationError = error as Error;
75
+ logger.error?.(
76
+ `Certificate verification config validation failed - defaulting to disabled: ${(error as Error).message}`
77
+ );
78
+ return false; // Fail-safe: invalid config = disabled verification
79
+ }
80
+ }
81
+
82
+ // Check for cached validation error
83
+ const cachedError = validationErrorCache.get(mtlsConfig);
84
+ if (cachedError) {
85
+ logger.trace?.('Using cached validation error result (object) - returning disabled');
86
+ return false;
87
+ }
88
+
89
+ const cached = configCache.get(mtlsConfig);
90
+ if (cached !== undefined) {
91
+ logger.trace?.('Using cached certificate verification config (object)');
92
+ return cached;
93
+ }
94
+
95
+ // Cache miss: parse and store the result
96
+ logger.trace?.('Parsing and caching certificate verification config (object)');
97
+ try {
98
+ const result = getCertificateVerificationConfig(mtlsConfig);
99
+ configCache.set(mtlsConfig, result);
100
+ return result;
101
+ } catch (error) {
102
+ // Cache the validation error to prevent repeated logging
103
+ validationErrorCache.set(mtlsConfig, error as Error);
104
+ logger.error?.(
105
+ `Certificate verification config validation failed - defaulting to disabled: ${(error as Error).message}`
106
+ );
107
+ return false; // Fail-safe: invalid config = disabled verification
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Determine if certificate verification should be performed based on configuration
113
+ * @param mtlsConfig - The mTLS configuration (can be boolean or object)
114
+ * @returns Configuration object or false if verification is disabled
115
+ */
116
+ function getCertificateVerificationConfig(
117
+ mtlsConfig?: boolean | Record<string, any> | null
118
+ ): false | CertificateVerificationConfig {
119
+ logger.trace?.(`getCertificateVerificationConfig called with: ${JSON.stringify({ mtlsConfig })}`);
120
+
121
+ if (!mtlsConfig) return false;
122
+
123
+ const verificationConfig = mtlsConfig === true ? undefined : mtlsConfig.certificateVerification;
124
+ logger.trace?.(`Certificate verification config: ${JSON.stringify({ verificationConfig })}`);
125
+
126
+ // Default to disabled for initial rollout to allow intentional real-world testing
127
+ // Users must explicitly enable certificate verification with certificateVerification: true or config object
128
+ if (verificationConfig == null || verificationConfig === false) return false;
129
+
130
+ // Pass through validator for enabled cases (true or object)
131
+ // Convert true to empty object so validator applies all defaults
132
+ // This ensures we always get a complete config with crl and ocsp defaults
133
+ const configToValidate = verificationConfig === true ? {} : verificationConfig;
134
+
135
+ // Let validation errors propagate up to getCachedCertificateVerificationConfig
136
+ // which will log them once and cache the error
137
+ return validateAndParseCertificateVerificationConfig(configToValidate);
138
+ }
@@ -0,0 +1,447 @@
1
+ /**
2
+ * Shared utilities for certificate verification
3
+ */
4
+
5
+ import { createHash } from 'node:crypto';
6
+ import * as pkijs from 'pkijs';
7
+ import * as asn1js from 'asn1js';
8
+ import { loggerWithTag } from '../../utility/logging/logger.ts';
9
+ import { table } from '../../resources/databases.ts';
10
+ import type { PeerCertificate, CertificateChainEntry } from './types.ts';
11
+
12
+ const logger = loggerWithTag('cert-verification-utils');
13
+
14
+ /**
15
+ * Convert a buffer to PEM format
16
+ * @param buffer - Certificate data as buffer
17
+ * @param type - Certificate type (e.g., 'CERTIFICATE')
18
+ * @returns PEM formatted string
19
+ */
20
+ export function bufferToPem(buffer: Buffer, type: string): string {
21
+ const base64 = buffer.toString('base64');
22
+ const lines = [`-----BEGIN ${type}-----`];
23
+
24
+ // Split into 64-char lines
25
+ for (let i = 0; i < base64.length; i += 64) {
26
+ lines.push(base64.substring(i, i + 64));
27
+ }
28
+
29
+ lines.push(`-----END ${type}-----`);
30
+ return lines.join('\n');
31
+ }
32
+
33
+ /**
34
+ * Extract certificate chain from peer certificate object
35
+ * @param peerCertificate - Peer certificate object from TLS connection
36
+ * @returns Certificate chain with issuer relationships
37
+ */
38
+ export function extractCertificateChain(peerCertificate: PeerCertificate): CertificateChainEntry[] {
39
+ const chain: CertificateChainEntry[] = [];
40
+ let current = peerCertificate;
41
+
42
+ while (current?.raw) {
43
+ const entry: CertificateChainEntry = { cert: current.raw };
44
+
45
+ // Get issuer if available and different from self
46
+ if (current.issuerCertificate && current.issuerCertificate !== current && current.issuerCertificate.raw) {
47
+ entry.issuer = current.issuerCertificate.raw;
48
+ }
49
+
50
+ chain.push(entry);
51
+
52
+ // Move to next in chain
53
+ if (current.issuerCertificate && current.issuerCertificate !== current) {
54
+ current = current.issuerCertificate;
55
+ } else {
56
+ break;
57
+ }
58
+ }
59
+
60
+ return chain;
61
+ }
62
+
63
+ /**
64
+ * Extract CRL Distribution Points from a certificate using PKI.js
65
+ * @param certPem - Certificate in PEM format
66
+ * @returns Array of CRL distribution point URLs
67
+ */
68
+ export function extractCRLDistributionPoints(certPem: string): string[] {
69
+ try {
70
+ // Parse the certificate using PKI.js
71
+ const certBuffer = pemToBuffer(certPem);
72
+ const cert = pkijs.Certificate.fromBER(certBuffer);
73
+
74
+ // Look for CRL Distribution Points extension (OID: 2.5.29.31)
75
+ const crlDistExt = cert.extensions?.find((ext) => ext.extnID === '2.5.29.31');
76
+
77
+ if (!crlDistExt) {
78
+ logger.debug?.('Certificate has no CRL Distribution Points extension');
79
+ return [];
80
+ }
81
+
82
+ // Parse the extension value
83
+ const asn1 = asn1js.fromBER(crlDistExt.extnValue.valueBlock.valueHexView);
84
+ if (asn1.offset === -1) {
85
+ throw new Error('Failed to parse ASN.1 structure in CRL Distribution Points extension');
86
+ }
87
+
88
+ const crlDistPoints = new pkijs.CRLDistributionPoints({
89
+ schema: asn1.result,
90
+ });
91
+
92
+ const distributionPoints: string[] = [];
93
+
94
+ // Extract distribution point URLs
95
+ for (const distPoint of crlDistPoints.distributionPoints) {
96
+ if (distPoint.distributionPoint && Array.isArray(distPoint.distributionPoint)) {
97
+ // Handle the actual PKI.js structure where distributionPoint is an array
98
+ for (const dp of distPoint.distributionPoint) {
99
+ if (dp.type === 6 && typeof dp.value === 'string') {
100
+ // uniformResourceIdentifier
101
+ const url = dp.value;
102
+ if (url.startsWith('http://') || url.startsWith('https://')) {
103
+ distributionPoints.push(url);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+
110
+ logger.debug?.(`Found ${distributionPoints.length} CRL distribution points: ${distributionPoints}`);
111
+ return distributionPoints;
112
+ } catch (error) {
113
+ // Parsing failures are treated as "no CRL URLs available"
114
+ // Rationale: The certificate was already validated by Node.js TLS (signature, trust chain)
115
+ // If PKI.js can't parse it, it's likely a library incompatibility or unsupported extension format
116
+ // Not a security issue since TLS already validated the cert - we just can't extract revocation URLs
117
+ // The higher-level fail-open/fail-closed configuration determines final behavior when no URLs found
118
+ logger.warn?.(`Failed to extract CRL distribution points: ${error}`);
119
+ return [];
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Extract both CRL and OCSP URLs from a certificate in a single parse operation
125
+ * @param certPem - Certificate in PEM format
126
+ * @returns Object containing arrays of CRL and OCSP URLs
127
+ */
128
+ export function extractRevocationUrls(certPem: string): { crlUrls: string[]; ocspUrls: string[] } {
129
+ try {
130
+ // Parse the certificate using PKI.js (single parse for both URL types)
131
+ const certBuffer = pemToBuffer(certPem);
132
+ const cert = pkijs.Certificate.fromBER(certBuffer);
133
+
134
+ const crlUrls: string[] = [];
135
+ const ocspUrls: string[] = [];
136
+
137
+ // Single pass through extensions to extract both CRL and OCSP URLs
138
+ for (const ext of cert.extensions || []) {
139
+ if (ext.extnID === '2.5.29.31') {
140
+ // CRL Distribution Points extension
141
+ try {
142
+ const asn1 = asn1js.fromBER(ext.extnValue.valueBlock.valueHexView);
143
+ if (asn1.offset !== -1) {
144
+ const crlDistPoints = new pkijs.CRLDistributionPoints({
145
+ schema: asn1.result,
146
+ });
147
+
148
+ // Extract CRL distribution point URLs
149
+ for (const distPoint of crlDistPoints.distributionPoints) {
150
+ if (distPoint.distributionPoint && Array.isArray(distPoint.distributionPoint)) {
151
+ // Handle the actual PKI.js structure where distributionPoint is an array
152
+ for (const dp of distPoint.distributionPoint) {
153
+ if (dp.type === 6 && typeof dp.value === 'string') {
154
+ // uniformResourceIdentifier
155
+ const url = dp.value;
156
+ if (url.startsWith('http://') || url.startsWith('https://')) {
157
+ crlUrls.push(url);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ } catch (crlError) {
165
+ logger.warn?.(`Failed to parse CRL Distribution Points extension: ${crlError}`);
166
+ }
167
+ } else if (ext.extnID === '1.3.6.1.5.5.7.1.1') {
168
+ // Authority Information Access extension
169
+ try {
170
+ const asn1 = asn1js.fromBER(ext.extnValue.valueBlock.valueHexView);
171
+ if (asn1.offset !== -1 && asn1.result instanceof asn1js.Sequence) {
172
+ for (const accessDesc of asn1.result.valueBlock.value) {
173
+ if (accessDesc instanceof asn1js.Sequence && accessDesc.valueBlock.value.length >= 2) {
174
+ const accessMethod = accessDesc.valueBlock.value[0];
175
+ const accessLocation = accessDesc.valueBlock.value[1];
176
+
177
+ // Check if accessMethod is OCSP (OID 1.3.6.1.5.5.7.48.1)
178
+ if (
179
+ accessMethod instanceof asn1js.ObjectIdentifier &&
180
+ accessMethod.valueBlock.toString() === '1.3.6.1.5.5.7.48.1'
181
+ ) {
182
+ // Check if accessLocation is a URI (context tag 6)
183
+ if (accessLocation.idBlock.tagNumber === 6) {
184
+ const url = String.fromCharCode(
185
+ ...Array.from((accessLocation.valueBlock as any).valueHexView as Uint8Array)
186
+ );
187
+ if (url.startsWith('http://') || url.startsWith('https://')) {
188
+ ocspUrls.push(url);
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ } catch (ocspError) {
196
+ logger.warn?.(`Failed to parse Authority Information Access extension: ${ocspError}`);
197
+ }
198
+ }
199
+ }
200
+
201
+ logger.debug?.(`Found ${crlUrls.length} CRL distribution points and ${ocspUrls.length} OCSP responder URLs`);
202
+ return { crlUrls, ocspUrls };
203
+ } catch (error) {
204
+ // Parsing failures are treated as "no revocation URLs available"
205
+ // Rationale: The certificate was already validated by Node.js TLS (signature, trust chain)
206
+ // If PKI.js can't parse it, it's likely a library incompatibility or unsupported extension format
207
+ // Not a security issue since TLS already validated the cert - we just can't extract revocation URLs
208
+ // The higher-level fail-open/fail-closed configuration determines final behavior when no URLs found
209
+ logger.warn?.(`Failed to extract revocation URLs: ${error}`);
210
+ return { crlUrls: [], ocspUrls: [] };
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Extract OCSP responder URLs from a certificate
216
+ * @param certPem - Certificate in PEM format
217
+ * @returns Array of OCSP responder URLs
218
+ */
219
+ export function extractOCSPUrls(certPem: string): string[] {
220
+ try {
221
+ // Parse the certificate using PKI.js
222
+ const certBuffer = pemToBuffer(certPem);
223
+ const cert = pkijs.Certificate.fromBER(certBuffer);
224
+
225
+ // Look for Authority Information Access extension (OID: 1.3.6.1.5.5.7.1.1)
226
+ const aiaExt = cert.extensions?.find((ext) => ext.extnID === '1.3.6.1.5.5.7.1.1');
227
+
228
+ if (!aiaExt) {
229
+ logger.debug?.('Certificate has no Authority Information Access extension');
230
+ return [];
231
+ }
232
+
233
+ // Parse the extension value using asn1js
234
+ const asn1 = asn1js.fromBER(aiaExt.extnValue.valueBlock.valueHexView);
235
+ if (asn1.offset === -1) {
236
+ throw new Error('Failed to parse ASN.1 structure in Authority Information Access extension');
237
+ }
238
+
239
+ const ocspUrls: string[] = [];
240
+
241
+ // The AIA extension contains a sequence of AccessDescription entries
242
+ // Each AccessDescription has: accessMethod (OID) and accessLocation (GeneralName)
243
+ if (asn1.result instanceof asn1js.Sequence) {
244
+ for (const accessDesc of asn1.result.valueBlock.value) {
245
+ if (accessDesc instanceof asn1js.Sequence && accessDesc.valueBlock.value.length >= 2) {
246
+ const accessMethod = accessDesc.valueBlock.value[0];
247
+ const accessLocation = accessDesc.valueBlock.value[1];
248
+
249
+ // Check if accessMethod is OCSP (OID 1.3.6.1.5.5.7.48.1)
250
+ if (
251
+ accessMethod instanceof asn1js.ObjectIdentifier &&
252
+ accessMethod.valueBlock.toString() === '1.3.6.1.5.5.7.48.1'
253
+ ) {
254
+ // Check if accessLocation is a URI (context tag 6)
255
+ if (accessLocation.idBlock.tagNumber === 6) {
256
+ const url = String.fromCharCode(
257
+ ...Array.from((accessLocation.valueBlock as any).valueHexView as Uint8Array)
258
+ );
259
+ if (url.startsWith('http://') || url.startsWith('https://')) {
260
+ ocspUrls.push(url);
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ logger.debug?.(`Found ${ocspUrls.length} OCSP responder URLs: ${ocspUrls}`);
269
+ return ocspUrls;
270
+ } catch (error) {
271
+ logger.error?.(`Failed to extract OCSP URLs: ${error}`);
272
+ return [];
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Convert PEM string to buffer for PKI.js parsing
278
+ * @param pem - PEM formatted certificate
279
+ * @returns Buffer containing certificate data
280
+ */
281
+ export function pemToBuffer(pem: string): ArrayBuffer {
282
+ // Remove PEM headers and whitespace
283
+ const base64 = pem
284
+ .replace(/-----BEGIN [^-]+-----/g, '')
285
+ .replace(/-----END [^-]+-----/g, '')
286
+ .replace(/\s/g, '');
287
+
288
+ // Convert to buffer
289
+ const binaryString = atob(base64);
290
+ const buffer = new ArrayBuffer(binaryString.length);
291
+ const view = new Uint8Array(buffer);
292
+
293
+ for (let i = 0; i < binaryString.length; i++) {
294
+ view[i] = binaryString.charCodeAt(i);
295
+ }
296
+
297
+ return buffer;
298
+ }
299
+
300
+ /**
301
+ * Create a cache key for certificate verification
302
+ * @param certPem - Certificate in PEM format
303
+ * @param issuerPem - Issuer certificate in PEM format
304
+ * @param method - Verification method (ocsp, crl)
305
+ * @param additionalData - Additional data to include in hash
306
+ * @returns Cache key string
307
+ */
308
+ export function createCacheKey(
309
+ certPem: string,
310
+ issuerPem: string,
311
+ method: 'ocsp' | 'crl',
312
+ additionalData?: Record<string, any>
313
+ ): string {
314
+ const cacheData = {
315
+ certPem,
316
+ issuerPem,
317
+ method,
318
+ ...additionalData,
319
+ };
320
+ const cacheKeyHash = createHash('sha256').update(JSON.stringify(cacheData)).digest('hex');
321
+ return `${method}:${cacheKeyHash}`;
322
+ }
323
+
324
+ /**
325
+ * Create a cache key for CRL storage
326
+ * @param distributionPoint - CRL distribution point URL
327
+ * @returns Cache key string
328
+ */
329
+ export function createCRLCacheKey(distributionPoint: string): string {
330
+ const hash = createHash('sha256').update(distributionPoint).digest('hex');
331
+ return `crl:${hash}`;
332
+ }
333
+
334
+ /**
335
+ * Create a composite ID for revoked certificate lookup
336
+ * @param issuerKeyId - Issuer key identifier or DN hash
337
+ * @param serialNumber - Certificate serial number
338
+ * @returns Composite ID string
339
+ */
340
+ export function createRevokedCertificateId(issuerKeyId: string, serialNumber: string): string {
341
+ return `${issuerKeyId}:${serialNumber}`;
342
+ }
343
+
344
+ /**
345
+ * Extract serial number from a certificate
346
+ * @param certPem - Certificate in PEM format
347
+ * @returns Certificate serial number as string
348
+ */
349
+ export function extractSerialNumber(certPem: string): string {
350
+ try {
351
+ const certBuffer = pemToBuffer(certPem);
352
+ const cert = pkijs.Certificate.fromBER(certBuffer);
353
+
354
+ // Convert serial number to string
355
+ const serialNumber = cert.serialNumber.valueBlock.valueHexView;
356
+ return Array.from(serialNumber)
357
+ .map((b) => b.toString(16).padStart(2, '0'))
358
+ .join('');
359
+ } catch (error) {
360
+ logger.error?.(`Failed to extract serial number: ${error}`);
361
+ throw new Error(`Failed to extract certificate serial number: ${error.message}`);
362
+ }
363
+ }
364
+
365
+ /**
366
+ * Extract issuer key identifier from a certificate
367
+ * @param certPem - Certificate in PEM format
368
+ * @returns Issuer key identifier as hex string, or hash of issuer DN if not available
369
+ */
370
+ export function extractIssuerKeyId(certPem: string): string {
371
+ try {
372
+ const certBuffer = pemToBuffer(certPem);
373
+ const cert = pkijs.Certificate.fromBER(certBuffer);
374
+
375
+ // Look for Authority Key Identifier extension (OID: 2.5.29.35)
376
+ const akiExt = cert.extensions?.find((ext) => ext.extnID === '2.5.29.35');
377
+
378
+ if (akiExt) {
379
+ try {
380
+ // Parse the extension value manually since parsedValue may be undefined for Ed25519 certs
381
+ const asn1 = asn1js.fromBER(akiExt.extnValue.valueBlock.valueHexView);
382
+ if (asn1.offset !== -1) {
383
+ const aki = new pkijs.AuthorityKeyIdentifier({
384
+ schema: asn1.result,
385
+ });
386
+
387
+ if (aki.keyIdentifier) {
388
+ const keyId = aki.keyIdentifier.valueBlock.valueHexView;
389
+ return Array.from(keyId)
390
+ .map((b) => b.toString(16).padStart(2, '0'))
391
+ .join('');
392
+ }
393
+ }
394
+ } catch (parseError) {
395
+ logger.debug?.(`Failed to parse Authority Key Identifier: ${parseError}, falling back to hash`);
396
+ }
397
+ }
398
+
399
+ // Fall back to hash of issuer DN
400
+ const issuerDN = cert.issuer.typesAndValues.map((tv) => `${tv.type}=${tv.value.valueBlock.value}`).join(',');
401
+
402
+ return createHash('sha256').update(issuerDN).digest('hex');
403
+ } catch (error) {
404
+ logger.error?.(`Failed to extract issuer key ID: ${error}`);
405
+ throw new Error(`Failed to extract issuer key ID: ${error.message}`);
406
+ }
407
+ }
408
+
409
+ /**
410
+ * Get shared certificate verification cache table
411
+ * @returns Harper table instance for certificate verification cache
412
+ */
413
+ // Cache the certificate cache table instance to avoid recreating it
414
+ let certificateCacheTable: ReturnType<typeof table> | null = null;
415
+
416
+ export function getCertificateCacheTable() {
417
+ if (!certificateCacheTable) {
418
+ certificateCacheTable = table({
419
+ table: 'hdb_certificate_cache',
420
+ database: 'system',
421
+ attributes: [
422
+ {
423
+ name: 'certificate_id',
424
+ isPrimaryKey: true,
425
+ },
426
+ {
427
+ name: 'status', // 'good', 'revoked', 'unknown'
428
+ },
429
+ {
430
+ name: 'reason',
431
+ },
432
+ {
433
+ name: 'checked_at',
434
+ },
435
+ {
436
+ name: 'expiresAt',
437
+ expiresAt: true,
438
+ indexed: true,
439
+ },
440
+ {
441
+ name: 'method', // 'ocsp' or 'crl'
442
+ },
443
+ ],
444
+ });
445
+ }
446
+ return certificateCacheTable;
447
+ }
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const crypto = require('crypto');
4
+
5
+ const CRYPTO_ALGORITHM = 'aes-256-cbc';
6
+ const KEY_BYTE_LENGTH = 32;
7
+ const IV_BYTE_LENGTH = 16;
8
+ const KEY_STRING_LENGTH = 64;
9
+ const IV_STRING_LENGTH = 32;
10
+ const ENCRYPTED_STRING_START = KEY_STRING_LENGTH + IV_STRING_LENGTH;
11
+
12
+ module.exports = {
13
+ encrypt,
14
+ decrypt,
15
+ };
16
+
17
+ function encrypt(text) {
18
+ let key = crypto.randomBytes(KEY_BYTE_LENGTH);
19
+ let iv = crypto.randomBytes(IV_BYTE_LENGTH);
20
+
21
+ let cipher = crypto.createCipheriv(CRYPTO_ALGORITHM, Buffer.from(key), iv);
22
+ let encrypted = cipher.update(text);
23
+ encrypted = Buffer.concat([encrypted, cipher.final()]);
24
+
25
+ let keyString = key.toString('hex');
26
+ let ivString = iv.toString('hex');
27
+ let encryptedString = encrypted.toString('hex');
28
+ return keyString + ivString + encryptedString;
29
+ }
30
+
31
+ function decrypt(text) {
32
+ let keyString = text.substr(0, KEY_STRING_LENGTH);
33
+ let ivString = text.substr(KEY_STRING_LENGTH, IV_STRING_LENGTH);
34
+ let encrptedString = text.substr(ENCRYPTED_STRING_START, text.length);
35
+
36
+ let iv = Buffer.from(ivString, 'hex');
37
+ let encryptedText = Buffer.from(encrptedString, 'hex');
38
+ let decipher = crypto.createDecipheriv(CRYPTO_ALGORITHM, Buffer.from(keyString, 'hex'), iv);
39
+ let decrypted = decipher.update(encryptedText);
40
+ decrypted = Buffer.concat([decrypted, decipher.final()]);
41
+ return decrypted.toString();
42
+ }
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ class PermissionAttributeResponseObject {
4
+ /**
5
+ * Used to track role-based, attribute-level permission issues related to an incoming API request/operation
6
+ * @param attrName {String} name of the attribute with a permission restriction
7
+ * @param requiredPerms {Array} array of CRU perms that are required on attr for operation
8
+ */
9
+ constructor(attrName, requiredPerms = []) {
10
+ this.attribute_name = attrName;
11
+ this.required_permissions = requiredPerms;
12
+ }
13
+ }
14
+
15
+ module.exports = PermissionAttributeResponseObject;