node-server-engine 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/.env.example +193 -193
  2. package/.mocharc.js +13 -13
  3. package/.nycrc +18 -18
  4. package/.prettierrc +7 -7
  5. package/Dockerfile +30 -30
  6. package/README.md +991 -1025
  7. package/babel.config.json +35 -35
  8. package/dist/const/DebeziumEvent.js.map +1 -1
  9. package/dist/const/LogSeverity.js.map +1 -1
  10. package/dist/const/index.js.map +1 -1
  11. package/dist/const/metrics.js.map +1 -1
  12. package/dist/const/mime.js.map +1 -1
  13. package/dist/const/tokenIssuer.js.map +1 -1
  14. package/dist/db/migrations/20241030121500-create-sequelize-meta-table.js.map +1 -1
  15. package/dist/db/models/SequelizeMeta.js.map +1 -1
  16. package/dist/db/models/index.js.map +1 -1
  17. package/dist/entities/ElasticSearch/ElasticSearch.js +7 -7
  18. package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
  19. package/dist/entities/ElasticSearch/ElasticSearch.types.js.map +1 -1
  20. package/dist/entities/ElasticSearch/index.js.map +1 -1
  21. package/dist/entities/Endpoint/Endpoint.js +8 -8
  22. package/dist/entities/Endpoint/Endpoint.js.map +1 -1
  23. package/dist/entities/Endpoint/Endpoint.types.js.map +1 -1
  24. package/dist/entities/Endpoint/index.js.map +1 -1
  25. package/dist/entities/EngineError/EngineError.js +2 -2
  26. package/dist/entities/EngineError/EngineError.js.map +1 -1
  27. package/dist/entities/EngineError/EngineError.types.js.map +1 -1
  28. package/dist/entities/EngineError/index.js.map +1 -1
  29. package/dist/entities/KeySet/KeySet.js +3 -3
  30. package/dist/entities/KeySet/KeySet.js.map +1 -1
  31. package/dist/entities/KeySet/KeySet.types.js.map +1 -1
  32. package/dist/entities/KeySet/index.js.map +1 -1
  33. package/dist/entities/LifecycleController/LifecycleController.js.map +1 -1
  34. package/dist/entities/LifecycleController/LifecycleController.types.js.map +1 -1
  35. package/dist/entities/LifecycleController/index.js.map +1 -1
  36. package/dist/entities/Localizator/Localizator.js +7 -7
  37. package/dist/entities/Localizator/Localizator.js.map +1 -1
  38. package/dist/entities/Localizator/Localizator.types.js.map +1 -1
  39. package/dist/entities/Localizator/guessNamingConvention/guessNamingConvention.js.map +1 -1
  40. package/dist/entities/Localizator/guessNamingConvention/index.js.map +1 -1
  41. package/dist/entities/Localizator/index.js.map +1 -1
  42. package/dist/entities/MessageHandler/MessageHandler.js +2 -2
  43. package/dist/entities/MessageHandler/MessageHandler.js.map +1 -1
  44. package/dist/entities/MessageHandler/MessageHandler.types.js.map +1 -1
  45. package/dist/entities/MessageHandler/index.js.map +1 -1
  46. package/dist/entities/PubSub/PubSub.js +25 -25
  47. package/dist/entities/PubSub/PubSub.js.map +1 -1
  48. package/dist/entities/PubSub/PubSub.types.js.map +1 -1
  49. package/dist/entities/PubSub/handleMessage/handleMessage.js +6 -6
  50. package/dist/entities/PubSub/handleMessage/handleMessage.js.map +1 -1
  51. package/dist/entities/PubSub/handleMessage/index.js.map +1 -1
  52. package/dist/entities/PubSub/index.js.map +1 -1
  53. package/dist/entities/PushNotification/PushNotification.js +4 -4
  54. package/dist/entities/PushNotification/PushNotification.js.map +1 -1
  55. package/dist/entities/PushNotification/PushNotification.types.js.map +1 -1
  56. package/dist/entities/PushNotification/index.js.map +1 -1
  57. package/dist/entities/Redis/Redis.js +8 -8
  58. package/dist/entities/Redis/Redis.js.map +1 -1
  59. package/dist/entities/Redis/Redis.types.js.map +1 -1
  60. package/dist/entities/Redis/Redis.validate.js +2 -2
  61. package/dist/entities/Redis/Redis.validate.js.map +1 -1
  62. package/dist/entities/Redis/index.js.map +1 -1
  63. package/dist/entities/Sequelize/Sequelize.config.js +42 -2
  64. package/dist/entities/Sequelize/Sequelize.config.js.map +1 -1
  65. package/dist/entities/Sequelize/Sequelize.js +3 -3
  66. package/dist/entities/Sequelize/Sequelize.js.map +1 -1
  67. package/dist/entities/Sequelize/Sequelize.types.js.map +1 -1
  68. package/dist/entities/Sequelize/Sequelize.validate.js +2 -2
  69. package/dist/entities/Sequelize/Sequelize.validate.js.map +1 -1
  70. package/dist/entities/Sequelize/index.js.map +1 -1
  71. package/dist/entities/Server/Server.const.js.map +1 -1
  72. package/dist/entities/Server/Server.js +2 -2
  73. package/dist/entities/Server/Server.js.map +1 -1
  74. package/dist/entities/Server/Server.types.js.map +1 -1
  75. package/dist/entities/Server/index.js.map +1 -1
  76. package/dist/entities/SocketClient/SocketClient.js +15 -15
  77. package/dist/entities/SocketClient/SocketClient.js.map +1 -1
  78. package/dist/entities/SocketClient/SocketClient.types.js.map +1 -1
  79. package/dist/entities/SocketClient/index.js.map +1 -1
  80. package/dist/entities/SocketClient/parseMessage/index.js.map +1 -1
  81. package/dist/entities/SocketClient/parseMessage/parseMessage.js +2 -2
  82. package/dist/entities/SocketClient/parseMessage/parseMessage.js.map +1 -1
  83. package/dist/entities/Storage/Storage.js +20 -20
  84. package/dist/entities/Storage/Storage.js.map +1 -1
  85. package/dist/entities/Storage/Storage.types.js.map +1 -1
  86. package/dist/entities/Storage/index.js.map +1 -1
  87. package/dist/entities/ValidationError/ValidationError.js.map +1 -1
  88. package/dist/entities/ValidationError/index.js.map +1 -1
  89. package/dist/entities/WebError/WebError.js +4 -4
  90. package/dist/entities/WebError/WebError.js.map +1 -1
  91. package/dist/entities/WebError/WebError.types.js.map +1 -1
  92. package/dist/entities/WebError/index.js.map +1 -1
  93. package/dist/entities/index.js.map +1 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/metrics/debug.js.map +1 -1
  96. package/dist/metrics/index.js.map +1 -1
  97. package/dist/metrics/request.js.map +1 -1
  98. package/dist/middleware/authAdmin/authAdmin.js.map +1 -1
  99. package/dist/middleware/authAdmin/authAdmin.types.js.map +1 -1
  100. package/dist/middleware/authAdmin/index.js.map +1 -1
  101. package/dist/middleware/authHmac/authHmac.js.map +1 -1
  102. package/dist/middleware/authHmac/authHmac.types.js.map +1 -1
  103. package/dist/middleware/authHmac/index.js.map +1 -1
  104. package/dist/middleware/authJwt/authJwt.js.map +1 -1
  105. package/dist/middleware/authJwt/authJwt.types.js.map +1 -1
  106. package/dist/middleware/authJwt/index.js.map +1 -1
  107. package/dist/middleware/authStatic/authStatic.js +3 -3
  108. package/dist/middleware/authStatic/authStatic.js.map +1 -1
  109. package/dist/middleware/authStatic/index.js.map +1 -1
  110. package/dist/middleware/authTls/authTls.js +8 -8
  111. package/dist/middleware/authTls/authTls.js.map +1 -1
  112. package/dist/middleware/authTls/authTls.types.js.map +1 -1
  113. package/dist/middleware/authTls/index.js.map +1 -1
  114. package/dist/middleware/checkPermission/checkPermission.d.ts +3 -1
  115. package/dist/middleware/checkPermission/checkPermission.js +2 -2
  116. package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
  117. package/dist/middleware/error/error.js.map +1 -1
  118. package/dist/middleware/error/index.js.map +1 -1
  119. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js +2 -2
  120. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js.map +1 -1
  121. package/dist/middleware/fileUploader/compressAvatar/compressAvatar.types.js.map +1 -1
  122. package/dist/middleware/fileUploader/compressAvatar/index.js.map +1 -1
  123. package/dist/middleware/fileUploader/fileUploader.js +12 -12
  124. package/dist/middleware/fileUploader/fileUploader.js.map +1 -1
  125. package/dist/middleware/fileUploader/fileUploader.types.js.map +1 -1
  126. package/dist/middleware/fileUploader/index.js.map +1 -1
  127. package/dist/middleware/fileUploader/isMultiPart/index.js.map +1 -1
  128. package/dist/middleware/fileUploader/isMultiPart/isMultipart.js.map +1 -1
  129. package/dist/middleware/fileUploader/validate/index.js.map +1 -1
  130. package/dist/middleware/fileUploader/validate/validate.js.map +1 -1
  131. package/dist/middleware/fourOhFour/fourOhFour.js.map +1 -1
  132. package/dist/middleware/fourOhFour/index.js.map +1 -1
  133. package/dist/middleware/geminiFileUploader/geminiFileUploader.js.map +1 -1
  134. package/dist/middleware/geminiFileUploader/index.js.map +1 -1
  135. package/dist/middleware/healthCheck/healthCheck.js +2 -2
  136. package/dist/middleware/healthCheck/healthCheck.js.map +1 -1
  137. package/dist/middleware/healthCheck/index.js.map +1 -1
  138. package/dist/middleware/index.js.map +1 -1
  139. package/dist/middleware/metrics/index.js.map +1 -1
  140. package/dist/middleware/metrics/metrics.js.map +1 -1
  141. package/dist/middleware/requestMetrics/index.js.map +1 -1
  142. package/dist/middleware/requestMetrics/requestMetrics.js.map +1 -1
  143. package/dist/middleware/swaggerDocs/index.js.map +1 -1
  144. package/dist/middleware/swaggerDocs/swaggerDocs.js +7 -7
  145. package/dist/middleware/swaggerDocs/swaggerDocs.js.map +1 -1
  146. package/dist/middleware/swaggerDocs/swaggerDocs.types.js.map +1 -1
  147. package/dist/middleware/userResolver/index.js.map +1 -1
  148. package/dist/middleware/userResolver/userResolver.js.map +1 -1
  149. package/dist/middleware/validate/index.js.map +1 -1
  150. package/dist/middleware/validate/validate.js.map +1 -1
  151. package/dist/middleware/version/index.js.map +1 -1
  152. package/dist/middleware/version/version.js +3 -3
  153. package/dist/middleware/version/version.js.map +1 -1
  154. package/dist/utils/checkEnvironment/index.js +13 -13
  155. package/dist/utils/checkEnvironment/index.js.map +1 -1
  156. package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
  157. package/dist/utils/createHttpServer/createHttpServer.validate.js +2 -2
  158. package/dist/utils/createHttpServer/createHttpServer.validate.js.map +1 -1
  159. package/dist/utils/createHttpServer/index.js.map +1 -1
  160. package/dist/utils/createSortedObject/createSortedObject.js.map +1 -1
  161. package/dist/utils/createSortedObject/index.js.map +1 -1
  162. package/dist/utils/dbMigration/dbMigration.js +8 -8
  163. package/dist/utils/dbMigration/dbMigration.js.map +1 -1
  164. package/dist/utils/dbMigration/dbMigration.types.js.map +1 -1
  165. package/dist/utils/dbMigration/index.js.map +1 -1
  166. package/dist/utils/dbMigration/migrateMetadataTable/index.js.map +1 -1
  167. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.d.ts +2 -2
  168. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js +47 -15
  169. package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
  170. package/dist/utils/envAssert/envAssert.js +6 -6
  171. package/dist/utils/envAssert/envAssert.js.map +1 -1
  172. package/dist/utils/envAssert/index.js.map +1 -1
  173. package/dist/utils/envAssert/validators/hostList.js +2 -2
  174. package/dist/utils/envAssert/validators/hostList.js.map +1 -1
  175. package/dist/utils/envAssert/validators/index.js.map +1 -1
  176. package/dist/utils/envAssert/validators/ipList.js +2 -2
  177. package/dist/utils/envAssert/validators/ipList.js.map +1 -1
  178. package/dist/utils/envAssert/validators/path.js +2 -2
  179. package/dist/utils/envAssert/validators/path.js.map +1 -1
  180. package/dist/utils/envAssert/validators/string.js +2 -2
  181. package/dist/utils/envAssert/validators/string.js.map +1 -1
  182. package/dist/utils/envAssert/validators/stringList.js +3 -3
  183. package/dist/utils/envAssert/validators/stringList.js.map +1 -1
  184. package/dist/utils/filter/filter.js +4 -4
  185. package/dist/utils/filter/filter.js.map +1 -1
  186. package/dist/utils/filter/index.js.map +1 -1
  187. package/dist/utils/getDynamicLink/getDynamicLink.js.map +1 -1
  188. package/dist/utils/getDynamicLink/getDynamicLink.types.js.map +1 -1
  189. package/dist/utils/getDynamicLink/getDynamicLink.validate.js.map +1 -1
  190. package/dist/utils/getDynamicLink/index.js.map +1 -1
  191. package/dist/utils/hmac/checkEnv/checkEnv.js +2 -2
  192. package/dist/utils/hmac/checkEnv/checkEnv.js.map +1 -1
  193. package/dist/utils/hmac/checkEnv/index.js.map +1 -1
  194. package/dist/utils/hmac/createHmac/createHmac.js.map +1 -1
  195. package/dist/utils/hmac/createHmac/index.js.map +1 -1
  196. package/dist/utils/hmac/index.js.map +1 -1
  197. package/dist/utils/hmac/index.types.js.map +1 -1
  198. package/dist/utils/hmac/signPayload/index.js.map +1 -1
  199. package/dist/utils/hmac/signPayload/signPayload.js.map +1 -1
  200. package/dist/utils/hmac/verifySignature/index.js.map +1 -1
  201. package/dist/utils/hmac/verifySignature/verifySignature.js.map +1 -1
  202. package/dist/utils/index.js.map +1 -1
  203. package/dist/utils/jwt/index.js.map +1 -1
  204. package/dist/utils/jwt/jwt.js.map +1 -1
  205. package/dist/utils/jwt/jwt.types.js.map +1 -1
  206. package/dist/utils/report/index.js.map +1 -1
  207. package/dist/utils/report/output.js.map +1 -1
  208. package/dist/utils/report/output.types.js.map +1 -1
  209. package/dist/utils/report/report.js.map +1 -1
  210. package/dist/utils/report/report.types.js.map +1 -1
  211. package/dist/utils/request/index.js.map +1 -1
  212. package/dist/utils/request/request.js.map +1 -1
  213. package/dist/utils/semverCompare/index.js.map +1 -1
  214. package/dist/utils/semverCompare/semverCompare.js +5 -5
  215. package/dist/utils/semverCompare/semverCompare.js.map +1 -1
  216. package/dist/utils/sendEmail/index.js.map +1 -1
  217. package/dist/utils/sendEmail/sendEmail.js +8 -8
  218. package/dist/utils/sendEmail/sendEmail.js.map +1 -1
  219. package/dist/utils/sendEmail/sendEmail.types.js.map +1 -1
  220. package/dist/utils/sendPush/index.js.map +1 -1
  221. package/dist/utils/sendPush/sendPush.js +5 -5
  222. package/dist/utils/sendPush/sendPush.js.map +1 -1
  223. package/dist/utils/sendPush/sendPush.types.js.map +1 -1
  224. package/dist/utils/tlsConfig/index.js.map +1 -1
  225. package/dist/utils/tlsConfig/tlsConfig.js +2 -2
  226. package/dist/utils/tlsConfig/tlsConfig.js.map +1 -1
  227. package/dist/utils/tlsConfig/tlsConfig.types.js.map +1 -1
  228. package/dist/utils/tlsConfig/tlsConfig.validate.js +2 -2
  229. package/dist/utils/tlsConfig/tlsConfig.validate.js.map +1 -1
  230. package/dist/utils/tlsRequest/index.js.map +1 -1
  231. package/dist/utils/tlsRequest/tlsRequest.js.map +1 -1
  232. package/dist/utils/trimPathSlash/index.js.map +1 -1
  233. package/dist/utils/trimPathSlash/trimPathSlash.js +4 -4
  234. package/dist/utils/trimPathSlash/trimPathSlash.js.map +1 -1
  235. package/eslint.config.mjs +11 -11
  236. package/package.json +164 -161
  237. package/src/const/DebeziumEvent.ts +6 -6
  238. package/src/const/LogSeverity.ts +7 -7
  239. package/src/const/index.ts +5 -5
  240. package/src/const/metrics.ts +6 -6
  241. package/src/const/mime.ts +37 -37
  242. package/src/const/tokenIssuer.ts +9 -9
  243. package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +29 -29
  244. package/src/db/models/SequelizeMeta.ts +16 -16
  245. package/src/db/models/index.ts +2 -2
  246. package/src/entities/ElasticSearch/ElasticSearch.ts +103 -103
  247. package/src/entities/ElasticSearch/ElasticSearch.types.ts +7 -7
  248. package/src/entities/ElasticSearch/index.ts +2 -2
  249. package/src/entities/Endpoint/Endpoint.test.ts +337 -337
  250. package/src/entities/Endpoint/Endpoint.ts +202 -202
  251. package/src/entities/Endpoint/Endpoint.types.ts +205 -205
  252. package/src/entities/Endpoint/index.ts +2 -2
  253. package/src/entities/EngineError/EngineError.ts +28 -28
  254. package/src/entities/EngineError/EngineError.types.ts +15 -15
  255. package/src/entities/EngineError/index.ts +2 -2
  256. package/src/entities/KeySet/KeySet.test.ts +126 -126
  257. package/src/entities/KeySet/KeySet.ts +172 -172
  258. package/src/entities/KeySet/KeySet.types.ts +28 -28
  259. package/src/entities/KeySet/index.ts +2 -2
  260. package/src/entities/LifecycleController/LifecycleController.test.ts +48 -48
  261. package/src/entities/LifecycleController/LifecycleController.ts +24 -24
  262. package/src/entities/LifecycleController/LifecycleController.types.ts +5 -5
  263. package/src/entities/LifecycleController/index.ts +2 -2
  264. package/src/entities/Localizator/Localizator.ts +139 -139
  265. package/src/entities/Localizator/Localizator.types.ts +52 -52
  266. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +165 -165
  267. package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +58 -58
  268. package/src/entities/Localizator/guessNamingConvention/index.ts +1 -1
  269. package/src/entities/Localizator/index.ts +2 -2
  270. package/src/entities/MessageHandler/MessageHandler.test.ts +130 -130
  271. package/src/entities/MessageHandler/MessageHandler.ts +72 -72
  272. package/src/entities/MessageHandler/MessageHandler.types.ts +15 -15
  273. package/src/entities/MessageHandler/index.ts +2 -2
  274. package/src/entities/PubSub/PubSub.test.ts +297 -297
  275. package/src/entities/PubSub/PubSub.ts +202 -202
  276. package/src/entities/PubSub/PubSub.types.ts +76 -76
  277. package/src/entities/PubSub/handleMessage/handleMessage.test.ts +102 -102
  278. package/src/entities/PubSub/handleMessage/handleMessage.ts +65 -65
  279. package/src/entities/PubSub/handleMessage/index.ts +1 -1
  280. package/src/entities/PubSub/index.ts +2 -2
  281. package/src/entities/PushNotification/PushNotification.test.ts +35 -35
  282. package/src/entities/PushNotification/PushNotification.ts +44 -44
  283. package/src/entities/PushNotification/PushNotification.types.ts +25 -25
  284. package/src/entities/PushNotification/index.ts +2 -2
  285. package/src/entities/Redis/Redis.ts +71 -71
  286. package/src/entities/Redis/Redis.types.ts +19 -19
  287. package/src/entities/Redis/Redis.validate.ts +17 -17
  288. package/src/entities/Redis/index.ts +2 -2
  289. package/src/entities/Sequelize/Sequelize.config.ts +59 -29
  290. package/src/entities/Sequelize/Sequelize.test.ts +21 -21
  291. package/src/entities/Sequelize/Sequelize.ts +75 -75
  292. package/src/entities/Sequelize/Sequelize.types.ts +10 -10
  293. package/src/entities/Sequelize/Sequelize.validate.ts +15 -15
  294. package/src/entities/Sequelize/index.ts +2 -2
  295. package/src/entities/Server/Server.const.ts +56 -56
  296. package/src/entities/Server/Server.test.ts +272 -272
  297. package/src/entities/Server/Server.ts +445 -445
  298. package/src/entities/Server/Server.types.ts +88 -88
  299. package/src/entities/Server/index.ts +2 -2
  300. package/src/entities/SocketClient/SocketClient.test.ts +392 -392
  301. package/src/entities/SocketClient/SocketClient.ts +401 -401
  302. package/src/entities/SocketClient/SocketClient.types.ts +62 -62
  303. package/src/entities/SocketClient/index.ts +2 -2
  304. package/src/entities/SocketClient/parseMessage/index.ts +1 -1
  305. package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +20 -20
  306. package/src/entities/SocketClient/parseMessage/parseMessage.ts +26 -26
  307. package/src/entities/Storage/Storage.test.ts +58 -58
  308. package/src/entities/Storage/Storage.ts +219 -219
  309. package/src/entities/Storage/Storage.types.ts +57 -57
  310. package/src/entities/Storage/index.ts +2 -2
  311. package/src/entities/ValidationError/ValidationError.ts +34 -34
  312. package/src/entities/ValidationError/index.ts +1 -1
  313. package/src/entities/WebError/WebError.test.ts +18 -18
  314. package/src/entities/WebError/WebError.ts +23 -23
  315. package/src/entities/WebError/WebError.types.ts +9 -9
  316. package/src/entities/WebError/index.ts +2 -2
  317. package/src/entities/index.ts +16 -16
  318. package/src/index.ts +4 -4
  319. package/src/metrics/debug.ts +10 -10
  320. package/src/metrics/index.ts +2 -2
  321. package/src/metrics/request.ts +17 -17
  322. package/src/middleware/authAdmin/authAdmin.test.ts +199 -199
  323. package/src/middleware/authAdmin/authAdmin.ts +114 -114
  324. package/src/middleware/authAdmin/authAdmin.types.ts +19 -19
  325. package/src/middleware/authAdmin/index.ts +2 -2
  326. package/src/middleware/authHmac/authHmac.test.ts +86 -86
  327. package/src/middleware/authHmac/authHmac.ts +56 -56
  328. package/src/middleware/authHmac/authHmac.types.ts +7 -7
  329. package/src/middleware/authHmac/index.ts +2 -2
  330. package/src/middleware/authJwt/authJwt.test.ts +54 -54
  331. package/src/middleware/authJwt/authJwt.ts +55 -55
  332. package/src/middleware/authJwt/authJwt.types.ts +14 -14
  333. package/src/middleware/authJwt/index.ts +2 -2
  334. package/src/middleware/authStatic/authStatic.test.ts +36 -36
  335. package/src/middleware/authStatic/authStatic.ts +45 -45
  336. package/src/middleware/authStatic/index.ts +1 -1
  337. package/src/middleware/authTls/authTls.test.ts +138 -138
  338. package/src/middleware/authTls/authTls.ts +106 -106
  339. package/src/middleware/authTls/authTls.types.ts +13 -13
  340. package/src/middleware/authTls/index.ts +2 -2
  341. package/src/middleware/checkPermission/checkPermission.ts +33 -35
  342. package/src/middleware/error/error.test.ts +60 -60
  343. package/src/middleware/error/error.ts +25 -25
  344. package/src/middleware/error/index.ts +1 -1
  345. package/src/middleware/fileUploader/compressAvatar/compressAvatar.ts +25 -25
  346. package/src/middleware/fileUploader/compressAvatar/compressAvatar.types.ts +12 -12
  347. package/src/middleware/fileUploader/compressAvatar/index.ts +2 -2
  348. package/src/middleware/fileUploader/fileUploader.test.ts +310 -310
  349. package/src/middleware/fileUploader/fileUploader.ts +303 -303
  350. package/src/middleware/fileUploader/fileUploader.types.ts +52 -52
  351. package/src/middleware/fileUploader/index.ts +2 -2
  352. package/src/middleware/fileUploader/isMultiPart/index.ts +1 -1
  353. package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +9 -9
  354. package/src/middleware/fileUploader/validate/index.ts +1 -1
  355. package/src/middleware/fileUploader/validate/validate.ts +27 -27
  356. package/src/middleware/fourOhFour/fourOhFour.test.ts +14 -14
  357. package/src/middleware/fourOhFour/fourOhFour.ts +13 -13
  358. package/src/middleware/fourOhFour/index.ts +1 -1
  359. package/src/middleware/geminiFileUploader/geminiFileUploader.ts +117 -117
  360. package/src/middleware/geminiFileUploader/index.ts +1 -1
  361. package/src/middleware/healthCheck/healthCheck.test.ts +12 -12
  362. package/src/middleware/healthCheck/healthCheck.ts +14 -14
  363. package/src/middleware/healthCheck/index.ts +1 -1
  364. package/src/middleware/index.ts +17 -17
  365. package/src/middleware/metrics/index.ts +1 -1
  366. package/src/middleware/metrics/metrics.test.ts +46 -46
  367. package/src/middleware/metrics/metrics.ts +24 -24
  368. package/src/middleware/requestMetrics/index.ts +1 -1
  369. package/src/middleware/requestMetrics/requestMetrics.test.ts +77 -77
  370. package/src/middleware/requestMetrics/requestMetrics.ts +20 -20
  371. package/src/middleware/swaggerDocs/index.ts +2 -2
  372. package/src/middleware/swaggerDocs/swaggerDocs.ts +114 -114
  373. package/src/middleware/swaggerDocs/swaggerDocs.types.ts +41 -41
  374. package/src/middleware/userResolver/index.ts +1 -1
  375. package/src/middleware/userResolver/userResolver.test.ts +35 -35
  376. package/src/middleware/userResolver/userResolver.ts +35 -35
  377. package/src/middleware/validate/index.ts +1 -1
  378. package/src/middleware/validate/validate.test.ts +43 -43
  379. package/src/middleware/validate/validate.ts +25 -25
  380. package/src/middleware/version/index.ts +1 -1
  381. package/src/middleware/version/version.test.ts +23 -23
  382. package/src/middleware/version/version.ts +12 -12
  383. package/src/utils/checkEnvironment/index.ts +49 -49
  384. package/src/utils/createHttpServer/createHttpServer.test.ts +24 -24
  385. package/src/utils/createHttpServer/createHttpServer.ts +34 -34
  386. package/src/utils/createHttpServer/createHttpServer.validate.ts +17 -17
  387. package/src/utils/createHttpServer/index.ts +1 -1
  388. package/src/utils/createSortedObject/createSortedObject.ts +20 -20
  389. package/src/utils/createSortedObject/createSortedObjet.test.ts +47 -47
  390. package/src/utils/createSortedObject/index.ts +1 -1
  391. package/src/utils/dbMigration/dbMigration.test.ts +209 -209
  392. package/src/utils/dbMigration/dbMigration.ts +199 -199
  393. package/src/utils/dbMigration/dbMigration.types.ts +11 -11
  394. package/src/utils/dbMigration/index.ts +2 -2
  395. package/src/utils/dbMigration/migrateMetadataTable/index.ts +1 -1
  396. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +59 -59
  397. package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +102 -70
  398. package/src/utils/envAssert/envAssert.ts +31 -31
  399. package/src/utils/envAssert/index.ts +1 -1
  400. package/src/utils/envAssert/validators/hostList.ts +17 -17
  401. package/src/utils/envAssert/validators/index.ts +5 -5
  402. package/src/utils/envAssert/validators/ipList.ts +13 -13
  403. package/src/utils/envAssert/validators/path.ts +13 -13
  404. package/src/utils/envAssert/validators/string.ts +9 -9
  405. package/src/utils/envAssert/validators/stringList.ts +13 -13
  406. package/src/utils/filter/filter.ts +17 -17
  407. package/src/utils/filter/index.ts +1 -1
  408. package/src/utils/getDynamicLink/getDynamicLink.test.ts +51 -51
  409. package/src/utils/getDynamicLink/getDynamicLink.ts +28 -28
  410. package/src/utils/getDynamicLink/getDynamicLink.types.ts +11 -11
  411. package/src/utils/getDynamicLink/getDynamicLink.validate.ts +6 -6
  412. package/src/utils/getDynamicLink/index.ts +2 -2
  413. package/src/utils/hmac/checkEnv/checkEnv.test.ts +18 -18
  414. package/src/utils/hmac/checkEnv/checkEnv.ts +9 -9
  415. package/src/utils/hmac/checkEnv/index.ts +1 -1
  416. package/src/utils/hmac/createHmac/createHmac.ts +33 -33
  417. package/src/utils/hmac/createHmac/index.ts +1 -1
  418. package/src/utils/hmac/index.ts +4 -4
  419. package/src/utils/hmac/index.types.ts +13 -13
  420. package/src/utils/hmac/signPayload/index.ts +1 -1
  421. package/src/utils/hmac/signPayload/signPayload.ts +16 -16
  422. package/src/utils/hmac/verifySignature/index.ts +1 -1
  423. package/src/utils/hmac/verifySignature/verifySignature.ts +24 -24
  424. package/src/utils/index.ts +26 -26
  425. package/src/utils/jwt/index.ts +2 -2
  426. package/src/utils/jwt/jwt.test.ts +41 -41
  427. package/src/utils/jwt/jwt.ts +204 -204
  428. package/src/utils/jwt/jwt.types.ts +21 -21
  429. package/src/utils/report/index.ts +3 -3
  430. package/src/utils/report/output.ts +45 -45
  431. package/src/utils/report/output.types.ts +70 -70
  432. package/src/utils/report/report.test.ts +133 -133
  433. package/src/utils/report/report.ts +134 -134
  434. package/src/utils/report/report.types.ts +13 -13
  435. package/src/utils/request/index.ts +1 -1
  436. package/src/utils/request/request.test.ts +26 -26
  437. package/src/utils/request/request.ts +48 -48
  438. package/src/utils/semverCompare/index.ts +1 -1
  439. package/src/utils/semverCompare/semverCompare.test.ts +49 -49
  440. package/src/utils/semverCompare/semverCompare.ts +60 -60
  441. package/src/utils/sendEmail/index.ts +1 -1
  442. package/src/utils/sendEmail/sendEmail.ts +27 -27
  443. package/src/utils/sendEmail/sendEmail.types.ts +7 -7
  444. package/src/utils/sendPush/index.ts +2 -2
  445. package/src/utils/sendPush/sendPush.ts +20 -20
  446. package/src/utils/sendPush/sendPush.types.ts +25 -25
  447. package/src/utils/tlsConfig/index.ts +2 -2
  448. package/src/utils/tlsConfig/tlsConfig.test.ts +32 -32
  449. package/src/utils/tlsConfig/tlsConfig.ts +47 -47
  450. package/src/utils/tlsConfig/tlsConfig.types.ts +11 -11
  451. package/src/utils/tlsConfig/tlsConfig.validate.ts +25 -25
  452. package/src/utils/tlsRequest/index.ts +1 -1
  453. package/src/utils/tlsRequest/tlsRequest.test.ts +63 -63
  454. package/src/utils/tlsRequest/tlsRequest.ts +12 -12
  455. package/src/utils/trimPathSlash/index.ts +1 -1
  456. package/src/utils/trimPathSlash/trimPathSlash.test.ts +26 -26
  457. package/src/utils/trimPathSlash/trimPathSlash.ts +8 -8
  458. package/test/env.ts +56 -56
  459. package/test/factory/index.ts +8 -8
  460. package/test/factory/sequelizeMeta.ts +12 -12
  461. package/test/hooks.ts +37 -37
  462. package/test/index.ts +3 -3
  463. package/test/stub/index.ts +3 -3
  464. package/test/stub/stubLocales.ts +68 -68
  465. package/test/stub/stubPubSub.ts +7 -7
  466. package/test/stub/stubStorage.ts +77 -77
  467. package/test/stub/stubStorage.types.ts +11 -11
  468. package/test/utils/app.ts +31 -31
  469. package/test/utils/index.ts +1 -1
  470. package/tsconfig.build.json +5 -5
  471. package/tsconfig.json +32 -32
