@prosopo/provider 5.14.0 → 5.16.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 +62 -46
- package/.turbo/turbo-build$colon$tsc.log +37 -34
- package/.turbo/turbo-build.log +63 -50
- package/CHANGELOG.md +193 -0
- package/LICENSE +201 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +4 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +63 -3
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.js +2 -2
- package/dist/api/captcha/getAudioCaptchaChallenge.d.ts +5 -0
- package/dist/api/captcha/getAudioCaptchaChallenge.d.ts.map +1 -0
- package/dist/api/captcha/getAudioCaptchaChallenge.js +37 -0
- package/dist/api/captcha/getAudioCaptchaChallenge.js.map +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +2 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -2
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +26 -15
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +5 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +20 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +1 -0
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
- package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts +5 -0
- package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts.map +1 -0
- package/dist/api/captcha/getIconOrderCaptchaChallenge.js +37 -0
- package/dist/api/captcha/getIconOrderCaptchaChallenge.js.map +1 -0
- package/dist/api/captcha/getImageCaptchaChallenge.js +2 -2
- package/dist/api/captcha/getPoWCaptchaChallenge.js +4 -4
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +1 -3
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +53 -146
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/interactiveCaptchaChallenge.d.ts +42 -0
- package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -0
- package/dist/api/captcha/interactiveCaptchaChallenge.js +154 -0
- package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -0
- package/dist/api/captcha/interactiveCaptchaSolution.d.ts +14 -0
- package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -0
- package/dist/api/captcha/interactiveCaptchaSolution.js +77 -0
- package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -0
- package/dist/api/captcha/maintenanceModeResponses.d.ts +4 -2
- package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
- package/dist/api/captcha/maintenanceModeResponses.js +28 -1
- package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
- package/dist/api/captcha/submitAudioCaptchaSolution.d.ts +4 -0
- package/dist/api/captcha/submitAudioCaptchaSolution.d.ts.map +1 -0
- package/dist/api/captcha/submitAudioCaptchaSolution.js +11 -0
- package/dist/api/captcha/submitAudioCaptchaSolution.js.map +1 -0
- package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts +4 -0
- package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts.map +1 -0
- package/dist/api/captcha/submitIconOrderCaptchaSolution.js +11 -0
- package/dist/api/captcha/submitIconOrderCaptchaSolution.js.map +1 -0
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts +4 -11
- package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPoWCaptchaSolution.js +13 -18
- package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts +1 -3
- package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
- package/dist/api/captcha/submitPuzzleCaptchaSolution.js +6 -73
- package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
- package/dist/api/captcha/trafficFilterRequestTime.d.ts +4 -1
- package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
- package/dist/api/captcha/trafficFilterRequestTime.js +3 -0
- package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +8 -0
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/domainMiddleware.js +1 -1
- package/dist/api/ja4Middleware.js +1 -1
- package/dist/api/rawTlsSignalsMiddleware.d.ts +14 -1
- package/dist/api/rawTlsSignalsMiddleware.d.ts.map +1 -1
- package/dist/api/rawTlsSignalsMiddleware.js +111 -23
- package/dist/api/rawTlsSignalsMiddleware.js.map +1 -1
- package/dist/api/startProviderApi.js +2 -2
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +153 -96
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +65 -2
- package/dist/cjs/api/blacklistRequestInspector.cjs +2 -2
- package/dist/cjs/api/captcha/getAudioCaptchaChallenge.cjs +37 -0
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -0
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +1 -1
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +25 -14
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +20 -0
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +1 -0
- package/dist/cjs/api/captcha/getIconOrderCaptchaChallenge.cjs +37 -0
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -2
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -4
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +52 -145
- package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +154 -0
- package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +77 -0
- package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +29 -0
- package/dist/cjs/api/captcha/submitAudioCaptchaSolution.cjs +11 -0
- package/dist/cjs/api/captcha/submitIconOrderCaptchaSolution.cjs +11 -0
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +11 -16
- package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +6 -73
- package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +3 -0
- package/dist/cjs/api/captcha.cjs +8 -0
- package/dist/cjs/api/domainMiddleware.cjs +1 -1
- package/dist/cjs/api/ja4Middleware.cjs +1 -1
- package/dist/cjs/api/rawTlsSignalsMiddleware.cjs +111 -22
- package/dist/cjs/api/startProviderApi.cjs +2 -2
- package/dist/cjs/api/verify.cjs +152 -95
- package/dist/cjs/compositeIpAddress.cjs +21 -7
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/tasks/audio/audioBuffer.cjs +72 -0
- package/dist/cjs/tasks/audio/audioRenderer.cjs +32 -0
- package/dist/cjs/tasks/audioAlternative.cjs +23 -0
- package/dist/cjs/tasks/audioCaptcha/audioTasks.cjs +65 -0
- package/dist/cjs/tasks/audioCaptcha/audioTasksUtils.cjs +19 -0
- package/dist/cjs/tasks/captchaManager.cjs +28 -1
- package/dist/cjs/tasks/captchaTypeSelection.cjs +31 -3
- package/dist/cjs/tasks/client/clientTasks.cjs +2 -2
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +49 -26
- package/dist/cjs/tasks/iconOrder/iconOrderRenderer.cjs +42 -0
- package/dist/cjs/tasks/iconOrderCaptcha/iconOrderTasks.cjs +69 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +10 -17
- package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +423 -0
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +15 -19
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +3 -1
- package/dist/cjs/tasks/puzzle/backgroundBuffer.cjs +3 -3
- package/dist/cjs/tasks/puzzle/nativeBackground.cjs +12 -5
- package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +4 -3
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +40 -493
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +18 -1
- package/dist/cjs/tasks/tasks.cjs +6 -0
- package/dist/cjs/util.cjs +1 -1
- package/dist/compositeIpAddress.d.ts.map +1 -1
- package/dist/compositeIpAddress.js +21 -7
- package/dist/compositeIpAddress.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/tasks/audio/audioBuffer.d.ts +23 -0
- package/dist/tasks/audio/audioBuffer.d.ts.map +1 -0
- package/dist/tasks/audio/audioBuffer.js +70 -0
- package/dist/tasks/audio/audioBuffer.js.map +1 -0
- package/dist/tasks/audio/audioRenderer.d.ts +11 -0
- package/dist/tasks/audio/audioRenderer.d.ts.map +1 -0
- package/dist/tasks/audio/audioRenderer.js +31 -0
- package/dist/tasks/audio/audioRenderer.js.map +1 -0
- package/dist/tasks/audioAlternative.d.ts +8 -0
- package/dist/tasks/audioAlternative.d.ts.map +1 -0
- package/dist/tasks/audioAlternative.js +20 -0
- package/dist/tasks/audioAlternative.js.map +1 -0
- package/dist/tasks/audioCaptcha/audioTasks.d.ts +19 -0
- package/dist/tasks/audioCaptcha/audioTasks.d.ts.map +1 -0
- package/dist/tasks/audioCaptcha/audioTasks.js +65 -0
- package/dist/tasks/audioCaptcha/audioTasks.js.map +1 -0
- package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts +3 -0
- package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts.map +1 -0
- package/dist/tasks/audioCaptcha/audioTasksUtils.js +18 -0
- package/dist/tasks/audioCaptcha/audioTasksUtils.js.map +1 -0
- package/dist/tasks/captchaManager.d.ts +9 -3
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +29 -2
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/captchaTypeSelection.d.ts +4 -2
- package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
- package/dist/tasks/captchaTypeSelection.js +32 -5
- package/dist/tasks/captchaTypeSelection.js.map +1 -1
- package/dist/tasks/client/clientTasks.js +2 -2
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +6 -1
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +51 -28
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
- package/dist/tasks/frictionless/routingMachine.d.ts +1 -2
- package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
- package/dist/tasks/frictionless/routingMachine.js.map +1 -1
- package/dist/tasks/iconOrder/iconOrderRenderer.d.ts +12 -0
- package/dist/tasks/iconOrder/iconOrderRenderer.d.ts.map +1 -0
- package/dist/tasks/iconOrder/iconOrderRenderer.js +40 -0
- package/dist/tasks/iconOrder/iconOrderRenderer.js.map +1 -0
- package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts +22 -0
- package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts.map +1 -0
- package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js +69 -0
- package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +10 -17
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts +52 -0
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -0
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +423 -0
- package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +15 -19
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +3 -2
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.d.ts +3 -2
- package/dist/tasks/puzzle/backgroundBuffer.d.ts.map +1 -1
- package/dist/tasks/puzzle/backgroundBuffer.js +3 -3
- package/dist/tasks/puzzle/backgroundBuffer.js.map +1 -1
- package/dist/tasks/puzzle/nativeBackground.d.ts +5 -1
- package/dist/tasks/puzzle/nativeBackground.d.ts.map +1 -1
- package/dist/tasks/puzzle/nativeBackground.js +12 -5
- package/dist/tasks/puzzle/nativeBackground.js.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.d.ts +2 -0
- package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
- package/dist/tasks/puzzle/puzzleRenderer.js +4 -3
- package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts +14 -16
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +41 -494
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts +4 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +18 -1
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tasks/tasks.d.ts +4 -0
- package/dist/tasks/tasks.d.ts.map +1 -1
- package/dist/tasks/tasks.js +6 -0
- package/dist/tasks/tasks.js.map +1 -1
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +7 -3
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js +44 -2
- package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +4 -2
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +76 -1
- package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +54 -2
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +45 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +20 -0
- package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js +15 -1
- package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js.map +1 -1
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +174 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js +96 -1
- package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/compositeIpAddress.unit.test.js +12 -3
- package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js +105 -0
- package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/audioAlternative.unit.test.js +76 -0
- package/dist/tests/unit/tasks/audioAlternative.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js +259 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js +52 -0
- package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +171 -2
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +68 -6
- package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +123 -0
- package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +31 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +103 -0
- package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js +28 -0
- package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js +60 -0
- package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js +225 -0
- package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +23 -1
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js +1 -4
- package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js +10 -3
- package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js +35 -0
- package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js +49 -0
- package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js.map +1 -0
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +17 -14
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts.map +1 -1
- package/dist/tests/unit/testUtils/mockProviderEnv.js.map +1 -1
- package/dist/util.js +1 -1
- package/package.json +107 -103
|
@@ -1,29 +1,32 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_dnsEventUrl = require("../../dnsEventUrl.cjs");
|
|
1
|
+
const require_rawTlsSignalsMiddleware = require("../../rawTlsSignalsMiddleware.cjs");
|
|
3
2
|
const require_compositeIpAddress = require("../../../compositeIpAddress.cjs");
|
|
4
|
-
const require_blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
|
|
5
3
|
const require_devicePlatform = require("../../../utils/devicePlatform.cjs");
|
|
4
|
+
const require_metrics = require("../../metrics.cjs");
|
|
5
|
+
const require_blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
|
|
6
|
+
const require_audioAlternative = require("../../../tasks/audioAlternative.cjs");
|
|
7
|
+
const require_dnsEventUrl = require("../../dnsEventUrl.cjs");
|
|
8
|
+
const require_captchaTypeSelection = require("../../../tasks/captchaTypeSelection.cjs");
|
|
6
9
|
const require_tasks = require("../../../tasks/tasks.cjs");
|
|
7
10
|
const require_apiToggleMaintenanceModeEndpoint = require("../../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
8
11
|
const require_testSiteKey = require("../../testSiteKey.cjs");
|
|
9
12
|
const require_normalizeRequestIp = require("../../../utils/normalizeRequestIp.cjs");
|
|
13
|
+
const require_trafficFilterRequestTime = require("../trafficFilterRequestTime.cjs");
|
|
14
|
+
const require_maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
|
|
10
15
|
const require_hashUserAgent = require("../../../utils/hashUserAgent.cjs");
|
|
11
16
|
const require_hashUserIp = require("../../../utils/hashUserIp.cjs");
|
|
12
|
-
const require_rawTlsSignalsMiddleware = require("../../rawTlsSignalsMiddleware.cjs");
|
|
13
|
-
const require_maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
|
|
14
|
-
const require_trafficFilterRequestTime = require("../trafficFilterRequestTime.cjs");
|
|
15
17
|
const require_honeypotResponse = require("./honeypotResponse.cjs");
|
|
16
18
|
const require_accessPolicy = require("./accessPolicy.cjs");
|
|
17
19
|
const require_constants = require("./constants.cjs");
|
|
18
20
|
const require_decisionMachine = require("./decisionMachine.cjs");
|
|
19
21
|
const require_decryptSimdReadings = require("./decryptSimdReadings.cjs");
|
|
22
|
+
const require_refreshLineage = require("./refreshLineage.cjs");
|
|
20
23
|
const require_sessionDedup = require("./sessionDedup.cjs");
|
|
21
24
|
const require_shortCircuit = require("./shortCircuit.cjs");
|
|
22
25
|
let _prosopo_common = require("@prosopo/common");
|
|
23
26
|
let _prosopo_types = require("@prosopo/types");
|
|
27
|
+
let _prosopo_user_access_policy = require("@prosopo/user-access-policy");
|
|
24
28
|
let _prosopo_util = require("@prosopo/util");
|
|
25
29
|
let uuid = require("uuid");
|
|
26
|
-
let _prosopo_user_access_policy = require("@prosopo/user-access-policy");
|
|
27
30
|
let _prosopo_web_bot_auth = require("@prosopo/web-bot-auth");
|
|
28
31
|
//#region src/api/captcha/getFrictionlessCaptchaChallenge/handler.ts
|
|
29
32
|
var handler_default = (env, userAccessRulesStorage) => async (req, res, next) => {
|
|
@@ -38,7 +41,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
38
41
|
}
|
|
39
42
|
}));
|
|
40
43
|
});
|
|
41
|
-
const { token, headHash, dapp, user, mode, simdReadings, detectorSessionId, currentUrl: reportedCurrentUrl, iframeUrl: reportedIframeUrl, clientSessionId } = _prosopo_types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
|
|
44
|
+
const { token, headHash, dapp, user, mode, simdReadings, detectorSessionId, currentUrl: reportedCurrentUrl, iframeUrl: reportedIframeUrl, clientSessionId, refreshOf } = _prosopo_types.GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);
|
|
42
45
|
const currentUrl = (0, _prosopo_util.sanitisePageUrl)(reportedCurrentUrl);
|
|
43
46
|
const iframeUrl = (0, _prosopo_util.sanitisePageUrl)(reportedIframeUrl);
|
|
44
47
|
const isProtect = (0, _prosopo_util.isProtectDeployment)(currentUrl, iframeUrl);
|
|
@@ -108,6 +111,10 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
108
111
|
i18n: req.i18n,
|
|
109
112
|
logger: req.logger
|
|
110
113
|
}));
|
|
114
|
+
const audioAlternativeEnabled = require_audioAlternative.isAudioAlternativeEnabled(clientRecord.settings);
|
|
115
|
+
tasks.frictionlessManager.setAudioAlternativeEnabled(audioAlternativeEnabled);
|
|
116
|
+
const allowedCaptchaTypes = require_constants.resolveSiteAllowedCaptchaTypes(clientRecord.settings);
|
|
117
|
+
tasks.frictionlessManager.setAllowedCaptchaTypes(allowedCaptchaTypes);
|
|
111
118
|
if (dedup) {
|
|
112
119
|
const dedupCountryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
|
|
113
120
|
const dedupAsn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
|
|
@@ -144,16 +151,17 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
144
151
|
...dedupTrafficPolicies && { trafficPolicies: dedupTrafficPolicies }
|
|
145
152
|
}
|
|
146
153
|
}) : { captchaType: cachedCaptchaType };
|
|
147
|
-
const dedupConflictsWithRouting = dedupRouted.captchaType !== cachedCaptchaType;
|
|
154
|
+
const dedupConflictsWithRouting = require_captchaTypeSelection.coerceToEnabledCaptchaType(dedupRouted.captchaType, allowedCaptchaTypes) !== cachedCaptchaType;
|
|
155
|
+
const dedupConflictsWithAllowedTypes = require_captchaTypeSelection.coerceToEnabledCaptchaType(cachedCaptchaType, allowedCaptchaTypes) !== cachedCaptchaType;
|
|
148
156
|
let dedupConflictsWithBundle = false;
|
|
149
157
|
let dedupIncomingBundleId;
|
|
150
158
|
if (detectorSessionId && dedup.session.bundleId) {
|
|
151
159
|
dedupIncomingBundleId = (await tasks.frictionlessManager.resolveBundleByDetectorSession(detectorSessionId))?.bundleId;
|
|
152
160
|
if (dedupIncomingBundleId !== void 0 && dedupIncomingBundleId !== dedup.session.bundleId) dedupConflictsWithBundle = true;
|
|
153
161
|
}
|
|
154
|
-
if (dedupConflictsWithPolicy || dedupConflictsWithRouting) {
|
|
162
|
+
if (dedupConflictsWithPolicy || dedupConflictsWithRouting || dedupConflictsWithAllowedTypes) {
|
|
155
163
|
req.logger.info(() => ({
|
|
156
|
-
msg: "Evicting reused session: cached captchaType conflicts with access policy or
|
|
164
|
+
msg: "Evicting reused session: cached captchaType conflicts with access policy, routing machine or allowed types",
|
|
157
165
|
data: {
|
|
158
166
|
userSitekeyIpHash,
|
|
159
167
|
sessionId: dedup.sessionId,
|
|
@@ -162,7 +170,8 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
162
170
|
policyType: dedupAccessPolicy?.type,
|
|
163
171
|
policyCaptchaType: dedupAccessPolicy?.captchaType
|
|
164
172
|
},
|
|
165
|
-
...dedupConflictsWithRouting && { routedCaptchaType: dedupRouted.captchaType }
|
|
173
|
+
...dedupConflictsWithRouting && { routedCaptchaType: dedupRouted.captchaType },
|
|
174
|
+
...dedupConflictsWithAllowedTypes && { allowedCaptchaTypes }
|
|
166
175
|
}
|
|
167
176
|
}));
|
|
168
177
|
await tasks.db.checkAndRemoveSession(dedup.sessionId);
|
|
@@ -202,7 +211,8 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
202
211
|
[_prosopo_types.ApiParams.captchaType]: dedup.captchaType,
|
|
203
212
|
[_prosopo_types.ApiParams.sessionId]: dedup.sessionId,
|
|
204
213
|
[_prosopo_types.ApiParams.status]: "ok",
|
|
205
|
-
dns_url: require_dnsEventUrl.buildDnsEventUrl(dedup.sessionId)
|
|
214
|
+
dns_url: require_dnsEventUrl.buildDnsEventUrl(dedup.sessionId),
|
|
215
|
+
...require_audioAlternative.offersAudioAlternative(dedup.captchaType, audioAlternativeEnabled) && { audioAlternativeAvailable: true }
|
|
206
216
|
});
|
|
207
217
|
}
|
|
208
218
|
}
|
|
@@ -306,6 +316,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
306
316
|
...triggeredDetectors && triggeredDetectors.length > 0 && { triggeredDetectors },
|
|
307
317
|
...shadowDomPenalty !== void 0 && { shadowDomPenalty }
|
|
308
318
|
};
|
|
319
|
+
const refreshLineage = await require_refreshLineage.resolveRefreshLineage(tasks.db, refreshOf, dapp, /* @__PURE__ */ new Date());
|
|
309
320
|
tasks.frictionlessManager.setSessionParams({
|
|
310
321
|
token: sessionToken,
|
|
311
322
|
score: botScore,
|
|
@@ -326,6 +337,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
326
337
|
...decodedSimdReadings && { simdReadings: decodedSimdReadings },
|
|
327
338
|
...d !== void 0 && { d },
|
|
328
339
|
...clientSessionId && { clientMetaData: { clientSessionId } },
|
|
340
|
+
...refreshLineage,
|
|
329
341
|
...req.tcpToChelloUs !== void 0 && { tcpToChelloUs: req.tcpToChelloUs },
|
|
330
342
|
...req.chelloToHandshakeUs !== void 0 && { chelloToHandshakeUs: req.chelloToHandshakeUs },
|
|
331
343
|
...require_rawTlsSignalsMiddleware.rawTlsSignalsForSession(req)
|
|
@@ -341,7 +353,6 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
|
|
|
341
353
|
score: botScore,
|
|
342
354
|
imageMaxRounds: clientRecord.settings.imageMaxRounds,
|
|
343
355
|
imageMinRounds: clientRecord.settings.imageMinRounds,
|
|
344
|
-
frictionlessTypes: clientRecord.settings.frictionlessTypes,
|
|
345
356
|
baseImageRounds: env.config.captchas.solved.count,
|
|
346
357
|
puzzleMaxDifficulty: clientRecord.settings.puzzleMaxDifficulty,
|
|
347
358
|
platform: require_devicePlatform.derivePlatform(requestUserAgent, webView, { ...typeof ipInfoMobile === "boolean" && { isMobile: ipInfoMobile } }),
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.ts
|
|
2
|
+
/**
|
|
3
|
+
* Work out where a refresh sits in its chain from the session it replaced.
|
|
4
|
+
*
|
|
5
|
+
* An unknown session, or one from another site, is ignored rather than
|
|
6
|
+
* rejected: the request then mints an ordinary session, which is all a client
|
|
7
|
+
* that never sent `refreshOf` would have got.
|
|
8
|
+
*/
|
|
9
|
+
var resolveRefreshLineage = async (db, refreshOf, siteKey, now) => {
|
|
10
|
+
if (!refreshOf) return void 0;
|
|
11
|
+
const replaced = await db.getSessionRecordBySessionId(refreshOf);
|
|
12
|
+
if (!replaced || replaced.siteKey !== siteKey) return void 0;
|
|
13
|
+
return {
|
|
14
|
+
refreshOf,
|
|
15
|
+
refreshCount: (replaced.refreshCount ?? 0) + 1,
|
|
16
|
+
refreshedAfterMs: Math.max(0, now.getTime() - new Date(replaced.createdAt).getTime())
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
exports.resolveRefreshLineage = resolveRefreshLineage;
|
|
@@ -68,6 +68,7 @@ var runConfiguredCaptchaTypeShortCircuit = async (input, res) => {
|
|
|
68
68
|
}));
|
|
69
69
|
case _prosopo_types.CaptchaType.pow: return res.json(await input.tasks.frictionlessManager.sendPowCaptcha(sessionParams));
|
|
70
70
|
case _prosopo_types.CaptchaType.puzzle: return res.json(await input.tasks.frictionlessManager.sendPuzzleCaptcha(sessionParams));
|
|
71
|
+
case _prosopo_types.CaptchaType.iconOrder: return res.json(await input.tasks.frictionlessManager.sendIconOrderCaptcha(sessionParams));
|
|
71
72
|
default: throw new Error(`Unhandled configured captchaType in /frictionless short-circuit: ${configuredType}`);
|
|
72
73
|
}
|
|
73
74
|
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const require_iconOrderRenderer = require("../../tasks/iconOrder/iconOrderRenderer.cjs");
|
|
2
|
+
const require_interactiveCaptchaChallenge = require("./interactiveCaptchaChallenge.cjs");
|
|
3
|
+
const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
4
|
+
let _prosopo_types = require("@prosopo/types");
|
|
5
|
+
//#region src/api/captcha/getIconOrderCaptchaChallenge.ts
|
|
6
|
+
var issueIconOrderChallenge = async ({ tasks, user, dapp, clientSettings, sessionRecord, trafficVerdict, provenance }) => {
|
|
7
|
+
const challengeVerdict = trafficVerdict.kind === "challenge" ? trafficVerdict : void 0;
|
|
8
|
+
const tolerance = challengeVerdict?.iconOrderTolerance ?? sessionRecord?.iconOrderTolerance ?? clientSettings?.settings?.iconOrderTolerance;
|
|
9
|
+
const renderSettings = require_iconOrderRenderer.resolveIconOrderRenderSettings(clientSettings?.settings?.iconOrder, challengeVerdict?.iconOrderSettings ?? sessionRecord?.iconOrder);
|
|
10
|
+
const challenge = await tasks.iconOrderCaptchaManager.getIconOrderCaptchaChallenge(user, dapp, tolerance, () => require_iconOrderRenderer.renderIconOrderImages(renderSettings));
|
|
11
|
+
await tasks.db.storeIconOrderCaptchaRecord(challenge.challenge, {
|
|
12
|
+
requestedAtTimestamp: challenge.requestedAtTimestamp,
|
|
13
|
+
userAccount: user,
|
|
14
|
+
dappAccount: dapp
|
|
15
|
+
}, challenge.targets, challenge.tolerance, challenge.providerSignature, provenance.ipAddress, provenance.headers, provenance.ja4, provenance.sessionId, provenance.ipInfo);
|
|
16
|
+
return {
|
|
17
|
+
logData: { tolerance: challenge.tolerance },
|
|
18
|
+
response: {
|
|
19
|
+
[_prosopo_types.ApiParams.status]: "ok",
|
|
20
|
+
[_prosopo_types.ApiParams.challenge]: challenge.challenge,
|
|
21
|
+
[_prosopo_types.ApiParams.background]: challenge.images.background,
|
|
22
|
+
[_prosopo_types.ApiParams.legend]: challenge.images.legend,
|
|
23
|
+
[_prosopo_types.ApiParams.legendIconSize]: challenge.images.legendIconSize,
|
|
24
|
+
[_prosopo_types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
|
|
25
|
+
[_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: challenge.providerSignature } }
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
var getIconOrderCaptchaChallenge_default = (env, userAccessRulesStorage) => require_interactiveCaptchaChallenge.interactiveChallengeHandler(env, userAccessRulesStorage, {
|
|
30
|
+
captchaType: _prosopo_types.CaptchaType.iconOrder,
|
|
31
|
+
label: "icon-order",
|
|
32
|
+
manager: (tasks) => tasks.iconOrderCaptchaManager,
|
|
33
|
+
maintenanceResponse: require_maintenanceModeResponses.buildIconOrderMaintenanceResponse,
|
|
34
|
+
issue: issueIconOrderChallenge
|
|
35
|
+
});
|
|
36
|
+
//#endregion
|
|
37
|
+
exports.default = getIconOrderCaptchaChallenge_default;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
const require_validateAddress = require("../validateAddress.cjs");
|
|
2
1
|
const require_metrics = require("../metrics.cjs");
|
|
3
2
|
const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
3
|
+
const require_validateAddress = require("../validateAddress.cjs");
|
|
4
4
|
const require_tasks = require("../../tasks/tasks.cjs");
|
|
5
5
|
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
6
6
|
const require_testSiteKey = require("../testSiteKey.cjs");
|
|
7
7
|
const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
8
|
-
const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
9
8
|
const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
|
|
9
|
+
const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
10
10
|
const require_sealedAssetsResolver = require("./sealedAssetsResolver.cjs");
|
|
11
11
|
const require_signedAssetsResolver = require("./signedAssetsResolver.cjs");
|
|
12
12
|
let _prosopo_common = require("@prosopo/common");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
const require_validateAddress = require("../validateAddress.cjs");
|
|
2
|
-
const require_metrics = require("../metrics.cjs");
|
|
3
1
|
const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
|
|
2
|
+
const require_metrics = require("../metrics.cjs");
|
|
4
3
|
const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
4
|
+
const require_validateAddress = require("../validateAddress.cjs");
|
|
5
5
|
const require_tasks = require("../../tasks/tasks.cjs");
|
|
6
6
|
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
7
7
|
const require_testSiteKey = require("../testSiteKey.cjs");
|
|
8
8
|
const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
9
|
-
const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
10
|
-
const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
|
|
11
9
|
const require_requestBodySummary = require("../requestBodySummary.cjs");
|
|
10
|
+
const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
|
|
11
|
+
const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
12
12
|
let _prosopo_common = require("@prosopo/common");
|
|
13
13
|
let _prosopo_types = require("@prosopo/types");
|
|
14
14
|
let _prosopo_util = require("@prosopo/util");
|
|
@@ -1,120 +1,51 @@
|
|
|
1
|
-
const require_validateAddress = require("../validateAddress.cjs");
|
|
2
|
-
const require_metrics = require("../metrics.cjs");
|
|
3
|
-
const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
|
|
4
|
-
const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
5
1
|
const require_puzzleRenderer = require("../../tasks/puzzle/puzzleRenderer.cjs");
|
|
6
|
-
const
|
|
7
|
-
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
8
|
-
const require_testSiteKey = require("../testSiteKey.cjs");
|
|
9
|
-
const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
2
|
+
const require_interactiveCaptchaChallenge = require("./interactiveCaptchaChallenge.cjs");
|
|
10
3
|
const require_maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
11
|
-
const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
|
|
12
|
-
const require_requestBodySummary = require("../requestBodySummary.cjs");
|
|
13
|
-
let _prosopo_common = require("@prosopo/common");
|
|
14
4
|
let _prosopo_types = require("@prosopo/types");
|
|
15
|
-
let
|
|
5
|
+
let _prosopo_puzzle_assets = require("@prosopo/puzzle-assets");
|
|
16
6
|
//#region src/api/captcha/getPuzzleCaptchaChallenge.ts
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
var issuePuzzleChallenge = async ({ tasks, user, dapp, origin, clientSettings, sessionRecord, trafficVerdict, provenance }) => {
|
|
8
|
+
const challengeVerdict = trafficVerdict.kind === "challenge" ? trafficVerdict : void 0;
|
|
9
|
+
const tolerance = challengeVerdict?.puzzleTolerance ?? sessionRecord?.puzzleTolerance ?? clientSettings?.settings?.puzzleTolerance;
|
|
10
|
+
const routedPuzzleSettings = challengeVerdict?.puzzleSettings ?? sessionRecord?.puzzle;
|
|
11
|
+
const effectivePuzzleSettings = require_puzzleRenderer.resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, routedPuzzleSettings);
|
|
12
|
+
const effectivePieceSize = require_puzzleRenderer.resolvePuzzlePieceSize(clientSettings?.settings?.puzzle, routedPuzzleSettings);
|
|
13
|
+
const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
|
|
14
|
+
await tasks.db.storePuzzleCaptchaRecord(challenge.challenge, {
|
|
15
|
+
requestedAtTimestamp: challenge.requestedAtTimestamp,
|
|
16
|
+
userAccount: user,
|
|
17
|
+
dappAccount: dapp
|
|
18
|
+
}, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, provenance.ipAddress, provenance.headers, provenance.ja4, provenance.sessionId, provenance.ipInfo);
|
|
19
|
+
const images = await require_puzzleRenderer.renderPuzzleImages({
|
|
20
|
+
targetX: challenge.targetX,
|
|
21
|
+
targetY: challenge.targetY
|
|
22
|
+
}, effectivePuzzleSettings, effectivePieceSize);
|
|
23
|
+
await tasks.db.updatePuzzleCaptchaRecord(challenge.challenge, { render: {
|
|
24
|
+
...sessionRecord?.puzzleLevel !== void 0 && { level: sessionRecord.puzzleLevel },
|
|
25
|
+
pieceSize: images.pieceSize,
|
|
26
|
+
geometry: {
|
|
27
|
+
width: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.width,
|
|
28
|
+
height: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.height,
|
|
29
|
+
notchSize: _prosopo_puzzle_assets.DEFAULT_GEOMETRY.notchSize
|
|
30
|
+
},
|
|
31
|
+
settings: {
|
|
32
|
+
decoyCount: effectivePuzzleSettings.decoyCount,
|
|
33
|
+
decoyEdgeDarkness: effectivePuzzleSettings.decoyEdgeDarkness,
|
|
34
|
+
decoyBodyBrightness: effectivePuzzleSettings.decoyBodyBrightness,
|
|
35
|
+
holeDarken: effectivePuzzleSettings.holeDarken,
|
|
36
|
+
decoyHoleDarken: effectivePuzzleSettings.decoyHoleDarken
|
|
37
|
+
},
|
|
38
|
+
backgroundSeed: images.backgroundSeed,
|
|
39
|
+
renderSeed: images.renderSeed
|
|
40
|
+
} }).catch((updateErr) => {
|
|
41
|
+
tasks.logger.warn(() => ({
|
|
42
|
+
err: updateErr,
|
|
43
|
+
msg: "Failed to patch puzzle render inputs onto the challenge record"
|
|
29
44
|
}));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
35
|
-
req.logger.info(() => ({
|
|
36
|
-
msg: "Maintenance mode active - returning dummy puzzle challenge",
|
|
37
|
-
data: {
|
|
38
|
-
dapp,
|
|
39
|
-
user,
|
|
40
|
-
sessionId
|
|
41
|
-
}
|
|
42
|
-
}));
|
|
43
|
-
return res.json(await require_maintenanceModeResponses.buildPuzzleMaintenanceResponse(user, dapp));
|
|
44
|
-
}
|
|
45
|
-
if (require_testSiteKey.isReservedTestSiteKey(dapp)) {
|
|
46
|
-
req.logger.warn(() => ({
|
|
47
|
-
msg: "Reserved TEST site key - returning dummy puzzle challenge",
|
|
48
|
-
data: {
|
|
49
|
-
dapp,
|
|
50
|
-
user,
|
|
51
|
-
sessionId
|
|
52
|
-
}
|
|
53
|
-
}));
|
|
54
|
-
return res.json(await require_maintenanceModeResponses.buildPuzzleMaintenanceResponse(user, dapp));
|
|
55
|
-
}
|
|
56
|
-
const tasks = new require_tasks.Tasks(env, req.logger);
|
|
57
|
-
try {
|
|
58
|
-
const clientSettings = await tasks.db.getClientRecord(dapp);
|
|
59
|
-
if (!clientSettings) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
|
|
60
|
-
context: {
|
|
61
|
-
code: 400,
|
|
62
|
-
siteKey: dapp
|
|
63
|
-
},
|
|
64
|
-
i18n: req.i18n,
|
|
65
|
-
logger: req.logger
|
|
66
|
-
}));
|
|
67
|
-
const normalizedIp = require_normalizeRequestIp.normalizeRequestIp(req.ip, req.logger);
|
|
68
|
-
if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
|
|
69
|
-
const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
|
|
70
|
-
const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
|
|
71
|
-
const sessionRecord = sessionId ? await tasks.db.getSessionRecordBySessionId(sessionId) : void 0;
|
|
72
|
-
const userScope = require_blacklistRequestInspector.getRequestUserScope((0, _prosopo_util.flatten)(req.headers), req.ja4, normalizedIp, user, sessionRecord?.decryptedHeadHash, void 0, countryCode, asn);
|
|
73
|
-
const userAccessPolicy = (await tasks.puzzleCaptchaManager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope, require_blacklistRequestInspector.normalizeHeadersForMatching(req.headers))).find((p) => !p.deferToVerify);
|
|
74
|
-
const { valid, reason, sessionId: validSessionId } = await tasks.puzzleCaptchaManager.isValidRequest(clientSettings, _prosopo_types.CaptchaType.puzzle, env, sessionId, userAccessPolicy, normalizedIp);
|
|
75
|
-
if (!valid) return next(new _prosopo_common.ProsopoApiError(reason || "API.BAD_REQUEST", {
|
|
76
|
-
context: {
|
|
77
|
-
code: 400,
|
|
78
|
-
siteKey: dapp,
|
|
79
|
-
user
|
|
80
|
-
},
|
|
81
|
-
i18n: req.i18n,
|
|
82
|
-
logger: req.logger
|
|
83
|
-
}));
|
|
84
|
-
const origin = req.headers.origin;
|
|
85
|
-
if (!origin) return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
86
|
-
context: {
|
|
87
|
-
error: "Origin header not found",
|
|
88
|
-
code: 400,
|
|
89
|
-
siteKey: dapp,
|
|
90
|
-
user
|
|
91
|
-
},
|
|
92
|
-
i18n: req.i18n,
|
|
93
|
-
logger: req.logger
|
|
94
|
-
}));
|
|
95
|
-
const trafficVerdict = require_trafficFilterRequestTime.applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
|
|
96
|
-
const tolerance = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleTolerance : void 0) ?? sessionRecord?.puzzleTolerance ?? clientSettings?.settings?.puzzleTolerance;
|
|
97
|
-
const routedPuzzleSettings = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleSettings : void 0) ?? sessionRecord?.puzzle;
|
|
98
|
-
const effectivePuzzleSettings = require_puzzleRenderer.resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, routedPuzzleSettings);
|
|
99
|
-
const effectivePieceSize = require_puzzleRenderer.resolvePuzzlePieceSize(clientSettings?.settings?.puzzle, routedPuzzleSettings);
|
|
100
|
-
const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
|
|
101
|
-
if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, _prosopo_types.SimdReadingsStage.challenge).catch((updateErr) => {
|
|
102
|
-
req.logger.warn(() => ({
|
|
103
|
-
err: updateErr,
|
|
104
|
-
msg: "Failed to patch session with SIMD readings on puzzle challenge"
|
|
105
|
-
}));
|
|
106
|
-
});
|
|
107
|
-
await tasks.db.storePuzzleCaptchaRecord(challenge.challenge, {
|
|
108
|
-
requestedAtTimestamp: challenge.requestedAtTimestamp,
|
|
109
|
-
userAccount: user,
|
|
110
|
-
dappAccount: dapp
|
|
111
|
-
}, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, require_compositeIpAddress.getCompositeIpAddress(normalizedIp), (0, _prosopo_util.flatten)(req.headers), req.ja4, validSessionId, req.ipInfo);
|
|
112
|
-
const images = await require_puzzleRenderer.renderPuzzleImages({
|
|
113
|
-
targetX: challenge.targetX,
|
|
114
|
-
targetY: challenge.targetY
|
|
115
|
-
}, effectivePuzzleSettings, effectivePieceSize);
|
|
116
|
-
const padBytes = trafficVerdict.padBytes;
|
|
117
|
-
const getPuzzleCaptchaResponse = {
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
logData: { tolerance: challenge.tolerance },
|
|
48
|
+
response: {
|
|
118
49
|
[_prosopo_types.ApiParams.status]: "ok",
|
|
119
50
|
[_prosopo_types.ApiParams.challenge]: challenge.challenge,
|
|
120
51
|
[_prosopo_types.ApiParams.background]: images.background,
|
|
@@ -124,39 +55,15 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
|
|
|
124
55
|
[_prosopo_types.ApiParams.originY]: challenge.originY,
|
|
125
56
|
[_prosopo_types.ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
|
|
126
57
|
[_prosopo_types.ApiParams.signature]: { [_prosopo_types.ApiParams.provider]: { [_prosopo_types.ApiParams.challenge]: challenge.providerSignature } }
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
msg: "Puzzle captcha challenge issued",
|
|
130
|
-
data: {
|
|
131
|
-
captchaType: _prosopo_types.CaptchaType.puzzle,
|
|
132
|
-
challenge: challenge.challenge,
|
|
133
|
-
tolerance: challenge.tolerance,
|
|
134
|
-
user,
|
|
135
|
-
dapp,
|
|
136
|
-
session: sessionId
|
|
137
|
-
}
|
|
138
|
-
}));
|
|
139
|
-
res.locals.padBytes = padBytes;
|
|
140
|
-
require_metrics.recordCaptchaIssued(_prosopo_types.CaptchaType.puzzle);
|
|
141
|
-
return res.json(getPuzzleCaptchaResponse);
|
|
142
|
-
} catch (err) {
|
|
143
|
-
require_metrics.recordCaptchaIssueError(_prosopo_types.CaptchaType.puzzle);
|
|
144
|
-
req.logger.error(() => ({
|
|
145
|
-
err,
|
|
146
|
-
body: require_requestBodySummary.summariseRequestBody(req),
|
|
147
|
-
msg: "Error in puzzle captcha challenge request"
|
|
148
|
-
}));
|
|
149
|
-
return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
150
|
-
context: {
|
|
151
|
-
code: 500,
|
|
152
|
-
siteKey: req.body.dapp,
|
|
153
|
-
user: req.body.user,
|
|
154
|
-
error: err
|
|
155
|
-
},
|
|
156
|
-
i18n: req.i18n,
|
|
157
|
-
logger: req.logger
|
|
158
|
-
}));
|
|
159
|
-
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
160
60
|
};
|
|
61
|
+
var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => require_interactiveCaptchaChallenge.interactiveChallengeHandler(env, userAccessRulesStorage, {
|
|
62
|
+
captchaType: _prosopo_types.CaptchaType.puzzle,
|
|
63
|
+
label: "puzzle",
|
|
64
|
+
manager: (tasks) => tasks.puzzleCaptchaManager,
|
|
65
|
+
maintenanceResponse: require_maintenanceModeResponses.buildPuzzleMaintenanceResponse,
|
|
66
|
+
issue: issuePuzzleChallenge
|
|
67
|
+
});
|
|
161
68
|
//#endregion
|
|
162
69
|
exports.default = getPuzzleCaptchaChallenge_default;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
const require_compositeIpAddress = require("../../compositeIpAddress.cjs");
|
|
2
|
+
const require_metrics = require("../metrics.cjs");
|
|
3
|
+
const require_blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
4
|
+
const require_validateAddress = require("../validateAddress.cjs");
|
|
5
|
+
const require_tasks = require("../../tasks/tasks.cjs");
|
|
6
|
+
const require_apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
7
|
+
const require_testSiteKey = require("../testSiteKey.cjs");
|
|
8
|
+
const require_normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
9
|
+
const require_requestBodySummary = require("../requestBodySummary.cjs");
|
|
10
|
+
const require_trafficFilterRequestTime = require("./trafficFilterRequestTime.cjs");
|
|
11
|
+
let _prosopo_common = require("@prosopo/common");
|
|
12
|
+
let _prosopo_types = require("@prosopo/types");
|
|
13
|
+
let _prosopo_util = require("@prosopo/util");
|
|
14
|
+
//#region src/api/captcha/interactiveCaptchaChallenge.ts
|
|
15
|
+
var capitalise = (text) => text.charAt(0).toUpperCase() + text.slice(1);
|
|
16
|
+
/** Request handling shared by the challenge endpoints of the interactive types. */
|
|
17
|
+
var interactiveChallengeHandler = (env, userAccessRulesStorage, spec) => async (req, res, next) => {
|
|
18
|
+
const { captchaType, label } = spec;
|
|
19
|
+
let parsed;
|
|
20
|
+
try {
|
|
21
|
+
parsed = _prosopo_types.GetPuzzleCaptchaChallengeRequestBody.parse(req.body);
|
|
22
|
+
} catch (err) {
|
|
23
|
+
return next(new _prosopo_common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
24
|
+
context: {
|
|
25
|
+
code: 400,
|
|
26
|
+
error: err
|
|
27
|
+
},
|
|
28
|
+
i18n: req.i18n,
|
|
29
|
+
logger: req.logger
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
const { user, dapp, sessionId, simdReadings } = parsed;
|
|
33
|
+
require_validateAddress.validateSiteKey(dapp);
|
|
34
|
+
require_validateAddress.validateAddr(user);
|
|
35
|
+
if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
36
|
+
req.logger.info(() => ({
|
|
37
|
+
msg: `Maintenance mode active - returning dummy ${label} challenge`,
|
|
38
|
+
data: {
|
|
39
|
+
dapp,
|
|
40
|
+
user,
|
|
41
|
+
sessionId
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
44
|
+
return res.json(await spec.maintenanceResponse(user, dapp));
|
|
45
|
+
}
|
|
46
|
+
if (require_testSiteKey.isReservedTestSiteKey(dapp)) {
|
|
47
|
+
req.logger.warn(() => ({
|
|
48
|
+
msg: `Reserved TEST site key - returning dummy ${label} challenge`,
|
|
49
|
+
data: {
|
|
50
|
+
dapp,
|
|
51
|
+
user,
|
|
52
|
+
sessionId
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
55
|
+
return res.json(await spec.maintenanceResponse(user, dapp));
|
|
56
|
+
}
|
|
57
|
+
const tasks = new require_tasks.Tasks(env, req.logger);
|
|
58
|
+
const manager = spec.manager(tasks);
|
|
59
|
+
try {
|
|
60
|
+
const clientSettings = await tasks.db.getClientRecord(dapp);
|
|
61
|
+
if (!clientSettings) return next(new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
|
|
62
|
+
context: {
|
|
63
|
+
code: 400,
|
|
64
|
+
siteKey: dapp
|
|
65
|
+
},
|
|
66
|
+
i18n: req.i18n,
|
|
67
|
+
logger: req.logger
|
|
68
|
+
}));
|
|
69
|
+
const normalizedIp = require_normalizeRequestIp.normalizeRequestIp(req.ip, req.logger);
|
|
70
|
+
if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
|
|
71
|
+
const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
|
|
72
|
+
const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
|
|
73
|
+
const sessionRecord = sessionId ? await tasks.db.getSessionRecordBySessionId(sessionId) : void 0;
|
|
74
|
+
const userScope = require_blacklistRequestInspector.getRequestUserScope((0, _prosopo_util.flatten)(req.headers), req.ja4, normalizedIp, user, sessionRecord?.decryptedHeadHash, void 0, countryCode, asn);
|
|
75
|
+
const userAccessPolicy = (await manager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope, require_blacklistRequestInspector.normalizeHeadersForMatching(req.headers))).find((p) => !p.deferToVerify);
|
|
76
|
+
const { valid, reason, sessionId: validSessionId } = await manager.isValidRequest(clientSettings, captchaType, env, sessionId, userAccessPolicy, normalizedIp);
|
|
77
|
+
if (!valid) return next(new _prosopo_common.ProsopoApiError(reason || "API.BAD_REQUEST", {
|
|
78
|
+
context: {
|
|
79
|
+
code: 400,
|
|
80
|
+
siteKey: dapp,
|
|
81
|
+
user
|
|
82
|
+
},
|
|
83
|
+
i18n: req.i18n,
|
|
84
|
+
logger: req.logger
|
|
85
|
+
}));
|
|
86
|
+
const origin = req.headers.origin;
|
|
87
|
+
if (!origin) return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
88
|
+
context: {
|
|
89
|
+
error: "Origin header not found",
|
|
90
|
+
code: 400,
|
|
91
|
+
siteKey: dapp,
|
|
92
|
+
user
|
|
93
|
+
},
|
|
94
|
+
i18n: req.i18n,
|
|
95
|
+
logger: req.logger
|
|
96
|
+
}));
|
|
97
|
+
const trafficVerdict = require_trafficFilterRequestTime.applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
|
|
98
|
+
if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, _prosopo_types.SimdReadingsStage.challenge).catch((updateErr) => {
|
|
99
|
+
req.logger.warn(() => ({
|
|
100
|
+
err: updateErr,
|
|
101
|
+
msg: `Failed to patch session with SIMD readings on ${label} challenge`
|
|
102
|
+
}));
|
|
103
|
+
});
|
|
104
|
+
const { response, logData } = await spec.issue({
|
|
105
|
+
tasks,
|
|
106
|
+
user,
|
|
107
|
+
dapp,
|
|
108
|
+
origin,
|
|
109
|
+
clientSettings,
|
|
110
|
+
sessionRecord,
|
|
111
|
+
trafficVerdict,
|
|
112
|
+
provenance: {
|
|
113
|
+
ipAddress: require_compositeIpAddress.getCompositeIpAddress(normalizedIp),
|
|
114
|
+
headers: (0, _prosopo_util.flatten)(req.headers),
|
|
115
|
+
ja4: req.ja4,
|
|
116
|
+
sessionId: validSessionId,
|
|
117
|
+
ipInfo: req.ipInfo
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
req.logger.info(() => ({
|
|
121
|
+
msg: `${capitalise(label)} captcha challenge issued`,
|
|
122
|
+
data: {
|
|
123
|
+
captchaType,
|
|
124
|
+
challenge: response.challenge,
|
|
125
|
+
...logData,
|
|
126
|
+
user,
|
|
127
|
+
dapp,
|
|
128
|
+
session: sessionId
|
|
129
|
+
}
|
|
130
|
+
}));
|
|
131
|
+
res.locals.padBytes = trafficVerdict.padBytes;
|
|
132
|
+
require_metrics.recordCaptchaIssued(captchaType);
|
|
133
|
+
return res.json(response);
|
|
134
|
+
} catch (err) {
|
|
135
|
+
require_metrics.recordCaptchaIssueError(captchaType);
|
|
136
|
+
req.logger.error(() => ({
|
|
137
|
+
err,
|
|
138
|
+
body: require_requestBodySummary.summariseRequestBody(req),
|
|
139
|
+
msg: `Error in ${label} captcha challenge request`
|
|
140
|
+
}));
|
|
141
|
+
return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
|
|
142
|
+
context: {
|
|
143
|
+
code: 500,
|
|
144
|
+
siteKey: req.body.dapp,
|
|
145
|
+
user: req.body.user,
|
|
146
|
+
error: err
|
|
147
|
+
},
|
|
148
|
+
i18n: req.i18n,
|
|
149
|
+
logger: req.logger
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
//#endregion
|
|
154
|
+
exports.interactiveChallengeHandler = interactiveChallengeHandler;
|