@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/verify.cjs
CHANGED
|
@@ -6,12 +6,23 @@ const types = require("@prosopo/types");
|
|
|
6
6
|
const utilCrypto = require("@prosopo/util-crypto");
|
|
7
7
|
const express = require("express");
|
|
8
8
|
const tasks = require("../tasks/tasks.cjs");
|
|
9
|
+
const apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
9
10
|
function prosopoVerifyRouter(env) {
|
|
10
11
|
const router = express.Router();
|
|
11
12
|
router.post(
|
|
12
13
|
types.ClientApiPaths.VerifyImageCaptchaSolutionDapp,
|
|
13
14
|
async (req, res, next) => {
|
|
14
15
|
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
16
|
+
if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
17
|
+
req.logger.info(() => ({
|
|
18
|
+
msg: "Maintenance mode active - returning verified for image captcha verification"
|
|
19
|
+
}));
|
|
20
|
+
const verificationResponse = {
|
|
21
|
+
status: "ok",
|
|
22
|
+
verified: true
|
|
23
|
+
};
|
|
24
|
+
return res.json(verificationResponse);
|
|
25
|
+
}
|
|
15
26
|
let parsed;
|
|
16
27
|
try {
|
|
17
28
|
parsed = types.VerifySolutionBody.parse(req.body);
|
|
@@ -24,7 +35,7 @@ function prosopoVerifyRouter(env) {
|
|
|
24
35
|
})
|
|
25
36
|
);
|
|
26
37
|
}
|
|
27
|
-
const { dappSignature, token, ip } = parsed;
|
|
38
|
+
const { dappSignature, token, ip, maxVerifiedTime } = parsed;
|
|
28
39
|
try {
|
|
29
40
|
const { user, dapp, timestamp, commitmentId } = types.decodeProcaptchaOutput(token);
|
|
30
41
|
utilCrypto.validateAddress(dapp, false, 42);
|
|
@@ -45,8 +56,10 @@ function prosopoVerifyRouter(env) {
|
|
|
45
56
|
user,
|
|
46
57
|
dapp,
|
|
47
58
|
commitmentId,
|
|
48
|
-
|
|
49
|
-
|
|
59
|
+
env,
|
|
60
|
+
maxVerifiedTime,
|
|
61
|
+
ip,
|
|
62
|
+
clientRecord.settings.disallowWebView
|
|
50
63
|
);
|
|
51
64
|
req.logger.debug(() => ({ data: { response } }));
|
|
52
65
|
const verificationResponse = tasks$1.imgCaptchaManager.getVerificationResponse(
|
|
@@ -73,6 +86,16 @@ function prosopoVerifyRouter(env) {
|
|
|
73
86
|
types.ClientApiPaths.VerifyPowCaptchaSolution,
|
|
74
87
|
async (req, res, next) => {
|
|
75
88
|
const tasks$1 = new tasks.Tasks(env, req.logger);
|
|
89
|
+
if (apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
90
|
+
req.logger.info(() => ({
|
|
91
|
+
msg: "Maintenance mode active - returning verified for PoW captcha verification"
|
|
92
|
+
}));
|
|
93
|
+
const verificationResponse = {
|
|
94
|
+
status: "ok",
|
|
95
|
+
verified: true
|
|
96
|
+
};
|
|
97
|
+
return res.json(verificationResponse);
|
|
98
|
+
}
|
|
76
99
|
let parsed;
|
|
77
100
|
try {
|
|
78
101
|
parsed = types.ServerPowCaptchaVerifyRequestBody.parse(req.body);
|
|
@@ -113,6 +136,7 @@ function prosopoVerifyRouter(env) {
|
|
|
113
136
|
dapp,
|
|
114
137
|
challenge,
|
|
115
138
|
verifiedTimeout,
|
|
139
|
+
env,
|
|
116
140
|
ip
|
|
117
141
|
);
|
|
118
142
|
const verificationResponse = tasks$1.powCaptchaManager.getVerificationResponse(
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const typesDatabase = require("@prosopo/types-database");
|
|
4
|
+
const util = require("@prosopo/util");
|
|
5
|
+
const ipAddress = require("ip-address");
|
|
6
|
+
const V6_SHIFT = 64n;
|
|
7
|
+
const v6_LOWER_MASK = (1n << V6_SHIFT) - 1n;
|
|
8
|
+
const getCompositeIpAddress = (ip) => {
|
|
9
|
+
let ipAddress2;
|
|
10
|
+
try {
|
|
11
|
+
ipAddress2 = "string" === typeof ip ? util.getIPAddress(ip) : ip;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
return {
|
|
14
|
+
lower: 0n,
|
|
15
|
+
type: typesDatabase.IpAddressType.v4
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return getCompositeFromIpAddress(ipAddress2);
|
|
19
|
+
};
|
|
20
|
+
const getCompositeFromIpAddress = (ipAddress$1) => {
|
|
21
|
+
const numericIp = ipAddress$1.bigInt();
|
|
22
|
+
if (ipAddress$1 instanceof ipAddress.Address4) {
|
|
23
|
+
return {
|
|
24
|
+
lower: numericIp,
|
|
25
|
+
type: typesDatabase.IpAddressType.v4
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
ipAddress$1;
|
|
29
|
+
return {
|
|
30
|
+
lower: numericIp & v6_LOWER_MASK,
|
|
31
|
+
upper: numericIp >> V6_SHIFT,
|
|
32
|
+
type: typesDatabase.IpAddressType.v6
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
const getIpAddressFromComposite = (compositeIpAddress) => {
|
|
36
|
+
switch (compositeIpAddress.type) {
|
|
37
|
+
case typesDatabase.IpAddressType.v4:
|
|
38
|
+
return ipAddress.Address4.fromBigInt(getBigInt(compositeIpAddress.lower));
|
|
39
|
+
case typesDatabase.IpAddressType.v6:
|
|
40
|
+
return ipAddress.Address6.fromBigInt(
|
|
41
|
+
getBigInt(compositeIpAddress.upper) << V6_SHIFT | getBigInt(compositeIpAddress.lower) & v6_LOWER_MASK
|
|
42
|
+
);
|
|
43
|
+
default:
|
|
44
|
+
never();
|
|
45
|
+
return ipAddress.Address4.fromBigInt(0n);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const getBigInt = (number) => BigInt(number || 0n);
|
|
49
|
+
const never = () => {
|
|
50
|
+
throw new Error("Unhandled type");
|
|
51
|
+
};
|
|
52
|
+
exports.getCompositeIpAddress = getCompositeIpAddress;
|
|
53
|
+
exports.getIpAddressFromComposite = getIpAddressFromComposite;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -14,9 +14,13 @@ const headerCheckMiddleware = require("./api/headerCheckMiddleware.cjs");
|
|
|
14
14
|
const createApiAdminRoutesProvider = require("./api/admin/createApiAdminRoutesProvider.cjs");
|
|
15
15
|
const ignoreMiddleware = require("./api/ignoreMiddleware.cjs");
|
|
16
16
|
const robotsMiddleware = require("./api/robotsMiddleware.cjs");
|
|
17
|
+
const compositeIpAddress = require("./compositeIpAddress.cjs");
|
|
18
|
+
const ipComparison = require("./services/ipComparison.cjs");
|
|
17
19
|
const tasks = require("./tasks/tasks.cjs");
|
|
18
20
|
exports.checkIfTaskIsRunning = util.checkIfTaskIsRunning;
|
|
21
|
+
exports.deepValidateIpAddress = util.deepValidateIpAddress;
|
|
19
22
|
exports.encodeStringAddress = util.encodeStringAddress;
|
|
23
|
+
exports.evaluateIpValidationRules = util.evaluateIpValidationRules;
|
|
20
24
|
exports.getIPAddress = util.getIPAddress;
|
|
21
25
|
exports.getIPAddressFromBigInt = util.getIPAddressFromBigInt;
|
|
22
26
|
exports.shuffleArray = util.shuffleArray;
|
|
@@ -35,4 +39,7 @@ exports.headerCheckMiddleware = headerCheckMiddleware.headerCheckMiddleware;
|
|
|
35
39
|
exports.createApiAdminRoutesProvider = createApiAdminRoutesProvider.createApiAdminRoutesProvider;
|
|
36
40
|
exports.ignoreMiddleware = ignoreMiddleware.ignoreMiddleware;
|
|
37
41
|
exports.robotsMiddleware = robotsMiddleware.robotsMiddleware;
|
|
42
|
+
exports.getCompositeIpAddress = compositeIpAddress.getCompositeIpAddress;
|
|
43
|
+
exports.getIpAddressFromComposite = compositeIpAddress.getIpAddressFromComposite;
|
|
44
|
+
exports.compareIPs = ipComparison.compareIPs;
|
|
38
45
|
exports.Tasks = tasks.Tasks;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const util = require("@prosopo/util");
|
|
4
|
+
const constructPairList = (list) => {
|
|
5
|
+
if (list.length % 2 !== 0) {
|
|
6
|
+
throw new Error("Invalid pairs length");
|
|
7
|
+
}
|
|
8
|
+
const pairList = [];
|
|
9
|
+
for (let i = 0; i < list.length; i += 2) {
|
|
10
|
+
pairList.push([util.at(list, i), util.at(list, i + 1)]);
|
|
11
|
+
}
|
|
12
|
+
return pairList;
|
|
13
|
+
};
|
|
14
|
+
const containsIdenticalPairs = (pairsLists) => {
|
|
15
|
+
const set = /* @__PURE__ */ new Set();
|
|
16
|
+
for (const pairList of pairsLists) {
|
|
17
|
+
for (const pair of pairList) {
|
|
18
|
+
const x = util.at(pair, 0);
|
|
19
|
+
const y = util.at(pair, 1);
|
|
20
|
+
const coordString = `${x},${y}`;
|
|
21
|
+
set.add(coordString);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return set.size !== pairsLists.flat().flat().length / 2;
|
|
25
|
+
};
|
|
26
|
+
exports.constructPairList = constructPairList;
|
|
27
|
+
exports.containsIdenticalPairs = containsIdenticalPairs;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const geolib = require("geolib");
|
|
4
|
+
const ipInfo = require("./ipInfo.cjs");
|
|
5
|
+
async function compareIPs(ip1, ip2, apiKey, apiUrl) {
|
|
6
|
+
try {
|
|
7
|
+
if (!ip1 || !ip2 || typeof ip1 !== "string" || typeof ip2 !== "string") {
|
|
8
|
+
return {
|
|
9
|
+
error: "Invalid IP addresses provided",
|
|
10
|
+
ip1: ip1 || "undefined",
|
|
11
|
+
ip2: ip2 || "undefined"
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
if (ip1 === ip2) {
|
|
15
|
+
return {
|
|
16
|
+
ipsMatch: true,
|
|
17
|
+
ip1,
|
|
18
|
+
ip2
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const [ip1Info, ip2Info] = await Promise.all([
|
|
22
|
+
ipInfo.getIPInfo(ip1, apiUrl, apiKey),
|
|
23
|
+
ipInfo.getIPInfo(ip2, apiUrl, apiKey)
|
|
24
|
+
]);
|
|
25
|
+
if (!ip1Info.isValid && !ip2Info.isValid) {
|
|
26
|
+
return {
|
|
27
|
+
error: "Failed to lookup both IP addresses",
|
|
28
|
+
ip1,
|
|
29
|
+
ip2,
|
|
30
|
+
ip1Error: ip1Info.error,
|
|
31
|
+
ip2Error: ip2Info.error
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (!ip1Info.isValid) {
|
|
35
|
+
return {
|
|
36
|
+
error: "Failed to lookup first IP address",
|
|
37
|
+
ip1,
|
|
38
|
+
ip2,
|
|
39
|
+
ip1Error: ip1Info.error
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (!ip2Info.isValid) {
|
|
43
|
+
return {
|
|
44
|
+
error: "Failed to lookup second IP address",
|
|
45
|
+
ip1,
|
|
46
|
+
ip2,
|
|
47
|
+
ip2Error: ip2Info.error
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const determineConnectionType = (ipInfo2) => {
|
|
51
|
+
if (ipInfo2.isMobile) return "mobile";
|
|
52
|
+
if (ipInfo2.isDatacenter) return "datacenter";
|
|
53
|
+
if (ipInfo2.isSatellite) return "satellite";
|
|
54
|
+
if (ipInfo2.providerType === "isp") return "residential";
|
|
55
|
+
switch (ipInfo2.providerType) {
|
|
56
|
+
case "hosting":
|
|
57
|
+
return "datacenter";
|
|
58
|
+
case "business":
|
|
59
|
+
case "education":
|
|
60
|
+
case "government":
|
|
61
|
+
case "banking":
|
|
62
|
+
return "residential";
|
|
63
|
+
default:
|
|
64
|
+
return "unknown";
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const ip1ConnectionType = determineConnectionType(ip1Info);
|
|
68
|
+
const ip2ConnectionType = determineConnectionType(ip2Info);
|
|
69
|
+
const differentConnectionTypes = ip1ConnectionType !== ip2ConnectionType;
|
|
70
|
+
const ip1Provider = ip1Info.providerName || ip1Info.asnOrganization || "Unknown";
|
|
71
|
+
const ip2Provider = ip2Info.providerName || ip2Info.asnOrganization || "Unknown";
|
|
72
|
+
const differentProviders = ip1Provider !== ip2Provider;
|
|
73
|
+
let distanceKm;
|
|
74
|
+
if (ip1Info.latitude !== void 0 && ip1Info.longitude !== void 0 && ip2Info.latitude !== void 0 && ip2Info.longitude !== void 0) {
|
|
75
|
+
const distanceMeters = geolib.getDistance(
|
|
76
|
+
{ latitude: ip1Info.latitude, longitude: ip1Info.longitude },
|
|
77
|
+
{ latitude: ip2Info.latitude, longitude: ip2Info.longitude }
|
|
78
|
+
);
|
|
79
|
+
distanceKm = distanceMeters / 1e3;
|
|
80
|
+
}
|
|
81
|
+
const ip1IsVpnOrProxy = ip1Info.isVPN || ip1Info.isProxy || ip1Info.isTor;
|
|
82
|
+
const ip2IsVpnOrProxy = ip2Info.isVPN || ip2Info.isProxy || ip2Info.isTor;
|
|
83
|
+
const anyVpnOrProxy = ip1IsVpnOrProxy || ip2IsVpnOrProxy;
|
|
84
|
+
const ip1Coordinates = ip1Info.latitude !== void 0 && ip1Info.longitude !== void 0 ? { latitude: ip1Info.latitude, longitude: ip1Info.longitude } : void 0;
|
|
85
|
+
const ip2Coordinates = ip2Info.latitude !== void 0 && ip2Info.longitude !== void 0 ? { latitude: ip2Info.latitude, longitude: ip2Info.longitude } : void 0;
|
|
86
|
+
return {
|
|
87
|
+
ipsMatch: false,
|
|
88
|
+
ip1,
|
|
89
|
+
ip2,
|
|
90
|
+
comparison: {
|
|
91
|
+
differentProviders,
|
|
92
|
+
differentConnectionTypes,
|
|
93
|
+
distanceKm,
|
|
94
|
+
anyVpnOrProxy,
|
|
95
|
+
ip1Details: {
|
|
96
|
+
provider: ip1Provider,
|
|
97
|
+
connectionType: ip1ConnectionType,
|
|
98
|
+
isVpnOrProxy: ip1IsVpnOrProxy,
|
|
99
|
+
country: ip1Info.country,
|
|
100
|
+
countryCode: ip1Info.countryCode,
|
|
101
|
+
city: ip1Info.city,
|
|
102
|
+
coordinates: ip1Coordinates
|
|
103
|
+
},
|
|
104
|
+
ip2Details: {
|
|
105
|
+
provider: ip2Provider,
|
|
106
|
+
connectionType: ip2ConnectionType,
|
|
107
|
+
isVpnOrProxy: ip2IsVpnOrProxy,
|
|
108
|
+
country: ip2Info.country,
|
|
109
|
+
countryCode: ip2Info.countryCode,
|
|
110
|
+
city: ip2Info.city,
|
|
111
|
+
coordinates: ip2Coordinates
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
} catch (error) {
|
|
116
|
+
return {
|
|
117
|
+
error: `Comparison failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
118
|
+
ip1,
|
|
119
|
+
ip2
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.compareIPs = compareIPs;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
async function getIPInfo(ip, apiUrl, apiKey, includeRawResponse = false) {
|
|
4
|
+
try {
|
|
5
|
+
if (!ip || typeof ip !== "string") {
|
|
6
|
+
return {
|
|
7
|
+
isValid: false,
|
|
8
|
+
error: "Invalid IP address provided",
|
|
9
|
+
ip: ip || "undefined"
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const url = apiUrl;
|
|
13
|
+
const body = { q: ip };
|
|
14
|
+
if (apiKey) {
|
|
15
|
+
body.key = apiKey;
|
|
16
|
+
}
|
|
17
|
+
const response = await fetch(url, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: {
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
Accept: "application/json"
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify(body)
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
return {
|
|
27
|
+
isValid: false,
|
|
28
|
+
error: `API request failed with status ${response.status}: ${response.statusText}`,
|
|
29
|
+
ip
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const data = await response.json();
|
|
33
|
+
if (data.is_bogon) {
|
|
34
|
+
return {
|
|
35
|
+
isValid: false,
|
|
36
|
+
error: "IP address is bogon (non-routable)",
|
|
37
|
+
ip
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const result = {
|
|
41
|
+
ip: data.ip,
|
|
42
|
+
isValid: true,
|
|
43
|
+
// Threat indicators
|
|
44
|
+
isVPN: data.is_vpn,
|
|
45
|
+
isTor: data.is_tor,
|
|
46
|
+
isProxy: data.is_proxy,
|
|
47
|
+
isDatacenter: data.is_datacenter,
|
|
48
|
+
isAbuser: data.is_abuser,
|
|
49
|
+
isMobile: data.is_mobile,
|
|
50
|
+
isSatellite: data.is_satellite,
|
|
51
|
+
// Provider information
|
|
52
|
+
providerName: data.company?.name || data.datacenter?.datacenter,
|
|
53
|
+
providerType: data.company?.type || data.asn?.type,
|
|
54
|
+
asnNumber: data.asn?.asn,
|
|
55
|
+
asnOrganization: data.asn?.org,
|
|
56
|
+
// Geolocation
|
|
57
|
+
country: data.location?.country,
|
|
58
|
+
countryCode: data.location?.country_code,
|
|
59
|
+
region: data.location?.state,
|
|
60
|
+
city: data.location?.city,
|
|
61
|
+
latitude: data.location?.latitude,
|
|
62
|
+
longitude: data.location?.longitude,
|
|
63
|
+
timezone: data.location?.timezone,
|
|
64
|
+
// VPN specific details
|
|
65
|
+
vpnService: data.vpn?.service,
|
|
66
|
+
vpnType: data.vpn?.type,
|
|
67
|
+
// Risk scoring
|
|
68
|
+
abuserScore: Number.parseFloat(
|
|
69
|
+
data.asn?.abuser_score.split(" ")[0] || "0"
|
|
70
|
+
),
|
|
71
|
+
companyAbuserScore: Number.parseFloat(
|
|
72
|
+
data.company?.abuser_score.split(" ")[0] || "0"
|
|
73
|
+
)
|
|
74
|
+
};
|
|
75
|
+
if (includeRawResponse) {
|
|
76
|
+
result.rawResponse = data;
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return {
|
|
81
|
+
isValid: false,
|
|
82
|
+
error: `Network or parsing error: ${error instanceof Error ? error.message : String(error)}`,
|
|
83
|
+
ip
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.getIPInfo = getIPInfo;
|
|
@@ -3,19 +3,17 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const common = require("@prosopo/common");
|
|
4
4
|
const types = require("@prosopo/types");
|
|
5
5
|
const blacklistRequestInspector = require("../api/blacklistRequestInspector.cjs");
|
|
6
|
+
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
6
7
|
class CaptchaManager {
|
|
7
8
|
constructor(db, pair, logger) {
|
|
8
9
|
this.pair = pair;
|
|
9
10
|
this.db = db;
|
|
10
|
-
this.logger = logger || common.getLogger("info",
|
|
11
|
+
this.logger = logger || common.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("tasks/captchaManager.cjs", document.baseURI).href);
|
|
11
12
|
}
|
|
12
|
-
async
|
|
13
|
-
|
|
14
|
-
sessionRecord.tokenId
|
|
15
|
-
);
|
|
16
|
-
return tokenRecord ? tokenRecord._id : void 0;
|
|
13
|
+
async validateSessionIP(sessionRecord, currentIP, env) {
|
|
14
|
+
return { valid: true };
|
|
17
15
|
}
|
|
18
|
-
async isValidRequest(clientSettings, requestedCaptchaType, sessionId, userAccessPolicy) {
|
|
16
|
+
async isValidRequest(clientSettings, requestedCaptchaType, env, sessionId, userAccessPolicy, currentIP) {
|
|
19
17
|
this.logger.debug(() => ({
|
|
20
18
|
msg: "Validating request",
|
|
21
19
|
data: {
|
|
@@ -54,11 +52,44 @@ class CaptchaManager {
|
|
|
54
52
|
type: requestedCaptchaType
|
|
55
53
|
};
|
|
56
54
|
}
|
|
57
|
-
|
|
55
|
+
if (currentIP) {
|
|
56
|
+
const ipValidation = await this.validateSessionIP(
|
|
57
|
+
sessionRecord,
|
|
58
|
+
currentIP,
|
|
59
|
+
env
|
|
60
|
+
);
|
|
61
|
+
if (!ipValidation.valid) {
|
|
62
|
+
return {
|
|
63
|
+
valid: false,
|
|
64
|
+
reason: ipValidation.reason,
|
|
65
|
+
type: requestedCaptchaType
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (sessionRecord.captchaType !== requestedCaptchaType) {
|
|
70
|
+
this.logger.warn(() => ({
|
|
71
|
+
msg: "Invalid frictionless request",
|
|
72
|
+
data: {
|
|
73
|
+
account: clientSettings.account,
|
|
74
|
+
sessionId
|
|
75
|
+
}
|
|
76
|
+
}));
|
|
77
|
+
return {
|
|
78
|
+
valid: false,
|
|
79
|
+
reason: "CAPTCHA.NO_SESSION_FOUND",
|
|
80
|
+
type: requestedCaptchaType
|
|
81
|
+
};
|
|
82
|
+
}
|
|
58
83
|
return {
|
|
59
84
|
valid: true,
|
|
60
|
-
|
|
61
|
-
type: requestedCaptchaType
|
|
85
|
+
sessionId: sessionRecord.sessionId,
|
|
86
|
+
type: requestedCaptchaType,
|
|
87
|
+
...sessionRecord.powDifficulty && {
|
|
88
|
+
powDifficulty: sessionRecord.powDifficulty
|
|
89
|
+
},
|
|
90
|
+
...sessionRecord.solvedImagesCount && {
|
|
91
|
+
solvedImagesCount: sessionRecord.solvedImagesCount
|
|
92
|
+
}
|
|
62
93
|
};
|
|
63
94
|
}
|
|
64
95
|
this.logger.warn(() => ({
|
|
@@ -102,39 +102,8 @@ class ClientTaskManager {
|
|
|
102
102
|
async (skip) => await this.providerDB.getUnstoredSessionRecords(BATCH_SIZE, skip),
|
|
103
103
|
async (batch) => {
|
|
104
104
|
const filteredBatch = lastTask?.updated ? batch.filter((record) => this.isRecordUpdated(record)) : batch;
|
|
105
|
-
const frictionlessTokenRecords = await this.providerDB.getFrictionlessTokenRecordsByTokenIds(
|
|
106
|
-
filteredBatch.map((record) => record.tokenId)
|
|
107
|
-
);
|
|
108
|
-
this.logger.info(() => ({
|
|
109
|
-
msg: `Frictionless token records: ${frictionlessTokenRecords.length}`
|
|
110
|
-
}));
|
|
111
|
-
const filteredBatchWithScores = filteredBatch.map((record) => {
|
|
112
|
-
const tokenRecord = frictionlessTokenRecords.find(
|
|
113
|
-
(tokenRecord2) => tokenRecord2._id?.toString() === record.tokenId.toString()
|
|
114
|
-
);
|
|
115
|
-
if (!tokenRecord) {
|
|
116
|
-
this.logger.error(() => ({
|
|
117
|
-
msg: "No token record found",
|
|
118
|
-
data: { tokenId: record.tokenId }
|
|
119
|
-
}));
|
|
120
|
-
return {
|
|
121
|
-
...record,
|
|
122
|
-
score: 0,
|
|
123
|
-
scoreComponents: {
|
|
124
|
-
baseScore: 0
|
|
125
|
-
},
|
|
126
|
-
threshold: 0
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
...record,
|
|
131
|
-
score: tokenRecord?.score || 0,
|
|
132
|
-
scoreComponents: tokenRecord?.scoreComponents,
|
|
133
|
-
threshold: tokenRecord?.threshold || 0
|
|
134
|
-
};
|
|
135
|
-
});
|
|
136
105
|
if (filteredBatch.length > 0) {
|
|
137
|
-
await captchaDB.saveCaptchas(
|
|
106
|
+
await captchaDB.saveCaptchas(filteredBatch, [], []);
|
|
138
107
|
await this.providerDB.markSessionRecordsStored(
|
|
139
108
|
filteredBatch.map((record) => record.sessionId)
|
|
140
109
|
);
|
|
@@ -194,7 +163,7 @@ class ClientTaskManager {
|
|
|
194
163
|
this.logger
|
|
195
164
|
);
|
|
196
165
|
const tenMinuteWindow = 10 * 60 * 1e3;
|
|
197
|
-
const updatedAtTimestamp = lastTask?.updated ? lastTask.updated - tenMinuteWindow || 0 : 0;
|
|
166
|
+
const updatedAtTimestamp = lastTask?.updated ? lastTask.updated.getTime() - tenMinuteWindow || 0 : 0;
|
|
198
167
|
this.logger.info(() => ({
|
|
199
168
|
msg: `Getting updated client records since ${new Date(updatedAtTimestamp).toDateString()}`
|
|
200
169
|
}));
|
|
@@ -248,25 +217,44 @@ class ClientTaskManager {
|
|
|
248
217
|
const activeDetectorKeys = await this.providerDB.getDetectorKeys();
|
|
249
218
|
return activeDetectorKeys;
|
|
250
219
|
}
|
|
251
|
-
async removeDetectorKey(detectorKey) {
|
|
220
|
+
async removeDetectorKey(detectorKey, expirationInSeconds) {
|
|
252
221
|
if (!isValidPrivateKey(detectorKey)) {
|
|
253
222
|
throw new common.ProsopoApiError("INVALID_DETECTOR_KEY", {
|
|
254
223
|
context: { detectorKey },
|
|
255
224
|
logger: this.logger
|
|
256
225
|
});
|
|
257
226
|
}
|
|
258
|
-
await this.providerDB.removeDetectorKey(detectorKey);
|
|
227
|
+
await this.providerDB.removeDetectorKey(detectorKey, expirationInSeconds);
|
|
259
228
|
}
|
|
260
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Matches a request referrer against an allowed domain pattern.
|
|
231
|
+
* Supports global '*', subdomain '*.example.com', glob '*example*',
|
|
232
|
+
* plain domains (exact or subdomain), and 'localhost'.
|
|
233
|
+
*/
|
|
234
|
+
domainPatternMatcher(referrer, clientDomain) {
|
|
261
235
|
if (!referrer || !clientDomain) return false;
|
|
262
|
-
if (clientDomain === "*") return true;
|
|
263
236
|
try {
|
|
264
|
-
const
|
|
265
|
-
const
|
|
266
|
-
|
|
267
|
-
|
|
237
|
+
const referrerHost = util.parseUrl(referrer).hostname.replace(/\.$/, "");
|
|
238
|
+
const pattern = clientDomain.trim().toLowerCase();
|
|
239
|
+
if (pattern === "*") return true;
|
|
240
|
+
if (pattern === "localhost") {
|
|
241
|
+
return referrerHost === "localhost" || referrerHost.startsWith("localhost:");
|
|
242
|
+
}
|
|
243
|
+
if (pattern.startsWith("*.")) {
|
|
244
|
+
const suffix = pattern.slice(2);
|
|
245
|
+
const allowed = util.parseUrl(suffix).hostname.replace(/\.$/, "");
|
|
246
|
+
return referrerHost.endsWith(`.${allowed}`) || referrerHost === allowed;
|
|
247
|
+
}
|
|
248
|
+
if (pattern.includes("*")) {
|
|
249
|
+
const escaped = pattern.replace(/[.+?^${}()|\[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
250
|
+
const regex = new RegExp(`^${escaped}$`, "i");
|
|
251
|
+
return regex.test(referrerHost);
|
|
252
|
+
}
|
|
253
|
+
const allowedHost = util.parseUrl(pattern).hostname.replace(/\.$/, "");
|
|
254
|
+
return referrerHost === allowedHost || referrerHost.endsWith(`.${allowedHost}`);
|
|
255
|
+
} catch (e) {
|
|
268
256
|
this.logger.error(() => ({
|
|
269
|
-
msg: "Error in
|
|
257
|
+
msg: "Error in domainPatternMatcher",
|
|
270
258
|
data: { referrer, clientDomain }
|
|
271
259
|
}));
|
|
272
260
|
return false;
|
|
@@ -274,7 +262,7 @@ class ClientTaskManager {
|
|
|
274
262
|
}
|
|
275
263
|
isRecordUpdated(record) {
|
|
276
264
|
const { lastUpdatedTimestamp, storedAtTimestamp } = record;
|
|
277
|
-
return !lastUpdatedTimestamp || !storedAtTimestamp || lastUpdatedTimestamp > storedAtTimestamp;
|
|
265
|
+
return !lastUpdatedTimestamp || !storedAtTimestamp || lastUpdatedTimestamp.getTime() > storedAtTimestamp.getTime();
|
|
278
266
|
}
|
|
279
267
|
async processBatchesWithCursor(fetchBatch, processBatch) {
|
|
280
268
|
let skip = 0;
|