@prosopo/provider 3.3.0 → 3.12.14
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/CHANGELOG.md +718 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +4278 -0
- package/coverage/coverage-final.json +42 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +311 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/api/admin/apiAdminRoutesProvider.ts.html +214 -0
- package/coverage/src/api/admin/apiRegisterSiteKeyEndpoint.ts.html +259 -0
- package/coverage/src/api/admin/apiRemoveDetectorKeyEndpoint.ts.html +283 -0
- package/coverage/src/api/admin/apiToggleMaintenanceModeEndpoint.ts.html +334 -0
- package/coverage/src/api/admin/apiUpdateDetectorKeyEndpoint.ts.html +298 -0
- package/coverage/src/api/admin/createApiAdminRoutesProvider.ts.html +163 -0
- package/coverage/src/api/admin/index.html +191 -0
- package/coverage/src/api/blacklistRequestInspector.ts.html +751 -0
- package/coverage/src/api/block.ts.html +187 -0
- package/coverage/src/api/captcha.ts.html +2803 -0
- package/coverage/src/api/domainMiddleware.ts.html +493 -0
- package/coverage/src/api/headerCheckMiddleware.ts.html +256 -0
- package/coverage/src/api/ignoreMiddleware.ts.html +181 -0
- package/coverage/src/api/index.html +266 -0
- package/coverage/src/api/ja4Middleware.ts.html +400 -0
- package/coverage/src/api/public.ts.html +343 -0
- package/coverage/src/api/robotsMiddleware.ts.html +157 -0
- package/coverage/src/api/validateAddress.ts.html +214 -0
- package/coverage/src/api/verify.ts.html +871 -0
- package/coverage/src/compositeIpAddress.ts.html +340 -0
- package/coverage/src/index.html +161 -0
- package/coverage/src/index.ts.html +175 -0
- package/coverage/src/pairs.ts.html +238 -0
- package/coverage/src/rules/index.html +116 -0
- package/coverage/src/rules/lang.ts.html +187 -0
- package/coverage/src/schedulers/captchaScheduler.ts.html +250 -0
- package/coverage/src/schedulers/getClientList.ts.html +271 -0
- package/coverage/src/schedulers/index.html +131 -0
- package/coverage/src/services/index.html +131 -0
- package/coverage/src/services/ipComparison.ts.html +685 -0
- package/coverage/src/services/ipInfo.ts.html +490 -0
- package/coverage/src/tasks/captchaManager.ts.html +865 -0
- package/coverage/src/tasks/client/clientTasks.ts.html +1381 -0
- package/coverage/src/tasks/client/index.html +116 -0
- package/coverage/src/tasks/dataset/datasetTasks.ts.html +268 -0
- package/coverage/src/tasks/dataset/datasetTasksUtils.ts.html +271 -0
- package/coverage/src/tasks/dataset/index.html +131 -0
- package/coverage/src/tasks/detection/decodePayload.js.html +127 -0
- package/coverage/src/tasks/detection/getBotScore.ts.html +244 -0
- package/coverage/src/tasks/detection/index.html +131 -0
- package/coverage/src/tasks/frictionless/frictionlessTasks.ts.html +1216 -0
- package/coverage/src/tasks/frictionless/frictionlessTasksUtils.ts.html +247 -0
- package/coverage/src/tasks/frictionless/index.html +131 -0
- package/coverage/src/tasks/imgCaptcha/imgCaptchaTasks.ts.html +1972 -0
- package/coverage/src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts.html +232 -0
- package/coverage/src/tasks/imgCaptcha/index.html +131 -0
- package/coverage/src/tasks/index.html +146 -0
- package/coverage/src/tasks/index.ts.html +127 -0
- package/coverage/src/tasks/powCaptcha/index.html +131 -0
- package/coverage/src/tasks/powCaptcha/powTasks.ts.html +961 -0
- package/coverage/src/tasks/powCaptcha/powTasksUtils.ts.html +244 -0
- package/coverage/src/tasks/tasks.ts.html +388 -0
- package/coverage/src/util.ts.html +1627 -0
- package/coverage/src/utils/hashUserAgent.ts.html +184 -0
- package/coverage/src/utils/index.html +116 -0
- package/dist/api/admin/apiAdminRoutesProvider.d.ts +9 -0
- package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -0
- package/dist/api/admin/apiAdminRoutesProvider.js +13 -18
- package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +14 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -0
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +23 -0
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +7 -4
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +13 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +40 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -0
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +14 -0
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -0
- package/dist/api/admin/createApiAdminRoutesProvider.d.ts +4 -0
- package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +1 -0
- package/dist/api/admin/createApiAdminRoutesProvider.js.map +1 -0
- package/dist/api/blacklistRequestInspector.d.ts +19 -0
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -0
- package/dist/api/blacklistRequestInspector.js +14 -12
- package/dist/api/blacklistRequestInspector.js.map +1 -0
- package/dist/api/block.d.ts +3 -0
- package/dist/api/block.d.ts.map +1 -0
- package/dist/api/block.js.map +1 -0
- package/dist/api/captcha.d.ts +4 -0
- package/dist/api/captcha.d.ts.map +1 -0
- package/dist/api/captcha.js +226 -48
- package/dist/api/captcha.js.map +1 -0
- package/dist/api/domainMiddleware.d.ts +4 -0
- package/dist/api/domainMiddleware.d.ts.map +1 -0
- package/dist/api/domainMiddleware.js +8 -8
- package/dist/api/domainMiddleware.js.map +1 -0
- package/dist/api/headerCheckMiddleware.d.ts +4 -0
- package/dist/api/headerCheckMiddleware.d.ts.map +1 -0
- package/dist/api/headerCheckMiddleware.js +4 -0
- package/dist/api/headerCheckMiddleware.js.map +1 -0
- package/dist/api/ignoreMiddleware.d.ts +3 -0
- package/dist/api/ignoreMiddleware.d.ts.map +1 -0
- package/dist/api/ignoreMiddleware.js +4 -1
- package/dist/api/ignoreMiddleware.js.map +1 -0
- package/dist/api/ja4Middleware.d.ts +10 -0
- package/dist/api/ja4Middleware.d.ts.map +1 -0
- package/dist/api/ja4Middleware.js +5 -23
- package/dist/api/ja4Middleware.js.map +1 -0
- package/dist/api/public.d.ts +4 -0
- package/dist/api/public.d.ts.map +1 -0
- package/dist/api/public.js +26 -3
- package/dist/api/public.js.map +1 -0
- package/dist/api/robotsMiddleware.d.ts +3 -0
- package/dist/api/robotsMiddleware.d.ts.map +1 -0
- package/dist/api/robotsMiddleware.js.map +1 -0
- package/dist/api/validateAddress.d.ts +5 -0
- package/dist/api/validateAddress.d.ts.map +1 -0
- package/dist/api/validateAddress.js.map +1 -0
- package/dist/api/verify.d.ts +4 -0
- package/dist/api/verify.d.ts.map +1 -0
- package/dist/api/verify.js +27 -3
- package/dist/api/verify.js.map +1 -0
- package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +13 -18
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +2 -1
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +9 -5
- package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +41 -0
- package/dist/cjs/api/blacklistRequestInspector.cjs +13 -11
- package/dist/cjs/api/captcha.cjs +226 -48
- package/dist/cjs/api/domainMiddleware.cjs +8 -8
- package/dist/cjs/api/headerCheckMiddleware.cjs +4 -0
- package/dist/cjs/api/ignoreMiddleware.cjs +3 -0
- package/dist/cjs/api/ja4Middleware.cjs +6 -23
- package/dist/cjs/api/public.cjs +26 -3
- package/dist/cjs/api/verify.cjs +27 -3
- package/dist/cjs/compositeIpAddress.cjs +53 -0
- package/dist/cjs/index.cjs +7 -0
- package/dist/cjs/pairs.cjs +27 -0
- package/dist/cjs/services/ipComparison.cjs +123 -0
- package/dist/cjs/services/ipInfo.cjs +87 -0
- package/dist/cjs/tasks/captchaManager.cjs +41 -10
- package/dist/cjs/tasks/client/clientTasks.cjs +31 -43
- package/dist/cjs/tasks/detection/decodePayload.cjs +616 -281
- package/dist/cjs/tasks/detection/getBotScore.cjs +28 -4
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +227 -36
- package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +17 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +78 -30
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +49 -21
- package/dist/cjs/util.cjs +262 -17
- package/dist/cjs/utils/hashUserAgent.cjs +10 -0
- package/dist/compositeIpAddress.d.ts +5 -0
- package/dist/compositeIpAddress.d.ts.map +1 -0
- package/dist/compositeIpAddress.js +53 -0
- package/dist/compositeIpAddress.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -0
- package/dist/pairs.d.ts +3 -0
- package/dist/pairs.d.ts.map +1 -0
- package/dist/pairs.js +27 -0
- package/dist/pairs.js.map +1 -0
- package/dist/rules/lang.d.ts +3 -0
- package/dist/rules/lang.d.ts.map +1 -0
- package/dist/rules/lang.js.map +1 -0
- package/dist/schedulers/captchaScheduler.d.ts +4 -0
- package/dist/schedulers/captchaScheduler.d.ts.map +1 -0
- package/dist/schedulers/captchaScheduler.js.map +1 -0
- package/dist/schedulers/getClientList.d.ts +4 -0
- package/dist/schedulers/getClientList.d.ts.map +1 -0
- package/dist/schedulers/getClientList.js.map +1 -0
- package/dist/schedulers/setClientEntropy.d.ts +4 -0
- package/dist/schedulers/setClientEntropy.d.ts.map +1 -0
- package/dist/schedulers/setClientEntropy.js +31 -0
- package/dist/schedulers/setClientEntropy.js.map +1 -0
- package/dist/services/ipComparison.d.ts +3 -0
- package/dist/services/ipComparison.d.ts.map +1 -0
- package/dist/services/ipComparison.js +123 -0
- package/dist/services/ipComparison.js.map +1 -0
- package/dist/services/ipInfo.d.ts +3 -0
- package/dist/services/ipInfo.d.ts.map +1 -0
- package/dist/services/ipInfo.js +87 -0
- package/dist/services/ipInfo.js.map +1 -0
- package/dist/tasks/captchaManager.d.ts +34 -0
- package/dist/tasks/captchaManager.d.ts.map +1 -0
- package/dist/tasks/captchaManager.js +39 -9
- package/dist/tasks/captchaManager.js.map +1 -0
- package/dist/tasks/client/clientTasks.d.ts +21 -0
- package/dist/tasks/client/clientTasks.d.ts.map +1 -0
- package/dist/tasks/client/clientTasks.js +31 -43
- package/dist/tasks/client/clientTasks.js.map +1 -0
- package/dist/tasks/dataset/datasetTasks.d.ts +13 -0
- package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
- package/dist/tasks/dataset/datasetTasks.js.map +1 -0
- package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
- package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
- package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
- package/dist/tasks/detection/decodePayload.d.ts +5 -0
- package/dist/tasks/detection/decodePayload.d.ts.map +1 -0
- package/dist/tasks/detection/decodePayload.js +616 -281
- package/dist/tasks/detection/decodePayload.js.map +1 -0
- package/dist/tasks/detection/getBotScore.d.ts +20 -0
- package/dist/tasks/detection/getBotScore.d.ts.map +1 -0
- package/dist/tasks/detection/getBotScore.js +29 -5
- package/dist/tasks/detection/getBotScore.js.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +67 -0
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasks.js +227 -36
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +6 -0
- package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasksUtils.js +18 -1
- package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +30 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +80 -32
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts +17 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.js +50 -22
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +3 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
- package/dist/tasks/tasks.d.ts +25 -0
- package/dist/tasks/tasks.d.ts.map +1 -0
- package/dist/tasks/tasks.js.map +1 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.d.ts.map +1 -0
- package/dist/tests/index.js +2 -0
- package/dist/tests/index.js.map +1 -0
- package/dist/tests/integration/accessRules.integration.test.d.ts +2 -0
- package/dist/tests/integration/accessRules.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/accessRules.integration.test.js +588 -0
- package/dist/tests/integration/accessRules.integration.test.js.map +1 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts +2 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +60 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts +2 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +368 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -0
- package/dist/tests/integration/imgCaptcha.integration.test.d.ts +2 -0
- package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/imgCaptcha.integration.test.js +272 -0
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -0
- package/dist/tests/integration/ipValidation.integration.test.d.ts +2 -0
- package/dist/tests/integration/ipValidation.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/ipValidation.integration.test.js +75 -0
- package/dist/tests/integration/ipValidation.integration.test.js.map +1 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.js +1046 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
- package/dist/tests/integration/powCaptcha.integration.test.d.ts +2 -0
- package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/powCaptcha.integration.test.js +308 -0
- package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -0
- package/dist/tests/integration/registerSitekey.d.ts +3 -0
- package/dist/tests/integration/registerSitekey.d.ts.map +1 -0
- package/dist/tests/integration/registerSitekey.js +24 -0
- package/dist/tests/integration/registerSitekey.js.map +1 -0
- package/dist/tests/integration/userAccessPolicy.d.ts +2 -0
- package/dist/tests/integration/userAccessPolicy.d.ts.map +1 -0
- package/dist/tests/integration/userAccessPolicy.js +2 -0
- package/dist/tests/integration/userAccessPolicy.js.map +1 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +60 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +43 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js +57 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.d.ts +2 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.js +86 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -0
- package/dist/tests/unit/pairs.unit.test.d.ts +2 -0
- package/dist/tests/unit/pairs.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/pairs.unit.test.js +83 -0
- package/dist/tests/unit/pairs.unit.test.js.map +1 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +2 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +75 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -0
- package/dist/tests/unit/services/ipComparison.unit.test.d.ts +2 -0
- package/dist/tests/unit/services/ipComparison.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/services/ipComparison.unit.test.js +258 -0
- package/dist/tests/unit/services/ipComparison.unit.test.js.map +1 -0
- package/dist/tests/unit/services/ipInfo.unit.test.d.ts +2 -0
- package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/services/ipInfo.unit.test.js +210 -0
- package/dist/tests/unit/services/ipInfo.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +311 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +289 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +92 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +75 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +143 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +145 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +64 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +388 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +46 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +216 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +69 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts +2 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +505 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +1 -0
- package/dist/tests/unit/util.ipDistance.unit.test.d.ts +2 -0
- package/dist/tests/unit/util.ipDistance.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/util.ipDistance.unit.test.js +93 -0
- package/dist/tests/unit/util.ipDistance.unit.test.js.map +1 -0
- package/dist/tests/unit/util.unit.test.d.ts +2 -0
- package/dist/tests/unit/util.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/util.unit.test.js +170 -0
- package/dist/tests/unit/util.unit.test.js.map +1 -0
- package/dist/util.d.ts +24 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +263 -18
- package/dist/util.js.map +1 -0
- package/dist/utils/hashUserAgent.d.ts +2 -0
- package/dist/utils/hashUserAgent.d.ts.map +1 -0
- package/dist/utils/hashUserAgent.js +10 -0
- package/dist/utils/hashUserAgent.js.map +1 -0
- package/package.json +31 -29
- package/vite.test.config.ts +3 -2
- package/vite.threads.test.config.ts +33 -0
package/dist/cjs/api/captcha.cjs
CHANGED
|
@@ -6,8 +6,12 @@ const datasets = require("@prosopo/datasets");
|
|
|
6
6
|
const types = require("@prosopo/types");
|
|
7
7
|
const util = require("@prosopo/util");
|
|
8
8
|
const express = require("express");
|
|
9
|
+
const compositeIpAddress = require("../compositeIpAddress.cjs");
|
|
9
10
|
const frictionlessTasks = require("../tasks/frictionless/frictionlessTasks.cjs");
|
|
11
|
+
const frictionlessTasksUtils = require("../tasks/frictionless/frictionlessTasksUtils.cjs");
|
|
10
12
|
const tasks = require("../tasks/tasks.cjs");
|
|
13
|
+
const hashUserAgent = require("../utils/hashUserAgent.cjs");
|
|
14
|
+
const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
11
15
|
const blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
|
|
12
16
|
const validateAddress = require("./validateAddress.cjs");
|
|
13
17
|
const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;
|
|
@@ -65,11 +69,18 @@ function prosopoRouter(env) {
|
|
|
65
69
|
dapp,
|
|
66
70
|
userScope
|
|
67
71
|
))[0];
|
|
68
|
-
const {
|
|
72
|
+
const {
|
|
73
|
+
valid,
|
|
74
|
+
reason,
|
|
75
|
+
sessionId: validSessionId,
|
|
76
|
+
solvedImagesCount
|
|
77
|
+
} = await tasks$1.imgCaptchaManager.isValidRequest(
|
|
69
78
|
clientRecord,
|
|
70
79
|
types.CaptchaType.image,
|
|
80
|
+
env,
|
|
71
81
|
sessionId,
|
|
72
|
-
userAccessPolicy
|
|
82
|
+
userAccessPolicy,
|
|
83
|
+
req.ip
|
|
73
84
|
);
|
|
74
85
|
if (!valid) {
|
|
75
86
|
return next(
|
|
@@ -86,7 +97,7 @@ function prosopoRouter(env) {
|
|
|
86
97
|
}
|
|
87
98
|
const captchaConfig = {
|
|
88
99
|
solved: {
|
|
89
|
-
count: userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
|
|
100
|
+
count: solvedImagesCount || userAccessPolicy?.solvedImagesCount || env.config.captchas.solved.count
|
|
90
101
|
},
|
|
91
102
|
unsolved: {
|
|
92
103
|
count: userAccessPolicy?.unsolvedImagesCount || env.config.captchas.unsolved.count
|
|
@@ -98,7 +109,7 @@ function prosopoRouter(env) {
|
|
|
98
109
|
ipAddress,
|
|
99
110
|
captchaConfig,
|
|
100
111
|
clientRecord.settings.imageThreshold ?? 0.8,
|
|
101
|
-
|
|
112
|
+
validSessionId
|
|
102
113
|
);
|
|
103
114
|
const captchaResponse = {
|
|
104
115
|
[types.ApiParams.status]: "ok",
|
|
@@ -117,12 +128,23 @@ function prosopoRouter(env) {
|
|
|
117
128
|
}
|
|
118
129
|
}
|
|
119
130
|
};
|
|
131
|
+
req.logger.info(() => ({
|
|
132
|
+
msg: "Image captcha challenge issued",
|
|
133
|
+
data: {
|
|
134
|
+
captchaType: types.CaptchaType.image,
|
|
135
|
+
requestHash: taskData.requestHash,
|
|
136
|
+
solvedImagesCount: captchaConfig.solved.count,
|
|
137
|
+
user,
|
|
138
|
+
dapp,
|
|
139
|
+
sessionId
|
|
140
|
+
}
|
|
141
|
+
}));
|
|
120
142
|
return res.json(captchaResponse);
|
|
121
143
|
} catch (err) {
|
|
122
144
|
req.logger.error(() => ({
|
|
123
145
|
err,
|
|
124
146
|
data: req.params,
|
|
125
|
-
msg: "Error in
|
|
147
|
+
msg: "Error in image captcha challenge request"
|
|
126
148
|
}));
|
|
127
149
|
return next(
|
|
128
150
|
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
@@ -143,6 +165,17 @@ function prosopoRouter(env) {
|
|
|
143
165
|
types.ClientApiPaths.SubmitImageCaptchaSolution,
|
|
144
166
|
async (req, res, next) => {
|
|
145
167
|
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
168
|
+
if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
169
|
+
req.logger.info(() => ({
|
|
170
|
+
msg: "Maintenance mode active - returning verified for image captcha"
|
|
171
|
+
}));
|
|
172
|
+
const result = {
|
|
173
|
+
status: "ok",
|
|
174
|
+
captchas: [],
|
|
175
|
+
verified: true
|
|
176
|
+
};
|
|
177
|
+
return res.json(result);
|
|
178
|
+
}
|
|
146
179
|
let parsed;
|
|
147
180
|
try {
|
|
148
181
|
parsed = types.CaptchaSolutionBody.parse(req.body);
|
|
@@ -177,7 +210,7 @@ function prosopoRouter(env) {
|
|
|
177
210
|
parsed[types.ApiParams.signature].user.timestamp,
|
|
178
211
|
Number.parseInt(parsed[types.ApiParams.timestamp]),
|
|
179
212
|
parsed[types.ApiParams.signature].provider.requestHash,
|
|
180
|
-
util.getIPAddress(req.ip || "")
|
|
213
|
+
util.getIPAddress(req.ip || ""),
|
|
181
214
|
util.flatten(req.headers),
|
|
182
215
|
req.ja4
|
|
183
216
|
);
|
|
@@ -192,7 +225,7 @@ function prosopoRouter(env) {
|
|
|
192
225
|
req.logger.error(() => ({
|
|
193
226
|
err,
|
|
194
227
|
body: req.body,
|
|
195
|
-
msg: "Error in
|
|
228
|
+
msg: "Error in image captcha solution submission"
|
|
196
229
|
}));
|
|
197
230
|
return next(
|
|
198
231
|
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
@@ -248,11 +281,18 @@ function prosopoRouter(env) {
|
|
|
248
281
|
dapp,
|
|
249
282
|
userScope
|
|
250
283
|
))[0];
|
|
251
|
-
const {
|
|
284
|
+
const {
|
|
285
|
+
valid,
|
|
286
|
+
reason,
|
|
287
|
+
sessionId: validSessionId,
|
|
288
|
+
powDifficulty
|
|
289
|
+
} = await tasks$1.powCaptchaManager.isValidRequest(
|
|
252
290
|
clientSettings,
|
|
253
291
|
types.CaptchaType.pow,
|
|
292
|
+
env,
|
|
254
293
|
sessionId,
|
|
255
|
-
userAccessPolicy
|
|
294
|
+
userAccessPolicy,
|
|
295
|
+
req.ip
|
|
256
296
|
);
|
|
257
297
|
if (!valid) {
|
|
258
298
|
return next(
|
|
@@ -282,11 +322,12 @@ function prosopoRouter(env) {
|
|
|
282
322
|
})
|
|
283
323
|
);
|
|
284
324
|
}
|
|
325
|
+
const difficulty = powDifficulty || userAccessPolicy?.powDifficulty || clientSettings?.settings?.powDifficulty;
|
|
285
326
|
const challenge = await tasks$1.powCaptchaManager.getPowCaptchaChallenge(
|
|
286
327
|
user,
|
|
287
328
|
dapp,
|
|
288
329
|
origin,
|
|
289
|
-
|
|
330
|
+
difficulty
|
|
290
331
|
);
|
|
291
332
|
await tasks$1.db.storePowCaptchaRecord(
|
|
292
333
|
challenge.challenge,
|
|
@@ -297,10 +338,10 @@ function prosopoRouter(env) {
|
|
|
297
338
|
},
|
|
298
339
|
challenge.difficulty,
|
|
299
340
|
challenge.providerSignature,
|
|
300
|
-
|
|
341
|
+
compositeIpAddress.getCompositeIpAddress(req.ip || ""),
|
|
301
342
|
util.flatten(req.headers),
|
|
302
343
|
req.ja4,
|
|
303
|
-
|
|
344
|
+
validSessionId
|
|
304
345
|
);
|
|
305
346
|
const getPowCaptchaResponse = {
|
|
306
347
|
[types.ApiParams.status]: "ok",
|
|
@@ -313,12 +354,23 @@ function prosopoRouter(env) {
|
|
|
313
354
|
}
|
|
314
355
|
}
|
|
315
356
|
};
|
|
357
|
+
req.logger.info(() => ({
|
|
358
|
+
msg: "PoW captcha challenge issued",
|
|
359
|
+
data: {
|
|
360
|
+
captchaType: types.CaptchaType.pow,
|
|
361
|
+
challenge: challenge.challenge,
|
|
362
|
+
difficulty: challenge.difficulty,
|
|
363
|
+
user,
|
|
364
|
+
dapp,
|
|
365
|
+
session: sessionId
|
|
366
|
+
}
|
|
367
|
+
}));
|
|
316
368
|
return res.json(getPowCaptchaResponse);
|
|
317
369
|
} catch (err) {
|
|
318
370
|
req.logger.error(() => ({
|
|
319
371
|
err,
|
|
320
372
|
body: req.body,
|
|
321
|
-
msg: "Error in PoW captcha
|
|
373
|
+
msg: "Error in PoW captcha challenge request"
|
|
322
374
|
}));
|
|
323
375
|
return next(
|
|
324
376
|
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
@@ -339,6 +391,16 @@ function prosopoRouter(env) {
|
|
|
339
391
|
async (req, res, next) => {
|
|
340
392
|
let parsed;
|
|
341
393
|
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
394
|
+
if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
395
|
+
req.logger.info(() => ({
|
|
396
|
+
msg: "Maintenance mode active - returning verified"
|
|
397
|
+
}));
|
|
398
|
+
const response = {
|
|
399
|
+
status: "ok",
|
|
400
|
+
verified: true
|
|
401
|
+
};
|
|
402
|
+
return res.json(response);
|
|
403
|
+
}
|
|
342
404
|
try {
|
|
343
405
|
parsed = types.SubmitPowCaptchaSolutionBody.parse(req.body);
|
|
344
406
|
} catch (err) {
|
|
@@ -350,15 +412,7 @@ function prosopoRouter(env) {
|
|
|
350
412
|
})
|
|
351
413
|
);
|
|
352
414
|
}
|
|
353
|
-
const {
|
|
354
|
-
challenge,
|
|
355
|
-
difficulty,
|
|
356
|
-
signature,
|
|
357
|
-
nonce,
|
|
358
|
-
verifiedTimeout,
|
|
359
|
-
dapp,
|
|
360
|
-
user
|
|
361
|
-
} = parsed;
|
|
415
|
+
const { challenge, signature, nonce, verifiedTimeout, dapp, user } = parsed;
|
|
362
416
|
validateAddress.validateSiteKey(dapp);
|
|
363
417
|
validateAddress.validateAddr(user);
|
|
364
418
|
try {
|
|
@@ -374,7 +428,6 @@ function prosopoRouter(env) {
|
|
|
374
428
|
}
|
|
375
429
|
const verified = await tasks$1.powCaptchaManager.verifyPowCaptchaSolution(
|
|
376
430
|
challenge,
|
|
377
|
-
difficulty,
|
|
378
431
|
signature.provider.challenge,
|
|
379
432
|
nonce,
|
|
380
433
|
verifiedTimeout,
|
|
@@ -409,24 +462,72 @@ function prosopoRouter(env) {
|
|
|
409
462
|
async (req, res, next) => {
|
|
410
463
|
try {
|
|
411
464
|
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
412
|
-
const { token, dapp, user } = types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
|
|
413
|
-
|
|
465
|
+
const { token, headHash, dapp, user } = types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
|
|
466
|
+
if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
467
|
+
req.logger.info(() => ({
|
|
468
|
+
msg: "Maintenance mode active - storing dummy token and sending PoW captcha",
|
|
469
|
+
data: { dapp, user }
|
|
470
|
+
}));
|
|
471
|
+
return res.json(
|
|
472
|
+
await tasks$1.frictionlessManager.sendPowCaptcha({
|
|
473
|
+
token,
|
|
474
|
+
score: 0,
|
|
475
|
+
threshold: 0.5,
|
|
476
|
+
scoreComponents: {
|
|
477
|
+
baseScore: 0
|
|
478
|
+
},
|
|
479
|
+
providerSelectEntropy: 0,
|
|
480
|
+
ipAddress: compositeIpAddress.getCompositeIpAddress(req.ip || ""),
|
|
481
|
+
powDifficulty: void 0,
|
|
482
|
+
webView: false,
|
|
483
|
+
iFrame: false,
|
|
484
|
+
decryptedHeadHash: ""
|
|
485
|
+
})
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
const existingToken = await tasks$1.db.getSessionRecordByToken(token);
|
|
414
489
|
if (existingToken) {
|
|
415
490
|
req.logger.info(() => ({
|
|
416
491
|
token: existingToken,
|
|
417
492
|
msg: "Token has already been used"
|
|
418
493
|
}));
|
|
419
|
-
return
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
494
|
+
return next(
|
|
495
|
+
new common.ProsopoApiError("API.BAD_REQUEST", {
|
|
496
|
+
context: {
|
|
497
|
+
code: 400,
|
|
498
|
+
siteKey: dapp,
|
|
499
|
+
user
|
|
500
|
+
},
|
|
501
|
+
i18n: req.i18n,
|
|
502
|
+
logger: req.logger
|
|
503
|
+
})
|
|
423
504
|
);
|
|
424
505
|
}
|
|
425
506
|
const lScore = tasks$1.frictionlessManager.checkLangRules(
|
|
426
507
|
req.headers["accept-language"] || ""
|
|
427
508
|
);
|
|
428
|
-
const {
|
|
429
|
-
|
|
509
|
+
const {
|
|
510
|
+
baseBotScore,
|
|
511
|
+
timestamp,
|
|
512
|
+
providerSelectEntropy,
|
|
513
|
+
userId,
|
|
514
|
+
userAgent,
|
|
515
|
+
webView,
|
|
516
|
+
iFrame,
|
|
517
|
+
decryptedHeadHash
|
|
518
|
+
} = await tasks$1.frictionlessManager.decryptPayload(token, headHash);
|
|
519
|
+
req.logger.debug(() => ({
|
|
520
|
+
msg: "Decrypted payload",
|
|
521
|
+
data: {
|
|
522
|
+
baseBotScore,
|
|
523
|
+
timestamp,
|
|
524
|
+
providerSelectEntropy,
|
|
525
|
+
userId,
|
|
526
|
+
userAgent,
|
|
527
|
+
webView
|
|
528
|
+
}
|
|
529
|
+
}));
|
|
530
|
+
let botScore = baseBotScore + lScore;
|
|
430
531
|
const clientRecord = await tasks$1.db.getClientRecord(dapp);
|
|
431
532
|
if (!clientRecord) {
|
|
432
533
|
return next(
|
|
@@ -439,7 +540,8 @@ function prosopoRouter(env) {
|
|
|
439
540
|
}
|
|
440
541
|
const { valid, reason } = await tasks$1.frictionlessManager.isValidRequest(
|
|
441
542
|
clientRecord,
|
|
442
|
-
types.CaptchaType.frictionless
|
|
543
|
+
types.CaptchaType.frictionless,
|
|
544
|
+
env
|
|
443
545
|
);
|
|
444
546
|
if (!valid) {
|
|
445
547
|
return next(
|
|
@@ -455,14 +557,21 @@ function prosopoRouter(env) {
|
|
|
455
557
|
);
|
|
456
558
|
}
|
|
457
559
|
const botThreshold = clientRecord.settings?.frictionlessThreshold || DEFAULT_FRICTIONLESS_THRESHOLD;
|
|
458
|
-
|
|
560
|
+
let scoreComponents = {
|
|
561
|
+
baseScore: baseBotScore,
|
|
562
|
+
...lScore && { lScore }
|
|
563
|
+
};
|
|
564
|
+
const ipAddress = compositeIpAddress.getCompositeIpAddress(req.ip || "");
|
|
565
|
+
tasks$1.frictionlessManager.setSessionParams({
|
|
459
566
|
token,
|
|
460
567
|
score: botScore,
|
|
461
568
|
threshold: botThreshold,
|
|
462
|
-
scoreComponents
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
569
|
+
scoreComponents,
|
|
570
|
+
providerSelectEntropy,
|
|
571
|
+
ipAddress,
|
|
572
|
+
webView,
|
|
573
|
+
iFrame,
|
|
574
|
+
decryptedHeadHash
|
|
466
575
|
});
|
|
467
576
|
const userScope = blacklistRequestInspector.getRequestUserScope(
|
|
468
577
|
util.flatten(req.headers),
|
|
@@ -475,50 +584,119 @@ function prosopoRouter(env) {
|
|
|
475
584
|
dapp,
|
|
476
585
|
userScope
|
|
477
586
|
))[0];
|
|
587
|
+
const headersUserAgent = req.headers["user-agent"];
|
|
588
|
+
const hashedHeadersUserAgent = headersUserAgent ? hashUserAgent.hashUserAgent(headersUserAgent) : "";
|
|
589
|
+
const headersProsopoUser = req.headers["prosopo-user"];
|
|
590
|
+
if (hashedHeadersUserAgent !== userAgent || headersProsopoUser !== userId) {
|
|
591
|
+
req.logger.info(() => ({
|
|
592
|
+
msg: "User agent or user id does not match",
|
|
593
|
+
data: {
|
|
594
|
+
headersUserAgent,
|
|
595
|
+
hashedHeadersUserAgent,
|
|
596
|
+
userAgent,
|
|
597
|
+
// This is the hashed user agent from the token
|
|
598
|
+
headersProsopoUser,
|
|
599
|
+
userId
|
|
600
|
+
}
|
|
601
|
+
}));
|
|
602
|
+
return res.json(
|
|
603
|
+
await tasks$1.frictionlessManager.sendImageCaptcha({
|
|
604
|
+
solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(timestamp)
|
|
605
|
+
})
|
|
606
|
+
);
|
|
607
|
+
}
|
|
478
608
|
if (userAccessPolicy) {
|
|
479
|
-
|
|
609
|
+
const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseAccessPolicy(
|
|
480
610
|
userAccessPolicy,
|
|
481
611
|
baseBotScore,
|
|
482
612
|
botScore,
|
|
483
|
-
|
|
613
|
+
scoreComponents
|
|
484
614
|
);
|
|
615
|
+
botScore = scoreUpdate.score;
|
|
616
|
+
scoreComponents = scoreUpdate.scoreComponents;
|
|
617
|
+
tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
|
|
485
618
|
if (userAccessPolicy.captchaType === types.CaptchaType.image) {
|
|
486
619
|
return res.json(
|
|
487
|
-
await tasks$1.frictionlessManager.sendImageCaptcha(
|
|
620
|
+
await tasks$1.frictionlessManager.sendImageCaptcha({
|
|
621
|
+
solvedImagesCount: userAccessPolicy.solvedImagesCount
|
|
622
|
+
})
|
|
488
623
|
);
|
|
489
624
|
}
|
|
490
625
|
if (userAccessPolicy.captchaType === types.CaptchaType.pow) {
|
|
491
626
|
return res.json(
|
|
492
|
-
await tasks$1.frictionlessManager.sendPowCaptcha(
|
|
627
|
+
await tasks$1.frictionlessManager.sendPowCaptcha({
|
|
628
|
+
powDifficulty: void 0
|
|
629
|
+
})
|
|
493
630
|
);
|
|
494
631
|
}
|
|
495
632
|
}
|
|
633
|
+
if (clientRecord.settings.disallowWebView && webView) {
|
|
634
|
+
tasks$1.logger.info(() => ({
|
|
635
|
+
msg: "WebView detected"
|
|
636
|
+
}));
|
|
637
|
+
const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseWebView(
|
|
638
|
+
baseBotScore,
|
|
639
|
+
botScore,
|
|
640
|
+
scoreComponents
|
|
641
|
+
);
|
|
642
|
+
botScore = scoreUpdate.score;
|
|
643
|
+
scoreComponents = scoreUpdate.scoreComponents;
|
|
644
|
+
tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
|
|
645
|
+
return res.json(
|
|
646
|
+
await tasks$1.frictionlessManager.sendImageCaptcha({
|
|
647
|
+
solvedImagesCount: env.config.captchas.solved.count * 2
|
|
648
|
+
})
|
|
649
|
+
);
|
|
650
|
+
}
|
|
496
651
|
if (frictionlessTasks.FrictionlessManager.timestampTooOld(timestamp)) {
|
|
497
|
-
|
|
652
|
+
const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseTimestamp(
|
|
498
653
|
timestamp,
|
|
499
654
|
baseBotScore,
|
|
500
655
|
botScore,
|
|
501
|
-
|
|
656
|
+
scoreComponents
|
|
502
657
|
);
|
|
658
|
+
botScore = scoreUpdate.score;
|
|
659
|
+
scoreComponents = scoreUpdate.scoreComponents;
|
|
660
|
+
tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
|
|
503
661
|
return res.json(
|
|
504
|
-
await tasks$1.frictionlessManager.sendImageCaptcha(
|
|
662
|
+
await tasks$1.frictionlessManager.sendImageCaptcha({
|
|
663
|
+
solvedImagesCount: frictionlessTasksUtils.timestampDecayFunction(timestamp)
|
|
664
|
+
})
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
const hostVerified = await tasks$1.frictionlessManager.hostVerified(
|
|
668
|
+
providerSelectEntropy
|
|
669
|
+
);
|
|
670
|
+
if (!hostVerified.verified) {
|
|
671
|
+
const scoreUpdate = tasks$1.frictionlessManager.scoreIncreaseUnverifiedHost(
|
|
672
|
+
hostVerified.domain,
|
|
673
|
+
baseBotScore,
|
|
674
|
+
botScore,
|
|
675
|
+
scoreComponents
|
|
505
676
|
);
|
|
677
|
+
botScore = scoreUpdate.score;
|
|
678
|
+
scoreComponents = scoreUpdate.scoreComponents;
|
|
679
|
+
tasks$1.frictionlessManager.updateScore(botScore, scoreComponents);
|
|
506
680
|
}
|
|
507
681
|
if (Number(botScore) > botThreshold) {
|
|
508
682
|
req.logger.info(() => ({
|
|
509
|
-
|
|
683
|
+
msg: "Bot score is greater than threshold",
|
|
510
684
|
data: {
|
|
511
685
|
botScore,
|
|
512
686
|
botThreshold,
|
|
513
|
-
|
|
687
|
+
token
|
|
514
688
|
}
|
|
515
689
|
}));
|
|
516
690
|
return res.json(
|
|
517
|
-
await tasks$1.frictionlessManager.sendImageCaptcha(
|
|
691
|
+
await tasks$1.frictionlessManager.sendImageCaptcha({
|
|
692
|
+
solvedImagesCount: env.config.captchas.solved.count
|
|
693
|
+
})
|
|
518
694
|
);
|
|
519
695
|
}
|
|
520
696
|
return res.json(
|
|
521
|
-
await tasks$1.frictionlessManager.sendPowCaptcha(
|
|
697
|
+
await tasks$1.frictionlessManager.sendPowCaptcha({
|
|
698
|
+
powDifficulty: void 0
|
|
699
|
+
})
|
|
522
700
|
);
|
|
523
701
|
} catch (err) {
|
|
524
702
|
req.logger.error(() => ({
|
|
@@ -10,26 +10,26 @@ const domainMiddleware = (env) => {
|
|
|
10
10
|
const tasks$1 = new tasks.Tasks(env);
|
|
11
11
|
return async (req, res, next) => {
|
|
12
12
|
try {
|
|
13
|
-
const
|
|
14
|
-
if (!
|
|
13
|
+
const siteKey = req.headers["prosopo-site-key"];
|
|
14
|
+
if (!siteKey)
|
|
15
15
|
throw siteKeyNotRegisteredError(
|
|
16
16
|
req.i18n,
|
|
17
17
|
"No sitekey provided",
|
|
18
18
|
req.logger
|
|
19
19
|
);
|
|
20
20
|
try {
|
|
21
|
-
utilCrypto.validateAddress(
|
|
21
|
+
utilCrypto.validateAddress(siteKey, false, 42);
|
|
22
22
|
} catch (err) {
|
|
23
|
-
throw invalidSiteKeyError(req.i18n,
|
|
23
|
+
throw invalidSiteKeyError(req.i18n, siteKey, req.logger);
|
|
24
24
|
}
|
|
25
|
-
const clientSettings = await tasks$1.db.getClientRecord(
|
|
25
|
+
const clientSettings = await tasks$1.db.getClientRecord(siteKey);
|
|
26
26
|
if (!clientSettings)
|
|
27
|
-
throw siteKeyNotRegisteredError(req.i18n,
|
|
27
|
+
throw siteKeyNotRegisteredError(req.i18n, siteKey, req.logger);
|
|
28
28
|
const allowedDomains = clientSettings.settings?.domains;
|
|
29
29
|
if (!allowedDomains)
|
|
30
30
|
throw siteKeyInvalidDomainError(
|
|
31
31
|
req.i18n,
|
|
32
|
-
|
|
32
|
+
siteKey,
|
|
33
33
|
req.hostname,
|
|
34
34
|
req.logger
|
|
35
35
|
);
|
|
@@ -37,7 +37,7 @@ const domainMiddleware = (env) => {
|
|
|
37
37
|
if (!origin)
|
|
38
38
|
throw unauthorizedOriginError(req.i18n, void 0, req.logger);
|
|
39
39
|
for (const domain of allowedDomains) {
|
|
40
|
-
if (tasks$1.clientTaskManager.
|
|
40
|
+
if (tasks$1.clientTaskManager.domainPatternMatcher(origin, domain)) {
|
|
41
41
|
next();
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
@@ -19,6 +19,10 @@ const headerCheckMiddleware = (env) => {
|
|
|
19
19
|
validateAddress.validateAddr(user, void 0, req.logger);
|
|
20
20
|
req.user = user;
|
|
21
21
|
req.siteKey = siteKey;
|
|
22
|
+
req.logger = req.logger.with({
|
|
23
|
+
user,
|
|
24
|
+
siteKey
|
|
25
|
+
});
|
|
22
26
|
next();
|
|
23
27
|
} catch (err) {
|
|
24
28
|
return apiExpressRouter.handleErrors(err, req, res, next);
|
|
@@ -3,6 +3,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const types = require("@prosopo/types");
|
|
4
4
|
function ignoreMiddleware() {
|
|
5
5
|
return (req, res, next) => {
|
|
6
|
+
if (req.originalUrl.indexOf(types.PublicApiPaths.Healthz) !== -1) {
|
|
7
|
+
return next();
|
|
8
|
+
}
|
|
6
9
|
if (req.originalUrl.indexOf(types.ApiPrefix) === -1) {
|
|
7
10
|
res.statusCode = 404;
|
|
8
11
|
res.send("Not Found");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const node_crypto = require("node:crypto");
|
|
4
3
|
const node_stream = require("node:stream");
|
|
5
4
|
const apiExpressRouter = require("@prosopo/api-express-router");
|
|
6
5
|
const common = require("@prosopo/common");
|
|
7
6
|
const utilCrypto = require("@prosopo/util-crypto");
|
|
8
7
|
const readTlsClientHello = require("read-tls-client-hello");
|
|
8
|
+
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
9
9
|
const DEFAULT_JA4 = "ja4";
|
|
10
10
|
const getJA4 = async (headers, logger) => {
|
|
11
|
-
logger = logger || common.getLogger("info",
|
|
11
|
+
logger = logger || common.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/ja4Middleware.cjs", document.baseURI).href);
|
|
12
12
|
if (process.env.NODE_ENV === "development") {
|
|
13
13
|
return {
|
|
14
14
|
ja4PlusFingerprint: `${DEFAULT_JA4}${utilCrypto.randomAsHex().slice(28, 32)}`
|
|
@@ -17,7 +17,6 @@ const getJA4 = async (headers, logger) => {
|
|
|
17
17
|
try {
|
|
18
18
|
const xTlsClientHello = (headers["x-tls-clienthello"] || "").toString();
|
|
19
19
|
const xTlsVersion = (headers["x-tls-version"] || "").toString().toLowerCase();
|
|
20
|
-
const xTlsServerName = (headers["x-tls-server-name"] || "").toString();
|
|
21
20
|
const clientHelloBuffer = Buffer.from(xTlsClientHello, "base64");
|
|
22
21
|
logger.debug(() => ({
|
|
23
22
|
msg: "ClientHello First Bytes:",
|
|
@@ -33,32 +32,13 @@ const getJA4 = async (headers, logger) => {
|
|
|
33
32
|
msg: "Headers TLS Version:",
|
|
34
33
|
data: { xTlsVersion }
|
|
35
34
|
}));
|
|
36
|
-
const tlsVersion = xTlsVersion.replace(/(tls)|\./g, "");
|
|
37
35
|
const readableStream = new node_stream.Readable({
|
|
38
36
|
read() {
|
|
39
37
|
this.push(clientHelloBuffer);
|
|
40
38
|
}
|
|
41
39
|
});
|
|
42
40
|
const clientHello = await readTlsClientHello.readTlsClientHello(readableStream);
|
|
43
|
-
const
|
|
44
|
-
const [_tlsVersion, cipherSuites, extensions] = clientHello.fingerprintData;
|
|
45
|
-
const transport = "t";
|
|
46
|
-
const sniIndicator = xTlsServerName ? "d" : "i";
|
|
47
|
-
const validCipherSuites = cipherSuites.filter(
|
|
48
|
-
(cs) => (cs & 3855) !== 2570
|
|
49
|
-
);
|
|
50
|
-
const cipherCount = validCipherSuites.length;
|
|
51
|
-
const validExtensions = extensions.filter(
|
|
52
|
-
(ext) => (ext & 3855) !== 2570
|
|
53
|
-
);
|
|
54
|
-
const extensionCount = validExtensions.length;
|
|
55
|
-
const alpn = alpnProtocols?.length ? alpnProtocols[0] : "";
|
|
56
|
-
const alpnLabel = alpn ? `${alpn[0]}${alpn[alpn.length - 1]}` : "00";
|
|
57
|
-
const sortedCiphers = validCipherSuites.map((cs) => cs.toString(16).padStart(4, "0")).sort().join(",");
|
|
58
|
-
const cipherHash = node_crypto.createHash("sha256").update(sortedCiphers).digest("hex").slice(0, 12);
|
|
59
|
-
const decimalString = extensions.sort((a, b) => a - b).map((ext) => ext.toString(10)).join("-");
|
|
60
|
-
const extensionHash = node_crypto.createHash("sha256").update(decimalString).digest("hex").slice(0, 12);
|
|
61
|
-
const ja4PlusFingerprint = `${transport}${tlsVersion}${sniIndicator}${cipherCount}${extensionCount}${alpnLabel}_${cipherHash}_${extensionHash}`;
|
|
41
|
+
const ja4PlusFingerprint = readTlsClientHello.calculateJa4FromHelloData(clientHello);
|
|
62
42
|
return { ja4PlusFingerprint };
|
|
63
43
|
} catch (e) {
|
|
64
44
|
logger.error(() => ({
|
|
@@ -74,6 +54,9 @@ const ja4Middleware = (env) => {
|
|
|
74
54
|
req.logger.debug(() => ({ data: { url: req.url } }));
|
|
75
55
|
const ja4 = await getJA4(req.headers, req.logger);
|
|
76
56
|
req.ja4 = ja4.ja4PlusFingerprint || "";
|
|
57
|
+
req.logger = req.logger.with({
|
|
58
|
+
ja4: req.ja4
|
|
59
|
+
});
|
|
77
60
|
next();
|
|
78
61
|
} catch (err) {
|
|
79
62
|
return apiExpressRouter.handleErrors(err, req, res, next);
|
package/dist/cjs/api/public.cjs
CHANGED
|
@@ -5,16 +5,39 @@ const common = require("@prosopo/common");
|
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
6
|
const util = require("@prosopo/util");
|
|
7
7
|
const express = require("express");
|
|
8
|
-
function publicRouter() {
|
|
8
|
+
function publicRouter(env) {
|
|
9
9
|
const router = express.Router();
|
|
10
10
|
router.get(types.PublicApiPaths.Healthz, (req, res) => {
|
|
11
11
|
res.status(200).send("OK");
|
|
12
12
|
});
|
|
13
13
|
router.get(types.PublicApiPaths.GetProviderDetails, async (req, res, next) => {
|
|
14
14
|
try {
|
|
15
|
-
|
|
15
|
+
const db = env.getDb();
|
|
16
|
+
const redisConnection = db.getRedisConnection();
|
|
17
|
+
const redisAccessRulesConnection = db.getRedisAccessRulesConnection();
|
|
18
|
+
const response = {
|
|
19
|
+
version: util.version,
|
|
20
|
+
message: "Provider online",
|
|
21
|
+
redis: [
|
|
22
|
+
{
|
|
23
|
+
actor: "General",
|
|
24
|
+
isReady: redisConnection.isReady(),
|
|
25
|
+
awaitingTimeSeconds: Math.ceil(
|
|
26
|
+
redisConnection.getAwaitingTimeMs() / 1e3
|
|
27
|
+
)
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
actor: "UAP",
|
|
31
|
+
isReady: redisAccessRulesConnection.isReady(),
|
|
32
|
+
awaitingTimeSeconds: Math.ceil(
|
|
33
|
+
redisAccessRulesConnection.getAwaitingTimeMs() / 1e3
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
};
|
|
38
|
+
return res.json(response);
|
|
16
39
|
} catch (err) {
|
|
17
|
-
|
|
40
|
+
env.logger.error(() => ({
|
|
18
41
|
err,
|
|
19
42
|
data: { reqParams: req.params },
|
|
20
43
|
msg: "Error getting provider details"
|