@prosopo/provider 4.7.1 → 4.8.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.
Files changed (68) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +15 -15
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +16 -16
  4. package/CHANGELOG.md +33 -0
  5. package/dist/api/admin/apiDnsEventEndpoint.d.ts +6 -2
  6. package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
  7. package/dist/api/admin/apiDnsEventEndpoint.js +19 -17
  8. package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
  9. package/dist/api/blacklistRequestInspector.d.ts +4 -3
  10. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  11. package/dist/api/blacklistRequestInspector.js +85 -39
  12. package/dist/api/blacklistRequestInspector.js.map +1 -1
  13. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +7 -3
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  16. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  17. package/dist/api/captcha/getImageCaptchaChallenge.js +3 -1
  18. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  19. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  20. package/dist/api/captcha/getPoWCaptchaChallenge.js +3 -1
  21. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  22. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  23. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +3 -1
  24. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  25. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +19 -17
  26. package/dist/cjs/api/blacklistRequestInspector.cjs +83 -37
  27. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +7 -3
  28. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +3 -1
  29. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +3 -1
  30. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +3 -1
  31. package/dist/cjs/index.cjs +1 -0
  32. package/dist/cjs/tasks/captchaManager.cjs +3 -2
  33. package/dist/cjs/tasks/detection/getBotScore.cjs +3 -1
  34. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +9 -3
  35. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +2 -1
  36. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +2 -1
  37. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +2 -1
  38. package/dist/index.js +2 -1
  39. package/dist/tasks/captchaManager.d.ts +1 -1
  40. package/dist/tasks/captchaManager.d.ts.map +1 -1
  41. package/dist/tasks/captchaManager.js +3 -2
  42. package/dist/tasks/captchaManager.js.map +1 -1
  43. package/dist/tasks/detection/getBotScore.d.ts +2 -0
  44. package/dist/tasks/detection/getBotScore.d.ts.map +1 -1
  45. package/dist/tasks/detection/getBotScore.js +3 -1
  46. package/dist/tasks/detection/getBotScore.js.map +1 -1
  47. package/dist/tasks/frictionless/frictionlessTasks.d.ts +1 -0
  48. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  49. package/dist/tasks/frictionless/frictionlessTasks.js +9 -3
  50. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  51. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  52. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +2 -1
  53. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  54. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  55. package/dist/tasks/powCaptcha/powTasks.js +2 -1
  56. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  57. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  58. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +2 -1
  59. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  60. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +10 -94
  61. package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -1
  62. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.d.ts +2 -0
  63. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.d.ts.map +1 -0
  64. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +150 -0
  65. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -0
  66. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +132 -1
  67. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  68. package/package.json +12 -12
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/provider@4.7.1 build:cjs
2
+ > @prosopo/provider@4.8.0 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -84,7 +84,7 @@ rendering chunks...
84
84
  dist/cjs/api/headerCheckMiddleware.cjs  1.07 kB
85
85
  dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/sessionDedup.cjs  1.09 kB
86
86
  dist/cjs/tasks/powCaptcha/powTasksUtils.cjs  1.13 kB
87
- dist/cjs/tasks/detection/getBotScore.cjs  1.13 kB
87
+ dist/cjs/tasks/detection/getBotScore.cjs  1.21 kB
88
88
  dist/cjs/schedulers/getClientList.cjs  1.21 kB
89
89
  dist/cjs/schedulers/setClientEntropy.cjs  1.24 kB
90
90
  dist/cjs/schedulers/captchaScheduler.cjs  1.28 kB
@@ -112,8 +112,8 @@ rendering chunks...
112
112
  dist/cjs/tasks/frictionless/routingMachine.cjs  1.86 kB
113
113
  dist/cjs/api/captcha/checkSpamEmail.cjs  2.10 kB
114
114
  dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs  2.11 kB
115
+ dist/cjs/api/admin/apiDnsEventEndpoint.cjs  2.12 kB
115
116
  dist/cjs/tasks/spam/updateSpamEmailDomains.cjs  2.13 kB
116
- dist/cjs/api/admin/apiDnsEventEndpoint.cjs  2.31 kB
117
117
  dist/cjs/api/captcha.cjs  2.66 kB
118
118
  dist/cjs/api/ja4Middleware.cjs  2.74 kB
119
119
  dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs  2.85 kB
@@ -123,32 +123,32 @@ rendering chunks...
123
123
  dist/cjs/api/admin/apiAdminRoutesProvider.cjs  3.56 kB
124
124
  dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/accessPolicy.cjs  3.78 kB
