@prosopo/provider 4.15.14 → 4.15.16
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 +106 -106
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +107 -104
- package/CHANGELOG.md +63 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/api/admin/apiAdminRoutesProvider.js +27 -46
- package/dist/api/admin/apiClearAllCountersEndpoint.js +62 -57
- package/dist/api/admin/apiDnsEventEndpoint.js +79 -92
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +43 -45
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js +40 -40
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +23 -22
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +26 -30
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +35 -37
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +40 -40
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +29 -31
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +33 -29
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +32 -31
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +43 -35
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +43 -63
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +36 -35
- package/dist/api/admin/createApiAdminRoutesProvider.js +6 -8
- package/dist/api/blacklistRequestInspector.js +285 -377
- package/dist/api/block.js +17 -30
- package/dist/api/captcha/checkSpamEmail.js +88 -98
- package/dist/api/captcha/contextAwareValidation.js +21 -15
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +126 -140
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -12
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +236 -299
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.js +10 -13
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +336 -462
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.js +17 -14
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.js +27 -27
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +42 -63
- package/dist/api/captcha/getFrictionlessCaptchaChallenge.js +2 -4
- package/dist/api/captcha/getImageCaptchaChallenge.js +136 -207
- package/dist/api/captcha/getPoWCaptchaChallenge.js +128 -198
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +132 -201
- package/dist/api/captcha/maintenanceModeResponses.js +38 -47
- package/dist/api/captcha/submitImageCaptchaSolution.js +75 -101
- package/dist/api/captcha/submitPoWCaptchaSolution.js +137 -207
- package/dist/api/captcha/submitPuzzleCaptchaSolution.js +73 -105
- package/dist/api/captcha.js +76 -58
- package/dist/api/dnsEventUrl.js +20 -22
- package/dist/api/domainMiddleware.js +104 -115
- package/dist/api/forwardVerify.js +62 -48
- package/dist/api/handshakeTimingMiddleware.js +43 -62
- package/dist/api/hardBlockVerdictCache.js +114 -117
- package/dist/api/headerCheckMiddleware.js +34 -34
- package/dist/api/ignoreMiddleware.js +13 -15
- package/dist/api/ipInfoMiddleware.js +17 -19
- package/dist/api/ja4.js +149 -188
- package/dist/api/ja4Middleware.js +39 -54
- package/dist/api/metrics.js +245 -257
- package/dist/api/public.js +52 -54
- package/dist/api/robotsMiddleware.js +10 -10
- package/dist/api/startProviderApi.js +205 -232
- package/dist/api/testSiteKey.js +16 -16
- package/dist/api/validateAddress.js +23 -21
- package/dist/api/verify.js +334 -377
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +40 -59
- package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +63 -58
- package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +82 -93
- package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +46 -48
- package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +41 -41
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +25 -24
- package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +28 -32
- package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +38 -40
- package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +41 -41
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +31 -33
- package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +35 -31
- package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +34 -33
- package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +45 -35
- package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +45 -65
- package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +38 -37
- package/dist/cjs/api/admin/createApiAdminRoutesProvider.cjs +7 -8
- package/dist/cjs/api/blacklistRequestInspector.cjs +288 -376
- package/dist/cjs/api/block.cjs +18 -30
- package/dist/cjs/api/captcha/checkSpamEmail.cjs +90 -100
- package/dist/cjs/api/captcha/contextAwareValidation.cjs +21 -14
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +125 -140
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -10
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +238 -301
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decryptSimdReadings.cjs +9 -12
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +349 -473
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/honeypotResponse.cjs +18 -14
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.cjs +26 -26
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +42 -63
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge.cjs +2 -3
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +138 -208
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +131 -200
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +135 -203
- package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +38 -44
- package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +77 -102
- package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +140 -209
- package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +76 -107
- package/dist/cjs/api/captcha.cjs +79 -58
- package/dist/cjs/api/dnsEventUrl.cjs +20 -21
- package/dist/cjs/api/domainMiddleware.cjs +106 -117
- package/dist/cjs/api/forwardVerify.cjs +63 -49
- package/dist/cjs/api/handshakeTimingMiddleware.cjs +43 -61
- package/dist/cjs/api/hardBlockVerdictCache.cjs +114 -114
- package/dist/cjs/api/headerCheckMiddleware.cjs +34 -34
- package/dist/cjs/api/ignoreMiddleware.cjs +12 -14
- package/dist/cjs/api/ipInfoMiddleware.cjs +16 -18
- package/dist/cjs/api/ja4.cjs +149 -187
- package/dist/cjs/api/ja4Middleware.cjs +40 -53
- package/dist/cjs/api/metrics.cjs +229 -228
- package/dist/cjs/api/public.cjs +57 -57
- package/dist/cjs/api/robotsMiddleware.cjs +9 -9
- package/dist/cjs/api/startProviderApi.cjs +219 -237
- package/dist/cjs/api/testSiteKey.cjs +15 -14
- package/dist/cjs/api/validateAddress.cjs +24 -21
- package/dist/cjs/api/verify.cjs +338 -379
- package/dist/cjs/compositeIpAddress.cjs +40 -47
- package/dist/cjs/index.cjs +65 -71
- package/dist/cjs/pairs.cjs +31 -35
- package/dist/cjs/rules/lang.cjs +10 -14
- package/dist/cjs/schedulers/captchaScheduler.cjs +26 -32
- package/dist/cjs/schedulers/getClientList.cjs +35 -33
- package/dist/cjs/schedulers/setClientEntropy.cjs +35 -33
- package/dist/cjs/schedulers/updateSpamEmailDomains.cjs +39 -43
- package/dist/cjs/services/ipComparison.cjs +122 -119
- package/dist/cjs/tasks/captchaManager.cjs +407 -486
- package/dist/cjs/tasks/client/clientTasks.cjs +347 -470
- package/dist/cjs/tasks/dataset/datasetTasks.cjs +25 -29
- package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +16 -32
- package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +220 -307
- package/dist/cjs/tasks/detection/decodeBehavior.cjs +408 -317
- package/dist/cjs/tasks/detection/decodePayload.cjs +686 -468
- package/dist/cjs/tasks/detection/decodeSimd.cjs +462 -304
- package/dist/cjs/tasks/detection/getBotScore.cjs +37 -43
- package/dist/cjs/tasks/dnsEvent/enrichDnsEvent.cjs +88 -71
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +348 -486
- package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +13 -30
- package/dist/cjs/tasks/frictionless/routingMachine.cjs +71 -55
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +555 -806
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +22 -23
- package/dist/cjs/tasks/index.cjs +2 -4
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +491 -687
- package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +17 -29
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +422 -591
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasksUtils.cjs +8 -5
- package/dist/cjs/tasks/spam/checkSpamEmail.cjs +133 -141
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +118 -76
- package/dist/cjs/tasks/spam/evaluateEmailSpamRules.cjs +75 -84
- package/dist/cjs/tasks/spam/updateSpamEmailDomains.cjs +40 -56
- package/dist/cjs/tasks/tasks.cjs +107 -158
- package/dist/cjs/util/usageCounters.cjs +220 -211
- package/dist/cjs/util.cjs +329 -359
- package/dist/cjs/utils/devicePlatform.cjs +14 -8
- package/dist/cjs/utils/dns.cjs +68 -93
- package/dist/cjs/utils/hashUserAgent.cjs +14 -7
- package/dist/cjs/utils/hashUserIp.cjs +14 -6
- package/dist/cjs/utils/honeypot/encoders.cjs +74 -80
- package/dist/cjs/utils/honeypot/phraseBank.cjs +51 -44
- package/dist/cjs/utils/normalizeRequestIp.cjs +33 -25
- package/dist/compositeIpAddress.js +38 -46
- package/dist/index.js +12 -56
- package/dist/pairs.js +31 -37
- package/dist/rules/lang.js +11 -15
- package/dist/schedulers/captchaScheduler.js +25 -31
- package/dist/schedulers/getClientList.js +34 -32
- package/dist/schedulers/setClientEntropy.js +34 -32
- package/dist/schedulers/updateSpamEmailDomains.js +38 -42
- package/dist/services/ipComparison.js +122 -119
- package/dist/tasks/captchaManager.js +403 -483
- package/dist/tasks/client/clientTasks.js +343 -467
- package/dist/tasks/dataset/datasetTasks.js +24 -28
- package/dist/tasks/dataset/datasetTasksUtils.js +15 -31
- package/dist/tasks/decisionMachine/decisionMachineRunner.js +217 -306
- package/dist/tasks/detection/getBotScore.js +37 -43
- package/dist/tasks/dnsEvent/enrichDnsEvent.d.ts.map +1 -1
- package/dist/tasks/dnsEvent/enrichDnsEvent.js +88 -74
- package/dist/tasks/dnsEvent/enrichDnsEvent.js.map +1 -1
- package/dist/tasks/frictionless/frictionlessTasks.js +342 -479
- package/dist/tasks/frictionless/frictionlessTasksUtils.js +14 -32
- package/dist/tasks/frictionless/routingMachine.js +72 -56
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +550 -801
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +21 -22
- package/dist/tasks/index.js +1 -3
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +486 -682
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasksUtils.js +15 -28
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +417 -586
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasksUtils.js +9 -6
- package/dist/tasks/spam/checkSpamEmail.js +133 -141
- package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -0
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +117 -77
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tasks/spam/evaluateEmailSpamRules.js +75 -86
- package/dist/tasks/spam/updateSpamEmailDomains.js +36 -54
- package/dist/tasks/tasks.js +98 -150
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +4 -1
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -1
- package/dist/tests/unit/api/block.unit.test.js +8 -4
- package/dist/tests/unit/api/block.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +8 -6
- package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
- package/dist/tests/unit/api/forwardVerify.unit.test.js +3 -1
- package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -1
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +15 -7
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +24 -18
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/getClientList.unit.test.js +19 -13
- package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +19 -13
- package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +22 -16
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +140 -0
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
- package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +7 -7
- package/dist/util/usageCounters.js +220 -212
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +327 -364
- package/dist/util.js.map +1 -1
- package/dist/utils/devicePlatform.js +15 -9
- package/dist/utils/dns.js +64 -77
- package/dist/utils/hashUserAgent.js +14 -7
- package/dist/utils/hashUserIp.js +14 -6
- package/dist/utils/honeypot/encoders.js +74 -80
- package/dist/utils/honeypot/phraseBank.js +49 -44
- package/dist/utils/normalizeRequestIp.js +34 -26
- package/package.json +24 -24
package/dist/cjs/api/captcha.cjs
CHANGED
|
@@ -1,63 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
require("./captcha/
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_checkSpamEmail = require("./captcha/checkSpamEmail.cjs");
|
|
3
|
+
const require_handler = require("./captcha/getFrictionlessCaptchaChallenge/handler.cjs");
|
|
4
|
+
const require_getImageCaptchaChallenge = require("./captcha/getImageCaptchaChallenge.cjs");
|
|
5
|
+
const require_getPoWCaptchaChallenge = require("./captcha/getPoWCaptchaChallenge.cjs");
|
|
6
|
+
const require_getPuzzleCaptchaChallenge = require("./captcha/getPuzzleCaptchaChallenge.cjs");
|
|
7
|
+
const require_submitImageCaptchaSolution = require("./captcha/submitImageCaptchaSolution.cjs");
|
|
8
|
+
const require_submitPoWCaptchaSolution = require("./captcha/submitPoWCaptchaSolution.cjs");
|
|
9
|
+
const require_submitPuzzleCaptchaSolution = require("./captcha/submitPuzzleCaptchaSolution.cjs");
|
|
10
|
+
let _prosopo_types = require("@prosopo/types");
|
|
11
|
+
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
12
|
+
let express = require("express");
|
|
13
|
+
express = require_runtime.__toESM(express, 1);
|
|
14
|
+
//#region src/api/captcha.ts
|
|
15
|
+
/**
|
|
16
|
+
* Wraps an async route handler so that any rejection - including synchronous
|
|
17
|
+
* throws (e.g. from validateSiteKey/validateAddr) that become rejected
|
|
18
|
+
* promises inside the async handler - is forwarded to Express's error handler.
|
|
19
|
+
* Without this, Express 4 does not observe the rejection and the request hangs
|
|
20
|
+
* instead of returning the intended 4xx response.
|
|
21
|
+
*
|
|
22
|
+
* The handler is invoked inside `Promise.resolve().then(...)` so that even a
|
|
23
|
+
* truly synchronous throw (from a non-async handler) is captured as a rejected
|
|
24
|
+
* promise and forwarded to `next`, rather than propagating synchronously.
|
|
25
|
+
*/
|
|
26
|
+
var asyncHandler = (handler) => (req, res, next) => {
|
|
27
|
+
Promise.resolve().then(() => handler(req, res, next)).catch(next);
|
|
17
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Returns a router connected to the database which can interact with the Proposo protocol
|
|
31
|
+
*
|
|
32
|
+
* @return {Router} - A middleware router that can interact with the Prosopo protocol
|
|
33
|
+
* @param {ProviderEnvironment} env - The Prosopo environment
|
|
34
|
+
*/
|
|
18
35
|
function prosopoRouter(env) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
36
|
+
const router = express.default.Router();
|
|
37
|
+
let userAccessRulesStorage;
|
|
38
|
+
try {
|
|
39
|
+
userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();
|
|
40
|
+
} catch (err) {
|
|
41
|
+
env.logger.warn(() => ({
|
|
42
|
+
msg: "User access rules storage unavailable; captcha endpoints will skip access-policy checks",
|
|
43
|
+
err
|
|
44
|
+
}));
|
|
45
|
+
userAccessRulesStorage = void 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Provides a Captcha puzzle to a Dapp User
|
|
49
|
+
*/
|
|
50
|
+
router.post(_prosopo_types.ClientApiPaths.GetImageCaptchaChallenge, asyncHandler(require_getImageCaptchaChallenge.default(env, userAccessRulesStorage)));
|
|
51
|
+
/**
|
|
52
|
+
* Receives solved CAPTCHA challenges from the user, stores to database, and checks against solution commitment
|
|
53
|
+
*/
|
|
54
|
+
router.post(_prosopo_types.ClientApiPaths.SubmitImageCaptchaSolution, asyncHandler(require_submitImageCaptchaSolution.default(env)));
|
|
55
|
+
/**
|
|
56
|
+
* Supplies a PoW challenge to a Dapp User
|
|
57
|
+
*/
|
|
58
|
+
router.post(_prosopo_types.ClientApiPaths.GetPowCaptchaChallenge, asyncHandler(require_getPoWCaptchaChallenge.default(env, userAccessRulesStorage)));
|
|
59
|
+
/**
|
|
60
|
+
* Verifies a user's PoW solution as being approved or not
|
|
61
|
+
*/
|
|
62
|
+
router.post(_prosopo_types.ClientApiPaths.SubmitPowCaptchaSolution, asyncHandler(require_submitPoWCaptchaSolution.default(env)));
|
|
63
|
+
/**
|
|
64
|
+
* Gets a frictionless captcha challenge
|
|
65
|
+
*/
|
|
66
|
+
router.post(_prosopo_types.ClientApiPaths.GetFrictionlessCaptchaChallenge, asyncHandler(require_handler.default(env, userAccessRulesStorage)));
|
|
67
|
+
/**
|
|
68
|
+
* Supplies a Puzzle challenge to a Dapp User
|
|
69
|
+
*/
|
|
70
|
+
router.post(_prosopo_types.ClientApiPaths.GetPuzzleCaptchaChallenge, asyncHandler(require_getPuzzleCaptchaChallenge.default(env, userAccessRulesStorage)));
|
|
71
|
+
/**
|
|
72
|
+
* Verifies a user's Puzzle solution as being approved or not
|
|
73
|
+
*/
|
|
74
|
+
router.post(_prosopo_types.ClientApiPaths.SubmitPuzzleCaptchaSolution, asyncHandler(require_submitPuzzleCaptchaSolution.default(env)));
|
|
75
|
+
/**
|
|
76
|
+
* Checks if an email domain is spam
|
|
77
|
+
*/
|
|
78
|
+
router.post(_prosopo_types.ClientApiPaths.CheckSpamEmail, asyncHandler(require_checkSpamEmail.default(env)));
|
|
79
|
+
router.use(_prosopo_api_express_router.handleErrors);
|
|
80
|
+
return router;
|
|
61
81
|
}
|
|
82
|
+
//#endregion
|
|
62
83
|
exports.asyncHandler = asyncHandler;
|
|
63
84
|
exports.prosopoRouter = prosopoRouter;
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
let node_crypto = require("node:crypto");
|
|
2
|
+
//#region src/api/dnsEventUrl.ts
|
|
3
|
+
var EXTENSIONS = [
|
|
4
|
+
"gif",
|
|
5
|
+
"png",
|
|
6
|
+
"webp"
|
|
7
|
+
];
|
|
8
|
+
var buildDnsEventUrl = (sessionId) => {
|
|
9
|
+
const subzone = process.env.DNS_EVENT_SUBZONE;
|
|
10
|
+
const secret = process.env.DNS_EVENT_HMAC_SECRET;
|
|
11
|
+
if (!subzone || !secret) return;
|
|
12
|
+
const path = derivePath(sessionId, secret);
|
|
13
|
+
const port = process.env.DNS_EVENT_PORT;
|
|
14
|
+
return `https://${port ? `${sessionId}.${subzone}:${port}` : `${sessionId}.${subzone}`}${path}?sid=${sessionId}`;
|
|
15
15
|
};
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const ext = EXTENSIONS[(digest.at(8) ?? 0) % EXTENSIONS.length];
|
|
22
|
-
return `/${name}.${ext}`;
|
|
16
|
+
var derivePath = (sessionId, secret) => {
|
|
17
|
+
const mac = (0, node_crypto.createHmac)("sha256", secret);
|
|
18
|
+
mac.update(sessionId);
|
|
19
|
+
const digest = mac.digest();
|
|
20
|
+
return `/${digest.subarray(0, 8).toString("hex")}.${EXTENSIONS[(digest.at(8) ?? 0) % EXTENSIONS.length]}`;
|
|
23
21
|
};
|
|
22
|
+
//#endregion
|
|
24
23
|
exports.buildDnsEventUrl = buildDnsEventUrl;
|
|
25
24
|
exports.derivePath = derivePath;
|
|
@@ -1,124 +1,113 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const candidateOrigins = [origin, ...googleTranslateOrigins(origin)];
|
|
60
|
-
for (const candidate of candidateOrigins) {
|
|
61
|
-
for (const domain of allowedDomains) {
|
|
62
|
-
if (tasks$1.clientTaskManager.domainPatternMatcher(candidate, domain)) {
|
|
63
|
-
metrics.recordDomainValidation("allowed");
|
|
64
|
-
next();
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
throw unauthorizedOriginError(req.i18n, origin, req.logger);
|
|
70
|
-
} catch (err) {
|
|
71
|
-
metrics.recordDomainValidation("rejected");
|
|
72
|
-
if (err instanceof common.ProsopoApiError || err instanceof zod.ZodError || err instanceof SyntaxError) {
|
|
73
|
-
apiExpressRouter.handleErrors(err, req, res, next);
|
|
74
|
-
} else {
|
|
75
|
-
res.status(401).json({ error: "Unauthorized", message: err });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
};
|
|
1
|
+
const require_metrics = require("./metrics.cjs");
|
|
2
|
+
const require_tasks = require("../tasks/tasks.cjs");
|
|
3
|
+
const require_apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
4
|
+
const require_testSiteKey = require("./testSiteKey.cjs");
|
|
5
|
+
let _prosopo_common = require("@prosopo/common");
|
|
6
|
+
let _prosopo_util = require("@prosopo/util");
|
|
7
|
+
let _prosopo_util_crypto = require("@prosopo/util-crypto");
|
|
8
|
+
let zod = require("zod");
|
|
9
|
+
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
10
|
+
//#region src/api/domainMiddleware.ts
|
|
11
|
+
var domainMiddleware = (env) => {
|
|
12
|
+
let cachedTasks;
|
|
13
|
+
return async (req, res, next) => {
|
|
14
|
+
try {
|
|
15
|
+
if (require_apiToggleMaintenanceModeEndpoint.getMaintenanceMode()) {
|
|
16
|
+
req.logger.info(() => ({ msg: "Maintenance mode active - skipping domain validation" }));
|
|
17
|
+
next();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (!cachedTasks) cachedTasks = new require_tasks.Tasks(env);
|
|
21
|
+
const tasks = cachedTasks;
|
|
22
|
+
const siteKey = req.headers["prosopo-site-key"];
|
|
23
|
+
if (!siteKey) throw siteKeyNotRegisteredError(req.i18n, "No sitekey provided", req.logger);
|
|
24
|
+
try {
|
|
25
|
+
(0, _prosopo_util_crypto.validateAddress)(siteKey, false, 42);
|
|
26
|
+
} catch (err) {
|
|
27
|
+
throw invalidSiteKeyError(req.i18n, siteKey, req.logger);
|
|
28
|
+
}
|
|
29
|
+
if (require_testSiteKey.isReservedTestSiteKey(siteKey)) {
|
|
30
|
+
require_metrics.recordDomainValidation("test_key");
|
|
31
|
+
next();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const clientSettings = await tasks.db.getClientRecord(siteKey);
|
|
35
|
+
if (!clientSettings) throw siteKeyNotRegisteredError(req.i18n, siteKey, req.logger);
|
|
36
|
+
const allowedDomains = clientSettings.settings?.domains;
|
|
37
|
+
if (!allowedDomains) throw siteKeyInvalidDomainError(req.i18n, siteKey, req.hostname, req.logger);
|
|
38
|
+
const origin = req.headers.origin;
|
|
39
|
+
if (!origin) throw unauthorizedOriginError(req.i18n, void 0, req.logger);
|
|
40
|
+
const candidateOrigins = [origin, ...googleTranslateOrigins(origin)];
|
|
41
|
+
for (const candidate of candidateOrigins) for (const domain of allowedDomains) if (tasks.clientTaskManager.domainPatternMatcher(candidate, domain)) {
|
|
42
|
+
require_metrics.recordDomainValidation("allowed");
|
|
43
|
+
next();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
throw unauthorizedOriginError(req.i18n, origin, req.logger);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
require_metrics.recordDomainValidation("rejected");
|
|
49
|
+
if (err instanceof _prosopo_common.ProsopoApiError || err instanceof zod.ZodError || err instanceof SyntaxError) (0, _prosopo_api_express_router.handleErrors)(err, req, res, next);
|
|
50
|
+
else {
|
|
51
|
+
res.status(401).json({
|
|
52
|
+
error: "Unauthorized",
|
|
53
|
+
message: err
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
80
59
|
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
60
|
+
var googleTranslateOrigins = (origin) => {
|
|
61
|
+
try {
|
|
62
|
+
const url = (0, _prosopo_util.parseUrl)(origin);
|
|
63
|
+
const decodedHost = (0, _prosopo_util.decodeGoogleTranslateHost)(url.hostname);
|
|
64
|
+
if (!decodedHost) return [];
|
|
65
|
+
return [`${url.protocol}//${decodedHost}`];
|
|
66
|
+
} catch {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
90
69
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
70
|
+
var siteKeyNotRegisteredError = (i18n, dapp, logger) => {
|
|
71
|
+
return new _prosopo_common.ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
|
|
72
|
+
context: {
|
|
73
|
+
code: 400,
|
|
74
|
+
siteKey: dapp
|
|
75
|
+
},
|
|
76
|
+
i18n,
|
|
77
|
+
logger
|
|
78
|
+
});
|
|
97
79
|
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
80
|
+
var invalidSiteKeyError = (i18n, siteKey, logger) => {
|
|
81
|
+
return new _prosopo_common.ProsopoApiError("API.INVALID_SITE_KEY", {
|
|
82
|
+
context: {
|
|
83
|
+
code: 400,
|
|
84
|
+
siteKey
|
|
85
|
+
},
|
|
86
|
+
i18n,
|
|
87
|
+
logger
|
|
88
|
+
});
|
|
104
89
|
};
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
90
|
+
var unauthorizedOriginError = (i18n, origin, logger) => {
|
|
91
|
+
return new _prosopo_common.ProsopoApiError("API.UNAUTHORIZED_ORIGIN_URL", {
|
|
92
|
+
context: {
|
|
93
|
+
code: 400,
|
|
94
|
+
origin
|
|
95
|
+
},
|
|
96
|
+
i18n,
|
|
97
|
+
logger
|
|
98
|
+
});
|
|
111
99
|
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
100
|
+
var siteKeyInvalidDomainError = (i18n, dapp, domain, logger) => {
|
|
101
|
+
return new _prosopo_common.ProsopoApiError("API.UNAUTHORIZED_ORIGIN_URL", {
|
|
102
|
+
context: {
|
|
103
|
+
code: 400,
|
|
104
|
+
message: "No domains are allowed for this site key. Please fix in the Procaptcha Portal",
|
|
105
|
+
siteKey: dapp,
|
|
106
|
+
domain
|
|
107
|
+
},
|
|
108
|
+
i18n,
|
|
109
|
+
logger
|
|
110
|
+
});
|
|
123
111
|
};
|
|
112
|
+
//#endregion
|
|
124
113
|
exports.domainMiddleware = domainMiddleware;
|
|
@@ -1,54 +1,68 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
let _prosopo_api = require("@prosopo/api");
|
|
2
|
+
let _prosopo_load_balancer = require("@prosopo/load-balancer");
|
|
3
|
+
//#region src/api/forwardVerify.ts
|
|
4
|
+
/**
|
|
5
|
+
* A client can send a verify request to *any* pronode, not necessarily the
|
|
6
|
+
* provider that issued the token. This determines the issuing provider from the
|
|
7
|
+
* `providerUrl` embedded in the token and, when it is a *different* provider to
|
|
8
|
+
* this one, forwards the verification request to it and returns its response —
|
|
9
|
+
* mirroring the AWS Lambda verify endpoint, but running on a provider.
|
|
10
|
+
*
|
|
11
|
+
* Returns `null` when this provider is the issuer (or the issuer cannot be
|
|
12
|
+
* determined), signalling the caller to verify locally as before.
|
|
13
|
+
*
|
|
14
|
+
* @param env - The provider environment
|
|
15
|
+
* @param logger - Request-scoped logger
|
|
16
|
+
* @param path - The verify path to forward to (kept identical, so the issuer
|
|
17
|
+
* routes the request to the correct captcha-type verification)
|
|
18
|
+
* @param providerUrl - The issuing provider url, decoded from the token
|
|
19
|
+
* @param dapp - The site key (used as the `Prosopo-Site-Key` header)
|
|
20
|
+
* @param user - The user account (used as the `Prosopo-User` header)
|
|
21
|
+
* @param body - The original, already-parsed request body, forwarded verbatim
|
|
22
|
+
*/
|
|
5
23
|
function normalizeProviderUrl(url) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
24
|
+
try {
|
|
25
|
+
const parsed = new URL(url);
|
|
26
|
+
parsed.hostname = parsed.hostname.replace(/^(ipv4|ipv6)\./, "");
|
|
27
|
+
return parsed.toString().replace(/\/$/, "");
|
|
28
|
+
} catch {
|
|
29
|
+
return url.replace(/\/$/, "");
|
|
30
|
+
}
|
|
13
31
|
}
|
|
14
32
|
async function forwardVerifyIfNotIssuer(args) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
msg: "Forwarding verify request to issuing provider",
|
|
49
|
-
data: { providerUrl, path, dapp }
|
|
50
|
-
}));
|
|
51
|
-
const providerApi = new api.ProviderApi(issuer.url, dapp);
|
|
52
|
-
return providerApi.forwardVerify(path, body, user);
|
|
33
|
+
const { env, logger, path, providerUrl, dapp, user, body, alreadyForwarded } = args;
|
|
34
|
+
if (alreadyForwarded) return null;
|
|
35
|
+
if (!providerUrl) return null;
|
|
36
|
+
let providers;
|
|
37
|
+
try {
|
|
38
|
+
providers = await (0, _prosopo_load_balancer.getProviders)(env.defaultEnvironment);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
logger.warn(() => ({
|
|
41
|
+
msg: "Failed to load provider list; verifying locally",
|
|
42
|
+
err: error instanceof Error ? error : new Error(String(error)),
|
|
43
|
+
data: { providerUrl }
|
|
44
|
+
}));
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const normalizedProviderUrl = normalizeProviderUrl(providerUrl);
|
|
48
|
+
const issuer = providers.find((provider) => normalizeProviderUrl(provider.url) === normalizedProviderUrl);
|
|
49
|
+
if (!issuer) {
|
|
50
|
+
logger.warn(() => ({
|
|
51
|
+
msg: "Token providerUrl is not a known provider; verifying locally",
|
|
52
|
+
data: { providerUrl }
|
|
53
|
+
}));
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (env.pair?.address && issuer.address === env.pair.address) return null;
|
|
57
|
+
logger.info(() => ({
|
|
58
|
+
msg: "Forwarding verify request to issuing provider",
|
|
59
|
+
data: {
|
|
60
|
+
providerUrl,
|
|
61
|
+
path,
|
|
62
|
+
dapp
|
|
63
|
+
}
|
|
64
|
+
}));
|
|
65
|
+
return new _prosopo_api.ProviderApi(issuer.url, dapp).forwardVerify(path, body, user);
|
|
53
66
|
}
|
|
67
|
+
//#endregion
|
|
54
68
|
exports.forwardVerifyIfNotIssuer = forwardVerifyIfNotIssuer;
|