@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
|
@@ -1,13 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const decodePayload = require("./decodePayload.cjs");
|
|
4
|
-
const
|
|
5
|
-
|
|
4
|
+
const DEFAULT_ENTROPY = 13837;
|
|
5
|
+
const getBotScore = async (payload, headHash, privateKeyString) => {
|
|
6
|
+
const result = await decodePayload(
|
|
7
|
+
payload,
|
|
8
|
+
headHash,
|
|
9
|
+
privateKeyString
|
|
10
|
+
);
|
|
6
11
|
const baseBotScore = result.score;
|
|
7
12
|
const timestamp = result.timestamp;
|
|
13
|
+
const providerSelectEntropy = result.providerSelectEntropy;
|
|
14
|
+
const userId = result.userId;
|
|
15
|
+
const userAgent = result.userAgent;
|
|
16
|
+
const isWebView = result.isWebView ?? false;
|
|
17
|
+
const isIframe = result.isIframe ?? false;
|
|
18
|
+
const decryptedHeadHash = result.decryptedHeadHash;
|
|
8
19
|
if (baseBotScore === void 0) {
|
|
9
|
-
return {
|
|
20
|
+
return {
|
|
21
|
+
baseBotScore: 1,
|
|
22
|
+
timestamp: 0,
|
|
23
|
+
providerSelectEntropy: DEFAULT_ENTROPY
|
|
24
|
+
};
|
|
10
25
|
}
|
|
11
|
-
return {
|
|
26
|
+
return {
|
|
27
|
+
baseBotScore,
|
|
28
|
+
timestamp,
|
|
29
|
+
providerSelectEntropy,
|
|
30
|
+
userId,
|
|
31
|
+
userAgent,
|
|
32
|
+
isWebView,
|
|
33
|
+
isIframe,
|
|
34
|
+
decryptedHeadHash
|
|
35
|
+
};
|
|
12
36
|
};
|
|
13
37
|
exports.getBotScore = getBotScore;
|
|
@@ -1,93 +1,223 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const loadBalancer = require("@prosopo/load-balancer");
|
|
3
4
|
const types = require("@prosopo/types");
|
|
4
5
|
const uuid = require("uuid");
|
|
5
6
|
const lang = require("../../rules/lang.cjs");
|
|
6
7
|
const captchaManager = require("../captchaManager.cjs");
|
|
7
8
|
const getBotScore = require("../detection/getBotScore.cjs");
|
|
9
|
+
const getDefaultEntropy = () => {
|
|
10
|
+
if (process.env.PROSOPO_ENTROPY) {
|
|
11
|
+
const parsed = Number.parseInt(process.env.PROSOPO_ENTROPY);
|
|
12
|
+
if (!Number.isNaN(parsed)) {
|
|
13
|
+
return parsed;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return 13337;
|
|
17
|
+
};
|
|
8
18
|
const DEFAULT_MAX_TIMESTAMP_AGE = 60 * 10 * 1e3;
|
|
19
|
+
const DEFAULT_ENTROPY = getDefaultEntropy();
|
|
9
20
|
class FrictionlessManager extends captchaManager.CaptchaManager {
|
|
10
21
|
constructor(db, pair, config, logger) {
|
|
11
22
|
super(db, pair, logger);
|
|
12
23
|
this.config = config;
|
|
13
24
|
}
|
|
25
|
+
setSessionParams(params) {
|
|
26
|
+
this.sessionParams = {
|
|
27
|
+
token: params.token,
|
|
28
|
+
score: params.score,
|
|
29
|
+
threshold: params.threshold,
|
|
30
|
+
scoreComponents: params.scoreComponents,
|
|
31
|
+
providerSelectEntropy: params.providerSelectEntropy,
|
|
32
|
+
ipAddress: params.ipAddress,
|
|
33
|
+
webView: params.webView ?? false,
|
|
34
|
+
iFrame: params.iFrame ?? false,
|
|
35
|
+
decryptedHeadHash: params.decryptedHeadHash
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
updateScore(score, scoreComponents) {
|
|
39
|
+
if (this.sessionParams) {
|
|
40
|
+
this.sessionParams.score = score;
|
|
41
|
+
this.sessionParams.scoreComponents = scoreComponents;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
14
44
|
checkLangRules(acceptLanguage) {
|
|
15
45
|
return lang.checkLangRules(this.config, acceptLanguage);
|
|
16
46
|
}
|
|
17
|
-
async createSession(
|
|
47
|
+
async createSession(token, score, threshold, scoreComponents, providerSelectEntropy, ipAddress, captchaType, solvedImagesCount, powDifficulty, webView = false, iFrame = false, decryptedHeadHash = "") {
|
|
18
48
|
const sessionRecord = {
|
|
19
49
|
sessionId: uuid.v4(),
|
|
20
50
|
createdAt: /* @__PURE__ */ new Date(),
|
|
21
|
-
|
|
22
|
-
|
|
51
|
+
token,
|
|
52
|
+
score,
|
|
53
|
+
threshold,
|
|
54
|
+
scoreComponents,
|
|
55
|
+
providerSelectEntropy,
|
|
56
|
+
ipAddress,
|
|
57
|
+
captchaType,
|
|
58
|
+
solvedImagesCount,
|
|
59
|
+
powDifficulty,
|
|
60
|
+
webView,
|
|
61
|
+
iFrame,
|
|
62
|
+
decryptedHeadHash
|
|
23
63
|
};
|
|
24
64
|
await this.db.storeSessionRecord(sessionRecord);
|
|
25
65
|
return sessionRecord;
|
|
26
66
|
}
|
|
27
|
-
async
|
|
28
|
-
const
|
|
67
|
+
async hostVerified(entropy) {
|
|
68
|
+
const chosen = await loadBalancer.getRandomActiveProvider(
|
|
69
|
+
this.config.defaultEnvironment,
|
|
70
|
+
entropy
|
|
71
|
+
);
|
|
72
|
+
const domain = new URL(chosen.provider.url).hostname;
|
|
73
|
+
this.logger.info(() => ({
|
|
74
|
+
data: { entropy, host: this.config.host, domain }
|
|
75
|
+
}));
|
|
76
|
+
if (domain !== this.config.host) {
|
|
77
|
+
this.logger.info(() => ({
|
|
78
|
+
msg: "Host mismatch",
|
|
79
|
+
data: { expected: this.config.host, got: domain, entropy }
|
|
80
|
+
}));
|
|
81
|
+
return { verified: false, domain };
|
|
82
|
+
}
|
|
83
|
+
return { verified: true, domain };
|
|
84
|
+
}
|
|
85
|
+
async sendImageCaptcha(params) {
|
|
86
|
+
const effectiveParams = { ...this.sessionParams, ...params };
|
|
87
|
+
if (!effectiveParams.token || effectiveParams.score === void 0 || effectiveParams.threshold === void 0 || !effectiveParams.scoreComponents || effectiveParams.providerSelectEntropy === void 0 || !effectiveParams.ipAddress) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
"Session parameters must be set before calling sendImageCaptcha"
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const sessionRecord = await this.createSession(
|
|
93
|
+
effectiveParams.token,
|
|
94
|
+
effectiveParams.score,
|
|
95
|
+
effectiveParams.threshold,
|
|
96
|
+
effectiveParams.scoreComponents,
|
|
97
|
+
effectiveParams.providerSelectEntropy,
|
|
98
|
+
effectiveParams.ipAddress,
|
|
99
|
+
types.CaptchaType.image,
|
|
100
|
+
params?.solvedImagesCount,
|
|
101
|
+
void 0,
|
|
102
|
+
effectiveParams.webView ?? false,
|
|
103
|
+
effectiveParams.iFrame ?? false,
|
|
104
|
+
effectiveParams.decryptedHeadHash
|
|
105
|
+
);
|
|
29
106
|
return {
|
|
30
107
|
[types.ApiParams.captchaType]: types.CaptchaType.image,
|
|
31
108
|
[types.ApiParams.sessionId]: sessionRecord.sessionId,
|
|
32
109
|
[types.ApiParams.status]: "ok"
|
|
33
110
|
};
|
|
34
111
|
}
|
|
35
|
-
async sendPowCaptcha(
|
|
36
|
-
const
|
|
112
|
+
async sendPowCaptcha(params) {
|
|
113
|
+
const effectiveParams = { ...this.sessionParams, ...params };
|
|
114
|
+
if (!effectiveParams.token || effectiveParams.score === void 0 || effectiveParams.threshold === void 0 || !effectiveParams.scoreComponents || effectiveParams.providerSelectEntropy === void 0 || !effectiveParams.ipAddress) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
"Session parameters must be set before calling sendPowCaptcha"
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
const sessionRecord = await this.createSession(
|
|
120
|
+
effectiveParams.token,
|
|
121
|
+
effectiveParams.score,
|
|
122
|
+
effectiveParams.threshold,
|
|
123
|
+
effectiveParams.scoreComponents,
|
|
124
|
+
effectiveParams.providerSelectEntropy,
|
|
125
|
+
effectiveParams.ipAddress,
|
|
126
|
+
types.CaptchaType.pow,
|
|
127
|
+
void 0,
|
|
128
|
+
params?.powDifficulty,
|
|
129
|
+
effectiveParams.webView ?? false,
|
|
130
|
+
effectiveParams.iFrame ?? false,
|
|
131
|
+
effectiveParams.decryptedHeadHash
|
|
132
|
+
);
|
|
37
133
|
return {
|
|
38
134
|
[types.ApiParams.captchaType]: types.CaptchaType.pow,
|
|
39
135
|
[types.ApiParams.sessionId]: sessionRecord.sessionId,
|
|
40
136
|
[types.ApiParams.status]: "ok"
|
|
41
137
|
};
|
|
42
138
|
}
|
|
43
|
-
|
|
139
|
+
scoreIncreaseAccessPolicy(accessPolicy, baseBotScore, botScore, scoreComponents) {
|
|
44
140
|
const accessPolicyPenalty = accessPolicy?.frictionlessScore || this.config.penalties.PENALTY_ACCESS_RULE;
|
|
45
141
|
botScore += accessPolicyPenalty;
|
|
46
|
-
|
|
142
|
+
return {
|
|
47
143
|
score: botScore,
|
|
48
144
|
scoreComponents: {
|
|
49
|
-
|
|
145
|
+
...scoreComponents,
|
|
50
146
|
accessPolicy: accessPolicyPenalty
|
|
51
147
|
}
|
|
52
|
-
}
|
|
53
|
-
return botScore;
|
|
148
|
+
};
|
|
54
149
|
}
|
|
55
|
-
|
|
150
|
+
scoreIncreaseUnverifiedHost(host, baseBotScore, botScore, scoreComponents) {
|
|
151
|
+
this.logger.info(() => ({
|
|
152
|
+
msg: "Host not verified",
|
|
153
|
+
data: { requested: this.config.host, selected: host }
|
|
154
|
+
}));
|
|
155
|
+
botScore += this.config.penalties.PENALTY_UNVERIFIED_HOST;
|
|
156
|
+
return {
|
|
157
|
+
score: botScore,
|
|
158
|
+
scoreComponents: {
|
|
159
|
+
...scoreComponents,
|
|
160
|
+
unverifiedHost: this.config.penalties.PENALTY_UNVERIFIED_HOST
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
scoreIncreaseWebView(baseBotScore, botScore, scoreComponents) {
|
|
165
|
+
this.logger.debug(() => ({
|
|
166
|
+
msg: "WebView detected"
|
|
167
|
+
}));
|
|
168
|
+
botScore += this.config.penalties.PENALTY_WEBVIEW;
|
|
169
|
+
return {
|
|
170
|
+
score: botScore,
|
|
171
|
+
scoreComponents: {
|
|
172
|
+
...scoreComponents,
|
|
173
|
+
webView: this.config.penalties.PENALTY_WEBVIEW
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
scoreIncreaseTimestamp(timestamp, baseBotScore, botScore, scoreComponents) {
|
|
56
178
|
this.logger.info(() => ({
|
|
57
179
|
msg: "Timestamp is older than 10 minutes",
|
|
58
180
|
data: { timestamp: new Date(timestamp) }
|
|
59
181
|
}));
|
|
60
182
|
botScore += this.config.penalties.PENALTY_OLD_TIMESTAMP;
|
|
61
|
-
|
|
183
|
+
return {
|
|
62
184
|
score: botScore,
|
|
63
185
|
scoreComponents: {
|
|
64
|
-
|
|
186
|
+
...scoreComponents,
|
|
65
187
|
timeout: this.config.penalties.PENALTY_OLD_TIMESTAMP
|
|
66
188
|
}
|
|
67
|
-
}
|
|
68
|
-
return botScore;
|
|
189
|
+
};
|
|
69
190
|
}
|
|
70
191
|
static timestampTooOld(timestamp) {
|
|
71
192
|
const now = Date.now();
|
|
72
193
|
const diff = now - timestamp;
|
|
73
194
|
return diff > DEFAULT_MAX_TIMESTAMP_AGE;
|
|
74
195
|
}
|
|
75
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Redacts a key for logging purposes by showing only the first 5, middle 10, and last 5 characters
|
|
198
|
+
* @param key - The key to redact
|
|
199
|
+
* @returns Redacted key string or empty string if key is falsy
|
|
200
|
+
*/
|
|
201
|
+
redactKeyForLogging(key) {
|
|
202
|
+
if (!key) return "";
|
|
203
|
+
const start = key.slice(0, 5);
|
|
204
|
+
const middle = key.slice(
|
|
205
|
+
Math.floor(key.length / 2) - 5,
|
|
206
|
+
Math.floor(key.length / 2) + 5
|
|
207
|
+
);
|
|
208
|
+
const end = key.slice(-5);
|
|
209
|
+
return `${start}...${middle}...${end}`;
|
|
210
|
+
}
|
|
211
|
+
async decryptPayload(token, headHash) {
|
|
76
212
|
const decryptKeys = [
|
|
77
|
-
|
|
78
|
-
...await this.getDetectorKeys()
|
|
213
|
+
// Process DB keys first, then env var key last as env key will likely be invalid
|
|
214
|
+
...await this.getDetectorKeys(),
|
|
215
|
+
process.env.BOT_DECRYPTION_KEY
|
|
79
216
|
].filter((k) => k);
|
|
80
217
|
this.logger.debug(() => {
|
|
81
|
-
const loggedKeys = decryptKeys.map(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const middle = key.slice(
|
|
85
|
-
Math.floor(key.length / 2) - 5,
|
|
86
|
-
Math.floor(key.length / 2) + 5
|
|
87
|
-
);
|
|
88
|
-
const end = key.slice(-5);
|
|
89
|
-
return `${start}...${middle}...${end}`;
|
|
90
|
-
});
|
|
218
|
+
const loggedKeys = decryptKeys.map(
|
|
219
|
+
(key) => this.redactKeyForLogging(key)
|
|
220
|
+
);
|
|
91
221
|
return {
|
|
92
222
|
msg: "Decrypting score",
|
|
93
223
|
data: {
|
|
@@ -98,19 +228,49 @@ class FrictionlessManager extends captchaManager.CaptchaManager {
|
|
|
98
228
|
});
|
|
99
229
|
let baseBotScore;
|
|
100
230
|
let timestamp;
|
|
231
|
+
let providerSelectEntropy;
|
|
232
|
+
let userId;
|
|
233
|
+
let userAgent;
|
|
234
|
+
let webView;
|
|
235
|
+
let iFrame;
|
|
236
|
+
let decryptedHeadHash = "";
|
|
101
237
|
for (const [keyIndex, key] of decryptKeys.entries()) {
|
|
102
238
|
try {
|
|
103
|
-
const { baseBotScore: s, timestamp: t } = await getBotScore.getBotScore(token, key);
|
|
104
239
|
this.logger.info(() => ({
|
|
240
|
+
msg: "Attempting to decrypt score",
|
|
241
|
+
data: {
|
|
242
|
+
key: this.redactKeyForLogging(key)
|
|
243
|
+
}
|
|
244
|
+
}));
|
|
245
|
+
const decrypted = await getBotScore.getBotScore(token, headHash, key);
|
|
246
|
+
decryptedHeadHash = decrypted.decryptedHeadHash || "";
|
|
247
|
+
const s = decrypted.baseBotScore;
|
|
248
|
+
const t = decrypted.timestamp;
|
|
249
|
+
const p = decrypted.providerSelectEntropy;
|
|
250
|
+
const a = decrypted.userId;
|
|
251
|
+
const u = decrypted.userAgent;
|
|
252
|
+
const w = decrypted.isWebView;
|
|
253
|
+
const i = decrypted.isIframe;
|
|
254
|
+
this.logger.debug(() => ({
|
|
105
255
|
msg: "Successfully decrypted score",
|
|
106
256
|
data: {
|
|
107
|
-
key:
|
|
257
|
+
key: this.redactKeyForLogging(key),
|
|
108
258
|
baseBotScore: s,
|
|
109
|
-
timestamp: t
|
|
259
|
+
timestamp: t,
|
|
260
|
+
entropy: p,
|
|
261
|
+
userId: a,
|
|
262
|
+
userAgent: u,
|
|
263
|
+
webView: w,
|
|
264
|
+
iFrame: i
|
|
110
265
|
}
|
|
111
266
|
}));
|
|
112
267
|
baseBotScore = s;
|
|
113
268
|
timestamp = t;
|
|
269
|
+
providerSelectEntropy = p;
|
|
270
|
+
userId = a;
|
|
271
|
+
userAgent = u;
|
|
272
|
+
webView = w;
|
|
273
|
+
iFrame = i;
|
|
114
274
|
break;
|
|
115
275
|
} catch (err) {
|
|
116
276
|
if (keyIndex === decryptKeys.length - 1) {
|
|
@@ -119,17 +279,48 @@ class FrictionlessManager extends captchaManager.CaptchaManager {
|
|
|
119
279
|
}));
|
|
120
280
|
baseBotScore = 1;
|
|
121
281
|
timestamp = 0;
|
|
282
|
+
providerSelectEntropy = DEFAULT_ENTROPY + 1;
|
|
283
|
+
decryptedHeadHash = "";
|
|
122
284
|
}
|
|
123
285
|
}
|
|
124
286
|
}
|
|
125
|
-
|
|
287
|
+
const baseBotScoreUndefined = baseBotScore === void 0;
|
|
288
|
+
const timestampUndefined = timestamp === void 0;
|
|
289
|
+
const providerSelectEntropyUndefined = providerSelectEntropy === void 0;
|
|
290
|
+
const undefinedCount = Number(baseBotScoreUndefined) + Number(timestampUndefined) + Number(providerSelectEntropyUndefined);
|
|
291
|
+
if (undefinedCount > 0) {
|
|
126
292
|
this.logger.error(() => ({
|
|
127
|
-
msg: "Error decrypting score: baseBotScore or timestamp is undefined"
|
|
293
|
+
msg: "Error decrypting score: baseBotScore or timestamp or providerSelectEntropy is undefined"
|
|
128
294
|
}));
|
|
129
295
|
baseBotScore = 1;
|
|
130
296
|
timestamp = 0;
|
|
297
|
+
providerSelectEntropy = DEFAULT_ENTROPY - undefinedCount;
|
|
298
|
+
decryptedHeadHash = "";
|
|
131
299
|
}
|
|
132
|
-
|
|
300
|
+
this.logger.info(() => ({
|
|
301
|
+
msg: "decryptPayload result",
|
|
302
|
+
data: {
|
|
303
|
+
baseBotScore,
|
|
304
|
+
timestamp,
|
|
305
|
+
entropy: providerSelectEntropy,
|
|
306
|
+
userId,
|
|
307
|
+
userAgent,
|
|
308
|
+
webView,
|
|
309
|
+
iFrame,
|
|
310
|
+
decryptedHeadHash
|
|
311
|
+
}
|
|
312
|
+
}));
|
|
313
|
+
return {
|
|
314
|
+
baseBotScore: Number(baseBotScore),
|
|
315
|
+
timestamp: Number(timestamp),
|
|
316
|
+
providerSelectEntropy: Number(providerSelectEntropy),
|
|
317
|
+
userId,
|
|
318
|
+
userAgent,
|
|
319
|
+
webView,
|
|
320
|
+
iFrame,
|
|
321
|
+
decryptedHeadHash
|
|
322
|
+
};
|
|
133
323
|
}
|
|
134
324
|
}
|
|
325
|
+
exports.DEFAULT_ENTROPY = DEFAULT_ENTROPY;
|
|
135
326
|
exports.FrictionlessManager = FrictionlessManager;
|
|
@@ -8,4 +8,21 @@ const computeFrictionlessScore = (scoreComponents) => {
|
|
|
8
8
|
).toFixed(2)
|
|
9
9
|
);
|
|
10
10
|
};
|
|
11
|
+
const timestampDecayFunction = (timestamp) => {
|
|
12
|
+
const max = (/* @__PURE__ */ new Date()).getTime();
|
|
13
|
+
if (max - timestamp > 36e5) {
|
|
14
|
+
return 12;
|
|
15
|
+
}
|
|
16
|
+
const min = 1e3;
|
|
17
|
+
const age = max - timestamp;
|
|
18
|
+
const decay = Math.log10(2e3) / max;
|
|
19
|
+
const bigScore = max * (1 - (1 - Math.exp(decay * age) ** 24));
|
|
20
|
+
return Math.max(
|
|
21
|
+
2,
|
|
22
|
+
Math.round(
|
|
23
|
+
(Math.log(bigScore) - Math.log(min)) / (Math.log(max) - Math.log(min)) * 2.5
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
};
|
|
11
27
|
exports.computeFrictionlessScore = computeFrictionlessScore;
|
|
28
|
+
exports.timestampDecayFunction = timestampDecayFunction;
|
|
@@ -6,6 +6,8 @@ const datasets = require("@prosopo/datasets");
|
|
|
6
6
|
const types = require("@prosopo/types");
|
|
7
7
|
const util$2 = require("@prosopo/util");
|
|
8
8
|
const utilCrypto = require("@prosopo/util-crypto");
|
|
9
|
+
const compositeIpAddress = require("../../compositeIpAddress.cjs");
|
|
10
|
+
const pairs = require("../../pairs.cjs");
|
|
9
11
|
const lang = require("../../rules/lang.cjs");
|
|
10
12
|
const util = require("../../util.cjs");
|
|
11
13
|
const captchaManager = require("../captchaManager.cjs");
|
|
@@ -30,7 +32,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
30
32
|
}
|
|
31
33
|
return captchaDocs;
|
|
32
34
|
}
|
|
33
|
-
async getRandomCaptchasAndRequestHash(datasetId, userAccount, ipAddress, captchaConfig, threshold,
|
|
35
|
+
async getRandomCaptchasAndRequestHash(datasetId, userAccount, ipAddress, captchaConfig, threshold, sessionId) {
|
|
34
36
|
const dataset = await this.db.getDatasetDetails(datasetId);
|
|
35
37
|
if (!dataset) {
|
|
36
38
|
throw new common.ProsopoEnvError("DATABASE.DATASET_GET_FAILED", {
|
|
@@ -78,9 +80,9 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
78
80
|
salt,
|
|
79
81
|
deadlineTs,
|
|
80
82
|
currentTime,
|
|
81
|
-
|
|
83
|
+
compositeIpAddress.getCompositeIpAddress(ipAddress),
|
|
82
84
|
threshold,
|
|
83
|
-
|
|
85
|
+
sessionId
|
|
84
86
|
);
|
|
85
87
|
return {
|
|
86
88
|
captchas,
|
|
@@ -100,7 +102,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
100
102
|
* @param providerRequestHashSignature
|
|
101
103
|
* @param ipAddress
|
|
102
104
|
* @param headers
|
|
103
|
-
* @param
|
|
105
|
+
* @param ja4
|
|
104
106
|
* @return {Promise<DappUserSolutionResult>} result containing the contract event
|
|
105
107
|
*/
|
|
106
108
|
async dappUserSolution(userAccount, dappAccount, requestHash, captchas, userTimestampSignature, timestamp, providerRequestHashSignature, ipAddress, headers, ja4) {
|
|
@@ -152,6 +154,8 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
152
154
|
);
|
|
153
155
|
if (pendingRequest) {
|
|
154
156
|
const { storedCaptchas, receivedCaptchas, captchaIds } = await this.validateReceivedCaptchasAgainstStoredCaptchas(captchas);
|
|
157
|
+
const flat = receivedCaptchas.map((c) => util$2.extractData(c.salt));
|
|
158
|
+
const pairs$1 = flat.map((list) => pairs.constructPairList(list));
|
|
155
159
|
const { tree, commitmentId } = imgCaptchaTasksUtils.buildTreeAndGetCommitmentId(receivedCaptchas);
|
|
156
160
|
const datasetId = util$2.at(storedCaptchas, 0).datasetId;
|
|
157
161
|
if (!datasetId) {
|
|
@@ -170,10 +174,10 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
170
174
|
userSignature: userTimestampSignature,
|
|
171
175
|
userSubmitted: true,
|
|
172
176
|
serverChecked: false,
|
|
173
|
-
requestedAtTimestamp: timestamp,
|
|
174
|
-
ipAddress,
|
|
177
|
+
requestedAtTimestamp: new Date(timestamp),
|
|
178
|
+
ipAddress: compositeIpAddress.getCompositeIpAddress(ipAddress),
|
|
175
179
|
headers,
|
|
176
|
-
|
|
180
|
+
sessionId: pendingRecord.sessionId,
|
|
177
181
|
ja4
|
|
178
182
|
};
|
|
179
183
|
await this.db.storeUserImageCaptchaSolution(receivedCaptchas, commit);
|
|
@@ -191,6 +195,21 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
191
195
|
})
|
|
192
196
|
);
|
|
193
197
|
const totalImages = storedCaptchas[0]?.items.length || 0;
|
|
198
|
+
if (pairs.containsIdenticalPairs(pairs$1)) {
|
|
199
|
+
await this.db.disapproveDappUserCommitment(
|
|
200
|
+
commitmentId,
|
|
201
|
+
"CAPTCHA.INVALID_SOLUTION",
|
|
202
|
+
pairs$1
|
|
203
|
+
);
|
|
204
|
+
response = {
|
|
205
|
+
captchas: captchaIds.map((id) => ({
|
|
206
|
+
captchaId: id,
|
|
207
|
+
proof: [[]]
|
|
208
|
+
})),
|
|
209
|
+
verified: false
|
|
210
|
+
};
|
|
211
|
+
return response;
|
|
212
|
+
}
|
|
194
213
|
if (datasets.compareCaptchaSolutions(
|
|
195
214
|
receivedCaptchas,
|
|
196
215
|
solutionRecords,
|
|
@@ -204,11 +223,12 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
204
223
|
})),
|
|
205
224
|
verified: true
|
|
206
225
|
};
|
|
207
|
-
await this.db.approveDappUserCommitment(commitmentId);
|
|
226
|
+
await this.db.approveDappUserCommitment(commitmentId, pairs$1);
|
|
208
227
|
} else {
|
|
209
228
|
await this.db.disapproveDappUserCommitment(
|
|
210
229
|
commitmentId,
|
|
211
|
-
"CAPTCHA.INVALID_SOLUTION"
|
|
230
|
+
"CAPTCHA.INVALID_SOLUTION",
|
|
231
|
+
pairs$1
|
|
212
232
|
);
|
|
213
233
|
response = {
|
|
214
234
|
captchas: captchaIds.map((id) => ({
|
|
@@ -314,7 +334,7 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
314
334
|
}
|
|
315
335
|
return void 0;
|
|
316
336
|
}
|
|
317
|
-
async verifyImageCaptchaSolution(user, dapp, commitmentId, maxVerifiedTime, ip) {
|
|
337
|
+
async verifyImageCaptchaSolution(user, dapp, commitmentId, env, maxVerifiedTime, ip, disallowWebView) {
|
|
318
338
|
const solution = await (commitmentId ? this.getDappUserCommitmentById(commitmentId) : this.getDappUserCommitmentByAccount(user, dapp));
|
|
319
339
|
if (!solution) {
|
|
320
340
|
this.logger.debug(() => ({
|
|
@@ -322,10 +342,6 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
322
342
|
}));
|
|
323
343
|
return { status: "API.USER_NOT_VERIFIED_NO_SOLUTION", verified: false };
|
|
324
344
|
}
|
|
325
|
-
const ipValidation = util.validateIpAddress(ip, solution.ipAddress, this.logger);
|
|
326
|
-
if (!ipValidation.isValid) {
|
|
327
|
-
return { status: "API.USER_NOT_VERIFIED", verified: false };
|
|
328
|
-
}
|
|
329
345
|
if (solution.serverChecked) {
|
|
330
346
|
return { status: "API.USER_ALREADY_VERIFIED", verified: false };
|
|
331
347
|
}
|
|
@@ -334,33 +350,65 @@ class ImgCaptchaManager extends captchaManager.CaptchaManager {
|
|
|
334
350
|
return { status: "API.USER_NOT_VERIFIED", verified: false };
|
|
335
351
|
}
|
|
336
352
|
maxVerifiedTime = maxVerifiedTime || 60 * 1e3;
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
353
|
+
const currentTime = Date.now();
|
|
354
|
+
const timeSinceCompletion = currentTime - solution.requestedAtTimestamp.getTime();
|
|
355
|
+
if (timeSinceCompletion > maxVerifiedTime) {
|
|
356
|
+
this.logger.debug(() => ({
|
|
357
|
+
msg: "Not verified - timed out"
|
|
358
|
+
}));
|
|
359
|
+
return {
|
|
360
|
+
status: "API.USER_NOT_VERIFIED_TIME_EXPIRED",
|
|
361
|
+
verified: false
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
if (ip) {
|
|
365
|
+
const solutionIpAddress = compositeIpAddress.getIpAddressFromComposite(solution.ipAddress);
|
|
366
|
+
const clientRecord = await this.db.getClientRecord(dapp);
|
|
367
|
+
const ipValidationRules = clientRecord?.settings?.ipValidationRules;
|
|
368
|
+
await this.db.updateDappUserCommitment(solution.id, {
|
|
369
|
+
providedIp: compositeIpAddress.getCompositeIpAddress(ip)
|
|
370
|
+
});
|
|
371
|
+
const ipValidation = await util.deepValidateIpAddress(
|
|
372
|
+
ip,
|
|
373
|
+
solutionIpAddress,
|
|
374
|
+
this.logger,
|
|
375
|
+
env.config.ipApi.apiKey,
|
|
376
|
+
env.config.ipApi.baseUrl,
|
|
377
|
+
ipValidationRules
|
|
378
|
+
);
|
|
379
|
+
if (!ipValidation.isValid) {
|
|
380
|
+
this.logger.error(() => ({
|
|
381
|
+
msg: "IP validation failed for image captcha",
|
|
382
|
+
data: {
|
|
383
|
+
ip,
|
|
384
|
+
solutionIp: solutionIpAddress.address,
|
|
385
|
+
error: ipValidation.errorMessage,
|
|
386
|
+
distanceKm: ipValidation.distanceKm
|
|
387
|
+
}
|
|
343
388
|
}));
|
|
344
|
-
return {
|
|
345
|
-
status: "API.USER_NOT_VERIFIED_TIME_EXPIRED",
|
|
346
|
-
verified: false
|
|
347
|
-
};
|
|
389
|
+
return { status: "API.USER_NOT_VERIFIED", verified: false };
|
|
348
390
|
}
|
|
349
391
|
}
|
|
350
392
|
const isApproved = solution.result.status === types.CaptchaStatus.approved;
|
|
351
393
|
let score;
|
|
352
|
-
if (solution.
|
|
353
|
-
const
|
|
354
|
-
solution.
|
|
394
|
+
if (solution.sessionId) {
|
|
395
|
+
const sessionRecord = await this.db.getSessionRecordBySessionId(
|
|
396
|
+
solution.sessionId
|
|
355
397
|
);
|
|
356
|
-
if (
|
|
357
|
-
score = frictionlessTasksUtils.computeFrictionlessScore(
|
|
398
|
+
if (sessionRecord) {
|
|
399
|
+
score = frictionlessTasksUtils.computeFrictionlessScore(sessionRecord?.scoreComponents);
|
|
358
400
|
this.logger.info(() => ({
|
|
359
401
|
data: {
|
|
360
|
-
|
|
402
|
+
scoreComponents: sessionRecord?.scoreComponents,
|
|
361
403
|
score
|
|
362
404
|
}
|
|
363
405
|
}));
|
|
406
|
+
if (disallowWebView === true && (sessionRecord.scoreComponents.webView || 0) > 0) {
|
|
407
|
+
this.logger.info(() => ({
|
|
408
|
+
msg: "Disallowing webview access - user not verified"
|
|
409
|
+
}));
|
|
410
|
+
return { status: "API.USER_NOT_VERIFIED", verified: false };
|
|
411
|
+
}
|
|
364
412
|
}
|
|
365
413
|
}
|
|
366
414
|
return {
|