@prosopo/provider 4.7.2 → 4.8.1
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 +14 -14
- package/.turbo/turbo-build$colon$tsc.log +24 -24
- package/.turbo/turbo-build.log +15 -15
- package/CHANGELOG.md +21 -0
- package/dist/api/admin/apiDnsEventEndpoint.d.ts +6 -2
- package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
- package/dist/api/admin/apiDnsEventEndpoint.js +19 -17
- package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
- package/dist/api/blacklistRequestInspector.d.ts +4 -3
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
- package/dist/api/blacklistRequestInspector.js +85 -39
- package/dist/api/blacklistRequestInspector.js.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +3 -1
- package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
- package/dist/api/captcha/getImageCaptchaChallenge.js +3 -1
- 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 -1
- 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 -1
- package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
- package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +19 -17
- package/dist/cjs/api/blacklistRequestInspector.cjs +83 -37
- package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +3 -1
- package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -1
- package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -1
- package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/tasks/captchaManager.cjs +3 -2
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +2 -1
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +2 -1
- package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +2 -1
- package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +1 -1
- package/dist/index.js +2 -1
- package/dist/tasks/captchaManager.d.ts +1 -1
- package/dist/tasks/captchaManager.d.ts.map +1 -1
- package/dist/tasks/captchaManager.js +3 -2
- package/dist/tasks/captchaManager.js.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +2 -1
- 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 +2 -1
- 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 +2 -1
- package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js +1 -1
- package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +10 -94
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -1
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +150 -0
- package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +132 -1
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js +15 -0
- package/dist/tests/unit/tasks/spam/checkTrafficFilter.unit.test.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/provider@4.
|
|
2
|
+
> @prosopo/provider@4.8.1 build:cjs
|
|
3
3
|
> NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
|
|
4
4
|
|
|
5
5
|
ViteCommonJSConfig: .
|
|
@@ -100,9 +100,9 @@ rendering chunks...
|
|
|
100
100
|
[2mdist/cjs/[22m[36mapi/admin/apiGetAllDecisionMachinesEndpoint.cjs [39m[1m[2m 1.57 kB[22m[1m[22m
|
|
101
101
|
[2mdist/cjs/[22m[36mcompositeIpAddress.cjs [39m[1m[2m 1.64 kB[22m[1m[22m
|
|
102
102
|
[2mdist/cjs/[22m[36mschedulers/updateSpamEmailDomains.cjs [39m[1m[2m 1.65 kB[22m[1m[22m
|
|
103
|
-
[2mdist/cjs/[22m[36mtasks/spam/checkTrafficFilter.cjs [39m[1m[2m 1.67 kB[22m[1m[22m
|
|
104
103
|
[2mdist/cjs/[22m[36mutils/honeypot/phraseBank.cjs [39m[1m[2m 1.71 kB[22m[1m[22m
|
|
105
104
|
[2mdist/cjs/[22m[36mapi/admin/apiToggleMaintenanceModeEndpoint.cjs [39m[1m[2m 1.72 kB[22m[1m[22m
|
|
105
|
+
[2mdist/cjs/[22m[36mtasks/spam/checkTrafficFilter.cjs [39m[1m[2m 1.72 kB[22m[1m[22m
|
|
106
106
|
[2mdist/cjs/[22m[36mapi/public.cjs [39m[1m[2m 1.74 kB[22m[1m[22m
|
|
107
107
|
[2mdist/cjs/[22m[36mapi/admin/apiClearAllCountersEndpoint.cjs [39m[1m[2m 1.78 kB[22m[1m[22m
|
|
108
108
|
[2mdist/cjs/[22m[36mapi/admin/apiUpdateDecisionMachineEndpoint.cjs [39m[1m[2m 1.79 kB[22m[1m[22m
|
|
@@ -112,8 +112,8 @@ rendering chunks...
|
|
|
112
112
|
[2mdist/cjs/[22m[36mtasks/frictionless/routingMachine.cjs [39m[1m[2m 1.86 kB[22m[1m[22m
|
|
113
113
|
[2mdist/cjs/[22m[36mapi/captcha/checkSpamEmail.cjs [39m[1m[2m 2.10 kB[22m[1m[22m
|
|
114
114
|
[2mdist/cjs/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs [39m[1m[2m 2.11 kB[22m[1m[22m
|
|
115
|
+
[2mdist/cjs/[22m[36mapi/admin/apiDnsEventEndpoint.cjs [39m[1m[2m 2.12 kB[22m[1m[22m
|
|
115
116
|
[2mdist/cjs/[22m[36mtasks/spam/updateSpamEmailDomains.cjs [39m[1m[2m 2.13 kB[22m[1m[22m
|
|
116
|
-
[2mdist/cjs/[22m[36mapi/admin/apiDnsEventEndpoint.cjs [39m[1m[2m 2.31 kB[22m[1m[22m
|
|
117
117
|
[2mdist/cjs/[22m[36mapi/captcha.cjs [39m[1m[2m 2.66 kB[22m[1m[22m
|
|
118
118
|
[2mdist/cjs/[22m[36mapi/ja4Middleware.cjs [39m[1m[2m 2.74 kB[22m[1m[22m
|
|
119
119
|
[2mdist/cjs/[22m[36mapi/captcha/submitPuzzleCaptchaSolution.cjs [39m[1m[2m 2.85 kB[22m[1m[22m
|
|
@@ -123,32 +123,32 @@ rendering chunks...
|
|
|
123
123
|
[2mdist/cjs/[22m[36mapi/admin/apiAdminRoutesProvider.cjs [39m[1m[2m 3.56 kB[22m[1m[22m
|
|
124
124
|
[2mdist/cjs/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs [39m[1m[2m 3.78 kB[22m[1m[22m
|
|
125
125
|
[2mdist/cjs/[22m[36mapi/domainMiddleware.cjs [39m[1m[2m 3.91 kB[22m[1m[22m
|
|
126
|
-
[2mdist/cjs/[22m[36mindex.cjs [39m[1m[2m
|
|
126
|
+
[2mdist/cjs/[22m[36mindex.cjs [39m[1m[2m 4.01 kB[22m[1m[22m
|
|
127
127
|
[2mdist/cjs/[22m[36mservices/ipComparison.cjs [39m[1m[2m 4.10 kB[22m[1m[22m
|
|
128
128
|
[2mdist/cjs/[22m[36mtasks/spam/checkSpamEmail.cjs [39m[1m[2m 4.32 kB[22m[1m[22m
|
|
129
|
-
[2mdist/cjs/[22m[36mapi/blacklistRequestInspector.cjs [39m[1m[2m 4.78 kB[22m[1m[22m
|
|
130
129
|
[2mdist/cjs/[22m[36mapi/captcha/submitPoWCaptchaSolution.cjs [39m[1m[2m 5.20 kB[22m[1m[22m
|
|
131
130
|
[2mdist/cjs/[22m[36mtasks/tasks.cjs [39m[1m[2m 5.33 kB[22m[1m[22m
|
|
132
131
|
[2mdist/cjs/[22m[36mutil/usageCounters.cjs [39m[1m[2m 5.40 kB[22m[1m[22m
|
|
133
|
-
[2mdist/cjs/[22m[36mapi/captcha/getImageCaptchaChallenge.cjs [39m[1m[2m 5.
|
|
134
|
-
[2mdist/cjs/[22m[36mapi/
|
|
135
|
-
[2mdist/cjs/[22m[36mapi/captcha/
|
|
132
|
+
[2mdist/cjs/[22m[36mapi/captcha/getImageCaptchaChallenge.cjs [39m[1m[2m 5.53 kB[22m[1m[22m
|
|
133
|
+
[2mdist/cjs/[22m[36mapi/blacklistRequestInspector.cjs [39m[1m[2m 6.05 kB[22m[1m[22m
|
|
134
|
+
[2mdist/cjs/[22m[36mapi/captcha/getPoWCaptchaChallenge.cjs [39m[1m[2m 6.23 kB[22m[1m[22m
|
|
135
|
+
[2mdist/cjs/[22m[36mapi/captcha/getPuzzleCaptchaChallenge.cjs [39m[1m[2m 6.42 kB[22m[1m[22m
|
|
136
136
|
[2mdist/cjs/[22m[36mapi/startProviderApi.cjs [39m[1m[2m 9.53 kB[22m[1m[22m
|
|
137
137
|
[2mdist/cjs/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs [39m[1m[2m 9.54 kB[22m[1m[22m
|
|
138
|
-
[2mdist/cjs/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/handler.cjs [39m[1m[
|
|
138
|
+
[2mdist/cjs/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/handler.cjs [39m[1m[2m10.10 kB[22m[1m[22m
|
|
139
139
|
[2mdist/cjs/[22m[36mtasks/decisionMachine/decisionMachineRunner.cjs [39m[1m[2m10.19 kB[22m[1m[22m
|
|
140
140
|
[2mdist/cjs/[22m[36mapi/verify.cjs [39m[1m[2m10.85 kB[22m[1m[22m
|
|
141
141
|
[2mdist/cjs/[22m[36mutil.cjs [39m[1m[2m12.22 kB[22m[1m[22m
|
|
142
142
|
[2mdist/cjs/[22m[36mtasks/client/clientTasks.cjs [39m[1m[2m15.63 kB[22m[1m[22m
|
|
143
|
-
[2mdist/cjs/[22m[36mtasks/captchaManager.cjs [39m[1m[2m15.
|
|
143
|
+
[2mdist/cjs/[22m[36mtasks/captchaManager.cjs [39m[1m[2m15.75 kB[22m[1m[22m
|
|
144
144
|
[2mdist/cjs/[22m[36mtasks/frictionless/frictionlessTasks.cjs [39m[1m[2m16.20 kB[22m[1m[22m
|
|
145
145
|
[2mdist/cjs/[22m[36mtasks/detection/decodeSimd.cjs [39m[1m[2m18.20 kB[22m[1m[22m
|
|
146
|
-
[2mdist/cjs/[22m[36mtasks/puzzleCaptcha/puzzleTasks.cjs [39m[1m[2m19.
|
|
146
|
+
[2mdist/cjs/[22m[36mtasks/puzzleCaptcha/puzzleTasks.cjs [39m[1m[2m19.08 kB[22m[1m[22m
|
|
147
147
|
[2mdist/cjs/[22m[36mtasks/detection/decodeBehavior.cjs [39m[1m[2m19.16 kB[22m[1m[22m
|
|
148
|
-
[2mdist/cjs/[22m[36mtasks/powCaptcha/powTasks.cjs [39m[1m[
|
|
149
|
-
[2mdist/cjs/[22m[36mtasks/imgCaptcha/imgCaptchaTasks.cjs [39m[1m[2m26.
|
|
148
|
+
[2mdist/cjs/[22m[36mtasks/powCaptcha/powTasks.cjs [39m[1m[2m21.06 kB[22m[1m[22m
|
|
149
|
+
[2mdist/cjs/[22m[36mtasks/imgCaptcha/imgCaptchaTasks.cjs [39m[1m[2m26.91 kB[22m[1m[22m
|
|
150
150
|
[2mdist/cjs/[22m[36mtasks/detection/decodePayload.cjs [39m[1m[2m44.26 kB[22m[1m[22m
|
|
151
|
-
[32m✓ built in
|
|
151
|
+
[32m✓ built in 750ms[39m
|
|
152
152
|
[copy-plugin] copying /home/runner/work/captcha/captcha/packages/provider/src/tasks/detection/decodeBehavior.js to /home/runner/work/captcha/captcha/packages/provider/dist/cjs/tasks/detection/decodeBehavior.js
|
|
153
153
|
[copy-plugin] copying /home/runner/work/captcha/captcha/packages/provider/src/tasks/detection/decodePayload.js to /home/runner/work/captcha/captcha/packages/provider/dist/cjs/tasks/detection/decodePayload.js
|
|
154
154
|
[copy-plugin] copying /home/runner/work/captcha/captcha/packages/provider/src/tasks/detection/decodeSimd.js to /home/runner/work/captcha/captcha/packages/provider/dist/cjs/tasks/detection/decodeSimd.js
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/provider@4.
|
|
2
|
+
> @prosopo/provider@4.8.1 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
1:25:10 PM - Projects in this build:
|
|
6
6
|
* ../../dev/config/tsconfig.json
|
|
7
7
|
* ../util/tsconfig.json
|
|
8
8
|
* ../logger/tsconfig.json
|
|
@@ -25,47 +25,47 @@
|
|
|
25
25
|
* ../load-balancer/tsconfig.json
|
|
26
26
|
* tsconfig.json
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
1:25:10 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/vite/NodejsPolarsNativeFilePlugin.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
1:25:10 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
1:25:10 PM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
1:25:10 PM - Project '../api-route/tsconfig.json' is up to date because newest input '../api-route/src/apiRoutes.ts' is older than output '../api-route/tsconfig.tsbuildinfo'
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
1:25:10 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
1:25:10 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
1:25:10 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/provider/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
1:25:10 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/error.ts' is older than output '../common/tsconfig.tsbuildinfo'
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
1:25:10 PM - Project '../ipinfo/tsconfig.json' is up to date because newest input '../ipinfo/src/IpInfoService.ts' is older than output '../ipinfo/tsconfig.tsbuildinfo'
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
1:25:10 PM - Project '../redis-client/tsconfig.json' is up to date because newest input '../redis-client/src/index.ts' is older than output '../redis-client/tsconfig.tsbuildinfo'
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
1:25:10 PM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
1:25:10 PM - Project '../user-access-policy/tsconfig.json' is up to date because newest input '../user-access-policy/src/ruleRecord.ts' is older than output '../user-access-policy/tsconfig.tsbuildinfo'
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
1:25:10 PM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/index.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
1:25:10 PM - Project '../database/tsconfig.json' is up to date because newest input '../database/src/tests/integration/ipInfoPersistence.integration.test.ts' is older than output '../database/tsconfig.tsbuildinfo'
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
1:25:10 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
1:25:10 PM - Project '../types-env/tsconfig.json' is up to date because newest input '../types-env/src/env.ts' is older than output '../types-env/tsconfig.tsbuildinfo'
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
1:25:10 PM - Project '../env/tsconfig.json' is up to date because newest input '../env/src/env.ts' is older than output '../env/tsconfig.tsbuildinfo'
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
1:25:10 PM - Project '../api-express-router/tsconfig.json' is up to date because newest input '../api-express-router/src/errorHandler.ts' is older than output '../api-express-router/tsconfig.tsbuildinfo'
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
1:25:10 PM - Project '../datasets/tsconfig.json' is up to date because newest input '../datasets/src/tests/mocks/data/captchas.ts' is older than output '../datasets/tsconfig.tsbuildinfo'
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
1:25:10 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/balancer.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
1:25:10 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
1:25:10 PM - Building project '/home/runner/work/captcha/captcha/packages/provider/tsconfig.json'...
|
|
71
71
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/provider@4.
|
|
2
|
+
> @prosopo/provider@4.8.1 build
|
|
3
3
|
> npm run build:cross-env -- --mode ${NODE_ENV:-development}
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @prosopo/provider@4.
|
|
6
|
+
> @prosopo/provider@4.8.1 build:cross-env
|
|
7
7
|
> vite build --config vite.esm.config.ts --mode production
|
|
8
8
|
|
|
9
9
|
ViteEsmConfig: .
|
|
@@ -105,21 +105,21 @@ rendering chunks...
|
|
|
105
105
|
[2mdist/[22m[36mcompositeIpAddress.js [39m[1m[2m 1.44 kB[22m[1m[22m
|
|
106
106
|
[2mdist/[22m[36mapi/captcha/maintenanceModeResponses.js [39m[1m[2m 1.47 kB[22m[1m[22m
|
|
107
107
|
[2mdist/[22m[36mschedulers/updateSpamEmailDomains.js [39m[1m[2m 1.50 kB[22m[1m[22m
|
|
108
|
-
[2mdist/[22m[36mtasks/spam/checkTrafficFilter.js [39m[1m[2m 1.56 kB[22m[1m[22m
|
|
109
108
|
[2mdist/[22m[36mutils/honeypot/phraseBank.js [39m[1m[2m 1.57 kB[22m[1m[22m
|
|
110
109
|
[2mdist/[22m[36mapi/public.js [39m[1m[2m 1.60 kB[22m[1m[22m
|
|
110
|
+
[2mdist/[22m[36mtasks/spam/checkTrafficFilter.js [39m[1m[2m 1.61 kB[22m[1m[22m
|
|
111
|
+
[2mdist/[22m[36mapi/admin/apiDnsEventEndpoint.js [39m[1m[2m 1.64 kB[22m[1m[22m
|
|
111
112
|
[2mdist/[22m[36mapi/admin/apiClearAllCountersEndpoint.js [39m[1m[2m 1.66 kB[22m[1m[22m
|
|
112
113
|
[2mdist/[22m[36mapi/admin/apiUpdateDecisionMachineEndpoint.js [39m[1m[2m 1.67 kB[22m[1m[22m
|
|
113
114
|
[2mdist/[22m[36mutils/honeypot/encoders.js [39m[1m[2m 1.71 kB[22m[1m[22m
|
|
114
115
|
[2mdist/[22m[36mtasks/frictionless/routingMachine.js [39m[1m[2m 1.76 kB[22m[1m[22m
|
|
115
|
-
[2mdist/[22m[36mapi/admin/apiDnsEventEndpoint.js [39m[1m[2m 1.82 kB[22m[1m[22m
|
|
116
116
|
[2mdist/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js [39m[1m[2m 1.95 kB[22m[1m[22m
|
|
117
117
|
[2mdist/[22m[36mtasks/spam/updateSpamEmailDomains.js [39m[1m[2m 2.03 kB[22m[1m[22m
|
|
118
118
|
[2mdist/[22m[36mapi/captcha/checkSpamEmail.js [39m[1m[2m 2.08 kB[22m[1m[22m
|
|
119
119
|
[2mdist/[22m[36mapi/ja4Middleware.js [39m[1m[2m 2.19 kB[22m[1m[22m
|
|
120
120
|
[2mdist/[22m[36mapi/captcha.js [39m[1m[2m 2.49 kB[22m[1m[22m
|
|
121
121
|
[2mdist/[22m[36mutils/dns.js [39m[1m[2m 2.57 kB[22m[1m[22m
|
|
122
|
-
[2mdist/[22m[36mindex.js [39m[1m[2m 2.
|
|
122
|
+
[2mdist/[22m[36mindex.js [39m[1m[2m 2.66 kB[22m[1m[22m
|
|
123
123
|
[2mdist/[22m[36mapi/captcha/submitPuzzleCaptchaSolution.js [39m[1m[2m 2.78 kB[22m[1m[22m
|
|
124
124
|
[2mdist/[22m[36mtasks/spam/evaluateEmailSpamRules.js [39m[1m[2m 2.84 kB[22m[1m[22m
|
|
125
125
|
[2mdist/[22m[36mapi/admin/apiAdminRoutesProvider.js [39m[1m[2m 2.93 kB[22m[1m[22m
|
|
@@ -128,29 +128,29 @@ rendering chunks...
|
|
|
128
128
|
[2mdist/[22m[36mapi/domainMiddleware.js [39m[1m[2m 3.71 kB[22m[1m[22m
|
|
129
129
|
[2mdist/[22m[36mservices/ipComparison.js [39m[1m[2m 4.00 kB[22m[1m[22m
|
|
130
130
|
[2mdist/[22m[36mtasks/spam/checkSpamEmail.js [39m[1m[2m 4.26 kB[22m[1m[22m
|
|
131
|
-
[2mdist/[22m[36mapi/blacklistRequestInspector.js [39m[1m[2m 4.57 kB[22m[1m[22m
|
|
132
131
|
[2mdist/[22m[36mapi/captcha/submitPoWCaptchaSolution.js [39m[1m[2m 5.09 kB[22m[1m[22m
|
|
133
132
|
[2mdist/[22m[36mtasks/tasks.js [39m[1m[2m 5.13 kB[22m[1m[22m
|
|
134
133
|
[2mdist/[22m[36mutil/usageCounters.js [39m[1m[2m 5.29 kB[22m[1m[22m
|
|
135
|
-
[2mdist/[22m[36mapi/captcha/getImageCaptchaChallenge.js [39m[1m[2m 5.
|
|
136
|
-
[2mdist/[22m[36mapi/
|
|
137
|
-
[2mdist/[22m[36mapi/captcha/
|
|
134
|
+
[2mdist/[22m[36mapi/captcha/getImageCaptchaChallenge.js [39m[1m[2m 5.41 kB[22m[1m[22m
|
|
135
|
+
[2mdist/[22m[36mapi/blacklistRequestInspector.js [39m[1m[2m 5.80 kB[22m[1m[22m
|
|
136
|
+
[2mdist/[22m[36mapi/captcha/getPoWCaptchaChallenge.js [39m[1m[2m 6.00 kB[22m[1m[22m
|
|
137
|
+
[2mdist/[22m[36mapi/captcha/getPuzzleCaptchaChallenge.js [39m[1m[2m 6.17 kB[22m[1m[22m
|
|
138
138
|
[2mdist/[22m[36mapi/startProviderApi.js [39m[1m[2m 7.65 kB[22m[1m[22m
|
|
139
139
|
[2mdist/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js [39m[1m[2m 9.17 kB[22m[1m[22m
|
|
140
|
-
[2mdist/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/handler.js [39m[1m[2m 9.
|
|
140
|
+
[2mdist/[22m[36mapi/captcha/getFrictionlessCaptchaChallenge/handler.js [39m[1m[2m 9.76 kB[22m[1m[22m
|
|
141
141
|
[2mdist/[22m[36mtasks/decisionMachine/decisionMachineRunner.js [39m[1m[2m10.14 kB[22m[1m[22m
|
|
142
142
|
[2mdist/[22m[36mapi/verify.js [39m[1m[2m10.43 kB[22m[1m[22m
|
|
143
143
|
[2mdist/[22m[36mutil.js [39m[1m[2m11.79 kB[22m[1m[22m
|
|
144
|
-
[2mdist/[22m[36mtasks/captchaManager.js [39m[1m[2m15.
|
|
144
|
+
[2mdist/[22m[36mtasks/captchaManager.js [39m[1m[2m15.10 kB[22m[1m[22m
|
|
145
145
|
[2mdist/[22m[36mtasks/client/clientTasks.js [39m[1m[2m15.37 kB[22m[1m[22m
|
|
146
146
|
[2mdist/[22m[36mtasks/frictionless/frictionlessTasks.js [39m[1m[2m15.89 kB[22m[1m[22m
|
|
147
147
|
[2mdist/[22m[36mtasks/detection/decodeSimd.js [39m[1m[2m18.06 kB[22m[1m[22m
|
|
148
|
-
[2mdist/[22m[36mtasks/puzzleCaptcha/puzzleTasks.js [39m[1m[2m18.
|
|
148
|
+
[2mdist/[22m[36mtasks/puzzleCaptcha/puzzleTasks.js [39m[1m[2m18.83 kB[22m[1m[22m
|
|
149
149
|
[2mdist/[22m[36mtasks/detection/decodeBehavior.js [39m[1m[2m19.03 kB[22m[1m[22m
|
|
150
|
-
[2mdist/[22m[36mtasks/powCaptcha/powTasks.js [39m[1m[2m20.
|
|
151
|
-
[2mdist/[22m[36mtasks/imgCaptcha/imgCaptchaTasks.js [39m[1m[2m26.
|
|
150
|
+
[2mdist/[22m[36mtasks/powCaptcha/powTasks.js [39m[1m[2m20.71 kB[22m[1m[22m
|
|
151
|
+
[2mdist/[22m[36mtasks/imgCaptcha/imgCaptchaTasks.js [39m[1m[2m26.52 kB[22m[1m[22m
|
|
152
152
|
[2mdist/[22m[36mtasks/detection/decodePayload.js [39m[1m[2m44.24 kB[22m[1m[22m
|
|
153
|
-
[32m✓ built in
|
|
153
|
+
[32m✓ built in 906ms[39m
|
|
154
154
|
[copy-plugin] copying /home/runner/work/captcha/captcha/packages/provider/src/tasks/detection/decodeBehavior.js to /home/runner/work/captcha/captcha/packages/provider/dist/tasks/detection/decodeBehavior.js
|
|
155
155
|
[copy-plugin] copying /home/runner/work/captcha/captcha/packages/provider/src/tasks/detection/decodePayload.js to /home/runner/work/captcha/captcha/packages/provider/dist/tasks/detection/decodePayload.js
|
|
156
156
|
[copy-plugin] copying /home/runner/work/captcha/captcha/packages/provider/src/tasks/detection/decodeSimd.js to /home/runner/work/captcha/captcha/packages/provider/dist/tasks/detection/decodeSimd.js
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @prosopo/provider
|
|
2
2
|
|
|
3
|
+
## 4.8.1
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- 8a30164: `checkTrafficFilter` no longer treats VPN traffic that exits from a datacenter IP as datacenter traffic. Commercial VPNs (Mullvad, NordVPN, ProtonVPN, …) all run on cloud providers, so operators who enabled `blockDatacenter` but not `blockVpn` were silently catching VPN end-users they did not intend to block. The datacenter rule is now suppressed when `ipInfo.isVPN` is true and `blockVpn` is false. Closes prosopo/captcha-private#3479.
|
|
7
|
+
|
|
8
|
+
## 4.8.0
|
|
9
|
+
### Minor Changes
|
|
10
|
+
|
|
11
|
+
- 2f459ce: Collapse the per-request access-rule lookup from 2 × (2^n − 1) Redis `FT.SEARCH` round trips (126 with n=6 user-scope fields) to a single greedy query, with specificity ranking done in JS. Same external semantics — client-scoped rules still outrank global, and a rule with both `ja4Hash` and `ip` constraints is correctly rejected for requests that only match one of them.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 2f459ce: Add `asn` as a user-scope field for access rules. The captcha provider can now block / restrict by Autonomous System Number, matching what the protect/bumblebee tier already supports. ASN is read from `ipInfo.asnNumber` and threaded through `getRequestUserScope` and `checkForHardBlock` at all challenge entry points. Redis index gains a NUMERIC `asn` field with range-syntax lookups.
|
|
16
|
+
- Updated dependencies [2f459ce]
|
|
17
|
+
- @prosopo/user-access-policy@3.8.0
|
|
18
|
+
- @prosopo/database@3.13.9
|
|
19
|
+
- @prosopo/types-database@4.8.2
|
|
20
|
+
- @prosopo/env@3.5.9
|
|
21
|
+
- @prosopo/types-env@2.9.18
|
|
22
|
+
- @prosopo/api-express-router@3.1.19
|
|
23
|
+
|
|
3
24
|
## 4.7.2
|
|
4
25
|
### Patch Changes
|
|
5
26
|
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { type ApiEndpoint, type ApiEndpointResponse } from "@prosopo/api-route";
|
|
2
2
|
import { type Logger } from "@prosopo/logger";
|
|
3
|
-
import { type DnsEvent, DnsEventBatchSchema
|
|
3
|
+
import { type DnsEvent, DnsEventBatchSchema } from "@prosopo/types";
|
|
4
4
|
import type { IProviderDatabase } from "@prosopo/types-database";
|
|
5
5
|
import type { z } from "zod";
|
|
6
6
|
type DnsEventBatchSchemaType = typeof DnsEventBatchSchema;
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const dnsEventToFields: (event: DnsEvent) => {
|
|
8
|
+
resolverIp?: string;
|
|
9
|
+
peerIp?: string;
|
|
10
|
+
pathValid?: boolean;
|
|
11
|
+
};
|
|
8
12
|
declare class ApiDnsEventEndpoint implements ApiEndpoint<DnsEventBatchSchemaType> {
|
|
9
13
|
private readonly db;
|
|
10
14
|
constructor(db: IProviderDatabase);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiDnsEventEndpoint.d.ts","sourceRoot":"","sources":["../../../src/api/admin/apiDnsEventEndpoint.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,mBAAmB,EAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"apiDnsEventEndpoint.d.ts","sourceRoot":"","sources":["../../../src/api/admin/apiDnsEventEndpoint.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,mBAAmB,EAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,KAAK,uBAAuB,GAAG,OAAO,mBAAmB,CAAC;AAG1D,eAAO,MAAM,gBAAgB,UACrB,QAAQ,KACb;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAW7D,CAAC;AAEF,cAAM,mBAAoB,YAAW,WAAW,CAAC,uBAAuB,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAEnD,cAAc,CACnB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,EACtC,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC;IA6CxB,oBAAoB,IAAI,uBAAuB;CAGtD;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { ApiEndpointResponseStatus } from "@prosopo/api-route";
|
|
2
2
|
import { getLogger } from "@prosopo/logger";
|
|
3
3
|
import { DnsEventBatchSchema } from "@prosopo/types";
|
|
4
|
-
const
|
|
5
|
-
const receivedAt = existing?.receivedAt ?? /* @__PURE__ */ new Date();
|
|
6
|
-
const merged = { ...existing ?? {}, receivedAt };
|
|
4
|
+
const dnsEventToFields = (event) => {
|
|
7
5
|
if (event.kind === "dns") {
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
return { resolverIp: event.src_ip };
|
|
7
|
+
}
|
|
8
|
+
const out = {
|
|
9
|
+
peerIp: event.src_ip
|
|
10
|
+
};
|
|
11
|
+
if (typeof event.path_valid === "boolean") {
|
|
12
|
+
out.pathValid = event.path_valid;
|
|
14
13
|
}
|
|
15
|
-
return
|
|
14
|
+
return out;
|
|
16
15
|
};
|
|
17
16
|
class ApiDnsEventEndpoint {
|
|
18
17
|
constructor(db) {
|
|
@@ -23,19 +22,22 @@ class ApiDnsEventEndpoint {
|
|
|
23
22
|
const { events } = args;
|
|
24
23
|
let stored = 0;
|
|
25
24
|
let errors = 0;
|
|
25
|
+
const now = /* @__PURE__ */ new Date();
|
|
26
26
|
for (const event of events) {
|
|
27
27
|
const sessionId = event.jti;
|
|
28
28
|
if (!sessionId) {
|
|
29
29
|
continue;
|
|
30
30
|
}
|
|
31
31
|
try {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const fields = dnsEventToFields(event);
|
|
33
|
+
const matched = await this.db.mergeSessionDnsEvent(
|
|
34
|
+
sessionId,
|
|
35
|
+
fields,
|
|
36
|
+
now
|
|
37
|
+
);
|
|
38
|
+
if (matched) {
|
|
39
|
+
stored += 1;
|
|
35
40
|
}
|
|
36
|
-
const dnsEvent = dnsEventToPartialSession(event, session.dnsEvent);
|
|
37
|
-
await this.db.updateSessionRecord(sessionId, { dnsEvent });
|
|
38
|
-
stored += 1;
|
|
39
41
|
} catch (err) {
|
|
40
42
|
errors += 1;
|
|
41
43
|
logger.warn(() => ({
|
|
@@ -60,5 +62,5 @@ class ApiDnsEventEndpoint {
|
|
|
60
62
|
}
|
|
61
63
|
export {
|
|
62
64
|
ApiDnsEventEndpoint,
|
|
63
|
-
|
|
65
|
+
dnsEventToFields
|
|
64
66
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiDnsEventEndpoint.js","sourceRoot":"","sources":["../../../src/api/admin/apiDnsEventEndpoint.ts"],"names":[],"mappings":"AAcA,OAAO,EAGN,yBAAyB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"apiDnsEventEndpoint.js","sourceRoot":"","sources":["../../../src/api/admin/apiDnsEventEndpoint.ts"],"names":[],"mappings":"AAcA,OAAO,EAGN,yBAAyB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAe,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAiB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAOpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,KAAe,EACiD,EAAE;IAClE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,GAAG,GAA4C;QACpD,MAAM,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC;IACF,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3C,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,mBAAmB;IACxB,YAAoC,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7D,KAAK,CAAC,cAAc,CACnB,IAAsC,EACtC,MAAe;QAEf,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAExB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC;YAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,SAAS;YACV,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,oBAAoB,CACjD,SAAS,EACT,MAAM,EACN,GAAG,CACH,CAAC;gBACF,IAAI,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,CAAC,CAAC;gBACb,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAClB,GAAG;oBACH,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;oBACrC,GAAG,EAAE,wCAAwC;iBAC7C,CAAC,CAAC,CAAC;YACL,CAAC;QACF,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClB,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;YACjD,GAAG,EAAE,2BAA2B;SAChC,CAAC,CAAC,CAAC;QAEJ,OAAO;YACN,MAAM,EAAE,yBAAyB,CAAC,OAAO;YACzC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;SACxB,CAAC;IACH,CAAC;IAEM,oBAAoB;QAC1B,OAAO,mBAAmB,CAAC;IAC5B,CAAC;CACD;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Logger } from "@prosopo/logger";
|
|
2
2
|
import { type IPInfoResponse } from "@prosopo/types";
|
|
3
|
-
import { type AccessRulesStorage, type UserScope, type UserScopeRecord } from "@prosopo/user-access-policy";
|
|
3
|
+
import { type AccessRule, type AccessRulesStorage, type UserScope, type UserScopeRecord } from "@prosopo/user-access-policy";
|
|
4
4
|
import type { NextFunction, Request, Response } from "express";
|
|
5
|
-
export declare const getRequestUserScope: (requestHeaders: Record<string, unknown>, ja4?: string, ip?: string, user?: string, headHash?: string, coords?: string, countryCode?: string) => Pick<UserScopeRecord, "userId" | "ja4Hash" | "userAgent" | "ip" | "headHash" | "coords" | "countryCode">;
|
|
6
|
-
export declare const
|
|
5
|
+
export declare const getRequestUserScope: (requestHeaders: Record<string, unknown>, ja4?: string, ip?: string, user?: string, headHash?: string, coords?: string, countryCode?: string, asn?: number) => Pick<UserScopeRecord, "userId" | "ja4Hash" | "userAgent" | "ip" | "headHash" | "coords" | "countryCode" | "asn">;
|
|
6
|
+
export declare const rankCandidateRules: (rules: AccessRule[], request: UserScope, requestClientId: string | undefined) => AccessRule[];
|
|
7
|
+
export declare const getPrioritisedAccessRule: (userAccessRulesStorage: AccessRulesStorage, userScope: UserScope | UserScopeRecord, clientId?: string) => Promise<AccessRule[]>;
|
|
7
8
|
export declare class BlacklistRequestInspector {
|
|
8
9
|
private readonly userAccessRulesStorage;
|
|
9
10
|
private readonly environmentReadinessWaiter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blacklistRequestInspector.d.ts","sourceRoot":"","sources":["../../src/api/blacklistRequestInspector.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAEN,KAAK,kBAAkB,EAEvB,KAAK,SAAS,EACd,KAAK,eAAe,EAEpB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"blacklistRequestInspector.d.ts","sourceRoot":"","sources":["../../src/api/blacklistRequestInspector.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAEN,KAAK,UAAU,EACf,KAAK,kBAAkB,EAEvB,KAAK,SAAS,EACd,KAAK,eAAe,EAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,mBAAmB,mBACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACjC,MAAM,OACP,MAAM,SACJ,MAAM,aACF,MAAM,WACR,MAAM,gBACD,MAAM,QACd,MAAM,KACV,IAAI,CACN,eAAe,EACb,QAAQ,GACR,SAAS,GACT,WAAW,GACX,IAAI,GACJ,UAAU,GACV,QAAQ,GACR,aAAa,GACb,KAAK,CAgBP,CAAC;AA+FF,eAAO,MAAM,kBAAkB,UACvB,UAAU,EAAE,WACV,SAAS,mBACD,MAAM,GAAG,SAAS,KACjC,UAAU,EAWT,CAAC;AAaL,eAAO,MAAM,wBAAwB,2BACZ,kBAAkB,aAC/B,SAAS,GAAG,eAAe,aAC3B,MAAM,KACf,OAAO,CAAC,UAAU,EAAE,CAqBtB,CAAC;AAEF,qBAAa,yBAAyB;IAEpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;gBAD1B,sBAAsB,EAAE,kBAAkB,EAC1C,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAGpD,2BAA2B,CACvC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC;IAyBH,kBAAkB,CAC9B,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,CAAC;IAqEnB,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAInD,SAAS,CAAC,qBAAqB,CAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC;QACF,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B;IAcD,SAAS,CAAC,cAAc,CACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,GACT,OAAO;CAGV"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ApiPrefix } from "@prosopo/types";
|
|
2
|
-
import { userScopeInput, FilterScopeMatch
|
|
3
|
-
|
|
4
|
-
const getRequestUserScope = (requestHeaders, ja4, ip, user, headHash, coords, countryCode) => {
|
|
2
|
+
import { AccessPolicyType, userScopeInput, FilterScopeMatch } from "@prosopo/user-access-policy";
|
|
3
|
+
const getRequestUserScope = (requestHeaders, ja4, ip, user, headHash, coords, countryCode, asn) => {
|
|
5
4
|
const userAgent = requestHeaders["user-agent"] ? requestHeaders["user-agent"].toString() : void 0;
|
|
6
5
|
return {
|
|
7
6
|
...user && { userId: user },
|
|
@@ -10,45 +9,89 @@ const getRequestUserScope = (requestHeaders, ja4, ip, user, headHash, coords, co
|
|
|
10
9
|
...ip && { ip },
|
|
11
10
|
...headHash && { headHash },
|
|
12
11
|
...coords && { coords },
|
|
13
|
-
...countryCode && { countryCode }
|
|
12
|
+
...countryCode && { countryCode },
|
|
13
|
+
...typeof asn === "number" && { asn }
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
const SCALAR_USER_SCOPE_FIELDS = [
|
|
17
|
+
"userId",
|
|
18
|
+
"ja4Hash",
|
|
19
|
+
"headersHash",
|
|
20
|
+
"userAgentHash",
|
|
21
|
+
"headHash",
|
|
22
|
+
"coords",
|
|
23
|
+
"countryCode",
|
|
24
|
+
"asn"
|
|
25
|
+
];
|
|
26
|
+
const ruleHasIpConstraint = (rule) => rule.numericIp !== void 0 || rule.numericIpMaskMin !== void 0 && rule.numericIpMaskMax !== void 0;
|
|
27
|
+
const ruleIpMatchesRequest = (rule, requestIp) => {
|
|
28
|
+
if (!ruleHasIpConstraint(rule)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (requestIp === void 0) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (rule.numericIp !== void 0) {
|
|
35
|
+
return requestIp === rule.numericIp;
|
|
36
|
+
}
|
|
37
|
+
return requestIp >= rule.numericIpMaskMin && requestIp <= rule.numericIpMaskMax;
|
|
27
38
|
};
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
for (const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
const ruleApplies = (rule, request, requestClientId) => {
|
|
40
|
+
if (rule.clientId !== void 0 && rule.clientId !== requestClientId) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
for (const field of SCALAR_USER_SCOPE_FIELDS) {
|
|
44
|
+
const ruleValue = rule[field];
|
|
45
|
+
if (ruleValue === void 0) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (ruleValue !== request[field]) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return ruleIpMatchesRequest(rule, request.numericIp);
|
|
53
|
+
};
|
|
54
|
+
const ruleSpecificity = (rule, requestClientId) => {
|
|
55
|
+
let score = 0;
|
|
56
|
+
if (rule.clientId !== void 0 && rule.clientId === requestClientId) {
|
|
57
|
+
score += 1;
|
|
58
|
+
}
|
|
59
|
+
for (const field of SCALAR_USER_SCOPE_FIELDS) {
|
|
60
|
+
if (rule[field] !== void 0) {
|
|
61
|
+
score += 1;
|
|
49
62
|
}
|
|
50
63
|
}
|
|
51
|
-
|
|
64
|
+
if (ruleHasIpConstraint(rule)) {
|
|
65
|
+
score += 1;
|
|
66
|
+
}
|
|
67
|
+
return score;
|
|
68
|
+
};
|
|
69
|
+
const policySeverity = (rule) => rule.type === AccessPolicyType.Block ? 1 : 0;
|
|
70
|
+
const rankCandidateRules = (rules, request, requestClientId) => rules.filter((rule) => ruleApplies(rule, request, requestClientId)).sort((a, b) => {
|
|
71
|
+
const specDelta = ruleSpecificity(b, requestClientId) - ruleSpecificity(a, requestClientId);
|
|
72
|
+
if (specDelta !== 0) {
|
|
73
|
+
return specDelta;
|
|
74
|
+
}
|
|
75
|
+
return policySeverity(b) - policySeverity(a);
|
|
76
|
+
});
|
|
77
|
+
const getPrioritisedAccessRule = async (userAccessRulesStorage, userScope, clientId) => {
|
|
78
|
+
const parsedUserScope = userScopeInput.parse(userScope);
|
|
79
|
+
const filter = {
|
|
80
|
+
...clientId && {
|
|
81
|
+
policyScope: {
|
|
82
|
+
clientId
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
policyScopeMatch: FilterScopeMatch.Greedy,
|
|
86
|
+
userScope: parsedUserScope,
|
|
87
|
+
userScopeMatch: FilterScopeMatch.Greedy
|
|
88
|
+
};
|
|
89
|
+
const candidates = await userAccessRulesStorage.findRules(
|
|
90
|
+
filter,
|
|
91
|
+
false,
|
|
92
|
+
true
|
|
93
|
+
);
|
|
94
|
+
return rankCandidateRules(candidates, parsedUserScope, clientId);
|
|
52
95
|
};
|
|
53
96
|
class BlacklistRequestInspector {
|
|
54
97
|
constructor(userAccessRulesStorage, environmentReadinessWaiter) {
|
|
@@ -97,6 +140,7 @@ class BlacklistRequestInspector {
|
|
|
97
140
|
requestBody
|
|
98
141
|
);
|
|
99
142
|
const countryCode = ipInfo?.isValid ? ipInfo.countryCode : void 0;
|
|
143
|
+
const asn = ipInfo?.isValid ? ipInfo.asnNumber : void 0;
|
|
100
144
|
const accessPolicies = await getPrioritisedAccessRule(
|
|
101
145
|
this.userAccessRulesStorage,
|
|
102
146
|
getRequestUserScope(
|
|
@@ -108,7 +152,8 @@ class BlacklistRequestInspector {
|
|
|
108
152
|
// headHash
|
|
109
153
|
void 0,
|
|
110
154
|
// coords
|
|
111
|
-
countryCode
|
|
155
|
+
countryCode,
|
|
156
|
+
asn
|
|
112
157
|
),
|
|
113
158
|
clientId
|
|
114
159
|
);
|
|
@@ -143,5 +188,6 @@ class BlacklistRequestInspector {
|
|
|
143
188
|
export {
|
|
144
189
|
BlacklistRequestInspector,
|
|
145
190
|
getPrioritisedAccessRule,
|
|
146
|
-
getRequestUserScope
|
|
191
|
+
getRequestUserScope,
|
|
192
|
+
rankCandidateRules
|
|
147
193
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blacklistRequestInspector.js","sourceRoot":"","sources":["../../src/api/blacklistRequestInspector.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACN,gBAAgB,
|
|
1
|
+
{"version":3,"file":"blacklistRequestInspector.js","sourceRoot":"","sources":["../../src/api/blacklistRequestInspector.ts"],"names":[],"mappings":"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"}
|