@prosopo/provider 5.19.3 → 5.20.0
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/.turbo/turbo-build$colon$cjs.log +45 -40
- package/.turbo/turbo-build$colon$tsc.log +28 -28
- package/.turbo/turbo-build.log +48 -40
- package/CHANGELOG.md +167 -0
- package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetSessionEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
- package/dist/api/admin/apiReplaceDetectorPoolEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +9 -8
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
- package/dist/api/captcha/checkSpamEmail.js +19 -26
- package/dist/api/captcha/checkSpamEmail.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +11 -2
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +6 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +30 -27
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.js +32 -43
- package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.js +27 -32
- package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +3 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +23 -5
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/interactiveCaptchaChallenge.js +27 -32
- package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/interactiveCaptchaSolution.js +18 -24
- package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitImageCaptchaSolution.js +18 -24
- package/dist/api/captcha/submitImageCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +35 -27
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/domainMiddleware.d.ts.map +1 -1
- package/dist/api/domainMiddleware.js +39 -47
- package/dist/api/domainMiddleware.js.map +1 -1
- package/dist/api/errorCodeForReason.d.ts +3 -0
- package/dist/api/errorCodeForReason.d.ts.map +1 -0
- package/dist/api/errorCodeForReason.js +22 -0
- package/dist/api/errorCodeForReason.js.map +1 -0
- package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
- package/dist/api/headerCheckMiddleware.js +14 -9
- package/dist/api/headerCheckMiddleware.js.map +1 -1
- package/dist/api/ipInfoMiddleware.d.ts +1 -1
- package/dist/api/ipInfoMiddleware.d.ts.map +1 -1
- package/dist/api/ipInfoMiddleware.js +5 -1
- package/dist/api/ipInfoMiddleware.js.map +1 -1
- package/dist/api/metrics.d.ts.map +1 -1
- package/dist/api/metrics.js +9 -1
- package/dist/api/metrics.js.map +1 -1
- package/dist/api/public.d.ts.map +1 -1
- package/dist/api/public.js +6 -2
- package/dist/api/public.js.map +1 -1
- package/dist/api/rateLimitHandler.d.ts +4 -0
- package/dist/api/rateLimitHandler.d.ts.map +1 -0
- package/dist/api/rateLimitHandler.js +20 -0
- package/dist/api/rateLimitHandler.js.map +1 -0
- package/dist/api/startProviderApi.d.ts +1 -0
- package/dist/api/startProviderApi.d.ts.map +1 -1
- package/dist/api/startProviderApi.js +8 -17
- package/dist/api/startProviderApi.js.map +1 -1
- package/dist/api/validateAddress.d.ts +3 -4
- package/dist/api/validateAddress.d.ts.map +1 -1
- package/dist/api/validateAddress.js +13 -19
- package/dist/api/validateAddress.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +73 -96
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/blacklistRequestInspector.cjs +9 -8
- package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -25
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +11 -2
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +6 -1
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +29 -26
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +31 -42
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +26 -31
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +22 -3
- package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +26 -31
- package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +17 -23
- package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +17 -23
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +34 -26
- package/dist/cjs/api/domainMiddleware.cjs +38 -46
- package/dist/cjs/api/errorCodeForReason.cjs +22 -0
- package/dist/cjs/api/headerCheckMiddleware.cjs +13 -8
- package/dist/cjs/api/ipInfoMiddleware.cjs +5 -1
- package/dist/cjs/api/metrics.cjs +9 -1
- package/dist/cjs/api/public.cjs +5 -1
- package/dist/cjs/api/rateLimitHandler.cjs +20 -0
- package/dist/cjs/api/startProviderApi.cjs +8 -16
- package/dist/cjs/api/validateAddress.cjs +12 -18
- package/dist/cjs/api/verify.cjs +72 -95
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/tasks/captchaManager.cjs +6 -8
- package/dist/cjs/tasks/client/clientTasks.cjs +26 -13
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +28 -8
- package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +21 -19
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +1 -1
- package/dist/cjs/tasks/frictionless/routingMachine.cjs +13 -4
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +89 -40
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +18 -8
- package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +21 -13
- package/dist/cjs/tasks/powCaptcha/backgroundWrites.cjs +24 -0
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +44 -19
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +14 -10
- package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +17 -8
- package/dist/cjs/tasks/signatureCheck.cjs +12 -0
- package/dist/cjs/tasks/tasks.cjs +6 -1
- package/dist/cjs/util/usageCounters.cjs +26 -3
- package/dist/cjs/util.cjs +14 -3
- package/dist/cjs/utils/devicePlatform.cjs +9 -5
- package/dist/cjs/utils/mobileSignals.cjs +69 -0
- package/dist/errorSites.d.ts +98 -0
- package/dist/errorSites.d.ts.map +1 -0
- package/dist/errorSites.js +2 -0
- package/dist/errorSites.js.map +1 -0
- package/dist/fingerprint/dist/merkle.js +69 -0
- package/dist/fingerprint/dist/proof.js +95 -0
- package/dist/fingerprint/dist/summary.js +73 -0
- package/dist/index.js +2 -2
- package/dist/tasks/captchaManager.d.ts +2 -3
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +6 -7
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/client/clientTasks.d.ts.map +1 -1
- package/dist/tasks/client/clientTasks.js +27 -14
- package/dist/tasks/client/clientTasks.js.map +1 -1
- package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -1
- package/dist/tasks/dataset/datasetTasksUtils.js +29 -9
- package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -1
- package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts +1 -3
- package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts.map +1 -1
- package/dist/tasks/decisionMachine/decisionMachineRunner.js +21 -19
- package/dist/tasks/decisionMachine/decisionMachineRunner.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
- package/dist/tasks/frictionless/routingMachine.js +13 -4
- package/dist/tasks/frictionless/routingMachine.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +91 -42
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +19 -9
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -1
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -1
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +22 -14
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -1
- package/dist/tasks/powCaptcha/backgroundWrites.d.ts +7 -0
- package/dist/tasks/powCaptcha/backgroundWrites.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/backgroundWrites.js +24 -0
- package/dist/tasks/powCaptcha/backgroundWrites.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts +3 -3
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +45 -20
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +15 -11
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.d.ts +8 -1
- package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.js +16 -8
- package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
- package/dist/tasks/signatureCheck.d.ts +2 -0
- package/dist/tasks/signatureCheck.d.ts.map +1 -0
- package/dist/tasks/signatureCheck.js +12 -0
- package/dist/tasks/signatureCheck.js.map +1 -0
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +7 -2
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +3 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +6 -2
- package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/escalationPeekBeforeConsume.integration.test.js +1 -1
- package/dist/tests/integration/escalationPeekBeforeConsume.integration.test.js.map +1 -1
- package/dist/tests/integration/imgCaptcha.integration.test.js +6 -5
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
- package/dist/tests/integration/ipValidation.integration.test.js +1 -1
- package/dist/tests/integration/ipValidation.integration.test.js.map +1 -1
- package/dist/tests/integration/powCaptcha.integration.test.js +2 -2
- package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
- package/dist/tests/integration/routingDecisionMachines.integration.test.js.map +1 -1
- package/dist/tests/integration/testUtils.d.ts +2 -2
- package/dist/tests/integration/testUtils.d.ts.map +1 -1
- package/dist/tests/integration/testUtils.js +1 -1
- package/dist/tests/integration/testUtils.js.map +1 -1
- package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js +3 -1
- package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js.map +1 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +26 -10
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +4 -4
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.js +210 -0
- package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.js +153 -0
- package/dist/tests/unit/api/captcha/submitSolutionBadSignature.unit.test.js.map +1 -0
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js +6 -2
- package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js.map +1 -1
- package/dist/tests/unit/api/errorCodeForReason.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/errorCodeForReason.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/errorCodeForReason.unit.test.js +23 -0
- package/dist/tests/unit/api/errorCodeForReason.unit.test.js.map +1 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +6 -1
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +16 -7
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.js +46 -0
- package/dist/tests/unit/api/ipInfoMiddleware.unit.test.js.map +1 -0
- package/dist/tests/unit/api/public.unit.test.js +45 -10
- package/dist/tests/unit/api/public.unit.test.js.map +1 -1
- package/dist/tests/unit/api/rateLimitHandler.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/rateLimitHandler.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/rateLimitHandler.unit.test.js +39 -0
- package/dist/tests/unit/api/rateLimitHandler.unit.test.js.map +1 -0
- package/dist/tests/unit/api/validateAddress.unit.test.js +41 -115
- package/dist/tests/unit/api/validateAddress.unit.test.js.map +1 -1
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.js +3 -3
- package/dist/tests/unit/api/verifyMalformedToken.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +22 -18
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +25 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +25 -20
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js +31 -0
- package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.js +80 -0
- package/dist/tests/unit/tasks/frictionless/fingerprintBucketFlow.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js +48 -0
- package/dist/tests/unit/tasks/frictionless/routingMachine.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +20 -28
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +2 -2
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.js +44 -0
- package/dist/tests/unit/tasks/powCaptcha/backgroundWrites.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +78 -43
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +7 -6
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +2 -2
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/util/usageCounters.unit.test.js +20 -0
- package/dist/tests/unit/util/usageCounters.unit.test.js.map +1 -1
- package/dist/tests/unit/util.unit.test.js +7 -7
- package/dist/tests/unit/util.unit.test.js.map +1 -1
- package/dist/tests/unit/utils/devicePlatform.unit.test.js +9 -8
- package/dist/tests/unit/utils/devicePlatform.unit.test.js.map +1 -1
- package/dist/tests/unit/utils/mobileSignals.unit.test.d.ts +2 -0
- package/dist/tests/unit/utils/mobileSignals.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/mobileSignals.unit.test.js +161 -0
- package/dist/tests/unit/utils/mobileSignals.unit.test.js.map +1 -0
- package/dist/util/usageCounters.d.ts +1 -1
- package/dist/util/usageCounters.d.ts.map +1 -1
- package/dist/util/usageCounters.js +26 -3
- package/dist/util/usageCounters.js.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +15 -4
- package/dist/util.js.map +1 -1
- package/dist/utils/devicePlatform.d.ts +3 -3
- package/dist/utils/devicePlatform.d.ts.map +1 -1
- package/dist/utils/devicePlatform.js +9 -5
- package/dist/utils/devicePlatform.js.map +1 -1
- package/dist/utils/mobileSignals.d.ts +32 -0
- package/dist/utils/mobileSignals.d.ts.map +1 -0
- package/dist/utils/mobileSignals.js +68 -0
- package/dist/utils/mobileSignals.js.map +1 -0
- package/package.json +44 -43
|
@@ -12,6 +12,7 @@ let _prosopo_types = require("@prosopo/types");
|
|
|
12
12
|
let _prosopo_util = require("@prosopo/util");
|
|
13
13
|
let _prosopo_captcha_severity = require("@prosopo/captcha-severity");
|
|
14
14
|
let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
|
|
15
|
+
let _prosopo_fingerprint_summary = require("@prosopo/fingerprint/summary");
|
|
15
16
|
//#region src/api/captcha/submitPoWCaptchaSolution.ts
|
|
16
17
|
var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
17
18
|
if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
@@ -26,14 +27,12 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
26
27
|
try {
|
|
27
28
|
parsed = _prosopo_types.SubmitPowCaptchaSolutionBody.parse(req.body);
|
|
28
29
|
} catch (err) {
|
|
29
|
-
return next(new _prosopo_common.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
i18n: req.i18n,
|
|
36
|
-
logger: req.logger
|
|
30
|
+
return next(new _prosopo_common.ProsopoError({
|
|
31
|
+
code: "INVALID_REQUEST",
|
|
32
|
+
errorSite: "PROV-27",
|
|
33
|
+
message: "Error parsing captcha",
|
|
34
|
+
cause: err,
|
|
35
|
+
context: { body: require_requestBodySummary.summariseRequestBody(req) }
|
|
37
36
|
}));
|
|
38
37
|
}
|
|
39
38
|
const { challenge, signature, nonce, dapp, user, behavioralData, salt, simdReadings, clientMetaData, fingerprintProof } = parsed;
|
|
@@ -49,22 +48,21 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
49
48
|
}
|
|
50
49
|
try {
|
|
51
50
|
const clientRecord = await tasks.db.getClientRecord(dapp);
|
|
52
|
-
if (!clientRecord) return next(new _prosopo_common.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
},
|
|
57
|
-
i18n: req.i18n,
|
|
58
|
-
logger: req.logger
|
|
51
|
+
if (!clientRecord) return next(new _prosopo_common.ProsopoError({
|
|
52
|
+
code: "SITE_KEY_NOT_REGISTERED",
|
|
53
|
+
errorSite: "PROV-28",
|
|
54
|
+
context: { siteKey: dapp }
|
|
59
55
|
}));
|
|
60
56
|
const flatHeaders = (0, _prosopo_util.flatten)(req.headers);
|
|
61
57
|
const userAgent = req.headers["user-agent"] ?? "";
|
|
62
58
|
const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
|
|
59
|
+
const fingerprintSummary = (0, _prosopo_fingerprint_summary.summariseFingerprintProof)(fingerprintProof);
|
|
63
60
|
req.logger.info(() => ({
|
|
64
61
|
msg: fingerprintProof ? "fingerprintProof detected" : "no fingerprintProof on PoW submission",
|
|
65
62
|
data: {
|
|
66
63
|
fingerprintProofPresent: fingerprintProof !== void 0,
|
|
67
64
|
fingerprintProofBytes: fingerprintProof?.length ?? 0,
|
|
65
|
+
fingerprintSummarised: fingerprintSummary !== void 0,
|
|
68
66
|
challenge
|
|
69
67
|
}
|
|
70
68
|
}));
|
|
@@ -72,12 +70,17 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
72
70
|
tasks.powCaptchaManager.setPostPowContext({
|
|
73
71
|
ip: req.ip || "",
|
|
74
72
|
countryCode,
|
|
75
|
-
platform: require_devicePlatform.derivePlatform(userAgent, false
|
|
73
|
+
platform: require_devicePlatform.derivePlatform(userAgent, false, {
|
|
74
|
+
headers: flatHeaders,
|
|
75
|
+
...req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid && { carrierNetwork: req.ipInfo.isMobile },
|
|
76
|
+
...req.tcpMss !== void 0 && { tcpMss: req.tcpMss }
|
|
77
|
+
}),
|
|
76
78
|
raw: {
|
|
77
79
|
headers: flatHeaders,
|
|
78
80
|
userAgent,
|
|
79
81
|
...req.ja4 && { ja4: req.ja4 },
|
|
80
82
|
...fingerprintProof && { fingerprintProof },
|
|
83
|
+
...fingerprintSummary && { fingerprintSummary },
|
|
81
84
|
...req.tcpToChelloUs !== void 0 && { tcpToChelloUs: req.tcpToChelloUs },
|
|
82
85
|
...req.chelloToHandshakeUs !== void 0 && { chelloToHandshakeUs: req.chelloToHandshakeUs },
|
|
83
86
|
...require_rawTlsSignalsMiddleware.rawTlsSignalsForSession(req),
|
|
@@ -86,7 +89,7 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
86
89
|
}
|
|
87
90
|
});
|
|
88
91
|
const submitWindowMs = clientRecord.settings.solutionTimeout ?? clientRecord.settings.verifiedTimeout;
|
|
89
|
-
const result = await tasks.powCaptchaManager.verifyPowCaptchaSolution(challenge, signature.provider.challenge, nonce, submitWindowMs, signature.user.timestamp, (0, _prosopo_util.getIPAddress)(req.ip || ""), flatHeaders, behavioralData, salt, simdReadings, clientMetaData);
|
|
92
|
+
const result = await tasks.powCaptchaManager.verifyPowCaptchaSolution(challenge, signature.provider.challenge, nonce, submitWindowMs, signature.user.timestamp, (0, _prosopo_util.getIPAddress)(req.ip || ""), flatHeaders, behavioralData, salt, simdReadings, clientMetaData, fingerprintSummary);
|
|
90
93
|
if (result.routingOutput) req.logger.info(() => ({
|
|
91
94
|
msg: "post-PoW routing decision",
|
|
92
95
|
data: {
|
|
@@ -111,19 +114,18 @@ var submitPoWCaptchaSolution_default = (env) => async (req, res, next) => {
|
|
|
111
114
|
};
|
|
112
115
|
return res.json(response);
|
|
113
116
|
} catch (err) {
|
|
117
|
+
if ((0, _prosopo_common.isProsopoError)(err) && !(0, _prosopo_common.isSevereError)(err)) return next(err);
|
|
114
118
|
req.logger.error(() => ({
|
|
115
119
|
err,
|
|
116
120
|
body: require_requestBodySummary.summariseRequestBody(req),
|
|
117
121
|
msg: "Error in PoW captcha solution submission"
|
|
118
122
|
}));
|
|
119
|
-
return next(new _prosopo_common.
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
i18n: req.i18n,
|
|
126
|
-
logger: req.logger
|
|
123
|
+
return next(new _prosopo_common.ProsopoError({
|
|
124
|
+
code: "UNEXPECTED",
|
|
125
|
+
errorSite: "PROV-29",
|
|
126
|
+
message: "BadRequest",
|
|
127
|
+
cause: err,
|
|
128
|
+
context: { siteKey: req.body.dapp }
|
|
127
129
|
}));
|
|
128
130
|
}
|
|
129
131
|
};
|
|
@@ -150,7 +152,13 @@ var buildEscalation = async (tasks, result, challenge, perConnectionSignals, sit
|
|
|
150
152
|
const imageMaxRounds = siteConstraints?.imageMaxRounds ?? _prosopo_types.imageMaxRoundsDefault;
|
|
151
153
|
const escalationPuzzleOverrides = (() => {
|
|
152
154
|
if (escalatedType !== _prosopo_types.CaptchaType.puzzle) return void 0;
|
|
153
|
-
const { isMobile } = require_devicePlatform.derivePlatform(originSession.headers?.["user-agent"] ?? "", originSession.webView
|
|
155
|
+
const { isMobile } = require_devicePlatform.derivePlatform(originSession.headers?.["user-agent"] ?? "", originSession.webView, {
|
|
156
|
+
...originSession.headers && { headers: originSession.headers },
|
|
157
|
+
...originSession.ipInfo?.isValid && { carrierNetwork: originSession.ipInfo.isMobile },
|
|
158
|
+
...originSession.tcpMss !== void 0 && { tcpMss: originSession.tcpMss },
|
|
159
|
+
...powRecord.deviceCapability !== void 0 && { deviceCapability: powRecord.deviceCapability },
|
|
160
|
+
...powRecord.behavioralDataPacked?.c2 !== void 0 && { touchEventCount: powRecord.behavioralDataPacked.c2.length }
|
|
161
|
+
});
|
|
154
162
|
const level = (0, _prosopo_captcha_severity.severityToPuzzleDifficulty)(routed.solvedImagesCount ?? originSession.solvedImagesCount, tasks.config.captchas.solved.count, (0, _prosopo_captcha_severity.resolveMaxEscalationLevel)(siteConstraints?.puzzleMaxDifficulty, isMobile));
|
|
155
163
|
if (level === 0) return void 0;
|
|
156
164
|
const difficulty = require_puzzleDifficulty.samplePuzzleDifficulty(level, _prosopo_puzzle_assets.DEFAULT_RENDER_SETTINGS.holeDarken);
|
|
@@ -20,11 +20,11 @@ var domainMiddleware = (env) => {
|
|
|
20
20
|
if (!cachedTasks) cachedTasks = new require_tasks.Tasks(env);
|
|
21
21
|
const tasks = cachedTasks;
|
|
22
22
|
const siteKey = req.headers["prosopo-site-key"];
|
|
23
|
-
if (!siteKey) throw siteKeyNotRegisteredError(
|
|
23
|
+
if (!siteKey) throw siteKeyNotRegisteredError("No sitekey provided");
|
|
24
24
|
try {
|
|
25
25
|
(0, _prosopo_util_crypto.validateAddress)(siteKey, false, 42);
|
|
26
26
|
} catch (err) {
|
|
27
|
-
throw invalidSiteKeyError(
|
|
27
|
+
throw invalidSiteKeyError(siteKey);
|
|
28
28
|
}
|
|
29
29
|
if (require_testSiteKey.isReservedTestSiteKey(siteKey)) {
|
|
30
30
|
require_metrics.recordDomainValidation("test_key");
|
|
@@ -32,32 +32,34 @@ var domainMiddleware = (env) => {
|
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
const clientSettings = await tasks.db.getClientRecord(siteKey);
|
|
35
|
-
if (!clientSettings) throw siteKeyNotRegisteredError(
|
|
35
|
+
if (!clientSettings) throw siteKeyNotRegisteredError(siteKey);
|
|
36
36
|
const allowedDomains = clientSettings.settings?.domains;
|
|
37
|
-
if (!allowedDomains) throw siteKeyInvalidDomainError(
|
|
37
|
+
if (!allowedDomains) throw siteKeyInvalidDomainError(siteKey, req.hostname);
|
|
38
38
|
const origin = req.headers.origin;
|
|
39
|
-
if (!origin) throw unauthorizedOriginError(
|
|
39
|
+
if (!origin) throw unauthorizedOriginError(void 0);
|
|
40
40
|
const candidateOrigins = [origin, ...googleTranslateOrigins(origin)];
|
|
41
41
|
for (const candidate of candidateOrigins) for (const domain of allowedDomains) if (tasks.clientTaskManager.domainPatternMatcher(candidate, domain)) {
|
|
42
42
|
require_metrics.recordDomainValidation("allowed");
|
|
43
43
|
next();
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
|
-
throw unauthorizedOriginError(
|
|
46
|
+
throw unauthorizedOriginError(origin);
|
|
47
47
|
} catch (err) {
|
|
48
48
|
require_metrics.recordDomainValidation("rejected");
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
req.logger.error(() => ({
|
|
52
|
-
err,
|
|
53
|
-
msg: "Domain middleware error"
|
|
54
|
-
}));
|
|
55
|
-
res.status(401).json({
|
|
56
|
-
error: "Unauthorized",
|
|
57
|
-
message: "Unauthorized"
|
|
58
|
-
});
|
|
49
|
+
if ((0, _prosopo_common.isProsopoError)(err) || err instanceof zod.ZodError || err instanceof SyntaxError) {
|
|
50
|
+
(0, _prosopo_api_express_router.handleErrors)(err, req, res, next);
|
|
59
51
|
return;
|
|
60
52
|
}
|
|
53
|
+
req.logger.error(() => ({
|
|
54
|
+
err,
|
|
55
|
+
msg: "Domain middleware error"
|
|
56
|
+
}));
|
|
57
|
+
const error = new _prosopo_common.ProsopoError({
|
|
58
|
+
code: "UNAUTHORIZED",
|
|
59
|
+
errorSite: "PROV-85",
|
|
60
|
+
cause: err
|
|
61
|
+
});
|
|
62
|
+
res.status(error.status).json({ error: (0, _prosopo_common.toPublicError)(error, "BACKEND_ERROR") });
|
|
61
63
|
}
|
|
62
64
|
};
|
|
63
65
|
};
|
|
@@ -71,46 +73,36 @@ var googleTranslateOrigins = (origin) => {
|
|
|
71
73
|
return [];
|
|
72
74
|
}
|
|
73
75
|
};
|
|
74
|
-
var siteKeyNotRegisteredError = (
|
|
75
|
-
return new _prosopo_common.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
},
|
|
80
|
-
i18n,
|
|
81
|
-
logger
|
|
76
|
+
var siteKeyNotRegisteredError = (dapp) => {
|
|
77
|
+
return new _prosopo_common.ProsopoError({
|
|
78
|
+
code: "SITE_KEY_NOT_REGISTERED",
|
|
79
|
+
errorSite: "PROV-30",
|
|
80
|
+
context: { siteKey: dapp }
|
|
82
81
|
});
|
|
83
82
|
};
|
|
84
|
-
var invalidSiteKeyError = (
|
|
85
|
-
return new _prosopo_common.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
},
|
|
90
|
-
i18n,
|
|
91
|
-
logger
|
|
83
|
+
var invalidSiteKeyError = (siteKey) => {
|
|
84
|
+
return new _prosopo_common.ProsopoError({
|
|
85
|
+
code: "SITE_KEY_INVALID",
|
|
86
|
+
errorSite: "PROV-31",
|
|
87
|
+
context: { siteKey }
|
|
92
88
|
});
|
|
93
89
|
};
|
|
94
|
-
var unauthorizedOriginError = (
|
|
95
|
-
return new _prosopo_common.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
},
|
|
100
|
-
i18n,
|
|
101
|
-
logger
|
|
90
|
+
var unauthorizedOriginError = (origin) => {
|
|
91
|
+
return new _prosopo_common.ProsopoError({
|
|
92
|
+
code: "ORIGIN_NOT_ALLOWED",
|
|
93
|
+
errorSite: "PROV-32",
|
|
94
|
+
context: { origin }
|
|
102
95
|
});
|
|
103
96
|
};
|
|
104
|
-
var siteKeyInvalidDomainError = (
|
|
105
|
-
return new _prosopo_common.
|
|
97
|
+
var siteKeyInvalidDomainError = (dapp, domain) => {
|
|
98
|
+
return new _prosopo_common.ProsopoError({
|
|
99
|
+
code: "ORIGIN_NOT_ALLOWED",
|
|
100
|
+
errorSite: "PROV-33",
|
|
106
101
|
context: {
|
|
107
|
-
code: 400,
|
|
108
102
|
message: "No domains are allowed for this site key. Please fix in the Procaptcha Portal",
|
|
109
103
|
siteKey: dapp,
|
|
110
104
|
domain
|
|
111
|
-
}
|
|
112
|
-
i18n,
|
|
113
|
-
logger
|
|
105
|
+
}
|
|
114
106
|
});
|
|
115
107
|
};
|
|
116
108
|
//#endregion
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
let _prosopo_common = require("@prosopo/common");
|
|
2
|
+
//#region src/api/errorCodeForReason.ts
|
|
3
|
+
var RENAMED = {
|
|
4
|
+
"API.INVALID_SITE_KEY": "SITE_KEY_INVALID",
|
|
5
|
+
"API.UNAUTHORIZED_ORIGIN_URL": "ORIGIN_NOT_ALLOWED",
|
|
6
|
+
"API.BAD_REQUEST": "INVALID_REQUEST"
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* A request validation outcome (a `ResultReason` or other translation key) as
|
|
10
|
+
* the error code the widget branches on: the key without its namespace, e.g.
|
|
11
|
+
* `API.VPN_BLOCKED` is `VPN_BLOCKED`. An outcome with no code of its own gets
|
|
12
|
+
* `fallback`.
|
|
13
|
+
*/
|
|
14
|
+
var errorCodeForReason = (reason, fallback = "INVALID_REQUEST") => {
|
|
15
|
+
if (reason === void 0) return fallback;
|
|
16
|
+
const renamed = RENAMED[reason];
|
|
17
|
+
if (renamed) return renamed;
|
|
18
|
+
const unprefixed = reason.slice(reason.indexOf(".") + 1);
|
|
19
|
+
return (0, _prosopo_common.isErrorCode)(unprefixed) ? unprefixed : fallback;
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
exports.errorCodeForReason = errorCodeForReason;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const require_validateAddress = require("./validateAddress.cjs");
|
|
2
|
+
let _prosopo_common = require("@prosopo/common");
|
|
2
3
|
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
3
4
|
//#region src/api/headerCheckMiddleware.ts
|
|
4
5
|
var headerCheckMiddleware = (env) => {
|
|
@@ -7,15 +8,23 @@ var headerCheckMiddleware = (env) => {
|
|
|
7
8
|
const user = req.headers["prosopo-user"];
|
|
8
9
|
const siteKey = req.headers["prosopo-site-key"];
|
|
9
10
|
if (!user) {
|
|
10
|
-
|
|
11
|
+
(0, _prosopo_api_express_router.sendProsopoError)(res, new _prosopo_common.ProsopoError({
|
|
12
|
+
code: "UNAUTHORIZED",
|
|
13
|
+
errorSite: "PROV-86",
|
|
14
|
+
message: "Missing prosopo-user header"
|
|
15
|
+
}));
|
|
11
16
|
return;
|
|
12
17
|
}
|
|
13
18
|
if (!siteKey) {
|
|
14
|
-
|
|
19
|
+
(0, _prosopo_api_express_router.sendProsopoError)(res, new _prosopo_common.ProsopoError({
|
|
20
|
+
code: "UNAUTHORIZED",
|
|
21
|
+
errorSite: "PROV-87",
|
|
22
|
+
message: "Missing prosopo-site-key header"
|
|
23
|
+
}));
|
|
15
24
|
return;
|
|
16
25
|
}
|
|
17
|
-
require_validateAddress.validateSiteKey(siteKey
|
|
18
|
-
require_validateAddress.validateAddr(user
|
|
26
|
+
require_validateAddress.validateSiteKey(siteKey);
|
|
27
|
+
require_validateAddress.validateAddr(user);
|
|
19
28
|
req.user = user;
|
|
20
29
|
req.siteKey = siteKey;
|
|
21
30
|
req.logger = req.logger.with({
|
|
@@ -28,9 +37,5 @@ var headerCheckMiddleware = (env) => {
|
|
|
28
37
|
}
|
|
29
38
|
};
|
|
30
39
|
};
|
|
31
|
-
var unauthorised = (res) => res.status(401).json({
|
|
32
|
-
error: "Unauthorized",
|
|
33
|
-
message: "Unauthorized"
|
|
34
|
-
});
|
|
35
40
|
//#endregion
|
|
36
41
|
exports.headerCheckMiddleware = headerCheckMiddleware;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
//#region src/api/ipInfoMiddleware.ts
|
|
2
|
-
var ipInfoMiddleware = (env) => {
|
|
2
|
+
var ipInfoMiddleware = (env, skipPaths = /* @__PURE__ */ new Set()) => {
|
|
3
3
|
return async (req, _res, next) => {
|
|
4
|
+
if (skipPaths.has(req.path)) {
|
|
5
|
+
next();
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
4
8
|
try {
|
|
5
9
|
const ip = req.ip;
|
|
6
10
|
if (ip && env.ipInfoService.isAvailable()) req.ipInfo = await env.ipInfoService.lookup(ip);
|
package/dist/cjs/api/metrics.cjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
let _prosopo_common = require("@prosopo/common");
|
|
1
2
|
let _prosopo_types = require("@prosopo/types");
|
|
3
|
+
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
2
4
|
let node_crypto = require("node:crypto");
|
|
3
5
|
let node_net = require("node:net");
|
|
4
6
|
let prom_client = require("prom-client");
|
|
@@ -386,7 +388,13 @@ var metricsHandler = (env) => {
|
|
|
386
388
|
return async (req, res) => {
|
|
387
389
|
const access = metricsAccess(req);
|
|
388
390
|
if (access !== 200) {
|
|
389
|
-
|
|
391
|
+
(0, _prosopo_api_express_router.sendProsopoError)(res, access === 401 ? new _prosopo_common.ProsopoError({
|
|
392
|
+
code: "UNAUTHORIZED",
|
|
393
|
+
errorSite: "PROV-91"
|
|
394
|
+
}) : new _prosopo_common.ProsopoError({
|
|
395
|
+
code: "FORBIDDEN",
|
|
396
|
+
errorSite: "PROV-92"
|
|
397
|
+
}));
|
|
390
398
|
return;
|
|
391
399
|
}
|
|
392
400
|
const m = getMetrics();
|
package/dist/cjs/api/public.cjs
CHANGED
|
@@ -62,7 +62,11 @@ function publicRouter(env) {
|
|
|
62
62
|
data: { reqParams: req.params },
|
|
63
63
|
msg: "Error getting provider details"
|
|
64
64
|
}));
|
|
65
|
-
return next(new _prosopo_common.
|
|
65
|
+
return next(new _prosopo_common.ProsopoError({
|
|
66
|
+
code: "UNEXPECTED",
|
|
67
|
+
errorSite: "PROV-34",
|
|
68
|
+
message: "BadRequest"
|
|
69
|
+
}));
|
|
66
70
|
}
|
|
67
71
|
});
|
|
68
72
|
router.use(require_assetDocument.assetDocumentRouter());
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
let _prosopo_common = require("@prosopo/common");
|
|
2
|
+
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
3
|
+
//#region src/api/rateLimitHandler.ts
|
|
4
|
+
var rateLimitHandler = (logger, path) => (req, res, _next, options) => {
|
|
5
|
+
logger.warn(() => ({
|
|
6
|
+
msg: "Rate limit exceeded",
|
|
7
|
+
data: {
|
|
8
|
+
path,
|
|
9
|
+
ip: req.ip,
|
|
10
|
+
siteKey: req.headers["prosopo-site-key"]
|
|
11
|
+
}
|
|
12
|
+
}));
|
|
13
|
+
(0, _prosopo_api_express_router.sendProsopoError)(res, new _prosopo_common.ProsopoError({
|
|
14
|
+
code: "RATE_LIMITED",
|
|
15
|
+
errorSite: "PROV-93",
|
|
16
|
+
status: options.statusCode
|
|
17
|
+
}));
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
exports.rateLimitHandler = rateLimitHandler;
|
|
@@ -17,11 +17,11 @@ const require_detectorPoolBodyParser = require("./detectorPoolBodyParser.cjs");
|
|
|
17
17
|
const require_headerCheckMiddleware = require("./headerCheckMiddleware.cjs");
|
|
18
18
|
const require_ignoreMiddleware = require("./ignoreMiddleware.cjs");
|
|
19
19
|
const require_ipInfoMiddleware = require("./ipInfoMiddleware.cjs");
|
|
20
|
+
const require_rateLimitHandler = require("./rateLimitHandler.cjs");
|
|
20
21
|
const require_robotsMiddleware = require("./robotsMiddleware.cjs");
|
|
21
22
|
let _prosopo_logger = require("@prosopo/logger");
|
|
22
23
|
let _prosopo_types = require("@prosopo/types");
|
|
23
24
|
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
24
|
-
let _prosopo_locale = require("@prosopo/locale");
|
|
25
25
|
let node_fs = require("node:fs");
|
|
26
26
|
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
27
27
|
let node_path = require("node:path");
|
|
@@ -30,6 +30,7 @@ let node_https = require("node:https");
|
|
|
30
30
|
node_https = require_runtime.__toESM(node_https, 1);
|
|
31
31
|
let express = require("express");
|
|
32
32
|
express = require_runtime.__toESM(express, 1);
|
|
33
|
+
let _prosopo_locale = require("@prosopo/locale");
|
|
33
34
|
let node_url = require("node:url");
|
|
34
35
|
let _prosopo_user_access_policy_api = require("@prosopo/user-access-policy/api");
|
|
35
36
|
let cors = require("cors");
|
|
@@ -73,6 +74,7 @@ var providerCorsOptions = {
|
|
|
73
74
|
var isTlsAvailable = () => {
|
|
74
75
|
return node_fs.default.existsSync(keyPath) && node_fs.default.existsSync(crtPath);
|
|
75
76
|
};
|
|
77
|
+
var getServerVerifyPaths = () => Object.values(_prosopo_types.ClientApiPaths).filter((path) => path.endsWith("/verify"));
|
|
76
78
|
/**
|
|
77
79
|
* Get client API paths that expect Prosopo headers (like site key) for validation, excluding verify and spam routes
|
|
78
80
|
* @returns Array of ClientApiPaths excluding verify and spam routes
|
|
@@ -181,36 +183,25 @@ async function startProviderApi(env, admin = false, port) {
|
|
|
181
183
|
...(0, _prosopo_user_access_policy_api.getExpressApiRuleRateLimits)()
|
|
182
184
|
};
|
|
183
185
|
const adminPaths = Object.values(_prosopo_types.AdminApiPaths);
|
|
184
|
-
const rateLimitHandler = (path) => (req, res, _next, options) => {
|
|
185
|
-
env.logger.warn(() => ({
|
|
186
|
-
msg: "Rate limit exceeded",
|
|
187
|
-
data: {
|
|
188
|
-
path,
|
|
189
|
-
ip: req.ip,
|
|
190
|
-
siteKey: req.headers["prosopo-site-key"]
|
|
191
|
-
}
|
|
192
|
-
}));
|
|
193
|
-
res.status(options.statusCode).send(options.message);
|
|
194
|
-
};
|
|
195
186
|
for (const [path, limit] of Object.entries(rateLimits)) {
|
|
196
187
|
const enumPath = path;
|
|
197
188
|
if (adminPaths.includes(enumPath)) apiApp.use(enumPath, (0, express_rate_limit.default)({
|
|
198
189
|
...limit,
|
|
199
|
-
handler: rateLimitHandler(enumPath),
|
|
190
|
+
handler: require_rateLimitHandler.rateLimitHandler(env.logger, enumPath),
|
|
200
191
|
keyGenerator: (req) => {
|
|
201
192
|
return getUserFromJWT(req) || req.ip || "unknown";
|
|
202
193
|
}
|
|
203
194
|
}));
|
|
204
195
|
else if (path === _prosopo_types.ClientApiPaths.VerifyImageCaptchaSolutionDapp || path === _prosopo_types.ClientApiPaths.VerifyPowCaptchaSolution) apiApp.use(enumPath, (0, express_rate_limit.default)({
|
|
205
196
|
...limit,
|
|
206
|
-
handler: rateLimitHandler(enumPath),
|
|
197
|
+
handler: require_rateLimitHandler.rateLimitHandler(env.logger, enumPath),
|
|
207
198
|
keyGenerator: (req) => {
|
|
208
199
|
return req.headers["prosopo-site-key"] || req.ip || "unknown";
|
|
209
200
|
}
|
|
210
201
|
}));
|
|
211
202
|
else apiApp.use(enumPath, (0, express_rate_limit.default)({
|
|
212
203
|
...limit,
|
|
213
|
-
handler: rateLimitHandler(enumPath)
|
|
204
|
+
handler: require_rateLimitHandler.rateLimitHandler(env.logger, enumPath)
|
|
214
205
|
}));
|
|
215
206
|
}
|
|
216
207
|
}
|
|
@@ -222,7 +213,7 @@ async function startProviderApi(env, admin = false, port) {
|
|
|
222
213
|
apiApp.use(require_ja4Middleware.ja4Middleware(env));
|
|
223
214
|
apiApp.use(require_handshakeTimingMiddleware.handshakeTimingMiddleware(env));
|
|
224
215
|
apiApp.use(require_rawTlsSignalsMiddleware.rawTlsSignalsMiddleware(env));
|
|
225
|
-
apiApp.use(require_ipInfoMiddleware.ipInfoMiddleware(env));
|
|
216
|
+
apiApp.use(require_ipInfoMiddleware.ipInfoMiddleware(env, new Set(getServerVerifyPaths())));
|
|
226
217
|
apiApp.use(clientPathsExcludingVerify, require_headerCheckMiddleware.headerCheckMiddleware(env));
|
|
227
218
|
apiApp.use(require_verify.prosopoVerifyRouter(env));
|
|
228
219
|
env.logger.info(() => ({ msg: "Enabling admin auth middleware" }));
|
|
@@ -270,6 +261,7 @@ async function startProviderApi(env, admin = false, port) {
|
|
|
270
261
|
}
|
|
271
262
|
//#endregion
|
|
272
263
|
exports.getClientApiPathsExpectingProsopoHeaders = getClientApiPathsExpectingProsopoHeaders;
|
|
264
|
+
exports.getServerVerifyPaths = getServerVerifyPaths;
|
|
273
265
|
exports.getUserFromJWT = getUserFromJWT;
|
|
274
266
|
exports.isTlsAvailable = isTlsAvailable;
|
|
275
267
|
exports.providerCorsOptions = providerCorsOptions;
|
|
@@ -1,27 +1,21 @@
|
|
|
1
1
|
let _prosopo_common = require("@prosopo/common");
|
|
2
2
|
let _prosopo_util_crypto = require("@prosopo/util-crypto");
|
|
3
3
|
//#region src/api/validateAddress.ts
|
|
4
|
-
var validateSiteKey = (siteKey
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
var validateSiteKey = (siteKey) => validateAddr(siteKey, "SITE_KEY_INVALID");
|
|
5
|
+
var validateAddr = (address, code = "INVALID_REQUEST") => {
|
|
6
|
+
let valid = false;
|
|
7
|
+
let cause;
|
|
8
8
|
try {
|
|
9
|
-
|
|
10
|
-
context: {
|
|
11
|
-
code: 400,
|
|
12
|
-
siteKey: address
|
|
13
|
-
},
|
|
14
|
-
logger
|
|
15
|
-
});
|
|
9
|
+
valid = (0, _prosopo_util_crypto.validateAddress)(address, false, 42);
|
|
16
10
|
} catch (err) {
|
|
17
|
-
|
|
18
|
-
context: {
|
|
19
|
-
code: 400,
|
|
20
|
-
siteKey: address
|
|
21
|
-
},
|
|
22
|
-
logger
|
|
23
|
-
});
|
|
11
|
+
cause = err;
|
|
24
12
|
}
|
|
13
|
+
if (!valid) throw new _prosopo_common.ProsopoError({
|
|
14
|
+
code,
|
|
15
|
+
errorSite: "PROV-35",
|
|
16
|
+
cause,
|
|
17
|
+
context: { siteKey: address }
|
|
18
|
+
});
|
|
25
19
|
};
|
|
26
20
|
//#endregion
|
|
27
21
|
exports.validateAddr = validateAddr;
|