125
125
  dist/cjs/api/domainMiddleware.cjs  3.91 kB
126
- dist/cjs/index.cjs  3.94 kB
126
+ dist/cjs/index.cjs  4.01 kB
127
127
  dist/cjs/services/ipComparison.cjs  4.10 kB
128
128
  dist/cjs/tasks/spam/checkSpamEmail.cjs  4.32 kB
129
- dist/cjs/api/blacklistRequestInspector.cjs  4.78 kB
130
129
  dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs  5.20 kB
131
130
  dist/cjs/tasks/tasks.cjs  5.33 kB
132
131
  dist/cjs/util/usageCounters.cjs  5.40 kB
133
- dist/cjs/api/captcha/getImageCaptchaChallenge.cjs  5.41 kB
134
- dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs  6.11 kB
135
- dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs  6.30 kB
132
+ dist/cjs/api/captcha/getImageCaptchaChallenge.cjs  5.53 kB
133
+ dist/cjs/api/blacklistRequestInspector.cjs  6.05 kB
134
+ dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs  6.23 kB
135
+ dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs  6.42 kB
136
136
  dist/cjs/api/startProviderApi.cjs  9.53 kB
137
137
  dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs  9.54 kB
138
- dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs  9.89 kB
138
+ dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs 10.10 kB
139
139
  dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs 10.19 kB
140
140
  dist/cjs/api/verify.cjs 10.85 kB
141
141
  dist/cjs/util.cjs 12.22 kB
142
142
  dist/cjs/tasks/client/clientTasks.cjs 15.63 kB
143
- dist/cjs/tasks/captchaManager.cjs 15.73 kB
144
- dist/cjs/tasks/frictionless/frictionlessTasks.cjs 16.01 kB
143
+ dist/cjs/tasks/captchaManager.cjs 15.75 kB
144
+ dist/cjs/tasks/frictionless/frictionlessTasks.cjs 16.20 kB
145
145
  dist/cjs/tasks/detection/decodeSimd.cjs 18.20 kB
146
- dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs 19.00 kB
146
+ dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs 19.08 kB
147
147
  dist/cjs/tasks/detection/decodeBehavior.cjs 19.16 kB
148
- dist/cjs/tasks/powCaptcha/powTasks.cjs 20.97 kB
149
- dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs 26.84 kB
148
+ dist/cjs/tasks/powCaptcha/powTasks.cjs 21.06 kB
149
+ dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs 26.91 kB
150
150
  dist/cjs/tasks/detection/decodePayload.cjs 44.26 kB
151
- ✓ built in 773ms
151
+ ✓ built in 808ms
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.7.1 build:tsc
2
+ > @prosopo/provider@4.8.0 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 8:15:26 AM - Projects in this build:
5
+ 12:30:35 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
- 8:15:26 AM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
28
+ 12:30:35 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
29
29
 
30
- 8:15:26 AM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
30
+ 12:30:35 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
- 8:15:26 AM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
32
+ 12:30:35 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
- 8:15:26 AM - 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'
34
+ 12:30:35 PM - Project '../api-route/tsconfig.json' is up to date because newest input '../api-route/src/index.ts' is older than output '../api-route/tsconfig.tsbuildinfo'
35
35
 
36
- 8:15:26 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
36
+ 12:30:35 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
- 8:15:26 AM - 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'
38
+ 12:30:35 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
- 8:15:26 AM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/procaptcha/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
40
+ 12:30:35 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/procaptcha/behavioral.ts' is older than output '../types/tsconfig.tsbuildinfo'
41
41
 
42
- 8:15:26 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/error.ts' is older than output '../common/tsconfig.tsbuildinfo'
42
+ 12:30:35 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/tests/utils/batches.unit.test.ts' is older than output '../common/tsconfig.tsbuildinfo'
43
43
 
44
- 8:15:26 AM - Project '../ipinfo/tsconfig.json' is up to date because newest input '../ipinfo/src/IpInfoService.ts' is older than output '../ipinfo/tsconfig.tsbuildinfo'
44
+ 12:30:35 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
- 8:15:26 AM - 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'
46
+ 12:30:35 PM - Project '../redis-client/tsconfig.json' is up to date because newest input '../redis-client/src/redisClient.ts' is older than output '../redis-client/tsconfig.tsbuildinfo'
47
47
 
