@prosopo/provider 4.12.0 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build$colon$cjs.log +41 -38
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +42 -39
- package/CHANGELOG.md +84 -0
- package/dist/api/admin/apiClearAllCountersEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiClearAllCountersEndpoint.js +1 -1
- package/dist/api/admin/apiClearAllCountersEndpoint.js.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js +1 -1
- package/dist/api/admin/apiGetAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js +1 -1
- package/dist/api/admin/apiGetDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +1 -1
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.js +1 -1
- package/dist/api/admin/apiRegisterSiteKeysEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveAllDecisionMachinesEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +1 -2
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveSiteKeyEndpoint.js.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js +1 -1
- package/dist/api/admin/apiRemoveSiteKeysEndpoint.js.map +1 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +3 -1
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js +1 -1
- package/dist/api/admin/apiUpdateDecisionMachineEndpoint.js.map +1 -1
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +1 -2
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +7 -3
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/captcha/checkSpamEmail.d.ts.map +1 -1
- package/dist/api/captcha/checkSpamEmail.js +19 -4
- package/dist/api/captcha/checkSpamEmail.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js +1 -7
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +8 -7
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +68 -28
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +0 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.js +3 -0
- package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPoWCaptchaChallenge.js +3 -0
- package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js +3 -0
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/api/captcha.d.ts +2 -1
- package/dist/api/captcha.d.ts.map +1 -1
- package/dist/api/captcha.js +12 -15
- package/dist/api/captcha.js.map +1 -1
- package/dist/api/domainMiddleware.d.ts.map +1 -1
- package/dist/api/domainMiddleware.js +4 -0
- package/dist/api/domainMiddleware.js.map +1 -1
- package/dist/api/forwardVerify.d.ts +14 -0
- package/dist/api/forwardVerify.d.ts.map +1 -0
- package/dist/api/forwardVerify.js +54 -0
- package/dist/api/forwardVerify.js.map +1 -0
- package/dist/api/headerCheckMiddleware.d.ts.map +1 -1
- package/dist/api/headerCheckMiddleware.js +7 -4
- package/dist/api/headerCheckMiddleware.js.map +1 -1
- package/dist/api/ja4.d.ts +5 -0
- package/dist/api/ja4.d.ts.map +1 -0
- package/dist/api/ja4.js +203 -0
- package/dist/api/ja4.js.map +1 -0
- package/dist/api/ja4Middleware.d.ts.map +1 -1
- package/dist/api/ja4Middleware.js +9 -18
- package/dist/api/ja4Middleware.js.map +1 -1
- package/dist/api/metrics.d.ts +40 -0
- package/dist/api/metrics.d.ts.map +1 -0
- package/dist/api/metrics.js +260 -0
- package/dist/api/metrics.js.map +1 -0
- package/dist/api/public.d.ts.map +1 -1
- package/dist/api/public.js +4 -0
- package/dist/api/public.js.map +1 -1
- package/dist/api/startProviderApi.d.ts.map +1 -1
- package/dist/api/startProviderApi.js +3 -1
- package/dist/api/startProviderApi.js.map +1 -1
- package/dist/api/verify.d.ts.map +1 -1
- package/dist/api/verify.js +85 -8
- package/dist/api/verify.js.map +1 -1
- package/dist/cjs/api/admin/apiClearAllCountersEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiGetAllDecisionMachinesEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiGetDecisionMachineEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiRegisterSiteKeysEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiRemoveAllDecisionMachinesEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiRemoveDecisionMachineEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +1 -3
- package/dist/cjs/api/admin/apiRemoveSiteKeyEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiRemoveSiteKeysEndpoint.cjs +1 -2
- package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +3 -2
- package/dist/cjs/api/admin/apiUpdateDecisionMachineEndpoint.cjs +1 -1
- package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +1 -2
- package/dist/cjs/api/blacklistRequestInspector.cjs +7 -3
- package/dist/cjs/api/captcha/checkSpamEmail.cjs +18 -3
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs +1 -7
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +8 -7
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +70 -30
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +0 -1
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -0
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -0
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -0
- package/dist/cjs/api/captcha.cjs +12 -15
- package/dist/cjs/api/domainMiddleware.cjs +4 -0
- package/dist/cjs/api/forwardVerify.cjs +54 -0
- package/dist/cjs/api/headerCheckMiddleware.cjs +7 -4
- package/dist/cjs/api/ja4.cjs +203 -0
- package/dist/cjs/api/ja4Middleware.cjs +11 -21
- package/dist/cjs/api/metrics.cjs +260 -0
- package/dist/cjs/api/public.cjs +4 -0
- package/dist/cjs/api/startProviderApi.cjs +3 -1
- package/dist/cjs/api/verify.cjs +83 -6
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/tasks/captchaManager.cjs +1 -2
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +20 -22
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +17 -23
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +15 -21
- package/dist/index.js +2 -1
- package/dist/tasks/captchaManager.js +1 -1
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -22
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
- package/dist/tasks/powCaptcha/powTasks.js +17 -23
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js +15 -21
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiClearAllCountersEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +5 -1
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRegisterSiteKeysEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiRemoveDetectorKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js +1 -0
- package/dist/tests/unit/api/admin/apiUpdateDetectorKeyEndpoint.unit.test.js.map +1 -1
- package/dist/tests/unit/api/adminRoutes.unit.test.js +1 -0
- package/dist/tests/unit/api/adminRoutes.unit.test.js.map +1 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +43 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js +62 -0
- package/dist/tests/unit/api/captcha/checkSpamEmail.unit.test.js.map +1 -0
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js +0 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +0 -1
- package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -1
- package/dist/tests/unit/api/captcha.unit.test.js +31 -1
- package/dist/tests/unit/api/captcha.unit.test.js.map +1 -1
- package/dist/tests/unit/api/forwardVerify.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/forwardVerify.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/forwardVerify.unit.test.js +151 -0
- package/dist/tests/unit/api/forwardVerify.unit.test.js.map +1 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +68 -0
- package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js +2 -2
- package/dist/tests/unit/api/headerCheckMiddleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/ja4.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ja4.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ja4.unit.test.js +233 -0
- package/dist/tests/unit/api/ja4.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js +11 -8
- package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
- package/dist/tests/unit/api/public.unit.test.js +72 -0
- package/dist/tests/unit/api/public.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +1 -1
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/getClientList.unit.test.js +1 -1
- package/dist/tests/unit/schedulers/getClientList.unit.test.js.map +1 -1
- package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js +1 -1
- package/dist/tests/unit/schedulers/setClientEntropy.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +1 -1
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +1 -1
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +1 -1
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +4 -1
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
- package/package.json +23 -23
|
@@ -3,14 +3,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
4
|
const logger = require("@prosopo/logger");
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
7
6
|
class ApiRegisterSiteKeyEndpoint {
|
|
8
7
|
constructor(clientTaskManager) {
|
|
9
8
|
this.clientTaskManager = clientTaskManager;
|
|
10
9
|
}
|
|
11
10
|
async processRequest(args, logger$1) {
|
|
12
11
|
const { siteKey, tier, settings } = args;
|
|
13
|
-
logger$1 = logger$1
|
|
12
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:site-key:register") : logger.getLogger("info", "provider:admin:site-key:register");
|
|
14
13
|
const temp = settings || types.ClientSettingsSchema.parse({});
|
|
15
14
|
logger$1.info(() => ({ data: { siteKey }, msg: "`Registering site key" }));
|
|
16
15
|
await this.clientTaskManager.registerSiteKey(siteKey, tier, temp);
|
|
@@ -3,13 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
4
|
const logger = require("@prosopo/logger");
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
7
6
|
class ApiRegisterSiteKeysEndpoint {
|
|
8
7
|
constructor(clientTaskManager) {
|
|
9
8
|
this.clientTaskManager = clientTaskManager;
|
|
10
9
|
}
|
|
11
10
|
async processRequest(args, logger$1) {
|
|
12
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:site-keys:register") : logger.getLogger("info", "provider:admin:site-keys:register");
|
|
13
12
|
logger$1.info(() => ({
|
|
14
13
|
data: { count: args.length },
|
|
15
14
|
msg: "Registering site keys"
|
|
@@ -9,7 +9,7 @@ class ApiRemoveAllDecisionMachinesEndpoint {
|
|
|
9
9
|
this.clientTaskManager = clientTaskManager;
|
|
10
10
|
}
|
|
11
11
|
async processRequest(args, logger$1) {
|
|
12
|
-
logger$1 = logger$1
|
|
12
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machines:remove-all") : logger.getLogger("info", "provider:admin:decision-machines:remove-all");
|
|
13
13
|
try {
|
|
14
14
|
logger$1.info(() => ({
|
|
15
15
|
msg: "Removing all decision machines"
|
|
@@ -8,7 +8,7 @@ class ApiRemoveDecisionMachineEndpoint {
|
|
|
8
8
|
this.clientTaskManager = clientTaskManager;
|
|
9
9
|
}
|
|
10
10
|
async processRequest(args, logger$1) {
|
|
11
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machine:remove") : logger.getLogger("info", "provider:admin:decision-machine:remove");
|
|
12
12
|
try {
|
|
13
13
|
const { id } = args;
|
|
14
14
|
logger$1.info(() => ({
|
|
@@ -3,16 +3,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
4
|
const logger = require("@prosopo/logger");
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
7
6
|
class ApiRemoveDetectorKeyEndpoint {
|
|
8
7
|
constructor(clientTaskManager) {
|
|
9
8
|
this.clientTaskManager = clientTaskManager;
|
|
10
9
|
}
|
|
11
10
|
async processRequest(args, logger$1) {
|
|
12
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:detector-key:remove") : logger.getLogger("info", "provider:admin:detector-key:remove");
|
|
13
12
|
try {
|
|
14
13
|
const { detectorKey, expirationInSeconds } = args;
|
|
15
|
-
logger$1 = logger$1 || logger.getLogger("info", typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("api/admin/apiRemoveDetectorKeyEndpoint.cjs", document.baseURI).href);
|
|
16
14
|
logger$1.info(() => ({ msg: "Removing detector key" }));
|
|
17
15
|
await this.clientTaskManager.removeDetectorKey(
|
|
18
16
|
detectorKey,
|
|
@@ -3,13 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
4
|
const logger = require("@prosopo/logger");
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
7
6
|
class ApiRemoveSiteKeyEndpoint {
|
|
8
7
|
constructor(clientTaskManager) {
|
|
9
8
|
this.clientTaskManager = clientTaskManager;
|
|
10
9
|
}
|
|
11
10
|
async processRequest(args, logger$1) {
|
|
12
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:site-key:remove") : logger.getLogger("info", "provider:admin:site-key:remove");
|
|
13
12
|
try {
|
|
14
13
|
const { siteKey } = args;
|
|
15
14
|
logger$1.info(() => ({ data: { siteKey }, msg: "Removing site key" }));
|
|
@@ -3,13 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
4
|
const logger = require("@prosopo/logger");
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
|
-
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
7
6
|
class ApiRemoveSiteKeysEndpoint {
|
|
8
7
|
constructor(clientTaskManager) {
|
|
9
8
|
this.clientTaskManager = clientTaskManager;
|
|
10
9
|
}
|
|
11
10
|
async processRequest(args, logger$1) {
|
|
12
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:site-keys:remove") : logger.getLogger("info", "provider:admin:site-keys:remove");
|
|
13
12
|
try {
|
|
14
13
|
logger$1.info(() => ({
|
|
15
14
|
data: { count: args.length },
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const apiRoute = require("@prosopo/api-route");
|
|
4
4
|
const logger = require("@prosopo/logger");
|
|
5
5
|
const types = require("@prosopo/types");
|
|
6
|
-
|
|
6
|
+
const metrics = require("../metrics.cjs");
|
|
7
7
|
function getMaintenanceMode() {
|
|
8
8
|
return process.env.MAINTENANCE_MODE?.toLowerCase() === "true";
|
|
9
9
|
}
|
|
@@ -13,13 +13,14 @@ function setMaintenanceMode(enabled) {
|
|
|
13
13
|
class ApiToggleMaintenanceModeEndpoint {
|
|
14
14
|
async processRequest(args, logger$1) {
|
|
15
15
|
const { enabled } = args;
|
|
16
|
-
logger$1 = logger$1
|
|
16
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:maintenance:toggle") : logger.getLogger("info", "provider:admin:maintenance:toggle");
|
|
17
17
|
const previousMode = getMaintenanceMode();
|
|
18
18
|
logger$1.info(() => ({
|
|
19
19
|
data: { enabled, previous: previousMode },
|
|
20
20
|
msg: "Toggling maintenance mode"
|
|
21
21
|
}));
|
|
22
22
|
setMaintenanceMode(enabled);
|
|
23
|
+
metrics.setMaintenanceModeGauge(enabled);
|
|
23
24
|
const currentMode = getMaintenanceMode();
|
|
24
25
|
logger$1.info(() => ({
|
|
25
26
|
data: { enabled: currentMode },
|
|
@@ -8,7 +8,7 @@ class ApiUpdateDecisionMachineEndpoint {
|
|
|
8
8
|
this.clientTaskManager = clientTaskManager;
|
|
9
9
|
}
|
|
10
10
|
async processRequest(args, logger$1) {
|
|
11
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:decision-machine:update") : logger.getLogger("info", "provider:admin:decision-machine:update");
|
|
12
12
|
try {
|
|
13
13
|
const {
|
|
14
14
|
decisionMachineScope,
|
|
@@ -8,10 +8,9 @@ class ApiUpdateDetectorKeyEndpoint {
|
|
|
8
8
|
this.clientTaskManager = clientTaskManager;
|
|
9
9
|
}
|
|
10
10
|
async processRequest(args, logger$1) {
|
|
11
|
-
logger$1 = logger$1
|
|
11
|
+
logger$1 = logger$1 ? logger$1.with({}, "admin:detector-key:update") : logger.getLogger("info", "provider:admin:detector-key:update");
|
|
12
12
|
try {
|
|
13
13
|
const { detectorKey } = args;
|
|
14
|
-
logger$1 = logger$1 || logger.getLogger("info", "");
|
|
15
14
|
logger$1.info(() => ({ msg: "Updating detector key" }));
|
|
16
15
|
const activeDetectorKeys = await this.clientTaskManager.updateDetectorKey(detectorKey);
|
|
17
16
|
logger$1.info(() => ({
|
|
@@ -4,6 +4,7 @@ const node_crypto = require("node:crypto");
|
|
|
4
4
|
const types = require("@prosopo/types");
|
|
5
5
|
const userAccessPolicy = require("@prosopo/user-access-policy");
|
|
6
6
|
const compositeIpAddress = require("../compositeIpAddress.cjs");
|
|
7
|
+
const metrics = require("./metrics.cjs");
|
|
7
8
|
const getRequestUserScope = (requestHeaders, ja4, ip, user, headHash, coords, countryCode, asn) => {
|
|
8
9
|
const userAgent = requestHeaders["user-agent"] ? requestHeaders["user-agent"].toString() : void 0;
|
|
9
10
|
return {
|
|
@@ -145,7 +146,7 @@ class BlacklistRequestInspector {
|
|
|
145
146
|
request.ipInfo
|
|
146
147
|
);
|
|
147
148
|
if (shouldAbortRequest) {
|
|
148
|
-
res.status(
|
|
149
|
+
res.status(403).json({ error: "Forbidden" });
|
|
149
150
|
return;
|
|
150
151
|
}
|
|
151
152
|
next();
|
|
@@ -163,6 +164,7 @@ class BlacklistRequestInspector {
|
|
|
163
164
|
},
|
|
164
165
|
msg: "Request without IP"
|
|
165
166
|
}));
|
|
167
|
+
metrics.recordBlockedRequest("no_ip");
|
|
166
168
|
return true;
|
|
167
169
|
}
|
|
168
170
|
await this.environmentReadinessWaiter();
|
|
@@ -205,6 +207,7 @@ class BlacklistRequestInspector {
|
|
|
205
207
|
const accessPolicy = enforceable[0];
|
|
206
208
|
const isBlock = userAccessPolicy.AccessPolicyType.Block === accessPolicy.type;
|
|
207
209
|
if (isBlock) {
|
|
210
|
+
metrics.recordBlockedRequest("access_policy");
|
|
208
211
|
this.recordBlockDecision(
|
|
209
212
|
accessPolicy,
|
|
210
213
|
{
|
|
@@ -226,14 +229,15 @@ class BlacklistRequestInspector {
|
|
|
226
229
|
err,
|
|
227
230
|
msg: "Block Middleware Error"
|
|
228
231
|
}));
|
|
232
|
+
metrics.recordBlockedRequest("error");
|
|
229
233
|
return true;
|
|
230
234
|
}
|
|
231
235
|
}
|
|
232
236
|
/**
|
|
233
237
|
* Emit a structured log line and (if a DB is wired) persist a synthetic
|
|
234
|
-
* Session record for the request we're about to
|
|
238
|
+
* Session record for the request we're about to block (403). Fire-and-forget on
|
|
235
239
|
* the Mongo side — the structured log line is the source of truth and
|
|
236
|
-
* the
|
|
240
|
+
* the 403 response is never delayed by a persistence failure.
|
|
237
241
|
*
|
|
238
242
|
* Carries the matched rule's identity (hash + ruleType + description)
|
|
239
243
|
* so the Traffic page can surface "what's blocking traffic for this
|
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const common = require("@prosopo/common");
|
|
3
|
+
const types = require("@prosopo/types");
|
|
3
4
|
const util = require("@prosopo/util");
|
|
4
5
|
const zod = require("zod");
|
|
5
6
|
require("../../tasks/index.cjs");
|
|
6
7
|
const checkSpamEmail$1 = require("../../tasks/spam/checkSpamEmail.cjs");
|
|
7
8
|
const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
9
|
+
const metrics = require("../metrics.cjs");
|
|
8
10
|
const tasks = require("../../tasks/tasks.cjs");
|
|
9
11
|
const CheckSpamEmailRequestBody = zod.object({
|
|
10
|
-
email:
|
|
11
|
-
dapp:
|
|
12
|
+
email: types.safeLine(types.INPUT_LIMITS.EMAIL),
|
|
13
|
+
dapp: types.safeLine(types.INPUT_LIMITS.ID)
|
|
12
14
|
});
|
|
13
15
|
const checkSpamEmail = (env) => async (req, res, next) => {
|
|
16
|
+
let email;
|
|
17
|
+
let dapp;
|
|
18
|
+
try {
|
|
19
|
+
({ email, dapp } = CheckSpamEmailRequestBody.parse(req.body));
|
|
20
|
+
} catch (err) {
|
|
21
|
+
return next(
|
|
22
|
+
new common.ProsopoApiError("CAPTCHA.PARSE_ERROR", {
|
|
23
|
+
context: { code: 400, error: err },
|
|
24
|
+
i18n: req.i18n,
|
|
25
|
+
logger: req.logger
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
}
|
|
14
29
|
try {
|
|
15
|
-
const { email, dapp } = CheckSpamEmailRequestBody.parse(req.body);
|
|
16
30
|
const emailDomain = util.extractDomainFromEmail(email);
|
|
17
31
|
req.logger.info(() => ({
|
|
18
32
|
msg: "Check spam email handler entry",
|
|
@@ -66,6 +80,7 @@ const checkSpamEmail = (env) => async (req, res, next) => {
|
|
|
66
80
|
isSpam
|
|
67
81
|
}
|
|
68
82
|
}));
|
|
83
|
+
metrics.recordSpamEmail(isSpam ? "spam" : "ham");
|
|
69
84
|
return res.json({
|
|
70
85
|
isSpam,
|
|
71
86
|
emailDomain
|
|
@@ -11,11 +11,10 @@ const handleAccessPolicy = async (input, res) => {
|
|
|
11
11
|
scoreComponents: input.scoreComponents
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
const { tasks, clientRecord, userAccessPolicy, logger
|
|
14
|
+
const { tasks, clientRecord, userAccessPolicy, logger } = input;
|
|
15
15
|
logger.info(() => ({
|
|
16
16
|
msg: "User access policy matched",
|
|
17
17
|
data: {
|
|
18
|
-
requestId,
|
|
19
18
|
policy: userAccessPolicy,
|
|
20
19
|
captchaType: userAccessPolicy.captchaType,
|
|
21
20
|
userScope: input.userScope
|
|
@@ -34,7 +33,6 @@ const handleAccessPolicy = async (input, res) => {
|
|
|
34
33
|
logger.info(() => ({
|
|
35
34
|
msg: "Frictionless decision",
|
|
36
35
|
data: {
|
|
37
|
-
requestId,
|
|
38
36
|
decision: "block",
|
|
39
37
|
captchaType: types.CaptchaType.image
|
|
40
38
|
}
|
|
@@ -57,7 +55,6 @@ const handleAccessPolicy = async (input, res) => {
|
|
|
57
55
|
logger.info(() => ({
|
|
58
56
|
msg: "Frictionless decision",
|
|
59
57
|
data: {
|
|
60
|
-
requestId,
|
|
61
58
|
decision: "auto_ban_score",
|
|
62
59
|
botScore,
|
|
63
60
|
autoBanThreshold,
|
|
@@ -88,7 +85,6 @@ const handleAccessPolicy = async (input, res) => {
|
|
|
88
85
|
logger.info(() => ({
|
|
89
86
|
msg: "Frictionless decision",
|
|
90
87
|
data: {
|
|
91
|
-
requestId,
|
|
92
88
|
decision: "user_access_policy",
|
|
93
89
|
captchaType: types.CaptchaType.image
|
|
94
90
|
}
|
|
@@ -111,7 +107,6 @@ const handleAccessPolicy = async (input, res) => {
|
|
|
111
107
|
logger.info(() => ({
|
|
112
108
|
msg: "Frictionless decision",
|
|
113
109
|
data: {
|
|
114
|
-
requestId,
|
|
115
110
|
decision: "user_access_policy",
|
|
116
111
|
captchaType: types.CaptchaType.pow
|
|
117
112
|
}
|
|
@@ -128,7 +123,6 @@ const handleAccessPolicy = async (input, res) => {
|
|
|
128
123
|
logger.info(() => ({
|
|
129
124
|
msg: "Frictionless decision",
|
|
130
125
|
data: {
|
|
131
|
-
requestId,
|
|
132
126
|
decision: "user_access_policy",
|
|
133
127
|
captchaType: types.CaptchaType.puzzle
|
|
134
128
|
}
|
|
@@ -6,6 +6,7 @@ const util = require("@prosopo/util");
|
|
|
6
6
|
const frictionlessTasks = require("../../../tasks/frictionless/frictionlessTasks.cjs");
|
|
7
7
|
const frictionlessTasksUtils = require("../../../tasks/frictionless/frictionlessTasksUtils.cjs");
|
|
8
8
|
const hashUserAgent = require("../../../utils/hashUserAgent.cjs");
|
|
9
|
+
const metrics = require("../../metrics.cjs");
|
|
9
10
|
const contextAwareValidation = require("../contextAwareValidation.cjs");
|
|
10
11
|
const constants = require("./constants.cjs");
|
|
11
12
|
const honeypotResponse = require("./honeypotResponse.cjs");
|
|
@@ -57,13 +58,13 @@ const runDecisionMachine = async (input, handle) => {
|
|
|
57
58
|
req.logger.info(() => ({
|
|
58
59
|
msg: "Frictionless decision",
|
|
59
60
|
data: {
|
|
60
|
-
requestId: req.requestId,
|
|
61
61
|
decision: "auto_ban_score",
|
|
62
62
|
botScore,
|
|
63
63
|
autoBanThreshold,
|
|
64
64
|
token: input.token
|
|
65
65
|
}
|
|
66
66
|
}));
|
|
67
|
+
metrics.recordFrictionlessDecision("auto_ban_score");
|
|
67
68
|
await tasks.frictionlessManager.registerBlockedSession({
|
|
68
69
|
solvedImagesCount: clientRecord.settings.imageMaxRounds,
|
|
69
70
|
userSitekeyIpHash,
|
|
@@ -78,11 +79,11 @@ const runDecisionMachine = async (input, handle) => {
|
|
|
78
79
|
req.logger.info(() => ({
|
|
79
80
|
msg: "Frictionless decision",
|
|
80
81
|
data: {
|
|
81
|
-
requestId: req.requestId,
|
|
82
82
|
decision: "webview_detected",
|
|
83
83
|
captchaType: types.CaptchaType.image
|
|
84
84
|
}
|
|
85
85
|
}));
|
|
86
|
+
metrics.recordFrictionlessDecision("webview_detected");
|
|
86
87
|
honeypotResponse.attachHoneypot(res, clientRecord);
|
|
87
88
|
return res.json(
|
|
88
89
|
await tasks.frictionlessManager.sendImageCaptcha({
|
|
@@ -102,11 +103,11 @@ const runDecisionMachine = async (input, handle) => {
|
|
|
102
103
|
req.logger.info(() => ({
|
|
103
104
|
msg: "Frictionless decision",
|
|
104
105
|
data: {
|
|
105
|
-
requestId: req.requestId,
|
|
106
106
|
decision: "timestamp_too_old",
|
|
107
107
|
captchaType: types.CaptchaType.image
|
|
108
108
|
}
|
|
109
109
|
}));
|
|
110
|
+
metrics.recordFrictionlessDecision("timestamp_too_old");
|
|
110
111
|
honeypotResponse.attachHoneypot(res, clientRecord);
|
|
111
112
|
return res.json(
|
|
112
113
|
await tasks.frictionlessManager.sendImageCaptcha({
|
|
@@ -135,11 +136,11 @@ const runDecisionMachine = async (input, handle) => {
|
|
|
135
136
|
req.logger.info(() => ({
|
|
136
137
|
msg: "Frictionless decision",
|
|
137
138
|
data: {
|
|
138
|
-
requestId: req.requestId,
|
|
139
139
|
decision: "bot_score_above_threshold",
|
|
140
140
|
captchaType: types.CaptchaType.image
|
|
141
141
|
}
|
|
142
142
|
}));
|
|
143
|
+
metrics.recordFrictionlessDecision("bot_score_above_threshold");
|
|
143
144
|
honeypotResponse.attachHoneypot(res, clientRecord);
|
|
144
145
|
return res.json(
|
|
145
146
|
await tasks.frictionlessManager.sendImageCaptcha({
|
|
@@ -158,11 +159,11 @@ const runDecisionMachine = async (input, handle) => {
|
|
|
158
159
|
req.logger.info(() => ({
|
|
159
160
|
msg: "Frictionless decision",
|
|
160
161
|
data: {
|
|
161
|
-
requestId: req.requestId,
|
|
162
162
|
decision: "default_pow",
|
|
163
163
|
captchaType: types.CaptchaType.pow
|
|
164
164
|
}
|
|
165
165
|
}));
|
|
166
|
+
metrics.recordFrictionlessDecision("default_pow");
|
|
166
167
|
honeypotResponse.attachHoneypot(res, clientRecord);
|
|
167
168
|
return res.json(
|
|
168
169
|
await tasks.frictionlessManager.sendPowCaptcha({
|
|
@@ -194,11 +195,11 @@ const runUserAgentMismatchCheck = async (input, handle) => {
|
|
|
194
195
|
req.logger.info(() => ({
|
|
195
196
|
msg: "Frictionless decision",
|
|
196
197
|
data: {
|
|
197
|
-
requestId: req.requestId,
|
|
198
198
|
decision: "user_agent_mismatch",
|
|
199
199
|
captchaType: types.CaptchaType.image
|
|
200
200
|
}
|
|
201
201
|
}));
|
|
202
|
+
metrics.recordFrictionlessDecision("user_agent_mismatch");
|
|
202
203
|
honeypotResponse.attachHoneypot(res, input.clientRecord);
|
|
203
204
|
return res.json(
|
|
204
205
|
await input.tasks.frictionlessManager.sendImageCaptcha({
|
|
@@ -254,13 +255,13 @@ const runContextAwareValidation = async (input, handle) => {
|
|
|
254
255
|
req.logger.info(() => ({
|
|
255
256
|
msg: "Frictionless decision",
|
|
256
257
|
data: {
|
|
257
|
-
requestId: req.requestId,
|
|
258
258
|
decision: "context_aware_failed",
|
|
259
259
|
captchaType: types.CaptchaType.image,
|
|
260
260
|
sim,
|
|
261
261
|
threshold
|
|
262
262
|
}
|
|
263
263
|
}));
|
|
264
|
+
metrics.recordFrictionlessDecision("context_aware_failed");
|
|
264
265
|
honeypotResponse.attachHoneypot(res, clientRecord);
|
|
265
266
|
return res.json(
|
|
266
267
|
await tasks.frictionlessManager.sendImageCaptcha({
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const common = require("@prosopo/common");
|
|
3
3
|
const types = require("@prosopo/types");
|
|
4
|
+
const userAccessPolicy = require("@prosopo/user-access-policy");
|
|
4
5
|
const util = require("@prosopo/util");
|
|
5
6
|
const compositeIpAddress = require("../../../compositeIpAddress.cjs");
|
|
6
7
|
require("../../../tasks/index.cjs");
|
|
@@ -10,6 +11,7 @@ const normalizeRequestIp = require("../../../utils/normalizeRequestIp.cjs");
|
|
|
10
11
|
const apiToggleMaintenanceModeEndpoint = require("../../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
11
12
|
const blacklistRequestInspector = require("../../blacklistRequestInspector.cjs");
|
|
12
13
|
const dnsEventUrl = require("../../dnsEventUrl.cjs");
|
|
14
|
+
const metrics = require("../../metrics.cjs");
|
|
13
15
|
const testSiteKey = require("../../testSiteKey.cjs");
|
|
14
16
|
const maintenanceModeResponses = require("../maintenanceModeResponses.cjs");
|
|
15
17
|
const accessPolicy = require("./accessPolicy.cjs");
|
|
@@ -26,7 +28,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
26
28
|
req.logger.info(() => ({
|
|
27
29
|
msg: "Frictionless response finished",
|
|
28
30
|
data: {
|
|
29
|
-
requestId: req.requestId,
|
|
30
31
|
status: res.statusCode,
|
|
31
32
|
path: req.path,
|
|
32
33
|
method: req.method
|
|
@@ -39,7 +40,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
39
40
|
req.logger.info(() => ({
|
|
40
41
|
msg: "Frictionless handler entry",
|
|
41
42
|
data: {
|
|
42
|
-
requestId: req.requestId,
|
|
43
43
|
token,
|
|
44
44
|
user,
|
|
45
45
|
dapp,
|
|
@@ -104,30 +104,68 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
104
104
|
);
|
|
105
105
|
}
|
|
106
106
|
if (dedup) {
|
|
107
|
-
req.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
107
|
+
const dedupCountryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
|
|
108
|
+
const dedupAsn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
|
|
109
|
+
const dedupUserScope = blacklistRequestInspector.getRequestUserScope(
|
|
110
|
+
util.flatten(req.headers),
|
|
111
|
+
req.ja4,
|
|
112
|
+
normalizedIp,
|
|
113
|
+
user,
|
|
114
|
+
void 0,
|
|
115
|
+
void 0,
|
|
116
|
+
dedupCountryCode,
|
|
117
|
+
dedupAsn
|
|
118
|
+
);
|
|
119
|
+
const dedupAccessPolicy = (await tasks$1.frictionlessManager.getPrioritisedAccessPolicies(
|
|
120
|
+
userAccessRulesStorage,
|
|
121
|
+
dapp,
|
|
122
|
+
dedupUserScope
|
|
123
|
+
))[0];
|
|
124
|
+
const dedupConflictsWithPolicy = dedupAccessPolicy !== void 0 && (dedupAccessPolicy.type === userAccessPolicy.AccessPolicyType.Block || dedupAccessPolicy.captchaType !== void 0 && dedupAccessPolicy.captchaType !== dedup.captchaType);
|
|
125
|
+
if (dedupConflictsWithPolicy) {
|
|
126
|
+
req.logger.info(() => ({
|
|
127
|
+
msg: "Evicting reused session: cached captchaType conflicts with access policy",
|
|
128
|
+
data: {
|
|
129
|
+
userSitekeyIpHash,
|
|
130
|
+
sessionId: dedup.sessionId,
|
|
131
|
+
cachedCaptchaType: dedup.captchaType,
|
|
132
|
+
policyType: dedupAccessPolicy.type,
|
|
133
|
+
policyCaptchaType: dedupAccessPolicy.captchaType
|
|
134
|
+
}
|
|
135
|
+
}));
|
|
136
|
+
await tasks$1.db.checkAndRemoveSession(dedup.sessionId);
|
|
137
|
+
await Promise.all([
|
|
138
|
+
tasks$1.writeQueue?.invalidateCachedSession(dedup.sessionId) ?? Promise.resolve(),
|
|
139
|
+
tasks$1.writeQueue?.invalidateCachedSessionByHash(
|
|
140
|
+
userSitekeyIpHash
|
|
141
|
+
) ?? Promise.resolve()
|
|
142
|
+
]);
|
|
143
|
+
} else {
|
|
144
|
+
req.logger.info(() => ({
|
|
145
|
+
msg: "Reusing existing session for user-IP-sitekey combination",
|
|
146
|
+
data: {
|
|
147
|
+
userSitekeyIpHash,
|
|
148
|
+
sessionId: dedup.sessionId,
|
|
149
|
+
captchaType: dedup.captchaType
|
|
150
|
+
}
|
|
151
|
+
}));
|
|
152
|
+
req.logger.info(() => ({
|
|
153
|
+
msg: "Frictionless decision",
|
|
154
|
+
data: {
|
|
155
|
+
decision: "reuse_session",
|
|
156
|
+
captchaType: dedup.captchaType,
|
|
157
|
+
sessionId: dedup.sessionId
|
|
158
|
+
}
|
|
159
|
+
}));
|
|
160
|
+
metrics.recordFrictionlessDecision("reuse_session");
|
|
161
|
+
honeypotResponse.attachHoneypot(res, clientRecord);
|
|
162
|
+
return res.json({
|
|
163
|
+
[types.ApiParams.captchaType]: dedup.captchaType,
|
|
164
|
+
[types.ApiParams.sessionId]: dedup.sessionId,
|
|
165
|
+
[types.ApiParams.status]: "ok",
|
|
166
|
+
dns_url: dnsEventUrl.buildDnsEventUrl(dedup.sessionId)
|
|
167
|
+
});
|
|
168
|
+
}
|
|
131
169
|
}
|
|
132
170
|
const ipAddress = compositeIpAddress.getCompositeIpAddress(normalizedIp);
|
|
133
171
|
const flatHeaders = util.flatten(req.headers);
|
|
@@ -145,7 +183,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
145
183
|
flatHeaders,
|
|
146
184
|
sessionMode,
|
|
147
185
|
userSitekeyIpHash,
|
|
148
|
-
requestId: req.requestId,
|
|
149
186
|
logger: req.logger
|
|
150
187
|
},
|
|
151
188
|
res
|
|
@@ -214,6 +251,10 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
214
251
|
})
|
|
215
252
|
);
|
|
216
253
|
}
|
|
254
|
+
metrics.recordBotScore(botScore);
|
|
255
|
+
if (triggeredDetectors && triggeredDetectors.length > 0) {
|
|
256
|
+
metrics.recordDetectorTriggered(triggeredDetectors);
|
|
257
|
+
}
|
|
217
258
|
const botThreshold = clientRecord.settings?.frictionlessThreshold || constants.DEFAULT_FRICTIONLESS_THRESHOLD;
|
|
218
259
|
let scoreComponents = {
|
|
219
260
|
baseScore: baseBotScore,
|
|
@@ -265,12 +306,12 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
265
306
|
...req.ja4 && { ja4: req.ja4 }
|
|
266
307
|
}
|
|
267
308
|
});
|
|
268
|
-
const userAccessPolicy = accessPolicies[0];
|
|
309
|
+
const userAccessPolicy$1 = accessPolicies[0];
|
|
269
310
|
const accessPolicyOutcome = await accessPolicy.handleAccessPolicy(
|
|
270
311
|
{
|
|
271
312
|
tasks: tasks$1,
|
|
272
313
|
clientRecord,
|
|
273
|
-
userAccessPolicy,
|
|
314
|
+
userAccessPolicy: userAccessPolicy$1,
|
|
274
315
|
baseBotScore,
|
|
275
316
|
botScore,
|
|
276
317
|
scoreComponents,
|
|
@@ -278,7 +319,6 @@ const getFrictionlessCaptchaChallenge = (env, userAccessRulesStorage) => async (
|
|
|
278
319
|
dapp,
|
|
279
320
|
ipInfo: req.ipInfo,
|
|
280
321
|
flatHeaders,
|
|
281
|
-
requestId: req.requestId,
|
|
282
322
|
logger: req.logger,
|
|
283
323
|
userScope
|
|
284
324
|
},
|
|
@@ -7,6 +7,7 @@ require("../../tasks/index.cjs");
|
|
|
7
7
|
const normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
8
8
|
const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
9
9
|
const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
10
|
+
const metrics = require("../metrics.cjs");
|
|
10
11
|
const validateAddress = require("../validateAddress.cjs");
|
|
11
12
|
const maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
12
13
|
const tasks = require("../../tasks/tasks.cjs");
|
|
@@ -183,8 +184,10 @@ const getImageCaptchaChallenge = (env, userAccessRulesStorage) => async (req, re
|
|
|
183
184
|
sessionId
|
|
184
185
|
}
|
|
185
186
|
}));
|
|
187
|
+
metrics.recordCaptchaIssued(types.CaptchaType.image);
|
|
186
188
|
return res.json(captchaResponse);
|
|
187
189
|
} catch (err) {
|
|
190
|
+
metrics.recordCaptchaIssueError(types.CaptchaType.image);
|
|
188
191
|
req.logger.error(() => ({
|
|
189
192
|
err,
|
|
190
193
|
data: req.params,
|
|
@@ -7,6 +7,7 @@ require("../../tasks/index.cjs");
|
|
|
7
7
|
const normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
8
8
|
const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
9
9
|
const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
10
|
+
const metrics = require("../metrics.cjs");
|
|
10
11
|
const validateAddress = require("../validateAddress.cjs");
|
|
11
12
|
const maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
12
13
|
const tasks = require("../../tasks/tasks.cjs");
|
|
@@ -175,8 +176,10 @@ const getPoWCaptchaChallenge = (env, userAccessRulesStorage) => async (req, res,
|
|
|
175
176
|
session: sessionId
|
|
176
177
|
}
|
|
177
178
|
}));
|
|
179
|
+
metrics.recordCaptchaIssued(types.CaptchaType.pow);
|
|
178
180
|
return res.json(getPowCaptchaResponse);
|
|
179
181
|
} catch (err) {
|
|
182
|
+
metrics.recordCaptchaIssueError(types.CaptchaType.pow);
|
|
180
183
|
req.logger.error(() => ({
|
|
181
184
|
err,
|
|
182
185
|
body: req.body,
|
|
@@ -7,6 +7,7 @@ require("../../tasks/index.cjs");
|
|
|
7
7
|
const normalizeRequestIp = require("../../utils/normalizeRequestIp.cjs");
|
|
8
8
|
const apiToggleMaintenanceModeEndpoint = require("../admin/apiToggleMaintenanceModeEndpoint.cjs");
|
|
9
9
|
const blacklistRequestInspector = require("../blacklistRequestInspector.cjs");
|
|
10
|
+
const metrics = require("../metrics.cjs");
|
|
10
11
|
const validateAddress = require("../validateAddress.cjs");
|
|
11
12
|
const maintenanceModeResponses = require("./maintenanceModeResponses.cjs");
|
|
12
13
|
const tasks = require("../../tasks/tasks.cjs");
|
|
@@ -178,8 +179,10 @@ const getPuzzleCaptchaChallenge = (env, userAccessRulesStorage) => async (req, r
|
|
|
178
179
|
session: sessionId
|
|
179
180
|
}
|
|
180
181
|
}));
|
|
182
|
+
metrics.recordCaptchaIssued(types.CaptchaType.puzzle);
|
|
181
183
|
return res.json(getPuzzleCaptchaResponse);
|
|
182
184
|
} catch (err) {
|
|
185
|
+
metrics.recordCaptchaIssueError(types.CaptchaType.puzzle);
|
|
183
186
|
req.logger.error(() => ({
|
|
184
187
|
err,
|
|
185
188
|
body: req.body,
|