@prosopo/provider 4.15.13 → 4.15.15
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 +78 -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/powCaptcha/powTasks.unit.test.js +6 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +60 -1
- package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.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
|
@@ -1,245 +1,227 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_metrics = require("./metrics.cjs");
|
|
3
|
+
const require_blacklistRequestInspector = require("./blacklistRequestInspector.cjs");
|
|
4
|
+
const require_block = require("./block.cjs");
|
|
5
|
+
const require_captcha = require("./captcha.cjs");
|
|
6
|
+
const require_verify = require("./verify.cjs");
|
|
7
|
+
const require_ja4Middleware = require("./ja4Middleware.cjs");
|
|
8
|
+
const require_handshakeTimingMiddleware = require("./handshakeTimingMiddleware.cjs");
|
|
9
|
+
const require_public = require("./public.cjs");
|
|
10
|
+
const require_domainMiddleware = require("./domainMiddleware.cjs");
|
|
11
|
+
const require_createApiAdminRoutesProvider = require("./admin/createApiAdminRoutesProvider.cjs");
|
|
12
|
+
const require_headerCheckMiddleware = require("./headerCheckMiddleware.cjs");
|
|
13
|
+
const require_ignoreMiddleware = require("./ignoreMiddleware.cjs");
|
|
14
|
+
const require_ipInfoMiddleware = require("./ipInfoMiddleware.cjs");
|
|
15
|
+
const require_robotsMiddleware = require("./robotsMiddleware.cjs");
|
|
16
|
+
let _prosopo_logger = require("@prosopo/logger");
|
|
17
|
+
let _prosopo_types = require("@prosopo/types");
|
|
18
|
+
let node_https = require("node:https");
|
|
19
|
+
node_https = require_runtime.__toESM(node_https, 1);
|
|
20
|
+
let node_fs = require("node:fs");
|
|
21
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
22
|
+
let _prosopo_api_express_router = require("@prosopo/api-express-router");
|
|
23
|
+
let express = require("express");
|
|
24
|
+
express = require_runtime.__toESM(express, 1);
|
|
25
|
+
let node_path = require("node:path");
|
|
26
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
27
|
+
let node_url = require("node:url");
|
|
28
|
+
let _prosopo_locale = require("@prosopo/locale");
|
|
29
|
+
let _prosopo_user_access_policy_api = require("@prosopo/user-access-policy/api");
|
|
30
|
+
let cors = require("cors");
|
|
31
|
+
cors = require_runtime.__toESM(cors, 1);
|
|
32
|
+
let express_rate_limit = require("express-rate-limit");
|
|
33
|
+
express_rate_limit = require_runtime.__toESM(express_rate_limit, 1);
|
|
34
|
+
//#region src/api/startProviderApi.ts
|
|
35
|
+
var __dirname$1 = node_path.default.dirname((0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href));
|
|
36
|
+
var certPath = node_path.default.resolve(__dirname$1, "../../../../certs");
|
|
37
|
+
var keyPath = node_path.default.join(certPath, "server.key");
|
|
38
|
+
var crtPath = node_path.default.join(certPath, "server.crt");
|
|
39
|
+
/**
|
|
40
|
+
* Check if TLS certificates are available
|
|
41
|
+
* @returns True if both key and cert files exist
|
|
42
|
+
*/
|
|
43
|
+
var isTlsAvailable = () => {
|
|
44
|
+
return node_fs.default.existsSync(keyPath) && node_fs.default.existsSync(crtPath);
|
|
36
45
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Get client API paths that expect Prosopo headers (like site key) for validation, excluding verify and spam routes
|
|
48
|
+
* @returns Array of ClientApiPaths excluding verify and spam routes
|
|
49
|
+
*/
|
|
50
|
+
var getClientApiPathsExpectingProsopoHeaders = () => {
|
|
51
|
+
return Object.values(_prosopo_types.ClientApiPaths).filter((path) => path.indexOf("verify") === -1 && path.indexOf("spam") === -1);
|
|
42
52
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return payload.sub;
|
|
61
|
-
} catch (e) {
|
|
62
|
-
return void 0;
|
|
63
|
-
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract authenticated user address from JWT for rate limiting
|
|
55
|
+
* @param req Express request object
|
|
56
|
+
* @returns User address from JWT or undefined
|
|
57
|
+
*/
|
|
58
|
+
var getUserFromJWT = (req) => {
|
|
59
|
+
try {
|
|
60
|
+
const authHeader = req.headers.Authorization || req.headers.authorization;
|
|
61
|
+
if (!authHeader || typeof authHeader !== "string") return;
|
|
62
|
+
const jwt = authHeader.replace("Bearer ", "");
|
|
63
|
+
if (!jwt) return;
|
|
64
|
+
const parts = jwt.split(".");
|
|
65
|
+
if (parts.length !== 3 || !parts[1]) return;
|
|
66
|
+
return JSON.parse(Buffer.from(parts[1], "base64url").toString("utf-8")).sub;
|
|
67
|
+
} catch (e) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
64
70
|
};
|
|
71
|
+
/**
|
|
72
|
+
* Start the Prosopo Provider API server
|
|
73
|
+
*
|
|
74
|
+
* This function creates and configures an Express server with all necessary middleware
|
|
75
|
+
* for the Prosopo Provider API, including:
|
|
76
|
+
* - CORS support
|
|
77
|
+
* - Rate limiting (disabled in test/development environments)
|
|
78
|
+
* - Authentication and authorization
|
|
79
|
+
* - Request validation (headers, domains, etc.)
|
|
80
|
+
* - Blocking and security middleware
|
|
81
|
+
* - Admin and client API routes
|
|
82
|
+
* - Access rule management
|
|
83
|
+
*
|
|
84
|
+
* @param env - The ProviderEnvironment containing configuration and database connections
|
|
85
|
+
* @param admin - Whether to enable admin mode (currently unused, kept for compatibility)
|
|
86
|
+
* @param port - Optional port override. If not provided, uses env.config.server.port
|
|
87
|
+
* @returns Promise<Server> - The Node.js HTTP server instance
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const env = new ProviderEnvironment(config);
|
|
92
|
+
* await env.isReady();
|
|
93
|
+
* const server = await startProviderApi(env);
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
65
96
|
async function startProviderApi(env, admin = false, port) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
blacklistRequestInspector.getVerdictCache().clear();
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
next();
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
apiApp.use(
|
|
200
|
-
apiExpressRouter.apiExpressRouterFactory.createRouter(
|
|
201
|
-
apiRuleRoutesProvider,
|
|
202
|
-
apiEndpointAdapter
|
|
203
|
-
)
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
if (apiAdminRoutesProvider) {
|
|
207
|
-
apiApp.use(
|
|
208
|
-
apiExpressRouter.apiExpressRouterFactory.createRouter(
|
|
209
|
-
apiAdminRoutesProvider,
|
|
210
|
-
// unlike the default one, it should have errorStatusCode as 400
|
|
211
|
-
apiExpressRouter.createApiExpressDefaultEndpointAdapter(
|
|
212
|
-
logger.parseLogLevel(env.config.logLevel),
|
|
213
|
-
400
|
|
214
|
-
)
|
|
215
|
-
)
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
apiApp.use(block.blockMiddleware(env));
|
|
219
|
-
apiApp.use("/v1/prosopo/provider/client/", domainMiddleware.domainMiddleware(env));
|
|
220
|
-
apiApp.use(captcha.prosopoRouter(env));
|
|
221
|
-
const useTls = fs.existsSync(keyPath) && fs.existsSync(crtPath);
|
|
222
|
-
if (useTls) {
|
|
223
|
-
env.logger.info(() => ({ msg: "Starting Provider API with HTTPS" }));
|
|
224
|
-
const httpsOptions = {
|
|
225
|
-
key: fs.readFileSync(keyPath),
|
|
226
|
-
cert: fs.readFileSync(crtPath)
|
|
227
|
-
};
|
|
228
|
-
const httpsServer = https.createServer(httpsOptions, apiApp);
|
|
229
|
-
return httpsServer.listen(apiPort, () => {
|
|
230
|
-
env.logger.info(() => ({
|
|
231
|
-
data: { apiPort, protocol: "https" },
|
|
232
|
-
msg: "Prosopo app listening with HTTPS"
|
|
233
|
-
}));
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
return apiApp.listen(apiPort, () => {
|
|
237
|
-
env.logger.info(() => ({
|
|
238
|
-
data: { apiPort },
|
|
239
|
-
msg: "Prosopo app listening"
|
|
240
|
-
}));
|
|
241
|
-
});
|
|
97
|
+
env.logger.info(() => ({ msg: "Starting Prosopo API" }));
|
|
98
|
+
const apiApp = (0, express.default)();
|
|
99
|
+
const apiPort = port || env.config.server?.port;
|
|
100
|
+
const apiEndpointAdapter = (0, _prosopo_api_express_router.createApiExpressDefaultEndpointAdapter)((0, _prosopo_logger.parseLogLevel)(env.config.logLevel));
|
|
101
|
+
let apiRuleRoutesProvider;
|
|
102
|
+
let apiAdminRoutesProvider;
|
|
103
|
+
try {
|
|
104
|
+
apiRuleRoutesProvider = new _prosopo_user_access_policy_api.AccessRuleApiRoutes(env.getDb().getUserAccessRulesStorage(), env.logger);
|
|
105
|
+
apiAdminRoutesProvider = require_createApiAdminRoutesProvider.createApiAdminRoutesProvider(env);
|
|
106
|
+
} catch (err) {
|
|
107
|
+
env.logger.warn(() => ({
|
|
108
|
+
msg: "Skipping admin/access-rule routes; DB unavailable",
|
|
109
|
+
err
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
const clientPathsExcludingVerify = getClientApiPathsExpectingProsopoHeaders();
|
|
113
|
+
env.logger.debug(() => ({
|
|
114
|
+
msg: "Adding headerCheckMiddleware",
|
|
115
|
+
paths: clientPathsExcludingVerify
|
|
116
|
+
}));
|
|
117
|
+
apiApp.set("trust proxy", 1);
|
|
118
|
+
apiApp.use((0, cors.default)({
|
|
119
|
+
exposedHeaders: ["x-prosopo-meta"],
|
|
120
|
+
allowedHeaders: [
|
|
121
|
+
"Accept",
|
|
122
|
+
"Accept-Language",
|
|
123
|
+
"Authorization",
|
|
124
|
+
"Content-Language",
|
|
125
|
+
"Content-Type",
|
|
126
|
+
"Prosopo-Site-Key",
|
|
127
|
+
"Prosopo-User",
|
|
128
|
+
"x-prosopo-meta"
|
|
129
|
+
],
|
|
130
|
+
maxAge: 86400
|
|
131
|
+
}));
|
|
132
|
+
apiApp.use(express.default.json({ limit: "1mb" }));
|
|
133
|
+
apiApp.use(require_public.publicRouter(env));
|
|
134
|
+
apiApp.use(require_metrics.metricsMiddleware());
|
|
135
|
+
if (!(process.env.NODE_ENV === "test" || env.config.defaultEnvironment === "development")) {
|
|
136
|
+
const rateLimits = {
|
|
137
|
+
...env.config.rateLimits,
|
|
138
|
+
...(0, _prosopo_user_access_policy_api.getExpressApiRuleRateLimits)()
|
|
139
|
+
};
|
|
140
|
+
const adminPaths = Object.values(_prosopo_types.AdminApiPaths);
|
|
141
|
+
const rateLimitHandler = (path) => (req, res, _next, options) => {
|
|
142
|
+
env.logger.warn(() => ({
|
|
143
|
+
msg: "Rate limit exceeded",
|
|
144
|
+
data: {
|
|
145
|
+
path,
|
|
146
|
+
ip: req.ip,
|
|
147
|
+
siteKey: req.headers["prosopo-site-key"]
|
|
148
|
+
}
|
|
149
|
+
}));
|
|
150
|
+
res.status(options.statusCode).send(options.message);
|
|
151
|
+
};
|
|
152
|
+
for (const [path, limit] of Object.entries(rateLimits)) {
|
|
153
|
+
const enumPath = path;
|
|
154
|
+
if (adminPaths.includes(enumPath)) apiApp.use(enumPath, (0, express_rate_limit.default)({
|
|
155
|
+
...limit,
|
|
156
|
+
handler: rateLimitHandler(enumPath),
|
|
157
|
+
keyGenerator: (req) => {
|
|
158
|
+
return getUserFromJWT(req) || req.ip || "unknown";
|
|
159
|
+
}
|
|
160
|
+
}));
|
|
161
|
+
else if (path === _prosopo_types.ClientApiPaths.VerifyImageCaptchaSolutionDapp || path === _prosopo_types.ClientApiPaths.VerifyPowCaptchaSolution) apiApp.use(enumPath, (0, express_rate_limit.default)({
|
|
162
|
+
...limit,
|
|
163
|
+
handler: rateLimitHandler(enumPath),
|
|
164
|
+
keyGenerator: (req) => {
|
|
165
|
+
return req.headers["prosopo-site-key"] || req.ip || "unknown";
|
|
166
|
+
}
|
|
167
|
+
}));
|
|
168
|
+
else apiApp.use(enumPath, (0, express_rate_limit.default)({
|
|
169
|
+
...limit,
|
|
170
|
+
handler: rateLimitHandler(enumPath)
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const i18Middleware = await (0, _prosopo_locale.i18nMiddleware)({});
|
|
175
|
+
apiApp.use(require_robotsMiddleware.robotsMiddleware());
|
|
176
|
+
apiApp.use(require_ignoreMiddleware.ignoreMiddleware());
|
|
177
|
+
apiApp.use((0, _prosopo_api_express_router.requestLoggerMiddleware)(env));
|
|
178
|
+
apiApp.use(i18Middleware);
|
|
179
|
+
apiApp.use(require_ja4Middleware.ja4Middleware(env));
|
|
180
|
+
apiApp.use(require_handshakeTimingMiddleware.handshakeTimingMiddleware(env));
|
|
181
|
+
apiApp.use(require_ipInfoMiddleware.ipInfoMiddleware(env));
|
|
182
|
+
apiApp.use(clientPathsExcludingVerify, require_headerCheckMiddleware.headerCheckMiddleware(env));
|
|
183
|
+
apiApp.use(require_verify.prosopoVerifyRouter(env));
|
|
184
|
+
env.logger.info(() => ({ msg: "Enabling admin auth middleware" }));
|
|
185
|
+
apiApp.use("/v1/prosopo/provider/admin", (0, _prosopo_api_express_router.authMiddleware)(env.pair, env.authAccount));
|
|
186
|
+
if (apiRuleRoutesProvider) {
|
|
187
|
+
const userAccessRuleRoutes = apiRuleRoutesProvider.getRoutes();
|
|
188
|
+
for (const userAccessRuleRoute in userAccessRuleRoutes) apiApp.use(userAccessRuleRoute, (0, _prosopo_api_express_router.authMiddleware)(env.pair, env.authAccount));
|
|
189
|
+
for (const userAccessRuleRoute in userAccessRuleRoutes) apiApp.use(userAccessRuleRoute, (req, res, next) => {
|
|
190
|
+
if (req.method === "POST") res.on("finish", () => {
|
|
191
|
+
if (res.statusCode >= 200 && res.statusCode < 300) require_blacklistRequestInspector.getVerdictCache().clear();
|
|
192
|
+
});
|
|
193
|
+
next();
|
|
194
|
+
});
|
|
195
|
+
apiApp.use(_prosopo_api_express_router.apiExpressRouterFactory.createRouter(apiRuleRoutesProvider, apiEndpointAdapter));
|
|
196
|
+
}
|
|
197
|
+
if (apiAdminRoutesProvider) apiApp.use(_prosopo_api_express_router.apiExpressRouterFactory.createRouter(apiAdminRoutesProvider, (0, _prosopo_api_express_router.createApiExpressDefaultEndpointAdapter)((0, _prosopo_logger.parseLogLevel)(env.config.logLevel), 400)));
|
|
198
|
+
apiApp.use(require_block.blockMiddleware(env));
|
|
199
|
+
apiApp.use("/v1/prosopo/provider/client/", require_domainMiddleware.domainMiddleware(env));
|
|
200
|
+
apiApp.use(require_captcha.prosopoRouter(env));
|
|
201
|
+
if (node_fs.default.existsSync(keyPath) && node_fs.default.existsSync(crtPath)) {
|
|
202
|
+
env.logger.info(() => ({ msg: "Starting Provider API with HTTPS" }));
|
|
203
|
+
const httpsOptions = {
|
|
204
|
+
key: node_fs.default.readFileSync(keyPath),
|
|
205
|
+
cert: node_fs.default.readFileSync(crtPath)
|
|
206
|
+
};
|
|
207
|
+
return node_https.default.createServer(httpsOptions, apiApp).listen(apiPort, () => {
|
|
208
|
+
env.logger.info(() => ({
|
|
209
|
+
data: {
|
|
210
|
+
apiPort,
|
|
211
|
+
protocol: "https"
|
|
212
|
+
},
|
|
213
|
+
msg: "Prosopo app listening with HTTPS"
|
|
214
|
+
}));
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return apiApp.listen(apiPort, () => {
|
|
218
|
+
env.logger.info(() => ({
|
|
219
|
+
data: { apiPort },
|
|
220
|
+
msg: "Prosopo app listening"
|
|
221
|
+
}));
|
|
222
|
+
});
|
|
242
223
|
}
|
|
224
|
+
//#endregion
|
|
243
225
|
exports.getClientApiPathsExpectingProsopoHeaders = getClientApiPathsExpectingProsopoHeaders;
|
|
244
226
|
exports.getUserFromJWT = getUserFromJWT;
|
|
245
227
|
exports.isTlsAvailable = isTlsAvailable;
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
let _prosopo_types = require("@prosopo/types");
|
|
2
|
+
//#region src/api/testSiteKey.ts
|
|
3
|
+
var isReservedTestSiteKey = (siteKey) => (0, _prosopo_types.getTestSiteKeyMode)(siteKey) !== null;
|
|
4
|
+
var resolveTestSiteKeyVerdict = (siteKey, logger) => {
|
|
5
|
+
const mode = (0, _prosopo_types.getTestSiteKeyMode)(siteKey);
|
|
6
|
+
if (mode === null) return null;
|
|
7
|
+
logger?.warn(() => ({
|
|
8
|
+
msg: "Reserved TEST site key - forcing deterministic captcha verdict",
|
|
9
|
+
data: {
|
|
10
|
+
siteKey,
|
|
11
|
+
mode
|
|
12
|
+
}
|
|
13
|
+
}));
|
|
14
|
+
return mode === _prosopo_types.TestSiteKeyMode.Pass;
|
|
15
15
|
};
|
|
16
|
+
//#endregion
|
|
16
17
|
exports.isReservedTestSiteKey = isReservedTestSiteKey;
|
|
17
18
|
exports.resolveTestSiteKeyVerdict = resolveTestSiteKeyVerdict;
|
|
@@ -1,25 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return validateAddr(siteKey, "API.INVALID_SITE_KEY", logger);
|
|
1
|
+
let _prosopo_common = require("@prosopo/common");
|
|
2
|
+
let _prosopo_util_crypto = require("@prosopo/util-crypto");
|
|
3
|
+
//#region src/api/validateAddress.ts
|
|
4
|
+
var validateSiteKey = (siteKey, logger) => {
|
|
5
|
+
return validateAddr(siteKey, "API.INVALID_SITE_KEY", logger);
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
7
|
+
var validateAddr = (address, translationKey = "CONTRACT.INVALID_ADDRESS", logger) => {
|
|
8
|
+
try {
|
|
9
|
+
if (!(0, _prosopo_util_crypto.validateAddress)(address, false, 42)) throw new _prosopo_common.ProsopoApiError(translationKey, {
|
|
10
|
+
context: {
|
|
11
|
+
code: 400,
|
|
12
|
+
siteKey: address
|
|
13
|
+
},
|
|
14
|
+
logger
|
|
15
|
+
});
|
|
16
|
+
} catch (err) {
|
|
17
|
+
throw new _prosopo_common.ProsopoApiError(translationKey, {
|
|
18
|
+
context: {
|
|
19
|
+
code: 400,
|
|
20
|
+
siteKey: address
|
|
21
|
+
},
|
|
22
|
+
logger
|
|
23
|
+
});
|
|
24
|
+
}
|
|
23
25
|
};
|
|
26
|
+
//#endregion
|
|
24
27
|
exports.validateAddr = validateAddr;
|
|
25
28
|
exports.validateSiteKey = validateSiteKey;
|