48
- 8:15:26 AM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
48
+ 12:30:35 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
- 8:15:26 AM - Project '../user-access-policy/tsconfig.json' is up to date because newest input '../user-access-policy/src/transformRule.ts' is older than output '../user-access-policy/tsconfig.tsbuildinfo'
50
+ 12:30:35 PM - Project '../user-access-policy/tsconfig.json' is up to date because newest input '../user-access-policy/src/rule.ts' is older than output '../user-access-policy/tsconfig.tsbuildinfo'
51
51
 
52
- 8:15:26 AM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/types/bannedDomain.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
52
+ 12:30:35 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
- 8:15:26 AM - 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'
54
+ 12:30:35 PM - Project '../database/tsconfig.json' is up to date because newest input '../database/src/tests/unit/databases/centralDbStreamer.unit.test.ts' is older than output '../database/tsconfig.tsbuildinfo'
55
55
 
56
- 8:15:26 AM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
56
+ 12:30:35 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/keyring/keyring.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
57
57
 
58
- 8:15:26 AM - Project '../types-env/tsconfig.json' is up to date because newest input '../types-env/src/index.ts' is older than output '../types-env/tsconfig.tsbuildinfo'
58
+ 12:30:35 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
- 8:15:26 AM - Project '../env/tsconfig.json' is up to date because newest input '../env/src/env.ts' is older than output '../env/tsconfig.tsbuildinfo'
60
+ 12:30:35 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
- 8:15:26 AM - Project '../api-express-router/tsconfig.json' is up to date because newest input '../api-express-router/src/tests/unit/errorHandler.unit.test.ts' is older than output '../api-express-router/tsconfig.tsbuildinfo'
62
+ 12:30:35 PM - Project '../api-express-router/tsconfig.json' is up to date because newest input '../api-express-router/src/middlewares/requestLoggerMiddleware.ts' is older than output '../api-express-router/tsconfig.tsbuildinfo'
63
63
 
64
- 8:15:26 AM - 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'
64
+ 12:30:35 PM - Project '../datasets/tsconfig.json' is up to date because newest input '../datasets/src/index.ts' is older than output '../datasets/tsconfig.tsbuildinfo'
65
65
 
66
- 8:15:26 AM - 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'
66
+ 12:30:35 PM - Project '../load-balancer/tsconfig.json' is up to date because newest input '../load-balancer/src/index.ts' is older than output '../load-balancer/tsconfig.tsbuildinfo'
67
67
 
68
- 8:15:26 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
68
+ 12:30:35 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
69
69
 
70
- 8:15:26 AM - Building project '/home/runner/work/captcha/captcha/packages/provider/tsconfig.json'...
70
+ 12:30:35 PM - Building project '/home/runner/work/captcha/captcha/packages/provider/tsconfig.json'...
71
71
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/provider@4.7.1 build
2
+ > @prosopo/provider@4.8.0 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/provider@4.7.1 build:cross-env
6
+ > @prosopo/provider@4.8.0 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -90,7 +90,7 @@ rendering chunks...
90
90
  dist/api/admin/apiRemoveSiteKeyEndpoint.js  1.00 kB
91
91
  dist/api/admin/apiRemoveSiteKeysEndpoint.js  1.00 kB
92
92
  dist/api/admin/apiRegisterSiteKeysEndpoint.js  1.01 kB
93
- dist/tasks/detection/getBotScore.js  1.02 kB
93
+ dist/tasks/detection/getBotScore.js  1.09 kB
94
94
  dist/api/admin/apiRemoveDetectorKeyEndpoint.js  1.09 kB
95
95
  dist/schedulers/getClientList.js  1.10 kB
96
96
  dist/schedulers/setClientEntropy.js  1.13 kB
@@ -108,18 +108,18 @@ rendering chunks...
108
108
  dist/tasks/spam/checkTrafficFilter.js  1.56 kB
109
109
  dist/utils/honeypot/phraseBank.js  1.57 kB
110
110
  dist/api/public.js  1.60 kB
111
+ dist/api/admin/apiDnsEventEndpoint.js  1.64 kB
111
112
  dist/api/admin/apiClearAllCountersEndpoint.js  1.66 kB
112
113
  dist/api/admin/apiUpdateDecisionMachineEndpoint.js  1.67 kB
113
114
  dist/utils/honeypot/encoders.js  1.71 kB
114
115
  dist/tasks/frictionless/routingMachine.js  1.76 kB
115
- dist/api/admin/apiDnsEventEndpoint.js  1.82 kB
116
116
  dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js  1.95 kB
117
117
  dist/tasks/spam/updateSpamEmailDomains.js  2.03 kB
118
118
  dist/api/captcha/checkSpamEmail.js  2.08 kB