@@ -1,138 +1,138 @@
1
- import { expect } from 'chai';
2
- import { NextFunction, Request, Response } from 'express';
3
- import { faker } from '@faker-js/faker';
4
- import { fake } from 'sinon';
5
- import { authTlsMiddleware, loadEnv } from './authTls';
6
-
7
- describe('Middleware - Auth TLS', () => {
8
- const response = {} as unknown as Response;
9
- afterEach(() => {
10
- delete process.env.ALLOWED_CLIENT_HOSTS;
11
- loadEnv();
12
- });
13
-
14
- it('should reject unauthenticated requests', () => {
15
- const request = { client: { authorized: false } } as unknown as Request;
16
- const next = fake();
17
- expect(() => {
18
- authTlsMiddleware(request, response, next);
19
- }).to.throw();
20
- expect(next).to.not.have.been.called;
21
- });
22
-
23
- it('should accept properly authenticated requests', () => {
24
- const request = {
25
- socket: {
26
- getPeerCertificate: () => ({
27
- subject: { CN: faker.internet.domainName() }
28
- }),
29
- authorized: true
30
- }
31
- } as unknown as Request;
32
- const next = fake();
33
- authTlsMiddleware(request, response, next);
34
- expect(next).to.have.been.calledOnceWithExactly();
35
- });
36
-
37
- it('should reject when not on whitelist', () => {
38
- process.env.ALLOWED_CLIENT_HOSTS = faker.internet.domainName();
39
- loadEnv();
40
- const request = {
41
- socket: {
42
- getPeerCertificate: () => ({
43
- subject: { CN: faker.internet.domainName() }
44
- }),
45
- authorized: true
46
- }
47
- } as unknown as Request;
48
- const next = fake();
49
- expect(() => {
50
- authTlsMiddleware(request, response, next);
51
- }).to.throw();
52
- expect(next).to.not.have.been.called;
53
- });
54
-
55
- it('should accept when subject is in whitelist', () => {
56
- const domain = faker.internet.domainName();
57
- process.env.ALLOWED_CLIENT_HOSTS = domain;
58
- loadEnv();
59
- const request = {
60
- socket: {
61
- getPeerCertificate: () => ({ subject: { CN: domain } }),
62
- authorized: true
63
- }
64
- } as unknown as Request;
65
- const next = fake();
66
- authTlsMiddleware(request, response, next);
67
- expect(next).to.have.been.calledOnceWithExactly();
68
- });
69
-
70
- it('should accept when subject is in whitelist specific to this domain', () => {
71
- const domain = faker.internet.domainName();
72
- loadEnv();
73
- const request = {
74
- socket: {
75
- getPeerCertificate: () => ({ subject: { CN: domain } }),
76
- authorized: true
77
- }
78
- } as unknown as Request;
79
- const next = fake();
80
- authTlsMiddleware(request, response, next, { whitelist: [domain] });
81
- expect(next).to.have.been.calledOnceWithExactly();
82
- });
83
-
84
- it('should accept when subject is in altnames as domain', () => {
85
- const domain = faker.internet.domainName();
86
- process.env.ALLOWED_CLIENT_HOSTS = domain;
87
- loadEnv();
88
- const request = {
89
- socket: {
90
- getPeerCertificate: () => ({
91
- subject: { CN: faker.internet.domainName() },
92
- subjectaltname: `DNS:${domain}, IP Address:${faker.internet.ip()}`
93
- }),
94
- authorized: true
95
- }
96
- } as unknown as Request;
97
- const next = fake();
98
- authTlsMiddleware(request, response, next);
99
- expect(next).to.have.been.calledOnceWithExactly();
100
- });
101
-
102
- // it('should accept when subject is in altnames as ip', () => {
103
- // const ip = faker.internet.ip();
104
- // process.env.ALLOWED_CLIENT_HOSTS = ip;
105
- // loadEnv();
106
- // const request = {
107
- // socket: {
108
- // getPeerCertificate: () => ({
109
- // subject: { CN: faker.internet.domainName() },
110
- // subjectaltname: `DNS:${faker.internet.domainName()}, IP Address:${ip}`
111
- // }),
112
- // authorized: true
113
- // }
114
- // } as unknown as Request;
115
- // const next = fake();
116
- // authTlsMiddleware(request, response, next);
117
- // expect(next).to.have.been.calledOnceWithExactly();
118
- // });
119
-
120
- // it('should pass down subjects', () => {
121
- // const host = faker.internet.domainName();
122
- // const altHost = faker.internet.domainName();
123
- // const ip = faker.internet.ip();
124
- // process.env.ALLOWED_CLIENT_HOSTS = ip;
125
- // loadEnv();
126
- // const request = {
127
- // socket: {
128
- // getPeerCertificate: () => ({
129
- // subject: { CN: host },
130
- // subjectaltname: `DNS:${altHost}, IP Address:${ip}`
131
- // }),
132
- // authorized: true
133
- // }
134
- // } as unknown as Request;
135
- // authTlsMiddleware(request, response, fake() as unknown as NextFunction);
136
- // expect(request.hosts).to.have.members([host, altHost, ip]);
137
- // });
138
- });
1
+ import { expect } from 'chai';
2
+ import { NextFunction, Request, Response } from 'express';
3
+ import { faker } from '@faker-js/faker';
4
+ import { fake } from 'sinon';
5
+ import { authTlsMiddleware, loadEnv } from './authTls';
6
+
7
+ describe('Middleware - Auth TLS', () => {
8
+ const response = {} as unknown as Response;
9
+ afterEach(() => {
10
+ delete process.env.ALLOWED_CLIENT_HOSTS;
11
+ loadEnv();
12
+ });
13
+
14
+ it('should reject unauthenticated requests', () => {
15
+ const request = { client: { authorized: false } } as unknown as Request;
16
+ const next = fake();
17
+ expect(() => {
18
+ authTlsMiddleware(request, response, next);
19
+ }).to.throw();
20
+ expect(next).to.not.have.been.called;
21
+ });
22
+
23
+ it('should accept properly authenticated requests', () => {
24
+ const request = {
25
+ socket: {
26
+ getPeerCertificate: () => ({
27
+ subject: { CN: faker.internet.domainName() }
28
+ }),
29
+ authorized: true
30
+ }
31
+ } as unknown as Request;
32
+ const next = fake();
33
+ authTlsMiddleware(request, response, next);
34
+ expect(next).to.have.been.calledOnceWithExactly();
35
+ });
36
+
37
+ it('should reject when not on whitelist', () => {
38
+ process.env.ALLOWED_CLIENT_HOSTS = faker.internet.domainName();
39
+ loadEnv();
40
+ const request = {
41
+ socket: {
42
+ getPeerCertificate: () => ({
43
+ subject: { CN: faker.internet.domainName() }
44
+ }),
45
+ authorized: true
46
+ }
47
+ } as unknown as Request;
48
+ const next = fake();
49
+ expect(() => {
50
+ authTlsMiddleware(request, response, next);
51
+ }).to.throw();
52
+ expect(next).to.not.have.been.called;
53
+ });
54
+
55
+ it('should accept when subject is in whitelist', () => {
56
+ const domain = faker.internet.domainName();
57
+ process.env.ALLOWED_CLIENT_HOSTS = domain;
58
+ loadEnv();
59
+ const request = {
60
+ socket: {
61
+ getPeerCertificate: () => ({ subject: { CN: domain } }),
62
+ authorized: true
63
+ }
64
+ } as unknown as Request;
65
+ const next = fake();
66
+ authTlsMiddleware(request, response, next);
67
+ expect(next).to.have.been.calledOnceWithExactly();
68
+ });
69
+
70
+ it('should accept when subject is in whitelist specific to this domain', () => {
71
+ const domain = faker.internet.domainName();
72
+ loadEnv();
73
+ const request = {
74
+ socket: {
75
+ getPeerCertificate: () => ({ subject: { CN: domain } }),
76
+ authorized: true
77
+ }
78
+ } as unknown as Request;
79
+ const next = fake();
80
+ authTlsMiddleware(request, response, next, { whitelist: [domain] });
81
+ expect(next).to.have.been.calledOnceWithExactly();
82
+ });
83
+
84
+ it('should accept when subject is in altnames as domain', () => {
85
+ const domain = faker.internet.domainName();
86
+ process.env.ALLOWED_CLIENT_HOSTS = domain;
87
+ loadEnv();
88
+ const request = {
89
+ socket: {
90
+ getPeerCertificate: () => ({
91
+ subject: { CN: faker.internet.domainName() },
92
+ subjectaltname: `DNS:${domain}, IP Address:${faker.internet.ip()}`
93
+ }),
94
+ authorized: true
95
+ }
96
+ } as unknown as Request;
97
+ const next = fake();
98
+ authTlsMiddleware(request, response, next);
99
+ expect(next).to.have.been.calledOnceWithExactly();
100
+ });
101
+
102
+ // it('should accept when subject is in altnames as ip', () => {
103
+ // const ip = faker.internet.ip();
104
+ // process.env.ALLOWED_CLIENT_HOSTS = ip;
105
+ // loadEnv();
106
+ // const request = {
107
+ // socket: {
108
+ // getPeerCertificate: () => ({
109
+ // subject: { CN: faker.internet.domainName() },
110
+ // subjectaltname: `DNS:${faker.internet.domainName()}, IP Address:${ip}`
111
+ // }),
112
+ // authorized: true
113
+ // }
114
+ // } as unknown as Request;
115
+ // const next = fake();
116
+ // authTlsMiddleware(request, response, next);
117
+ // expect(next).to.have.been.calledOnceWithExactly();
118
+ // });
119
+
120
+ // it('should pass down subjects', () => {
121
+ // const host = faker.internet.domainName();
122
+ // const altHost = faker.internet.domainName();
123
+ // const ip = faker.internet.ip();
124
+ // process.env.ALLOWED_CLIENT_HOSTS = ip;
125
+ // loadEnv();
126
+ // const request = {
127
+ // socket: {
128
+ // getPeerCertificate: () => ({
129
+ // subject: { CN: host },
130
+ // subjectaltname: `DNS:${altHost}, IP Address:${ip}`
131
+ // }),
132
+ // authorized: true
133
+ // }
134
+ // } as unknown as Request;
135
+ // authTlsMiddleware(request, response, fake() as unknown as NextFunction);
136
+ // expect(request.hosts).to.have.members([host, altHost, ip]);
137
+ // });
138
+ });
@@ -1,106 +1,106 @@
1
- import { TLSSocket } from 'tls';
2
- import { Request, Response, NextFunction } from 'express';
3
- import { EndpointAuthParams, EndpointAuthType } from 'entities/Endpoint';
4
- import { WebError } from 'entities/WebError';
5
- import { assertEnvironment } from 'utils/checkEnvironment';
6
- import { envAssert } from 'utils/envAssert';
7
- import { reportDebug } from 'utils/report';
8
- import {} from './authTls.types';
9
-
10
- const namespace = 'engine:middleware:authTls';
11
-
12
- /**
13
- * Returns a middleware for TLS authentication
14
- * Both client and server must have a certificate signed by the same CA
15
- * Host name of the client is added to the express request object under 'request.user.host'
16
- * A limited number of hosts can be specified with the environment variable ALLOWED_CLIENT_HOSTS
17
- * @param {Object} options
18
- * @param {Array<String>} options.whitelist - List of certificate Common Name or Alt Name that are permitted to make requests to this endpoint
19
- * @return {Function}
20
- */
21
- export function authTls(
22
- options: EndpointAuthParams<EndpointAuthType.TLS> = {}
23
- ): (request: Request, response: Response, next: NextFunction) => void {
24
- assertEnvironment({
25
- TLS_SERVER_KEY: envAssert.isPath(),
26
- TLS_SERVER_CERT: envAssert.isPath()
27
- });
28
-
29
- return (request: Request, response: Response, next: NextFunction): void => {
30
- authTlsMiddleware(request, response, next, options);
31
- };
32
- }
33
-
34
- let allowedClientHosts: Array<string> = [];
35
-
36
- /** Load TLS auth related environment variables */
37
- export function loadEnv(): void {
38
- if (process.env.ALLOWED_CLIENT_HOSTS) {
39
- assertEnvironment({ ALLOWED_CLIENT_HOSTS: envAssert.isHostList() });
40
- allowedClientHosts = process.env.ALLOWED_CLIENT_HOSTS.split(',').map(
41
- (value) => value.trim()
42
- );
43
- } else {
44
- allowedClientHosts = [];
45
- }
46
- }
47
-
48
- loadEnv();
49
-
50
- /** Middleware that handles mTLS based authentication */
51
- export function authTlsMiddleware(
52
- request: Request,
53
- response: Response,
54
- next: NextFunction,
55
- options: EndpointAuthParams<EndpointAuthType.TLS> = {}
56
- ): void {
57
- const socket = request.socket as TLSSocket;
58
- // Check if the client's tls certificate is valid
59
- if (!socket?.authorized) {
60
- throw new WebError({
61
- errorCode: 'unauthorized',
62
- statusCode: 401,
63
- message: 'TLS certificate could not be validated'
64
- });
65
- }
66
-
67
- // Extract the subjects for the client certificate
68
- const clientCertificate = socket.getPeerCertificate();
69
- const subjects = [];
70
- if (clientCertificate.subject.CN) subjects.push(clientCertificate.subject.CN);
71
- if (clientCertificate.subjectaltname?.length) {
72
- const altNames = clientCertificate.subjectaltname
73
- .split(',')
74
- .map((subject) => subject.trim())
75
- .map((value) => value.split(':')[1]);
76
- subjects.push(...altNames);
77
- }
78
-
79
- const whitelist = options.whitelist ?? allowedClientHosts;
80
- reportDebug({
81
- namespace,
82
- message: 'Performing TLS authentication',
83
- data: { certificate: clientCertificate, whitelist, subjects }
84
- });
85
- // Check that the subject is authorized
86
- if (whitelist?.length) {
87
- let allowed = false;
88
- for (const subject of subjects) {
89
- if (whitelist.includes(subject)) {
90
- allowed = true;
91
- break;
92
- }
93
- }
94
- // Throw error if there is no subject in the whitelist
95
- if (!allowed)
96
- throw new WebError({
97
- errorCode: 'unauthorized',
98
- statusCode: 401,
99
- message: 'Client host is not in the whitelist',
100
- data: { subjects }
101
- });
102
- }
103
- // Pas subjects down
104
- request.hosts = subjects;
105
- next();
106
- }
1
+ import { TLSSocket } from 'tls';
2
+ import { Request, Response, NextFunction } from 'express';
3
+ import { EndpointAuthParams, EndpointAuthType } from 'entities/Endpoint';
4
+ import { WebError } from 'entities/WebError';
5
+ import { assertEnvironment } from 'utils/checkEnvironment';
6
+ import { envAssert } from 'utils/envAssert';
7
+ import { reportDebug } from 'utils/report';
8
+ import {} from './authTls.types';
9
+
10
+ const namespace = 'engine:middleware:authTls';
11
+
12
+ /**
13
+ * Returns a middleware for TLS authentication
14
+ * Both client and server must have a certificate signed by the same CA
15
+ * Host name of the client is added to the express request object under 'request.user.host'
16
+ * A limited number of hosts can be specified with the environment variable ALLOWED_CLIENT_HOSTS
17
+ * @param {Object} options
18
+ * @param {Array<String>} options.whitelist - List of certificate Common Name or Alt Name that are permitted to make requests to this endpoint
19
+ * @return {Function}
20
+ */
21
+ export function authTls(
22
+ options: EndpointAuthParams<EndpointAuthType.TLS> = {}
23
+ ): (request: Request, response: Response, next: NextFunction) => void {
24
+ assertEnvironment({
25
+ TLS_SERVER_KEY: envAssert.isPath(),
26
+ TLS_SERVER_CERT: envAssert.isPath()
27
+ });
28
+
29
+ return (request: Request, response: Response, next: NextFunction): void => {
30
+ authTlsMiddleware(request, response, next, options);
31
+ };
32
+ }
33
+
34
+ let allowedClientHosts: Array<string> = [];
35
+
36
+ /** Load TLS auth related environment variables */
37
+ export function loadEnv(): void {
38
+ if (process.env.ALLOWED_CLIENT_HOSTS) {
39
+ assertEnvironment({ ALLOWED_CLIENT_HOSTS: envAssert.isHostList() });
40
+ allowedClientHosts = process.env.ALLOWED_CLIENT_HOSTS.split(',').map(
41
+ (value) => value.trim()
42
+ );
43
+ } else {
44
+ allowedClientHosts = [];
45
+ }
46
+ }
47
+
48
+ loadEnv();
49
+
50
+ /** Middleware that handles mTLS based authentication */
51
+ export function authTlsMiddleware(
52
+ request: Request,
53
+ response: Response,
54
+ next: NextFunction,
55
+ options: EndpointAuthParams<EndpointAuthType.TLS> = {}
56
+ ): void {
57
+ const socket = request.socket as TLSSocket;
58
+ // Check if the client's tls certificate is valid
59
+ if (!socket?.authorized) {
60
+ throw new WebError({
61
+ errorCode: 'unauthorized',
62
+ statusCode: 401,
63
+ message: 'TLS certificate could not be validated'
64
+ });
65
+ }
66
+
67
+ // Extract the subjects for the client certificate
68
+ const clientCertificate = socket.getPeerCertificate();
69
+ const subjects = [];
70
+ if (clientCertificate.subject.CN) subjects.push(clientCertificate.subject.CN);
71
+ if (clientCertificate.subjectaltname?.length) {
72
+ const altNames = clientCertificate.subjectaltname
73
+ .split(',')
74
+ .map((subject) => subject.trim())
75
+ .map((value) => value.split(':')[1]);
76
+ subjects.push(...altNames);
77
+ }
78
+
79
+ const whitelist = options.whitelist ?? allowedClientHosts;
80
+ reportDebug({
81
+ namespace,
82
+ message: 'Performing TLS authentication',
83
+ data: { certificate: clientCertificate, whitelist, subjects }
84
+ });
85
+ // Check that the subject is authorized
86
+ if (whitelist?.length) {
87
+ let allowed = false;
88
+ for (const subject of subjects) {
89
+ if (whitelist.includes(subject)) {
90
+ allowed = true;
91
+ break;
92
+ }
93
+ }
94
+ // Throw error if there is no subject in the whitelist
95
+ if (!allowed)
96
+ throw new WebError({
97
+ errorCode: 'unauthorized',
98
+ statusCode: 401,
99
+ message: 'Client host is not in the whitelist',
100
+ data: { subjects }
101
+ });
102
+ }
103
+ // Pas subjects down
104
+ request.hosts = subjects;
105
+ next();
106
+ }
@@ -1,13 +1,13 @@
1
- // Override the Express request object to add the files
2
- declare global {
3
- // eslint-disable-next-line @typescript-eslint/no-namespace
4
- namespace Express {
5
- /** Express HTTP request */
6
- interface Request {
7
- /** Host names provided by the mTLS authenticated client */
8
- hosts?: Array<string>;
9
- }
10
- }
11
- }
12
-
13
- export {};
1
+ // Override the Express request object to add the files
2
+ declare global {
3
+ // eslint-disable-next-line @typescript-eslint/no-namespace
4
+ namespace Express {
5
+ /** Express HTTP request */
6
+ interface Request {
7
+ /** Host names provided by the mTLS authenticated client */
8
+ hosts?: Array<string>;
9
+ }
10
+ }
11
+ }
12
+
13
+ export {};
@@ -1,2 +1,2 @@
1
- export * from './authTls';
2
- export {} from './authTls.types';
1
+ export * from './authTls';
2
+ export {} from './authTls.types';
@@ -1,35 +1,33 @@
1
- import { Request, Response, NextFunction } from 'express';
2
-
3
- // Middleware to check if the user has at least one of the required permissions (case-insensitive)
4
- export function checkPermission(requiredActions: string | string[]) {
5
- return (req: Request, res: Response, next: NextFunction) => {
6
- const user = req.user;
7
-
8
- if (!user || !user.permissions) {
9
- return res
10
- .status(403)
11
- .json({ message: 'User does not have permissions' });
12
- }
13
-
14
- // Normalize input to an array of strings
15
- const requiredActionsArray = Array.isArray(requiredActions)
16
- ? requiredActions
17
- : [requiredActions];
18
-
19
- // Normalize required actions to lowercase
20
- const requiredActionsLower = requiredActionsArray.map((action) =>
21
- action.toLowerCase()
22
- );
23
-
24
- // Check if the user has any of the required permissions (case-insensitive)
25
- const hasPermission = user.permissions.some((permission: string) =>
26
- requiredActionsLower.includes(permission.toLowerCase())
27
- );
28
-
29
- if (!hasPermission) {
30
- return res.status(403).json({ message: 'Permission denied' });
31
- }
32
-
33
- next();
34
- };
35
- }
1
+ import { Request, Response, NextFunction } from 'express';
2
+
3
+ /** Middleware to check if the user has at least one of the required permissions (case-insensitive). */
4
+ function checkPermission(requiredActions: string | string[]) {
5
+ return function (req: Request, res: Response, next: NextFunction) {
6
+ const user = req.user;
7
+
8
+ if (!user || !user.permissions) {
9
+ return res.status(403).json({ message: 'User does not have permissions' });
10
+ }
11
+
12
+ // Normalize input to an array of strings
13
+ const requiredActionsArray = Array.isArray(requiredActions)
14
+ ? requiredActions
15
+ : [requiredActions];
16
+
17
+ // Normalize required actions to lowercase
18
+ const requiredActionsLower = requiredActionsArray.map(action => action.toLowerCase());
19
+
20
+ // Check if the user has any of the required permissions (case-insensitive)
21
+ const hasPermission = user.permissions.some((permission: string) =>
22
+ requiredActionsLower.includes(permission.toLowerCase())
23
+ );
24
+
25
+ if (!hasPermission) {
26
+ return res.status(403).json({ message: 'Permission denied' });
27
+ }
28
+
29
+ next();
30
+ };
31
+ }
32
+
33
+ export { checkPermission };