@prosopo/provider 4.15.14 → 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 +49 -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
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
//#region src/utils/devicePlatform.ts
|
|
2
|
+
var APPLE_UA_REGEX = /iPhone|iPad|iPod|Macintosh|Mac OS X/i;
|
|
3
|
+
var MOBILE_UA_REGEX = /Mobile|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/i;
|
|
4
|
+
/**
|
|
5
|
+
* Derive platform flags from server-visible signals. `isWebView` is supplied
|
|
6
|
+
* by the caller because that bit only comes from the encrypted bot-detection
|
|
7
|
+
* payload, not request headers. `isMobile` prefers IPInfo's network-classified
|
|
8
|
+
* mobile bit when present and falls back to UA parsing otherwise.
|
|
9
|
+
*/
|
|
10
|
+
var derivePlatform = (userAgent, webView, ipInfo) => ({
|
|
11
|
+
isApple: APPLE_UA_REGEX.test(userAgent),
|
|
12
|
+
isWebView: webView,
|
|
13
|
+
isMobile: typeof ipInfo?.isMobile === "boolean" ? ipInfo.isMobile : MOBILE_UA_REGEX.test(userAgent)
|
|
9
14
|
});
|
|
15
|
+
//#endregion
|
|
10
16
|
exports.derivePlatform = derivePlatform;
|
package/dist/cjs/utils/dns.cjs
CHANGED
|
@@ -1,101 +1,76 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return Object.freeze(n);
|
|
21
|
-
}
|
|
22
|
-
const dns__namespace = /* @__PURE__ */ _interopNamespaceDefault(dns);
|
|
23
|
-
const https__namespace = /* @__PURE__ */ _interopNamespaceDefault(https);
|
|
24
|
-
const DEFAULT_DNS_SERVERS = ["8.8.8.8", "1.1.1.1"];
|
|
25
|
-
const DEFAULT_HTTPS_TIMEOUT_MS = 1e3;
|
|
26
|
-
const createResolver = (dnsServers) => {
|
|
27
|
-
const resolver = new dns__namespace.Resolver();
|
|
28
|
-
resolver.setServers(dnsServers ?? DEFAULT_DNS_SERVERS);
|
|
29
|
-
return resolver;
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let node_dns = require("node:dns");
|
|
3
|
+
node_dns = require_runtime.__toESM(node_dns, 1);
|
|
4
|
+
let node_https = require("node:https");
|
|
5
|
+
node_https = require_runtime.__toESM(node_https, 1);
|
|
6
|
+
let node_util = require("node:util");
|
|
7
|
+
//#region src/utils/dns.ts
|
|
8
|
+
/** Default DNS servers to use for lookups (Google and Cloudflare) */
|
|
9
|
+
var DEFAULT_DNS_SERVERS = ["8.8.8.8", "1.1.1.1"];
|
|
10
|
+
/** Default timeout for HTTPS requests in milliseconds */
|
|
11
|
+
var DEFAULT_HTTPS_TIMEOUT_MS = 1e3;
|
|
12
|
+
/**
|
|
13
|
+
* Creates an isolated DNS resolver instance that doesn't affect global DNS config.
|
|
14
|
+
* Uses custom DNS servers by default for reliable lookups.
|
|
15
|
+
*/
|
|
16
|
+
var createResolver = (dnsServers) => {
|
|
17
|
+
const resolver = new node_dns.Resolver();
|
|
18
|
+
resolver.setServers(dnsServers ?? DEFAULT_DNS_SERVERS);
|
|
19
|
+
return resolver;
|
|
30
20
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
21
|
+
var checkForCname = async (domain, resolver) => {
|
|
22
|
+
try {
|
|
23
|
+
const res = resolver ?? createResolver();
|
|
24
|
+
return await (0, node_util.promisify)(res.resolveCname.bind(res))(domain);
|
|
25
|
+
} catch (err) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
39
28
|
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
29
|
+
var checkForMXRecord = async (domain, resolver) => {
|
|
30
|
+
try {
|
|
31
|
+
const res = resolver ?? createResolver();
|
|
32
|
+
return await (0, node_util.promisify)(res.resolveMx.bind(res))(domain);
|
|
33
|
+
} catch (err) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
48
36
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
37
|
+
var checkForRedirect = (url, timeoutMs = DEFAULT_HTTPS_TIMEOUT_MS) => {
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
const req = node_https.get(url, { timeout: timeoutMs }, (res) => {
|
|
40
|
+
res.resume();
|
|
41
|
+
if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) try {
|
|
42
|
+
const absoluteUrl = new URL(res.headers.location, url).href;
|
|
43
|
+
resolve({ redirectUrl: absoluteUrl });
|
|
44
|
+
} catch {
|
|
45
|
+
resolve({});
|
|
46
|
+
}
|
|
47
|
+
else resolve({});
|
|
48
|
+
}).on("timeout", () => {
|
|
49
|
+
req.destroy();
|
|
50
|
+
resolve({ timeout: true });
|
|
51
|
+
}).on("error", (e) => {
|
|
52
|
+
resolve({ tlsError: e.message.includes("CERT") || e.message.includes("SSL") || e.message.includes("TLS") || e.message.includes("certificate") || e.message.includes("EPROTO") });
|
|
53
|
+
});
|
|
54
|
+
});
|
|
57
55
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
resolve({ timeout: true });
|
|
75
|
-
}).on("error", (e) => {
|
|
76
|
-
const isTlsError = e.message.includes("CERT") || e.message.includes("SSL") || e.message.includes("TLS") || e.message.includes("certificate") || e.message.includes("EPROTO");
|
|
77
|
-
resolve({ tlsError: isTlsError });
|
|
78
|
-
});
|
|
79
|
-
});
|
|
56
|
+
var runDnsChecks = async (domain, options) => {
|
|
57
|
+
const resolver = createResolver(options?.dnsServers);
|
|
58
|
+
try {
|
|
59
|
+
const [cnameResult, mxRecordResult, redirectResult] = await Promise.all([
|
|
60
|
+
checkForCname(domain, resolver),
|
|
61
|
+
checkForMXRecord(domain, resolver),
|
|
62
|
+
checkForRedirect(`https://${domain}`)
|
|
63
|
+
]);
|
|
64
|
+
return {
|
|
65
|
+
cnameResult,
|
|
66
|
+
mxRecordResult,
|
|
67
|
+
redirectResult
|
|
68
|
+
};
|
|
69
|
+
} catch (e) {
|
|
70
|
+
throw new Error(`Error during DNS checks: ${e.toString()}`);
|
|
71
|
+
}
|
|
80
72
|
};
|
|
81
|
-
|
|
82
|
-
const resolver = createResolver(options?.dnsServers);
|
|
83
|
-
try {
|
|
84
|
-
const [cnameResult, mxRecordResult, redirectResult] = await Promise.all([
|
|
85
|
-
checkForCname(domain, resolver),
|
|
86
|
-
checkForMXRecord(domain, resolver),
|
|
87
|
-
checkForRedirect(`https://${domain}`)
|
|
88
|
-
]);
|
|
89
|
-
return {
|
|
90
|
-
cnameResult,
|
|
91
|
-
mxRecordResult,
|
|
92
|
-
redirectResult
|
|
93
|
-
};
|
|
94
|
-
} catch (e) {
|
|
95
|
-
throw new Error(`Error during DNS checks: ${e.toString()}`);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
exports.checkForARecord = checkForARecord;
|
|
73
|
+
//#endregion
|
|
99
74
|
exports.checkForCname = checkForCname;
|
|
100
75
|
exports.checkForMXRecord = checkForMXRecord;
|
|
101
76
|
exports.checkForRedirect = checkForRedirect;
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
let node_crypto = require("node:crypto");
|
|
2
|
+
//#region src/utils/hashUserAgent.ts
|
|
3
|
+
/**
|
|
4
|
+
* Hash a user agent string to a fixed-length string to prevent RSA-OAEP encryption size limits
|
|
5
|
+
* Uses SHA-256 and returns first 32 characters of the hex digest (128 bits)
|
|
6
|
+
* This provides a good balance between uniqueness and size constraints
|
|
7
|
+
*
|
|
8
|
+
* @param userAgent - The user agent string to hash
|
|
9
|
+
* @returns A 32-character hex string representing the hash
|
|
10
|
+
*/
|
|
4
11
|
function hashUserAgent(userAgent) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return hashHex.substring(0, 32);
|
|
12
|
+
const hash = (0, node_crypto.createHash)("sha256");
|
|
13
|
+
hash.update(userAgent, "utf8");
|
|
14
|
+
return hash.digest("hex").substring(0, 32);
|
|
9
15
|
}
|
|
16
|
+
//#endregion
|
|
10
17
|
exports.hashUserAgent = hashUserAgent;
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
let node_crypto = require("node:crypto");
|
|
2
|
+
//#region src/utils/hashUserIp.ts
|
|
3
|
+
/**
|
|
4
|
+
* Hash a user and IP address combination to create a unique session identifier
|
|
5
|
+
* SHA-256 hash of user:ip:sitekey combination
|
|
6
|
+
*
|
|
7
|
+
* @param user - The user identifier
|
|
8
|
+
* @param ip - The IP address
|
|
9
|
+
* @returns A 64-character hex string representing the hash
|
|
10
|
+
*/
|
|
4
11
|
function hashUserIp(user, ip, sitekey) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
const hash = (0, node_crypto.createHash)("sha256");
|
|
13
|
+
hash.update(`${user}:${ip}:${sitekey}`, "utf8");
|
|
14
|
+
return hash.digest("hex");
|
|
8
15
|
}
|
|
16
|
+
//#endregion
|
|
9
17
|
exports.hashUserIp = hashUserIp;
|
|
@@ -1,86 +1,80 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
"9": "----."
|
|
1
|
+
let _prosopo_types = require("@prosopo/types");
|
|
2
|
+
//#region src/utils/honeypot/encoders.ts
|
|
3
|
+
var MORSE_MAP = {
|
|
4
|
+
a: ".-",
|
|
5
|
+
b: "-...",
|
|
6
|
+
c: "-.-.",
|
|
7
|
+
d: "-..",
|
|
8
|
+
e: ".",
|
|
9
|
+
f: "..-.",
|
|
10
|
+
g: "--.",
|
|
11
|
+
h: "....",
|
|
12
|
+
i: "..",
|
|
13
|
+
j: ".---",
|
|
14
|
+
k: "-.-",
|
|
15
|
+
l: ".-..",
|
|
16
|
+
m: "--",
|
|
17
|
+
n: "-.",
|
|
18
|
+
o: "---",
|
|
19
|
+
p: ".--.",
|
|
20
|
+
q: "--.-",
|
|
21
|
+
r: ".-.",
|
|
22
|
+
s: "...",
|
|
23
|
+
t: "-",
|
|
24
|
+
u: "..-",
|
|
25
|
+
v: "...-",
|
|
26
|
+
w: ".--",
|
|
27
|
+
x: "-..-",
|
|
28
|
+
y: "-.--",
|
|
29
|
+
z: "--..",
|
|
30
|
+
"0": "-----",
|
|
31
|
+
"1": ".----",
|
|
32
|
+
"2": "..---",
|
|
33
|
+
"3": "...--",
|
|
34
|
+
"4": "....-",
|
|
35
|
+
"5": ".....",
|
|
36
|
+
"6": "-....",
|
|
37
|
+
"7": "--...",
|
|
38
|
+
"8": "---..",
|
|
39
|
+
"9": "----."
|
|
41
40
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
41
|
+
var SEMAPHORE_MAP = {
|
|
42
|
+
a: "↙↓",
|
|
43
|
+
b: "←↓",
|
|
44
|
+
c: "↖↓",
|
|
45
|
+
d: "↑↓",
|
|
46
|
+
e: "↓↘",
|
|
47
|
+
f: "↓→",
|
|
48
|
+
g: "↓↗",
|
|
49
|
+
h: "↙←",
|
|
50
|
+
i: "↙↖",
|
|
51
|
+
j: "↓↑",
|
|
52
|
+
k: "↑←",
|
|
53
|
+
l: "↗←",
|
|
54
|
+
m: "←↖",
|
|
55
|
+
n: "←↑",
|
|
56
|
+
o: "↖↑",
|
|
57
|
+
p: "↑↗",
|
|
58
|
+
q: "↗→",
|
|
59
|
+
r: "→↘",
|
|
60
|
+
s: "↘↓",
|
|
61
|
+
t: "↓↙",
|
|
62
|
+
u: "↘↗",
|
|
63
|
+
v: "→↑",
|
|
64
|
+
w: "↘↑",
|
|
65
|
+
x: "↙↗",
|
|
66
|
+
y: "→↗",
|
|
67
|
+
z: "↘→"
|
|
69
68
|
};
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return words.map(
|
|
73
|
-
(word) => [...word].map((ch) => MORSE_MAP[ch]).filter((code) => Boolean(code)).join(" ")
|
|
74
|
-
).filter(Boolean).join(" / ");
|
|
69
|
+
var encodeMorse = (text) => {
|
|
70
|
+
return text.toLowerCase().split(/\s+/).filter(Boolean).map((word) => [...word].map((ch) => MORSE_MAP[ch]).filter((code) => Boolean(code)).join(" ")).filter(Boolean).join(" / ");
|
|
75
71
|
};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return words.map(
|
|
79
|
-
(word) => [...word].map((ch) => SEMAPHORE_MAP[ch]).filter((code) => Boolean(code)).join(" ")
|
|
80
|
-
).filter(Boolean).join(" / ");
|
|
72
|
+
var encodeSemaphore = (text) => {
|
|
73
|
+
return text.toLowerCase().split(/\s+/).filter(Boolean).map((word) => [...word].map((ch) => SEMAPHORE_MAP[ch]).filter((code) => Boolean(code)).join(" ")).filter(Boolean).join(" / ");
|
|
81
74
|
};
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
75
|
+
var encodeHoneypotQuestion = (text, encoding) => {
|
|
76
|
+
const encoded = encoding === _prosopo_types.EncodingType.morse ? encodeMorse(text) : encodeSemaphore(text);
|
|
77
|
+
return Buffer.from(encoded, "utf-8").toString("base64");
|
|
85
78
|
};
|
|
79
|
+
//#endregion
|
|
86
80
|
exports.encodeHoneypotQuestion = encodeHoneypotQuestion;
|
|
@@ -1,47 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
1
|
+
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let _prosopo_logger = require("@prosopo/logger");
|
|
3
|
+
let node_fs = require("node:fs");
|
|
4
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
5
|
+
//#region src/utils/honeypot/phraseBank.ts
|
|
6
|
+
var DEFAULT_PHRASE_BANK_PATH = "/app/data/honeypot-phrases.json";
|
|
7
|
+
var logger = (0, _prosopo_logger.getLogger)("info", "honeypot-phrase-bank");
|
|
8
|
+
var cachedPhrases = null;
|
|
9
|
+
var resolvePath = () => process.env.PROSOPO_HONEYPOT_PHRASE_BANK_PATH ?? DEFAULT_PHRASE_BANK_PATH;
|
|
10
|
+
var loadPhrases = () => {
|
|
11
|
+
const path = resolvePath();
|
|
12
|
+
try {
|
|
13
|
+
const raw = node_fs.default.readFileSync(path, "utf-8");
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
if (parsed && typeof parsed === "object" && "phrases" in parsed && Array.isArray(parsed.phrases)) {
|
|
16
|
+
const phrases = parsed.phrases.filter((p) => typeof p === "string" && p.trim().length > 0);
|
|
17
|
+
logger.info(() => ({
|
|
18
|
+
msg: "Loaded honeypot phrase bank",
|
|
19
|
+
data: {
|
|
20
|
+
path,
|
|
21
|
+
count: phrases.length
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
return phrases;
|
|
25
|
+
}
|
|
26
|
+
logger.warn(() => ({
|
|
27
|
+
msg: "Honeypot phrase bank missing `phrases` array",
|
|
28
|
+
data: { path }
|
|
29
|
+
}));
|
|
30
|
+
return [];
|
|
31
|
+
} catch (err) {
|
|
32
|
+
logger.warn(() => ({
|
|
33
|
+
msg: "Failed to load honeypot phrase bank — fallback questions disabled",
|
|
34
|
+
data: {
|
|
35
|
+
path,
|
|
36
|
+
err: err instanceof Error ? err.message : String(err)
|
|
37
|
+
}
|
|
38
|
+
}));
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
36
41
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Returns a random phrase from the loaded bank, or `undefined` if the bank
|
|
44
|
+
* is empty / unloadable. Loads lazily on first call so startup ordering
|
|
45
|
+
* doesn't matter and tests can swap the env var before first use.
|
|
46
|
+
*/
|
|
47
|
+
var getRandomPhrase = () => {
|
|
48
|
+
if (cachedPhrases === null) cachedPhrases = loadPhrases();
|
|
49
|
+
if (cachedPhrases.length === 0) return void 0;
|
|
50
|
+
const idx = Math.floor(Math.random() * cachedPhrases.length);
|
|
51
|
+
return cachedPhrases[idx];
|
|
45
52
|
};
|
|
53
|
+
//#endregion
|
|
46
54
|
exports.getRandomPhrase = getRandomPhrase;
|
|
47
|
-
exports.resetPhraseBankCache = resetPhraseBankCache;
|
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
//#region src/utils/normalizeRequestIp.ts
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes a request IP address from various formats to a string
|
|
4
|
+
*
|
|
5
|
+
* Handles different IP formats:
|
|
6
|
+
* - Direct string
|
|
7
|
+
* - Object with address property (e.g., IPv6 format)
|
|
8
|
+
* - Other objects by converting to string
|
|
9
|
+
*
|
|
10
|
+
* @param rawIp - The raw IP value from the request
|
|
11
|
+
* @param logger - Logger instance for debugging
|
|
12
|
+
* @returns Normalized IP address as a string
|
|
13
|
+
*/
|
|
14
|
+
var normalizeRequestIp = (rawIp, logger) => {
|
|
15
|
+
let normalizedIp = "";
|
|
16
|
+
const rawType = typeof rawIp;
|
|
17
|
+
const rawCtor = rawIp && rawType === "object" ? rawIp.constructor?.name : void 0;
|
|
18
|
+
const addressProp = rawIp && rawType === "object" ? rawIp.address : void 0;
|
|
19
|
+
if (rawType === "string") normalizedIp = rawIp;
|
|
20
|
+
else if (typeof addressProp === "string") normalizedIp = addressProp;
|
|
21
|
+
else if (rawIp != null) normalizedIp = String(rawIp);
|
|
22
|
+
logger.debug(() => ({
|
|
23
|
+
msg: "Normalized request IP",
|
|
24
|
+
data: {
|
|
25
|
+
rawIpType: rawType,
|
|
26
|
+
rawIpCtor: rawCtor,
|
|
27
|
+
rawIpString: rawType === "string" ? rawIp : void 0,
|
|
28
|
+
addressPropType: typeof addressProp,
|
|
29
|
+
normalizedIp
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
return normalizedIp;
|
|
26
33
|
};
|
|
34
|
+
//#endregion
|
|
27
35
|
exports.normalizeRequestIp = normalizeRequestIp;
|