119
119
  dist/api/ja4Middleware.js  2.19 kB
120
120
  dist/api/captcha.js  2.49 kB
121
121
  dist/utils/dns.js  2.57 kB
122
- dist/index.js  2.62 kB
122
+ dist/index.js  2.66 kB
123
123
  dist/api/captcha/submitPuzzleCaptchaSolution.js  2.78 kB
124
124
  dist/tasks/spam/evaluateEmailSpamRules.js  2.84 kB
125
125
  dist/api/admin/apiAdminRoutesProvider.js  2.93 kB
@@ -128,29 +128,29 @@ rendering chunks...
128
128
  dist/api/domainMiddleware.js  3.71 kB
129
129
  dist/services/ipComparison.js  4.00 kB
130
130
  dist/tasks/spam/checkSpamEmail.js  4.26 kB
131
- dist/api/blacklistRequestInspector.js  4.57 kB
132
131
  dist/api/captcha/submitPoWCaptchaSolution.js  5.09 kB
133
132
  dist/tasks/tasks.js  5.13 kB
134
133
  dist/util/usageCounters.js  5.29 kB
135
- dist/api/captcha/getImageCaptchaChallenge.js  5.29 kB
136
- dist/api/captcha/getPoWCaptchaChallenge.js  5.88 kB
137
- dist/api/captcha/getPuzzleCaptchaChallenge.js  6.05 kB
134
+ dist/api/captcha/getImageCaptchaChallenge.js  5.41 kB
135
+ dist/api/blacklistRequestInspector.js  5.80 kB
136
+ dist/api/captcha/getPoWCaptchaChallenge.js  6.00 kB
137
+ dist/api/captcha/getPuzzleCaptchaChallenge.js  6.17 kB
138
138
  dist/api/startProviderApi.js  7.65 kB
139
139
  dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js  9.17 kB
140
- dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js  9.56 kB
140
+ dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js  9.76 kB
141
141
  dist/tasks/decisionMachine/decisionMachineRunner.js 10.14 kB
142
142
  dist/api/verify.js 10.43 kB
143
143
  dist/util.js 11.79 kB
144
- dist/tasks/captchaManager.js 15.08 kB
144
+ dist/tasks/captchaManager.js 15.10 kB
145
145
  dist/tasks/client/clientTasks.js 15.37 kB
146
- dist/tasks/frictionless/frictionlessTasks.js 15.70 kB
146
+ dist/tasks/frictionless/frictionlessTasks.js 15.89 kB
147
147
  dist/tasks/detection/decodeSimd.js 18.06 kB
148
- dist/tasks/puzzleCaptcha/puzzleTasks.js 18.74 kB
148
+ dist/tasks/puzzleCaptcha/puzzleTasks.js 18.83 kB
149
149
  dist/tasks/detection/decodeBehavior.js 19.03 kB
150
- dist/tasks/powCaptcha/powTasks.js 20.62 kB
151
- dist/tasks/imgCaptcha/imgCaptchaTasks.js 26.44 kB
150
+ dist/tasks/powCaptcha/powTasks.js 20.71 kB
151
+ dist/tasks/imgCaptcha/imgCaptchaTasks.js 26.52 kB
152
152
  dist/tasks/detection/decodePayload.js 44.24 kB
153
- ✓ built in 1.35s
153
+ ✓ built in 1.40s
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,38 @@
1
1
  # @prosopo/provider
2
2
 
3
+ ## 4.8.0
4
+ ### Minor Changes
5
+
6
+ - 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.
7
+
8
+ ### Patch Changes
9
+
10
+ - 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.
11
+ - Updated dependencies [2f459ce]
12
+ - @prosopo/user-access-policy@3.8.0
13
+ - @prosopo/database@3.13.9
14
+ - @prosopo/types-database@4.8.2
15
+ - @prosopo/env@3.5.9
16
+ - @prosopo/types-env@2.9.18
17
+ - @prosopo/api-express-router@3.1.19
18
+
19
+ ## 4.7.2
20
+ ### Patch Changes
21
+
22
+ - b03dad1: Thread `shadowDomPenalty: boolean` from the catcher's encrypted detection payload through `decryptPayload` and persist it on `Session.scoreComponents` so the flag is queryable in Mongo without inferring it from `baseScore=1 ∧ ¬triggeredDetectors`. Field is optional on the wire (position 6); older catcher bundles omit it and `shadowDomPenalty` stays undefined.
23
+ - Updated dependencies [b03dad1]
24
+ - @prosopo/types@4.3.1
25
+ - @prosopo/types-database@4.8.1
26
+ - @prosopo/env@3.5.8
27
+ - @prosopo/api@3.4.9
28
+ - @prosopo/api-express-router@3.1.18
29
+ - @prosopo/database@3.13.8
30
+ - @prosopo/datasets@3.1.29
31
+ - @prosopo/keyring@2.9.35
32
+ - @prosopo/load-balancer@2.9.11
33
+ - @prosopo/types-env@2.9.17
34
+ - @prosopo/user-access-policy@3.7.12
35
+
3
36
  ## 4.7.1
