node-server-engine 1.1.4 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +193 -193
- package/.mocharc.js +13 -13
- package/.nycrc +18 -18
- package/.prettierrc +7 -7
- package/Dockerfile +30 -30
- package/README.md +991 -991
- package/babel.config.json +34 -35
- package/dist/const/DebeziumEvent.js.map +1 -1
- package/dist/const/LogSeverity.js.map +1 -1
- package/dist/const/index.js.map +1 -1
- package/dist/const/metrics.js.map +1 -1
- package/dist/const/mime.js.map +1 -1
- package/dist/const/tokenIssuer.js.map +1 -1
- package/dist/db/migrations/20241030121500-create-sequelize-meta-table.js.map +1 -1
- package/dist/db/models/SequelizeMeta.js +1 -0
- package/dist/db/models/SequelizeMeta.js.map +1 -1
- package/dist/db/models/index.js.map +1 -1
- package/dist/entities/ElasticSearch/ElasticSearch.js +7 -7
- package/dist/entities/ElasticSearch/ElasticSearch.js.map +1 -1
- package/dist/entities/ElasticSearch/ElasticSearch.types.js.map +1 -1
- package/dist/entities/ElasticSearch/index.js.map +1 -1
- package/dist/entities/Endpoint/Endpoint.js +18 -17
- package/dist/entities/Endpoint/Endpoint.js.map +1 -1
- package/dist/entities/Endpoint/Endpoint.types.js.map +1 -1
- package/dist/entities/Endpoint/index.js.map +1 -1
- package/dist/entities/EngineError/EngineError.js +7 -6
- package/dist/entities/EngineError/EngineError.js.map +1 -1
- package/dist/entities/EngineError/EngineError.types.js.map +1 -1
- package/dist/entities/EngineError/index.js.map +1 -1
- package/dist/entities/KeySet/KeySet.js +10 -9
- package/dist/entities/KeySet/KeySet.js.map +1 -1
- package/dist/entities/KeySet/KeySet.types.js.map +1 -1
- package/dist/entities/KeySet/index.js.map +1 -1
- package/dist/entities/LifecycleController/LifecycleController.js.map +1 -1
- package/dist/entities/LifecycleController/LifecycleController.types.js.map +1 -1
- package/dist/entities/LifecycleController/index.js.map +1 -1
- package/dist/entities/Localizator/Localizator.js +7 -7
- package/dist/entities/Localizator/Localizator.js.map +1 -1
- package/dist/entities/Localizator/Localizator.types.js.map +1 -1
- package/dist/entities/Localizator/guessNamingConvention/guessNamingConvention.js.map +1 -1
- package/dist/entities/Localizator/guessNamingConvention/index.js.map +1 -1
- package/dist/entities/Localizator/index.js.map +1 -1
- package/dist/entities/MessageHandler/MessageHandler.js +7 -6
- package/dist/entities/MessageHandler/MessageHandler.js.map +1 -1
- package/dist/entities/MessageHandler/MessageHandler.types.js.map +1 -1
- package/dist/entities/MessageHandler/index.js.map +1 -1
- package/dist/entities/PubSub/PubSub.js +25 -25
- package/dist/entities/PubSub/PubSub.js.map +1 -1
- package/dist/entities/PubSub/PubSub.types.js.map +1 -1
- package/dist/entities/PubSub/handleMessage/handleMessage.js +6 -6
- package/dist/entities/PubSub/handleMessage/handleMessage.js.map +1 -1
- package/dist/entities/PubSub/handleMessage/index.js.map +1 -1
- package/dist/entities/PubSub/index.js.map +1 -1
- package/dist/entities/PushNotification/PushNotification.js +4 -4
- package/dist/entities/PushNotification/PushNotification.js.map +1 -1
- package/dist/entities/PushNotification/PushNotification.types.js.map +1 -1
- package/dist/entities/PushNotification/index.js.map +1 -1
- package/dist/entities/Redis/Redis.js +8 -8
- package/dist/entities/Redis/Redis.js.map +1 -1
- package/dist/entities/Redis/Redis.types.js.map +1 -1
- package/dist/entities/Redis/Redis.validate.js +2 -2
- package/dist/entities/Redis/Redis.validate.js.map +1 -1
- package/dist/entities/Redis/index.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.config.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.js +2 -2
- package/dist/entities/Sequelize/Sequelize.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.types.js.map +1 -1
- package/dist/entities/Sequelize/Sequelize.validate.js +2 -2
- package/dist/entities/Sequelize/Sequelize.validate.js.map +1 -1
- package/dist/entities/Sequelize/index.js.map +1 -1
- package/dist/entities/Server/Server.const.js.map +1 -1
- package/dist/entities/Server/Server.js +18 -17
- package/dist/entities/Server/Server.js.map +1 -1
- package/dist/entities/Server/Server.types.js.map +1 -1
- package/dist/entities/Server/index.js.map +1 -1
- package/dist/entities/SocketClient/SocketClient.js +33 -32
- package/dist/entities/SocketClient/SocketClient.js.map +1 -1
- package/dist/entities/SocketClient/SocketClient.types.js.map +1 -1
- package/dist/entities/SocketClient/index.js.map +1 -1
- package/dist/entities/SocketClient/parseMessage/index.js.map +1 -1
- package/dist/entities/SocketClient/parseMessage/parseMessage.js +2 -2
- package/dist/entities/SocketClient/parseMessage/parseMessage.js.map +1 -1
- package/dist/entities/Storage/Storage.js +20 -20
- package/dist/entities/Storage/Storage.js.map +1 -1
- package/dist/entities/Storage/Storage.types.js.map +1 -1
- package/dist/entities/Storage/index.js.map +1 -1
- package/dist/entities/ValidationError/ValidationError.js.map +1 -1
- package/dist/entities/ValidationError/index.js.map +1 -1
- package/dist/entities/WebError/WebError.js +7 -6
- package/dist/entities/WebError/WebError.js.map +1 -1
- package/dist/entities/WebError/WebError.types.js.map +1 -1
- package/dist/entities/WebError/index.js.map +1 -1
- package/dist/entities/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics/debug.js.map +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/request.js.map +1 -1
- package/dist/middleware/authAdmin/authAdmin.js.map +1 -1
- package/dist/middleware/authAdmin/authAdmin.types.js.map +1 -1
- package/dist/middleware/authAdmin/index.js.map +1 -1
- package/dist/middleware/authHmac/authHmac.js.map +1 -1
- package/dist/middleware/authHmac/authHmac.types.js.map +1 -1
- package/dist/middleware/authHmac/index.js.map +1 -1
- package/dist/middleware/authJwt/authJwt.js.map +1 -1
- package/dist/middleware/authJwt/authJwt.types.js.map +1 -1
- package/dist/middleware/authJwt/index.js.map +1 -1
- package/dist/middleware/authStatic/authStatic.js +3 -3
- package/dist/middleware/authStatic/authStatic.js.map +1 -1
- package/dist/middleware/authStatic/index.js.map +1 -1
- package/dist/middleware/authTls/authTls.js +8 -8
- package/dist/middleware/authTls/authTls.js.map +1 -1
- package/dist/middleware/authTls/authTls.types.js.map +1 -1
- package/dist/middleware/authTls/index.js.map +1 -1
- package/dist/middleware/checkPermission/checkPermission.js.map +1 -1
- package/dist/middleware/error/error.js.map +1 -1
- package/dist/middleware/error/index.js.map +1 -1
- package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js +2 -2
- package/dist/middleware/fileUploader/compressAvatar/compressAvatar.js.map +1 -1
- package/dist/middleware/fileUploader/compressAvatar/compressAvatar.types.js.map +1 -1
- package/dist/middleware/fileUploader/compressAvatar/index.js.map +1 -1
- package/dist/middleware/fileUploader/fileUploader.js +12 -12
- package/dist/middleware/fileUploader/fileUploader.js.map +1 -1
- package/dist/middleware/fileUploader/fileUploader.types.js.map +1 -1
- package/dist/middleware/fileUploader/index.js.map +1 -1
- package/dist/middleware/fileUploader/isMultiPart/index.js.map +1 -1
- package/dist/middleware/fileUploader/isMultiPart/isMultipart.js.map +1 -1
- package/dist/middleware/fileUploader/validate/index.js.map +1 -1
- package/dist/middleware/fileUploader/validate/validate.js.map +1 -1
- package/dist/middleware/fourOhFour/fourOhFour.js.map +1 -1
- package/dist/middleware/fourOhFour/index.js.map +1 -1
- package/dist/middleware/geminiFileUploader/geminiFileUploader.js.map +1 -1
- package/dist/middleware/geminiFileUploader/index.js.map +1 -1
- package/dist/middleware/healthCheck/healthCheck.js +2 -2
- package/dist/middleware/healthCheck/healthCheck.js.map +1 -1
- package/dist/middleware/healthCheck/index.js.map +1 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/metrics/index.js.map +1 -1
- package/dist/middleware/metrics/metrics.js.map +1 -1
- package/dist/middleware/requestMetrics/index.js.map +1 -1
- package/dist/middleware/requestMetrics/requestMetrics.js.map +1 -1
- package/dist/middleware/swaggerDocs/index.js.map +1 -1
- package/dist/middleware/swaggerDocs/swaggerDocs.js +7 -7
- package/dist/middleware/swaggerDocs/swaggerDocs.js.map +1 -1
- package/dist/middleware/swaggerDocs/swaggerDocs.types.js.map +1 -1
- package/dist/middleware/userResolver/index.js.map +1 -1
- package/dist/middleware/userResolver/userResolver.js.map +1 -1
- package/dist/middleware/validate/index.js.map +1 -1
- package/dist/middleware/validate/validate.js.map +1 -1
- package/dist/middleware/version/index.js.map +1 -1
- package/dist/middleware/version/version.js +3 -3
- package/dist/middleware/version/version.js.map +1 -1
- package/dist/utils/checkEnvironment/index.js +13 -13
- package/dist/utils/checkEnvironment/index.js.map +1 -1
- package/dist/utils/createHttpServer/createHttpServer.js.map +1 -1
- package/dist/utils/createHttpServer/createHttpServer.validate.js +2 -2
- package/dist/utils/createHttpServer/createHttpServer.validate.js.map +1 -1
- package/dist/utils/createHttpServer/index.js.map +1 -1
- package/dist/utils/createSortedObject/createSortedObject.js.map +1 -1
- package/dist/utils/createSortedObject/index.js.map +1 -1
- package/dist/utils/dbMigration/dbMigration.js +8 -8
- package/dist/utils/dbMigration/dbMigration.js.map +1 -1
- package/dist/utils/dbMigration/dbMigration.types.js.map +1 -1
- package/dist/utils/dbMigration/index.js.map +1 -1
- package/dist/utils/dbMigration/migrateMetadataTable/index.js.map +1 -1
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js +4 -4
- package/dist/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.js.map +1 -1
- package/dist/utils/envAssert/envAssert.js +6 -6
- package/dist/utils/envAssert/envAssert.js.map +1 -1
- package/dist/utils/envAssert/index.js.map +1 -1
- package/dist/utils/envAssert/validators/hostList.js +2 -2
- package/dist/utils/envAssert/validators/hostList.js.map +1 -1
- package/dist/utils/envAssert/validators/index.js.map +1 -1
- package/dist/utils/envAssert/validators/ipList.js +2 -2
- package/dist/utils/envAssert/validators/ipList.js.map +1 -1
- package/dist/utils/envAssert/validators/path.js +2 -2
- package/dist/utils/envAssert/validators/path.js.map +1 -1
- package/dist/utils/envAssert/validators/string.js +2 -2
- package/dist/utils/envAssert/validators/string.js.map +1 -1
- package/dist/utils/envAssert/validators/stringList.js +3 -3
- package/dist/utils/envAssert/validators/stringList.js.map +1 -1
- package/dist/utils/filter/filter.js +4 -4
- package/dist/utils/filter/filter.js.map +1 -1
- package/dist/utils/filter/index.js.map +1 -1
- package/dist/utils/getDynamicLink/getDynamicLink.js.map +1 -1
- package/dist/utils/getDynamicLink/getDynamicLink.types.js.map +1 -1
- package/dist/utils/getDynamicLink/getDynamicLink.validate.js.map +1 -1
- package/dist/utils/getDynamicLink/index.js.map +1 -1
- package/dist/utils/hmac/checkEnv/checkEnv.js +2 -2
- package/dist/utils/hmac/checkEnv/checkEnv.js.map +1 -1
- package/dist/utils/hmac/checkEnv/index.js.map +1 -1
- package/dist/utils/hmac/createHmac/createHmac.js.map +1 -1
- package/dist/utils/hmac/createHmac/index.js.map +1 -1
- package/dist/utils/hmac/index.js.map +1 -1
- package/dist/utils/hmac/index.types.js.map +1 -1
- package/dist/utils/hmac/signPayload/index.js.map +1 -1
- package/dist/utils/hmac/signPayload/signPayload.js.map +1 -1
- package/dist/utils/hmac/verifySignature/index.js.map +1 -1
- package/dist/utils/hmac/verifySignature/verifySignature.js.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jwt/index.js.map +1 -1
- package/dist/utils/jwt/jwt.js.map +1 -1
- package/dist/utils/jwt/jwt.types.js.map +1 -1
- package/dist/utils/report/index.js.map +1 -1
- package/dist/utils/report/output.js.map +1 -1
- package/dist/utils/report/output.types.js.map +1 -1
- package/dist/utils/report/report.js.map +1 -1
- package/dist/utils/report/report.types.js.map +1 -1
- package/dist/utils/request/index.js.map +1 -1
- package/dist/utils/request/request.js.map +1 -1
- package/dist/utils/semverCompare/index.js.map +1 -1
- package/dist/utils/semverCompare/semverCompare.js +5 -5
- package/dist/utils/semverCompare/semverCompare.js.map +1 -1
- package/dist/utils/sendEmail/index.js.map +1 -1
- package/dist/utils/sendEmail/sendEmail.js +8 -8
- package/dist/utils/sendEmail/sendEmail.js.map +1 -1
- package/dist/utils/sendEmail/sendEmail.types.js.map +1 -1
- package/dist/utils/sendPush/index.js.map +1 -1
- package/dist/utils/sendPush/sendPush.js +5 -5
- package/dist/utils/sendPush/sendPush.js.map +1 -1
- package/dist/utils/sendPush/sendPush.types.js.map +1 -1
- package/dist/utils/tlsConfig/index.js.map +1 -1
- package/dist/utils/tlsConfig/tlsConfig.js +2 -2
- package/dist/utils/tlsConfig/tlsConfig.js.map +1 -1
- package/dist/utils/tlsConfig/tlsConfig.types.js.map +1 -1
- package/dist/utils/tlsConfig/tlsConfig.validate.js +2 -2
- package/dist/utils/tlsConfig/tlsConfig.validate.js.map +1 -1
- package/dist/utils/tlsRequest/index.js.map +1 -1
- package/dist/utils/tlsRequest/tlsRequest.js.map +1 -1
- package/dist/utils/trimPathSlash/index.js.map +1 -1
- package/dist/utils/trimPathSlash/trimPathSlash.js +4 -4
- package/dist/utils/trimPathSlash/trimPathSlash.js.map +1 -1
- package/eslint.config.mjs +11 -11
- package/package.json +159 -164
- package/src/const/DebeziumEvent.ts +6 -6
- package/src/const/LogSeverity.ts +7 -7
- package/src/const/index.ts +5 -5
- package/src/const/metrics.ts +6 -6
- package/src/const/mime.ts +37 -37
- package/src/const/tokenIssuer.ts +9 -9
- package/src/db/migrations/20241030121500-create-sequelize-meta-table.ts +29 -29
- package/src/db/models/SequelizeMeta.ts +16 -16
- package/src/db/models/index.ts +2 -2
- package/src/entities/ElasticSearch/ElasticSearch.ts +103 -103
- package/src/entities/ElasticSearch/ElasticSearch.types.ts +7 -7
- package/src/entities/ElasticSearch/index.ts +2 -2
- package/src/entities/Endpoint/Endpoint.test.ts +337 -337
- package/src/entities/Endpoint/Endpoint.ts +202 -202
- package/src/entities/Endpoint/Endpoint.types.ts +205 -205
- package/src/entities/Endpoint/index.ts +2 -2
- package/src/entities/EngineError/EngineError.ts +28 -28
- package/src/entities/EngineError/EngineError.types.ts +15 -15
- package/src/entities/EngineError/index.ts +2 -2
- package/src/entities/KeySet/KeySet.test.ts +126 -126
- package/src/entities/KeySet/KeySet.ts +172 -172
- package/src/entities/KeySet/KeySet.types.ts +28 -28
- package/src/entities/KeySet/index.ts +2 -2
- package/src/entities/LifecycleController/LifecycleController.test.ts +48 -48
- package/src/entities/LifecycleController/LifecycleController.ts +24 -24
- package/src/entities/LifecycleController/LifecycleController.types.ts +5 -5
- package/src/entities/LifecycleController/index.ts +2 -2
- package/src/entities/Localizator/Localizator.ts +139 -139
- package/src/entities/Localizator/Localizator.types.ts +52 -52
- package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.test.ts +165 -165
- package/src/entities/Localizator/guessNamingConvention/guessNamingConvention.ts +58 -58
- package/src/entities/Localizator/guessNamingConvention/index.ts +1 -1
- package/src/entities/Localizator/index.ts +2 -2
- package/src/entities/MessageHandler/MessageHandler.test.ts +130 -130
- package/src/entities/MessageHandler/MessageHandler.ts +72 -72
- package/src/entities/MessageHandler/MessageHandler.types.ts +15 -15
- package/src/entities/MessageHandler/index.ts +2 -2
- package/src/entities/PubSub/PubSub.test.ts +297 -297
- package/src/entities/PubSub/PubSub.ts +202 -202
- package/src/entities/PubSub/PubSub.types.ts +76 -76
- package/src/entities/PubSub/handleMessage/handleMessage.test.ts +102 -102
- package/src/entities/PubSub/handleMessage/handleMessage.ts +65 -65
- package/src/entities/PubSub/handleMessage/index.ts +1 -1
- package/src/entities/PubSub/index.ts +2 -2
- package/src/entities/PushNotification/PushNotification.test.ts +35 -35
- package/src/entities/PushNotification/PushNotification.ts +44 -44
- package/src/entities/PushNotification/PushNotification.types.ts +25 -25
- package/src/entities/PushNotification/index.ts +2 -2
- package/src/entities/Redis/Redis.ts +71 -71
- package/src/entities/Redis/Redis.types.ts +19 -19
- package/src/entities/Redis/Redis.validate.ts +17 -17
- package/src/entities/Redis/index.ts +2 -2
- package/src/entities/Sequelize/Sequelize.config.ts +59 -59
- package/src/entities/Sequelize/Sequelize.test.ts +21 -21
- package/src/entities/Sequelize/Sequelize.ts +75 -75
- package/src/entities/Sequelize/Sequelize.types.ts +10 -10
- package/src/entities/Sequelize/Sequelize.validate.ts +15 -15
- package/src/entities/Sequelize/index.ts +2 -2
- package/src/entities/Server/Server.const.ts +56 -56
- package/src/entities/Server/Server.test.ts +272 -272
- package/src/entities/Server/Server.ts +445 -445
- package/src/entities/Server/Server.types.ts +88 -88
- package/src/entities/Server/index.ts +2 -2
- package/src/entities/SocketClient/SocketClient.test.ts +392 -392
- package/src/entities/SocketClient/SocketClient.ts +401 -401
- package/src/entities/SocketClient/SocketClient.types.ts +62 -62
- package/src/entities/SocketClient/index.ts +2 -2
- package/src/entities/SocketClient/parseMessage/index.ts +1 -1
- package/src/entities/SocketClient/parseMessage/parseMessage.test.ts +20 -20
- package/src/entities/SocketClient/parseMessage/parseMessage.ts +26 -26
- package/src/entities/Storage/Storage.test.ts +58 -58
- package/src/entities/Storage/Storage.ts +219 -219
- package/src/entities/Storage/Storage.types.ts +57 -57
- package/src/entities/Storage/index.ts +2 -2
- package/src/entities/ValidationError/ValidationError.ts +34 -34
- package/src/entities/ValidationError/index.ts +1 -1
- package/src/entities/WebError/WebError.test.ts +18 -18
- package/src/entities/WebError/WebError.ts +23 -23
- package/src/entities/WebError/WebError.types.ts +9 -9
- package/src/entities/WebError/index.ts +2 -2
- package/src/entities/index.ts +16 -16
- package/src/index.ts +4 -4
- package/src/metrics/debug.ts +10 -10
- package/src/metrics/index.ts +2 -2
- package/src/metrics/request.ts +17 -17
- package/src/middleware/authAdmin/authAdmin.test.ts +199 -199
- package/src/middleware/authAdmin/authAdmin.ts +114 -114
- package/src/middleware/authAdmin/authAdmin.types.ts +19 -19
- package/src/middleware/authAdmin/index.ts +2 -2
- package/src/middleware/authHmac/authHmac.test.ts +86 -86
- package/src/middleware/authHmac/authHmac.ts +56 -56
- package/src/middleware/authHmac/authHmac.types.ts +7 -7
- package/src/middleware/authHmac/index.ts +2 -2
- package/src/middleware/authJwt/authJwt.test.ts +54 -54
- package/src/middleware/authJwt/authJwt.ts +55 -55
- package/src/middleware/authJwt/authJwt.types.ts +14 -14
- package/src/middleware/authJwt/index.ts +2 -2
- package/src/middleware/authStatic/authStatic.test.ts +36 -36
- package/src/middleware/authStatic/authStatic.ts +45 -45
- package/src/middleware/authStatic/index.ts +1 -1
- package/src/middleware/authTls/authTls.test.ts +138 -138
- package/src/middleware/authTls/authTls.ts +106 -106
- package/src/middleware/authTls/authTls.types.ts +13 -13
- package/src/middleware/authTls/index.ts +2 -2
- package/src/middleware/checkPermission/checkPermission.ts +32 -32
- package/src/middleware/error/error.test.ts +60 -60
- package/src/middleware/error/error.ts +25 -25
- package/src/middleware/error/index.ts +1 -1
- package/src/middleware/fileUploader/compressAvatar/compressAvatar.ts +25 -25
- package/src/middleware/fileUploader/compressAvatar/compressAvatar.types.ts +12 -12
- package/src/middleware/fileUploader/compressAvatar/index.ts +2 -2
- package/src/middleware/fileUploader/fileUploader.test.ts +310 -310
- package/src/middleware/fileUploader/fileUploader.ts +303 -303
- package/src/middleware/fileUploader/fileUploader.types.ts +52 -52
- package/src/middleware/fileUploader/index.ts +2 -2
- package/src/middleware/fileUploader/isMultiPart/index.ts +1 -1
- package/src/middleware/fileUploader/isMultiPart/isMultipart.ts +9 -9
- package/src/middleware/fileUploader/validate/index.ts +1 -1
- package/src/middleware/fileUploader/validate/validate.ts +27 -27
- package/src/middleware/fourOhFour/fourOhFour.test.ts +14 -14
- package/src/middleware/fourOhFour/fourOhFour.ts +13 -13
- package/src/middleware/fourOhFour/index.ts +1 -1
- package/src/middleware/geminiFileUploader/geminiFileUploader.ts +117 -117
- package/src/middleware/geminiFileUploader/index.ts +1 -1
- package/src/middleware/healthCheck/healthCheck.test.ts +12 -12
- package/src/middleware/healthCheck/healthCheck.ts +14 -14
- package/src/middleware/healthCheck/index.ts +1 -1
- package/src/middleware/index.ts +17 -17
- package/src/middleware/metrics/index.ts +1 -1
- package/src/middleware/metrics/metrics.test.ts +46 -46
- package/src/middleware/metrics/metrics.ts +24 -24
- package/src/middleware/requestMetrics/index.ts +1 -1
- package/src/middleware/requestMetrics/requestMetrics.test.ts +77 -77
- package/src/middleware/requestMetrics/requestMetrics.ts +20 -20
- package/src/middleware/swaggerDocs/index.ts +2 -2
- package/src/middleware/swaggerDocs/swaggerDocs.ts +114 -114
- package/src/middleware/swaggerDocs/swaggerDocs.types.ts +41 -41
- package/src/middleware/userResolver/index.ts +1 -1
- package/src/middleware/userResolver/userResolver.test.ts +35 -35
- package/src/middleware/userResolver/userResolver.ts +35 -35
- package/src/middleware/validate/index.ts +1 -1
- package/src/middleware/validate/validate.test.ts +43 -43
- package/src/middleware/validate/validate.ts +25 -25
- package/src/middleware/version/index.ts +1 -1
- package/src/middleware/version/version.test.ts +23 -23
- package/src/middleware/version/version.ts +12 -12
- package/src/utils/checkEnvironment/index.ts +49 -49
- package/src/utils/createHttpServer/createHttpServer.test.ts +24 -24
- package/src/utils/createHttpServer/createHttpServer.ts +34 -34
- package/src/utils/createHttpServer/createHttpServer.validate.ts +17 -17
- package/src/utils/createHttpServer/index.ts +1 -1
- package/src/utils/createSortedObject/createSortedObject.ts +20 -20
- package/src/utils/createSortedObject/createSortedObjet.test.ts +47 -47
- package/src/utils/createSortedObject/index.ts +1 -1
- package/src/utils/dbMigration/dbMigration.test.ts +209 -209
- package/src/utils/dbMigration/dbMigration.ts +199 -199
- package/src/utils/dbMigration/dbMigration.types.ts +11 -11
- package/src/utils/dbMigration/index.ts +2 -2
- package/src/utils/dbMigration/migrateMetadataTable/index.ts +1 -1
- package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.test.ts +59 -59
- package/src/utils/dbMigration/migrateMetadataTable/migrateMetadataTable.ts +102 -102
- package/src/utils/envAssert/envAssert.ts +31 -31
- package/src/utils/envAssert/index.ts +1 -1
- package/src/utils/envAssert/validators/hostList.ts +17 -17
- package/src/utils/envAssert/validators/index.ts +5 -5
- package/src/utils/envAssert/validators/ipList.ts +13 -13
- package/src/utils/envAssert/validators/path.ts +13 -13
- package/src/utils/envAssert/validators/string.ts +9 -9
- package/src/utils/envAssert/validators/stringList.ts +13 -13
- package/src/utils/filter/filter.ts +17 -17
- package/src/utils/filter/index.ts +1 -1
- package/src/utils/getDynamicLink/getDynamicLink.test.ts +51 -51
- package/src/utils/getDynamicLink/getDynamicLink.ts +28 -28
- package/src/utils/getDynamicLink/getDynamicLink.types.ts +11 -11
- package/src/utils/getDynamicLink/getDynamicLink.validate.ts +6 -6
- package/src/utils/getDynamicLink/index.ts +2 -2
- package/src/utils/hmac/checkEnv/checkEnv.test.ts +18 -18
- package/src/utils/hmac/checkEnv/checkEnv.ts +9 -9
- package/src/utils/hmac/checkEnv/index.ts +1 -1
- package/src/utils/hmac/createHmac/createHmac.ts +33 -33
- package/src/utils/hmac/createHmac/index.ts +1 -1
- package/src/utils/hmac/index.ts +4 -4
- package/src/utils/hmac/index.types.ts +13 -13
- package/src/utils/hmac/signPayload/index.ts +1 -1
- package/src/utils/hmac/signPayload/signPayload.ts +16 -16
- package/src/utils/hmac/verifySignature/index.ts +1 -1
- package/src/utils/hmac/verifySignature/verifySignature.ts +24 -24
- package/src/utils/index.ts +26 -26
- package/src/utils/jwt/index.ts +2 -2
- package/src/utils/jwt/jwt.test.ts +41 -41
- package/src/utils/jwt/jwt.ts +204 -204
- package/src/utils/jwt/jwt.types.ts +21 -21
- package/src/utils/report/index.ts +3 -3
- package/src/utils/report/output.ts +45 -45
- package/src/utils/report/output.types.ts +70 -70
- package/src/utils/report/report.test.ts +133 -133
- package/src/utils/report/report.ts +134 -134
- package/src/utils/report/report.types.ts +13 -13
- package/src/utils/request/index.ts +1 -1
- package/src/utils/request/request.test.ts +26 -26
- package/src/utils/request/request.ts +48 -48
- package/src/utils/semverCompare/index.ts +1 -1
- package/src/utils/semverCompare/semverCompare.test.ts +49 -49
- package/src/utils/semverCompare/semverCompare.ts +60 -60
- package/src/utils/sendEmail/index.ts +1 -1
- package/src/utils/sendEmail/sendEmail.ts +27 -27
- package/src/utils/sendEmail/sendEmail.types.ts +7 -7
- package/src/utils/sendPush/index.ts +2 -2
- package/src/utils/sendPush/sendPush.ts +20 -20
- package/src/utils/sendPush/sendPush.types.ts +25 -25
- package/src/utils/tlsConfig/index.ts +2 -2
- package/src/utils/tlsConfig/tlsConfig.test.ts +32 -32
- package/src/utils/tlsConfig/tlsConfig.ts +47 -47
- package/src/utils/tlsConfig/tlsConfig.types.ts +11 -11
- package/src/utils/tlsConfig/tlsConfig.validate.ts +25 -25
- package/src/utils/tlsRequest/index.ts +1 -1
- package/src/utils/tlsRequest/tlsRequest.test.ts +63 -63
- package/src/utils/tlsRequest/tlsRequest.ts +12 -12
- package/src/utils/trimPathSlash/index.ts +1 -1
- package/src/utils/trimPathSlash/trimPathSlash.test.ts +26 -26
- package/src/utils/trimPathSlash/trimPathSlash.ts +8 -8
- package/test/env.ts +56 -56
- package/test/factory/index.ts +8 -8
- package/test/factory/sequelizeMeta.ts +12 -12
- package/test/hooks.ts +37 -37
- package/test/index.ts +3 -3
- package/test/stub/index.ts +3 -3
- package/test/stub/stubLocales.ts +68 -68
- package/test/stub/stubPubSub.ts +7 -7
- package/test/stub/stubStorage.ts +77 -77
- package/test/stub/stubStorage.types.ts +11 -11
- package/test/utils/app.ts +31 -31
- package/test/utils/index.ts +1 -1
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +32 -32
|
@@ -1,114 +1,114 @@
|
|
|
1
|
-
import { Request, Response, NextFunction } from 'express';
|
|
2
|
-
import { TokenIssuer } from 'const';
|
|
3
|
-
import { EndpointAuthParams, EndpointAuthType } from 'entities/Endpoint';
|
|
4
|
-
import { EngineError } from 'entities/EngineError';
|
|
5
|
-
import { WebError } from 'entities/WebError';
|
|
6
|
-
import { reportDebug, jwtVerify } from 'utils';
|
|
7
|
-
import {} from './authAdmin.types';
|
|
8
|
-
|
|
9
|
-
const namespace = 'engine:middleware:authAdmin';
|
|
10
|
-
|
|
11
|
-
/** Generate a middleware to authenticate the client connection with a Admin api */
|
|
12
|
-
export function authAdmin(
|
|
13
|
-
options: EndpointAuthParams<EndpointAuthType.ADMIN>
|
|
14
|
-
): (request: Request, response: Response, next: NextFunction) => Promise<void> {
|
|
15
|
-
if (!options.permission)
|
|
16
|
-
throw new EngineError({
|
|
17
|
-
message: 'Endpoint using admin auth type must specify permission'
|
|
18
|
-
});
|
|
19
|
-
return async (
|
|
20
|
-
request: Request,
|
|
21
|
-
response: Response,
|
|
22
|
-
next: NextFunction
|
|
23
|
-
): Promise<void> => {
|
|
24
|
-
const [scheme, credentials] =
|
|
25
|
-
request.headers?.authorization?.split(' ') ?? [];
|
|
26
|
-
// No bearer token has been sent
|
|
27
|
-
if (!credentials || scheme.toLowerCase() !== 'bearer') {
|
|
28
|
-
throw new WebError({
|
|
29
|
-
errorCode: 'unauthorized',
|
|
30
|
-
statusCode: 401,
|
|
31
|
-
message: 'No bearer token found',
|
|
32
|
-
data: { authorization: request.headers?.authorization }
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
reportDebug({
|
|
36
|
-
namespace,
|
|
37
|
-
message: 'Performing JWT authentication',
|
|
38
|
-
data: { scheme, credentials }
|
|
39
|
-
});
|
|
40
|
-
// Verify token and extract its payload
|
|
41
|
-
const payload = await jwtVerify(credentials, TokenIssuer.ADMIN_API);
|
|
42
|
-
reportDebug({
|
|
43
|
-
namespace,
|
|
44
|
-
message: 'Extracted user data from JWT',
|
|
45
|
-
data: { payload, credentials }
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
if (!payload.per)
|
|
49
|
-
throw new WebError({
|
|
50
|
-
errorCode: 'unauthorized',
|
|
51
|
-
statusCode: 401,
|
|
52
|
-
message: `User token does not contain any permission claim`
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// User Permission
|
|
56
|
-
const permissions = payload.per;
|
|
57
|
-
const userPermissions =
|
|
58
|
-
permissions instanceof Array ? permissions : [permissions];
|
|
59
|
-
|
|
60
|
-
reportDebug({
|
|
61
|
-
namespace,
|
|
62
|
-
message: 'Performing Admin Permission check',
|
|
63
|
-
data: {
|
|
64
|
-
permissions,
|
|
65
|
-
endpointPermission: options.permission,
|
|
66
|
-
adminPermissions: userPermissions
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
if (!checkUserPermissions(userPermissions, options.permission)) {
|
|
71
|
-
throw new WebError({
|
|
72
|
-
errorCode: 'unauthorized',
|
|
73
|
-
statusCode: 401,
|
|
74
|
-
message: `User does not have required permission "${options.permission}"`,
|
|
75
|
-
data: { userPermissions }
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// The user object on the request is hydrated with data from the token
|
|
80
|
-
request.admin = {
|
|
81
|
-
...request.admin,
|
|
82
|
-
email: payload.sub,
|
|
83
|
-
permissions: userPermissions
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
next();
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** */
|
|
91
|
-
function checkUserPermissions(
|
|
92
|
-
userPermissions: Array<string>,
|
|
93
|
-
endpointPermission: string
|
|
94
|
-
): boolean {
|
|
95
|
-
const endpointPermissionParts = endpointPermission.split(':');
|
|
96
|
-
userPermissionLoop: for (const permission of userPermissions) {
|
|
97
|
-
const permissionParts = permission.split(':');
|
|
98
|
-
|
|
99
|
-
// Ignore if both are not same length
|
|
100
|
-
if (permissionParts.length !== endpointPermissionParts.length)
|
|
101
|
-
continue userPermissionLoop;
|
|
102
|
-
|
|
103
|
-
for (let i = 0; i < permissionParts.length; i++) {
|
|
104
|
-
// Wildcards get automatic validation, otherwise it must match with the same part of the endpoint permission
|
|
105
|
-
if (
|
|
106
|
-
permissionParts[i] !== '*' &&
|
|
107
|
-
permissionParts[i] !== endpointPermissionParts[i]
|
|
108
|
-
)
|
|
109
|
-
continue userPermissionLoop;
|
|
110
|
-
}
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { TokenIssuer } from 'const';
|
|
3
|
+
import { EndpointAuthParams, EndpointAuthType } from 'entities/Endpoint';
|
|
4
|
+
import { EngineError } from 'entities/EngineError';
|
|
5
|
+
import { WebError } from 'entities/WebError';
|
|
6
|
+
import { reportDebug, jwtVerify } from 'utils';
|
|
7
|
+
import {} from './authAdmin.types';
|
|
8
|
+
|
|
9
|
+
const namespace = 'engine:middleware:authAdmin';
|
|
10
|
+
|
|
11
|
+
/** Generate a middleware to authenticate the client connection with a Admin api */
|
|
12
|
+
export function authAdmin(
|
|
13
|
+
options: EndpointAuthParams<EndpointAuthType.ADMIN>
|
|
14
|
+
): (request: Request, response: Response, next: NextFunction) => Promise<void> {
|
|
15
|
+
if (!options.permission)
|
|
16
|
+
throw new EngineError({
|
|
17
|
+
message: 'Endpoint using admin auth type must specify permission'
|
|
18
|
+
});
|
|
19
|
+
return async (
|
|
20
|
+
request: Request,
|
|
21
|
+
response: Response,
|
|
22
|
+
next: NextFunction
|
|
23
|
+
): Promise<void> => {
|
|
24
|
+
const [scheme, credentials] =
|
|
25
|
+
request.headers?.authorization?.split(' ') ?? [];
|
|
26
|
+
// No bearer token has been sent
|
|
27
|
+
if (!credentials || scheme.toLowerCase() !== 'bearer') {
|
|
28
|
+
throw new WebError({
|
|
29
|
+
errorCode: 'unauthorized',
|
|
30
|
+
statusCode: 401,
|
|
31
|
+
message: 'No bearer token found',
|
|
32
|
+
data: { authorization: request.headers?.authorization }
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
reportDebug({
|
|
36
|
+
namespace,
|
|
37
|
+
message: 'Performing JWT authentication',
|
|
38
|
+
data: { scheme, credentials }
|
|
39
|
+
});
|
|
40
|
+
// Verify token and extract its payload
|
|
41
|
+
const payload = await jwtVerify(credentials, TokenIssuer.ADMIN_API);
|
|
42
|
+
reportDebug({
|
|
43
|
+
namespace,
|
|
44
|
+
message: 'Extracted user data from JWT',
|
|
45
|
+
data: { payload, credentials }
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (!payload.per)
|
|
49
|
+
throw new WebError({
|
|
50
|
+
errorCode: 'unauthorized',
|
|
51
|
+
statusCode: 401,
|
|
52
|
+
message: `User token does not contain any permission claim`
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// User Permission
|
|
56
|
+
const permissions = payload.per;
|
|
57
|
+
const userPermissions =
|
|
58
|
+
permissions instanceof Array ? permissions : [permissions];
|
|
59
|
+
|
|
60
|
+
reportDebug({
|
|
61
|
+
namespace,
|
|
62
|
+
message: 'Performing Admin Permission check',
|
|
63
|
+
data: {
|
|
64
|
+
permissions,
|
|
65
|
+
endpointPermission: options.permission,
|
|
66
|
+
adminPermissions: userPermissions
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
if (!checkUserPermissions(userPermissions, options.permission)) {
|
|
71
|
+
throw new WebError({
|
|
72
|
+
errorCode: 'unauthorized',
|
|
73
|
+
statusCode: 401,
|
|
74
|
+
message: `User does not have required permission "${options.permission}"`,
|
|
75
|
+
data: { userPermissions }
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The user object on the request is hydrated with data from the token
|
|
80
|
+
request.admin = {
|
|
81
|
+
...request.admin,
|
|
82
|
+
email: payload.sub,
|
|
83
|
+
permissions: userPermissions
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
next();
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** */
|
|
91
|
+
function checkUserPermissions(
|
|
92
|
+
userPermissions: Array<string>,
|
|
93
|
+
endpointPermission: string
|
|
94
|
+
): boolean {
|
|
95
|
+
const endpointPermissionParts = endpointPermission.split(':');
|
|
96
|
+
userPermissionLoop: for (const permission of userPermissions) {
|
|
97
|
+
const permissionParts = permission.split(':');
|
|
98
|
+
|
|
99
|
+
// Ignore if both are not same length
|
|
100
|
+
if (permissionParts.length !== endpointPermissionParts.length)
|
|
101
|
+
continue userPermissionLoop;
|
|
102
|
+
|
|
103
|
+
for (let i = 0; i < permissionParts.length; i++) {
|
|
104
|
+
// Wildcards get automatic validation, otherwise it must match with the same part of the endpoint permission
|
|
105
|
+
if (
|
|
106
|
+
permissionParts[i] !== '*' &&
|
|
107
|
+
permissionParts[i] !== endpointPermissionParts[i]
|
|
108
|
+
)
|
|
109
|
+
continue userPermissionLoop;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
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 request object */
|
|
6
|
-
interface Request {
|
|
7
|
-
/** User that identified using a JWT */
|
|
8
|
-
admin?: RequestAdminProps;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** Admin auth properties of the request */
|
|
14
|
-
export interface RequestAdminProps {
|
|
15
|
-
/** Email address of the user */
|
|
16
|
-
email: string;
|
|
17
|
-
/** List of permissions that the user has */
|
|
18
|
-
permissions: Array<string>;
|
|
19
|
-
}
|
|
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 request object */
|
|
6
|
+
interface Request {
|
|
7
|
+
/** User that identified using a JWT */
|
|
8
|
+
admin?: RequestAdminProps;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Admin auth properties of the request */
|
|
14
|
+
export interface RequestAdminProps {
|
|
15
|
+
/** Email address of the user */
|
|
16
|
+
email: string;
|
|
17
|
+
/** List of permissions that the user has */
|
|
18
|
+
permissions: Array<string>;
|
|
19
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './authAdmin';
|
|
2
|
-
export * from './authAdmin.types';
|
|
1
|
+
export * from './authAdmin';
|
|
2
|
+
export * from './authAdmin.types';
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
import crypto from 'crypto';
|
|
2
|
-
import express, { json, Request, Response, Application } from 'express';
|
|
3
|
-
import { faker } from '@faker-js/faker';
|
|
4
|
-
import request from 'supertest';
|
|
5
|
-
import {
|
|
6
|
-
Endpoint,
|
|
7
|
-
EndpointAuthType,
|
|
8
|
-
EndpointMethod,
|
|
9
|
-
EndpointOptions
|
|
10
|
-
} from 'entities/Endpoint';
|
|
11
|
-
import { signPayload } from 'utils/hmac';
|
|
12
|
-
|
|
13
|
-
describe('Middleware - authHmac', () => {
|
|
14
|
-
let app: Application;
|
|
15
|
-
|
|
16
|
-
const PATH = '/test';
|
|
17
|
-
const config: EndpointOptions<EndpointAuthType.HMAC> = {
|
|
18
|
-
path: PATH,
|
|
19
|
-
method: EndpointMethod.POST,
|
|
20
|
-
handler: (req: Request, res: Response) => {
|
|
21
|
-
res.sendStatus(200);
|
|
22
|
-
},
|
|
23
|
-
authType: EndpointAuthType.HMAC,
|
|
24
|
-
validator: {}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
beforeEach(() => {
|
|
28
|
-
app = express();
|
|
29
|
-
app.use(json());
|
|
30
|
-
process.env.PAYLOAD_SIGNATURE_SECRET = faker.lorem.slug();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should allow properly signed requests', async () => {
|
|
34
|
-
const payload = signPayload({ test: 'test' });
|
|
35
|
-
const endpoint = new Endpoint({
|
|
36
|
-
...config,
|
|
37
|
-
authType: EndpointAuthType.HMAC
|
|
38
|
-
});
|
|
39
|
-
endpoint.register(app);
|
|
40
|
-
await request(app).post(PATH).send(payload).expect(200);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should allow properly signed requests with a custom secret', async () => {
|
|
44
|
-
const secret = faker.lorem.word();
|
|
45
|
-
const payload = signPayload({ test: 'test' }, { secret });
|
|
46
|
-
const endpoint = new Endpoint({
|
|
47
|
-
...config,
|
|
48
|
-
authType: EndpointAuthType.HMAC,
|
|
49
|
-
authParams: { secret }
|
|
50
|
-
});
|
|
51
|
-
endpoint.register(app);
|
|
52
|
-
await request(app).post(PATH).send(payload);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should not allow wrongly signed requests', async () => {
|
|
56
|
-
const payload = signPayload({ test: 'test' }, { secret: 'hacker' });
|
|
57
|
-
const endpoint = new Endpoint({
|
|
58
|
-
...config,
|
|
59
|
-
authType: EndpointAuthType.HMAC
|
|
60
|
-
});
|
|
61
|
-
endpoint.register(app);
|
|
62
|
-
await request(app).post(PATH).send(payload).expect(401);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('should allow signed requests from Github', async () => {
|
|
66
|
-
const payload = {
|
|
67
|
-
z: faker.lorem.word(),
|
|
68
|
-
a: { z: faker.lorem.word(), a: faker.lorem.word() }
|
|
69
|
-
};
|
|
70
|
-
const signature = crypto
|
|
71
|
-
.createHmac('sha1', process.env.PAYLOAD_SIGNATURE_SECRET as string)
|
|
72
|
-
.update(JSON.stringify(payload))
|
|
73
|
-
.digest('hex');
|
|
74
|
-
const endpoint = new Endpoint({
|
|
75
|
-
...config,
|
|
76
|
-
authType: EndpointAuthType.HMAC,
|
|
77
|
-
authParams: { isGithub: true }
|
|
78
|
-
});
|
|
79
|
-
endpoint.register(app);
|
|
80
|
-
await request(app)
|
|
81
|
-
.post(PATH)
|
|
82
|
-
.send(payload)
|
|
83
|
-
.set({ 'X-Hub-Signature': `sha1=${signature}` })
|
|
84
|
-
.expect(200);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import express, { json, Request, Response, Application } from 'express';
|
|
3
|
+
import { faker } from '@faker-js/faker';
|
|
4
|
+
import request from 'supertest';
|
|
5
|
+
import {
|
|
6
|
+
Endpoint,
|
|
7
|
+
EndpointAuthType,
|
|
8
|
+
EndpointMethod,
|
|
9
|
+
EndpointOptions
|
|
10
|
+
} from 'entities/Endpoint';
|
|
11
|
+
import { signPayload } from 'utils/hmac';
|
|
12
|
+
|
|
13
|
+
describe('Middleware - authHmac', () => {
|
|
14
|
+
let app: Application;
|
|
15
|
+
|
|
16
|
+
const PATH = '/test';
|
|
17
|
+
const config: EndpointOptions<EndpointAuthType.HMAC> = {
|
|
18
|
+
path: PATH,
|
|
19
|
+
method: EndpointMethod.POST,
|
|
20
|
+
handler: (req: Request, res: Response) => {
|
|
21
|
+
res.sendStatus(200);
|
|
22
|
+
},
|
|
23
|
+
authType: EndpointAuthType.HMAC,
|
|
24
|
+
validator: {}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
app = express();
|
|
29
|
+
app.use(json());
|
|
30
|
+
process.env.PAYLOAD_SIGNATURE_SECRET = faker.lorem.slug();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should allow properly signed requests', async () => {
|
|
34
|
+
const payload = signPayload({ test: 'test' });
|
|
35
|
+
const endpoint = new Endpoint({
|
|
36
|
+
...config,
|
|
37
|
+
authType: EndpointAuthType.HMAC
|
|
38
|
+
});
|
|
39
|
+
endpoint.register(app);
|
|
40
|
+
await request(app).post(PATH).send(payload).expect(200);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should allow properly signed requests with a custom secret', async () => {
|
|
44
|
+
const secret = faker.lorem.word();
|
|
45
|
+
const payload = signPayload({ test: 'test' }, { secret });
|
|
46
|
+
const endpoint = new Endpoint({
|
|
47
|
+
...config,
|
|
48
|
+
authType: EndpointAuthType.HMAC,
|
|
49
|
+
authParams: { secret }
|
|
50
|
+
});
|
|
51
|
+
endpoint.register(app);
|
|
52
|
+
await request(app).post(PATH).send(payload);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should not allow wrongly signed requests', async () => {
|
|
56
|
+
const payload = signPayload({ test: 'test' }, { secret: 'hacker' });
|
|
57
|
+
const endpoint = new Endpoint({
|
|
58
|
+
...config,
|
|
59
|
+
authType: EndpointAuthType.HMAC
|
|
60
|
+
});
|
|
61
|
+
endpoint.register(app);
|
|
62
|
+
await request(app).post(PATH).send(payload).expect(401);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should allow signed requests from Github', async () => {
|
|
66
|
+
const payload = {
|
|
67
|
+
z: faker.lorem.word(),
|
|
68
|
+
a: { z: faker.lorem.word(), a: faker.lorem.word() }
|
|
69
|
+
};
|
|
70
|
+
const signature = crypto
|
|
71
|
+
.createHmac('sha1', process.env.PAYLOAD_SIGNATURE_SECRET as string)
|
|
72
|
+
.update(JSON.stringify(payload))
|
|
73
|
+
.digest('hex');
|
|
74
|
+
const endpoint = new Endpoint({
|
|
75
|
+
...config,
|
|
76
|
+
authType: EndpointAuthType.HMAC,
|
|
77
|
+
authParams: { isGithub: true }
|
|
78
|
+
});
|
|
79
|
+
endpoint.register(app);
|
|
80
|
+
await request(app)
|
|
81
|
+
.post(PATH)
|
|
82
|
+
.send(payload)
|
|
83
|
+
.set({ 'X-Hub-Signature': `sha1=${signature}` })
|
|
84
|
+
.expect(200);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import { BinaryToTextEncoding } from 'crypto';
|
|
2
|
-
import { Request, Response, NextFunction } from 'express';
|
|
3
|
-
import { HmacPayload } from './authHmac.types';
|
|
4
|
-
import { EndpointAuthParams, EndpointAuthType } from 'entities/Endpoint';
|
|
5
|
-
import { WebError } from 'entities/WebError';
|
|
6
|
-
import { verifySignature } from 'utils/hmac';
|
|
7
|
-
import { reportDebug } from 'utils/report';
|
|
8
|
-
|
|
9
|
-
const namespace = 'engine:middleware:authHmac';
|
|
10
|
-
|
|
11
|
-
/** Generate an HMAC authentication middleware */
|
|
12
|
-
export function authHmac(
|
|
13
|
-
options: EndpointAuthParams<EndpointAuthType.HMAC> = {}
|
|
14
|
-
): (req: Request, res: Response, next: NextFunction) => void {
|
|
15
|
-
return (req: Request, res: Response, next: NextFunction): void => {
|
|
16
|
-
const payload = (
|
|
17
|
-
req.method === 'GET' ? req.query : req.body
|
|
18
|
-
) as HmacPayload;
|
|
19
|
-
let signature: string | undefined;
|
|
20
|
-
let signatureSettings;
|
|
21
|
-
if (options.isGithub) {
|
|
22
|
-
// For GitHub, the signature is in the header and is has specific settings
|
|
23
|
-
signature =
|
|
24
|
-
req.headers['x-hub-signature'] &&
|
|
25
|
-
(req.headers['x-hub-signature'] as string).substr(5);
|
|
26
|
-
signatureSettings = {
|
|
27
|
-
algorithm: 'sha1',
|
|
28
|
-
sort: false,
|
|
29
|
-
encode: 'hex' as BinaryToTextEncoding
|
|
30
|
-
};
|
|
31
|
-
} else {
|
|
32
|
-
// In our standard authentication, the signature is included in the payload
|
|
33
|
-
signature = payload.signature;
|
|
34
|
-
delete payload.signature;
|
|
35
|
-
}
|
|
36
|
-
const settings = { secret: options.secret, ...signatureSettings };
|
|
37
|
-
if (!signature)
|
|
38
|
-
throw new WebError({
|
|
39
|
-
message: 'No signature was provided',
|
|
40
|
-
errorCode: 'unauthorized',
|
|
41
|
-
statusCode: 401
|
|
42
|
-
});
|
|
43
|
-
reportDebug({
|
|
44
|
-
namespace,
|
|
45
|
-
message: 'Performing HMAC authentication',
|
|
46
|
-
data: { payload, signature, settings }
|
|
47
|
-
});
|
|
48
|
-
if (!verifySignature(payload, signature, settings))
|
|
49
|
-
throw new WebError({
|
|
50
|
-
message: 'Signature does not match hmac of payload',
|
|
51
|
-
errorCode: 'unauthorized',
|
|
52
|
-
statusCode: 401
|
|
53
|
-
});
|
|
54
|
-
next();
|
|
55
|
-
};
|
|
56
|
-
}
|
|
1
|
+
import { BinaryToTextEncoding } from 'crypto';
|
|
2
|
+
import { Request, Response, NextFunction } from 'express';
|
|
3
|
+
import { HmacPayload } from './authHmac.types';
|
|
4
|
+
import { EndpointAuthParams, EndpointAuthType } from 'entities/Endpoint';
|
|
5
|
+
import { WebError } from 'entities/WebError';
|
|
6
|
+
import { verifySignature } from 'utils/hmac';
|
|
7
|
+
import { reportDebug } from 'utils/report';
|
|
8
|
+
|
|
9
|
+
const namespace = 'engine:middleware:authHmac';
|
|
10
|
+
|
|
11
|
+
/** Generate an HMAC authentication middleware */
|
|
12
|
+
export function authHmac(
|
|
13
|
+
options: EndpointAuthParams<EndpointAuthType.HMAC> = {}
|
|
14
|
+
): (req: Request, res: Response, next: NextFunction) => void {
|
|
15
|
+
return (req: Request, res: Response, next: NextFunction): void => {
|
|
16
|
+
const payload = (
|
|
17
|
+
req.method === 'GET' ? req.query : req.body
|
|
18
|
+
) as HmacPayload;
|
|
19
|
+
let signature: string | undefined;
|
|
20
|
+
let signatureSettings;
|
|
21
|
+
if (options.isGithub) {
|
|
22
|
+
// For GitHub, the signature is in the header and is has specific settings
|
|
23
|
+
signature =
|
|
24
|
+
req.headers['x-hub-signature'] &&
|
|
25
|
+
(req.headers['x-hub-signature'] as string).substr(5);
|
|
26
|
+
signatureSettings = {
|
|
27
|
+
algorithm: 'sha1',
|
|
28
|
+
sort: false,
|
|
29
|
+
encode: 'hex' as BinaryToTextEncoding
|
|
30
|
+
};
|
|
31
|
+
} else {
|
|
32
|
+
// In our standard authentication, the signature is included in the payload
|
|
33
|
+
signature = payload.signature;
|
|
34
|
+
delete payload.signature;
|
|
35
|
+
}
|
|
36
|
+
const settings = { secret: options.secret, ...signatureSettings };
|
|
37
|
+
if (!signature)
|
|
38
|
+
throw new WebError({
|
|
39
|
+
message: 'No signature was provided',
|
|
40
|
+
errorCode: 'unauthorized',
|
|
41
|
+
statusCode: 401
|
|
42
|
+
});
|
|
43
|
+
reportDebug({
|
|
44
|
+
namespace,
|
|
45
|
+
message: 'Performing HMAC authentication',
|
|
46
|
+
data: { payload, signature, settings }
|
|
47
|
+
});
|
|
48
|
+
if (!verifySignature(payload, signature, settings))
|
|
49
|
+
throw new WebError({
|
|
50
|
+
message: 'Signature does not match hmac of payload',
|
|
51
|
+
errorCode: 'unauthorized',
|
|
52
|
+
statusCode: 401
|
|
53
|
+
});
|
|
54
|
+
next();
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/** Options for HMAC auth */
|
|
2
|
-
export interface HmacPayload {
|
|
3
|
-
/** Generic object payload */
|
|
4
|
-
[key: string]: unknown;
|
|
5
|
-
/** HMAC signature of the whole payload */
|
|
6
|
-
signature?: string;
|
|
7
|
-
}
|
|
1
|
+
/** Options for HMAC auth */
|
|
2
|
+
export interface HmacPayload {
|
|
3
|
+
/** Generic object payload */
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
/** HMAC signature of the whole payload */
|
|
6
|
+
signature?: string;
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './authHmac';
|
|
2
|
-
export * from './authHmac.types';
|
|
1
|
+
export * from './authHmac';
|
|
2
|
+
export * from './authHmac.types';
|