4
37
  ### Patch Changes
5
38
 
@@ -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, type Session } from "@prosopo/types";
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 dnsEventToPartialSession: (event: DnsEvent, existing: Session["dnsEvent"] | undefined) => Session["dnsEvent"];
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,EACN,KAAK,QAAQ,EACb,mBAAmB,EACnB,KAAK,OAAO,EACZ,MAAM,gBAAgB,CAAC;AACxB,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,wBAAwB,UAC7B,QAAQ,YACL,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,KACvC,OAAO,CAAC,UAAU,CAYpB,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;IA0CxB,oBAAoB,IAAI,uBAAuB;CAGtD;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
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 dnsEventToPartialSession = (event, existing) => {
5
- const receivedAt = existing?.receivedAt ?? /* @__PURE__ */ new Date();
6
- const merged = { ...existing ?? {}, receivedAt };
4
+ const dnsEventToFields = (event) => {
7
5
  if (event.kind === "dns") {
8
- merged.resolverIp = event.src_ip;
9
- } else {
10
- merged.peerIp = event.src_ip;
11
- if (typeof event.path_valid === "boolean") {
12
- merged.pathValid = event.path_valid;
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 merged;
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 session = await this.db.getSessionRecordBySessionId(sessionId);
33
- if (!session) {
34
- continue;
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
- dnsEventToPartialSession
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,EAEN,mBAAmB,GAEnB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACvC,KAAe,EACf,QAAyC,EACnB,EAAE;IACxB,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IACtD,MAAM,MAAM,GAAwB,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IACxE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7B,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;QACrC,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,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;QAEf,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,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;gBACrE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,SAAS;gBACV,CAAC;gBACD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnE,MAAM,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC3D,MAAM,IAAI,CAAC,CAAC;YACb,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
+ {"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 getPrioritisedAccessRule: (userAccessRulesStorage: AccessRulesStorage, userScope: UserScope | UserScopeRecord, clientId?: string) => Promise<import("@prosopo/user-access-policy").AccessRule[]>;
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;AAErC,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,KAClB,IAAI,CACN,eAAe,EACb,QAAQ,GACR,SAAS,GACT,WAAW,GACX,IAAI,GACJ,UAAU,GACV,QAAQ,GACR,aAAa,CAef,CAAC;AAiBF,eAAO,MAAM,wBAAwB,2BACZ,kBAAkB,aAC/B,SAAS,GAAG,eAAe,aAC3B,MAAM,gEA+BjB,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;IAmEnB,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
+ {"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, AccessPolicyType } from "@prosopo/user-access-policy";
3
- import { uniqueSubsets } from "@prosopo/util";
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 getPrioritisedUserScopes = (userScope) => {
17
- const userScopeKeys = Object.keys(userScope);
18
- return uniqueSubsets(userScopeKeys).map(
19
- (subset) => subset.reduce(
20
- (acc, key) => {
21
- acc[key] = userScope[key];
22
- return acc;
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 getPrioritisedAccessRule = async (userAccessRulesStorage, userScope, clientId) => {
29
- const prioritisedUserScopes = getPrioritisedUserScopes(userScope);
30
- const policyPromises = [];
31
- const clientLoop = clientId ? [clientId, void 0] : [void 0];
32
- for (const clientOrUndefined of clientLoop) {
33
- for (const scope of prioritisedUserScopes) {
34
- if (Object.values(scope).every((value) => value === void 0)) {
35
- continue;
36
- }
37
- const parsedUserScope = userScopeInput.parse(scope);
38
- const filter = {
39
- ...clientOrUndefined && {
40
- policyScope: {
41
- clientId: clientOrUndefined
42
- }
43
- },
44
- policyScopeMatch: FilterScopeMatch.Exact,
45
- userScope: parsedUserScope,
46
- userScopeMatch: FilterScopeMatch.Exact
47
- };
48
- policyPromises.push(userAccessRulesStorage.findRules(filter, true, true));
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
- return (await Promise.all(policyPromises)).flat();
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
  };