@prosopo/provider 5.13.1 → 5.13.3

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 (139) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +25 -23
  2. package/.turbo/turbo-build$colon$tsc.log +27 -27
  3. package/.turbo/turbo-build.log +26 -24
  4. package/CHANGELOG.md +95 -0
  5. package/dist/api/admin/apiDnsEventEndpoint.d.ts +2 -2
  6. package/dist/api/admin/apiDnsEventEndpoint.d.ts.map +1 -1
  7. package/dist/api/admin/apiDnsEventEndpoint.js +28 -5
  8. package/dist/api/admin/apiDnsEventEndpoint.js.map +1 -1
  9. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  10. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +1 -1
  11. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  12. package/dist/api/captcha/getImageCaptchaChallenge.d.ts.map +1 -1
  13. package/dist/api/captcha/getImageCaptchaChallenge.js +2 -0
  14. package/dist/api/captcha/getImageCaptchaChallenge.js.map +1 -1
  15. package/dist/api/captcha/getPoWCaptchaChallenge.d.ts.map +1 -1
  16. package/dist/api/captcha/getPoWCaptchaChallenge.js +4 -1
  17. package/dist/api/captcha/getPoWCaptchaChallenge.js.map +1 -1
  18. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  19. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +4 -1
  20. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  21. package/dist/api/captcha/submitImageCaptchaSolution.d.ts.map +1 -1
  22. package/dist/api/captcha/submitImageCaptchaSolution.js +3 -2
  23. package/dist/api/captcha/submitImageCaptchaSolution.js.map +1 -1
  24. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  25. package/dist/api/captcha/submitPoWCaptchaSolution.js +3 -2
  26. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  27. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
  28. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +3 -2
  29. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
  30. package/dist/api/captcha/trafficFilterRequestTime.d.ts +2 -0
  31. package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
  32. package/dist/api/captcha/trafficFilterRequestTime.js +9 -3
  33. package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
  34. package/dist/api/captcha.d.ts.map +1 -1
  35. package/dist/api/captcha.js +2 -0
  36. package/dist/api/captcha.js.map +1 -1
  37. package/dist/api/hardBlockVerdictCache.d.ts +1 -0
  38. package/dist/api/hardBlockVerdictCache.d.ts.map +1 -1
  39. package/dist/api/hardBlockVerdictCache.js +4 -1
  40. package/dist/api/hardBlockVerdictCache.js.map +1 -1
  41. package/dist/api/requestBodySummary.d.ts +14 -0
  42. package/dist/api/requestBodySummary.d.ts.map +1 -0
  43. package/dist/api/requestBodySummary.js +47 -0
  44. package/dist/api/requestBodySummary.js.map +1 -0
  45. package/dist/api/verify.d.ts.map +1 -1
  46. package/dist/api/verify.js +9 -8
  47. package/dist/api/verify.js.map +1 -1
  48. package/dist/cjs/api/admin/apiDnsEventEndpoint.cjs +27 -4
  49. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +1 -1
  50. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -0
  51. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -1
  52. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +4 -1
  53. package/dist/cjs/api/captcha/submitImageCaptchaSolution.cjs +3 -2
  54. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +3 -2
  55. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +3 -2
  56. package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +6 -1
  57. package/dist/cjs/api/captcha.cjs +2 -0
  58. package/dist/cjs/api/hardBlockVerdictCache.cjs +4 -1
  59. package/dist/cjs/api/requestBodySummary.cjs +47 -0
  60. package/dist/cjs/api/verify.cjs +9 -8
  61. package/dist/cjs/pairs.cjs +70 -6
  62. package/dist/cjs/tasks/captchaManager.cjs +15 -0
  63. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +4 -1
  64. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +17 -6
  65. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +5 -1
  66. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +1 -4
  67. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +11 -0
  68. package/dist/cjs/tasks/tasks.cjs +1 -37
  69. package/dist/cjs/utils/tarpitPadding.cjs +23 -0
  70. package/dist/pairs.d.ts +6 -1
  71. package/dist/pairs.d.ts.map +1 -1
  72. package/dist/pairs.js +67 -7
  73. package/dist/pairs.js.map +1 -1
  74. package/dist/tasks/captchaManager.d.ts.map +1 -1
  75. package/dist/tasks/captchaManager.js +15 -0
  76. package/dist/tasks/captchaManager.js.map +1 -1
  77. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  78. package/dist/tasks/frictionless/frictionlessTasks.js +4 -1
  79. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  80. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  81. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +20 -8
  82. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  83. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  84. package/dist/tasks/powCaptcha/powTasks.js +5 -1
  85. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  86. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  87. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +1 -4
  88. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  89. package/dist/tasks/spam/checkTrafficFilter.d.ts +1 -0
  90. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  91. package/dist/tasks/spam/checkTrafficFilter.js +11 -1
  92. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  93. package/dist/tasks/tasks.d.ts +0 -1
  94. package/dist/tasks/tasks.d.ts.map +1 -1
  95. package/dist/tasks/tasks.js +1 -37
  96. package/dist/tasks/tasks.js.map +1 -1
  97. package/dist/tests/integration/authenticatedVerifyClaim.integration.test.d.ts +2 -0
  98. package/dist/tests/integration/authenticatedVerifyClaim.integration.test.d.ts.map +1 -0
  99. package/dist/tests/integration/authenticatedVerifyClaim.integration.test.js +81 -0
  100. package/dist/tests/integration/authenticatedVerifyClaim.integration.test.js.map +1 -0
  101. package/dist/tests/integration/imgCaptcha.integration.test.js +37 -1
  102. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
  103. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js +39 -3
  104. package/dist/tests/unit/api/admin/apiDnsEventEndpoint.unit.test.js.map +1 -1
  105. package/dist/tests/unit/api/domainMiddleware.unit.test.d.ts +2 -0
  106. package/dist/tests/unit/api/domainMiddleware.unit.test.d.ts.map +1 -0
  107. package/dist/tests/unit/api/domainMiddleware.unit.test.js +167 -0
  108. package/dist/tests/unit/api/domainMiddleware.unit.test.js.map +1 -0
  109. package/dist/tests/unit/api/hardBlockVerdictCache.unit.test.js +32 -0
  110. package/dist/tests/unit/api/hardBlockVerdictCache.unit.test.js.map +1 -1
  111. package/dist/tests/unit/api/requestBodySummary.unit.test.d.ts +2 -0
  112. package/dist/tests/unit/api/requestBodySummary.unit.test.d.ts.map +1 -0
  113. package/dist/tests/unit/api/requestBodySummary.unit.test.js +172 -0
  114. package/dist/tests/unit/api/requestBodySummary.unit.test.js.map +1 -0
  115. package/dist/tests/unit/pairs.unit.test.js +126 -1
  116. package/dist/tests/unit/pairs.unit.test.js.map +1 -1
  117. package/dist/tests/unit/tasks/captchaManager.unit.test.js +38 -0
  118. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  119. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +104 -8
  120. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  121. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +232 -17
  122. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  123. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +66 -14
  124. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  125. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js +21 -1
  126. package/dist/tests/unit/tasks/puzzleCaptcha/puzzleTasks.unit.test.js.map +1 -1
  127. package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.d.ts +2 -0
  128. package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.d.ts.map +1 -0
  129. package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.js +34 -0
  130. package/dist/tests/unit/tasks/tasksBackgroundWork.unit.test.js.map +1 -0
  131. package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.js +0 -49
  132. package/dist/tests/unit/tasks/writeQueueIntegration.unit.test.js.map +1 -1
  133. package/dist/tests/unit/util/redisCache.unit.test.js +1 -104
  134. package/dist/tests/unit/util/redisCache.unit.test.js.map +1 -1
  135. package/dist/utils/tarpitPadding.d.ts +3 -0
  136. package/dist/utils/tarpitPadding.d.ts.map +1 -0
  137. package/dist/utils/tarpitPadding.js +24 -0
  138. package/dist/utils/tarpitPadding.js.map +1 -0
  139. package/package.json +24 -24
@@ -4,6 +4,7 @@ const require_tasks = require("../tasks/tasks.cjs");
4
4
  const require_apiToggleMaintenanceModeEndpoint = require("./admin/apiToggleMaintenanceModeEndpoint.cjs");
5
5
  const require_testSiteKey = require("./testSiteKey.cjs");
6
6
  const require_maintenanceModeResponses = require("./captcha/maintenanceModeResponses.cjs");
7
+ const require_requestBodySummary = require("./requestBodySummary.cjs");
7
8
  const require_forwardVerify = require("./forwardVerify.cjs");
8
9
  let _prosopo_common = require("@prosopo/common");
9
10
  let _prosopo_types = require("@prosopo/types");
@@ -89,7 +90,7 @@ function prosopoVerifyRouter(env) {
89
90
  context: {
90
91
  code: 400,
91
92
  error: err,
92
- body: req.body
93
+ body: require_requestBodySummary.summariseRequestBody(req)
93
94
  },
94
95
  i18n: req.i18n,
95
96
  logger: req.logger
@@ -140,7 +141,7 @@ function prosopoVerifyRouter(env) {
140
141
  req.logger.error(() => ({
141
142
  err,
142
143
  msg: "Error in verifyImageCaptchaSolution",
143
- data: { body: req.body }
144
+ data: { body: require_requestBodySummary.summariseRequestBody(req) }
144
145
  }));
145
146
  return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
146
147
  context: {
@@ -174,7 +175,7 @@ function prosopoVerifyRouter(env) {
174
175
  context: {
175
176
  code: 400,
176
177
  error: err,
177
- body: req.body
178
+ body: require_requestBodySummary.summariseRequestBody(req)
178
179
  },
179
180
  i18n: req.i18n,
180
181
  logger: req.logger
@@ -230,7 +231,7 @@ function prosopoVerifyRouter(env) {
230
231
  req.logger.error(() => ({
231
232
  msg: "Error in verifyPowCaptchaSolution",
232
233
  err,
233
- data: { body: req.body }
234
+ data: { body: require_requestBodySummary.summariseRequestBody(req) }
234
235
  }));
235
236
  return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
236
237
  context: {
@@ -263,7 +264,7 @@ function prosopoVerifyRouter(env) {
263
264
  context: {
264
265
  code: 400,
265
266
  error: err,
266
- body: req.body
267
+ body: require_requestBodySummary.summariseRequestBody(req)
267
268
  },
268
269
  i18n: req.i18n,
269
270
  logger: req.logger
@@ -319,7 +320,7 @@ function prosopoVerifyRouter(env) {
319
320
  req.logger.error(() => ({
320
321
  msg: "Error in verifyPuzzleCaptchaSolution",
321
322
  err,
322
- data: { body: req.body }
323
+ data: { body: require_requestBodySummary.summariseRequestBody(req) }
323
324
  }));
324
325
  return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
325
326
  context: {
@@ -352,7 +353,7 @@ function prosopoVerifyRouter(env) {
352
353
  context: {
353
354
  code: 400,
354
355
  error: err,
355
- body: req.body
356
+ body: require_requestBodySummary.summariseRequestBody(req)
356
357
  },
357
358
  i18n: req.i18n,
358
359
  logger: req.logger
@@ -401,7 +402,7 @@ function prosopoVerifyRouter(env) {
401
402
  req.logger.error(() => ({
402
403
  err,
403
404
  msg: "Error in verifyAuthenticatedSession",
404
- data: { body: req.body }
405
+ data: { body: require_requestBodySummary.summariseRequestBody(req) }
405
406
  }));
406
407
  return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", {
407
408
  context: {
@@ -1,3 +1,4 @@
1
+ let _prosopo_types = require("@prosopo/types");
1
2
  let _prosopo_util = require("@prosopo/util");
2
3
  //#region src/pairs.ts
3
4
  /** Construct list of pairs from flat list
@@ -20,18 +21,81 @@ var peelCheckboxPrefix = (flat, solutionLengths) => {
20
21
  return { flat };
21
22
  };
22
23
  /**
23
- * Check if there are identical pairs in flattened lists of pairs
24
+ * The input method of every coordinate pair embedded in each captcha's salt.
25
+ * A captcha that declares none gets pointer for every pair, which keeps
26
+ * requests from older widgets under the full repeated-position check.
27
+ * Returns `undefined` when a captcha declares a different number of methods
28
+ * than it has pairs: the official widget never sends that.
29
+ * @param flat the coordinates extracted from each captcha's salt
30
+ * @param declared the input methods each captcha declared, if any
31
+ */
32
+ var resolveInputMethods = (flat, declared) => {
33
+ const resolved = [];
34
+ for (const [index, list] of flat.entries()) {
35
+ const pairCount = list.length / 2;
36
+ const methods = declared[index];
37
+ if (methods === void 0) resolved.push(new Array(pairCount).fill(_prosopo_types.InputMethod.pointer));
38
+ else if (methods.length === pairCount) resolved.push([...methods]);
39
+ else return;
40
+ }
41
+ return resolved;
42
+ };
43
+ /**
44
+ * Give the checkbox's input method its own list, as `peelCheckboxPrefix` does
45
+ * for its coordinates, so the result lines up with the pair lists.
46
+ * @param methods the input methods of each captcha, checkbox first
47
+ */
48
+ var peelCheckboxInputMethod = (methods) => {
49
+ const [first, ...rest] = methods;
50
+ if (first === void 0 || first.length === 0) return methods;
51
+ return [
52
+ first.slice(0, 1),
53
+ first.slice(1),
54
+ ...rest
55
+ ];
56
+ };
57
+ var isKeyboard = (inputMethods, listIndex, pairIndex) => inputMethods?.[listIndex]?.[pairIndex] === _prosopo_types.InputMethod.keyboard;
58
+ /**
59
+ * Whether any keyboard selection carries a pointer position. Keyboard
60
+ * activation has none, and the widget sends (0, 0) for it, so a position here
61
+ * means the request did not come from the widget.
24
62
  * @param pairsLists
63
+ * @param inputMethods the same shape as `pairsLists`
25
64
  */
26
- var containsIdenticalPairs = (pairsLists) => {
27
- const set = /* @__PURE__ */ new Set();
28
- for (const pairList of pairsLists) for (const pair of pairList) {
65
+ var keyboardSelectionHasPosition = (pairsLists, inputMethods) => pairsLists.some((pairList, listIndex) => pairList.some(([x, y], pairIndex) => isKeyboard(inputMethods, listIndex, pairIndex) && (x !== 0 || y !== 0)));
66
+ /**
67
+ * Check whether any pointer position repeats across the lists of pairs. A
68
+ * person selecting the same tile in two rounds almost never lands on the same
69
+ * pixel twice, whereas a script clicking each element's centre does. Keyboard
70
+ * selections have no position and are left out; without `inputMethods` every
71
+ * pair is a pointer selection.
72
+ * @param pairsLists
73
+ * @param inputMethods the same shape as `pairsLists`
74
+ */
75
+ var containsIdenticalPairs = (pairsLists, inputMethods) => {
76
+ const seen = /* @__PURE__ */ new Set();
77
+ for (const [listIndex, pairList] of pairsLists.entries()) for (const [pairIndex, pair] of pairList.entries()) {
78
+ if (isKeyboard(inputMethods, listIndex, pairIndex)) continue;
29
79
  const coordString = `${(0, _prosopo_util.at)(pair, 0)},${(0, _prosopo_util.at)(pair, 1)}`;
30
- set.add(coordString);
80
+ if (seen.has(coordString)) return true;
81
+ seen.add(coordString);
31
82
  }
32
- return set.size !== pairsLists.flat().flat().length / 2;
83
+ return false;
33
84
  };
85
+ /**
86
+ * Whether the selections point to a script rather than a person: the declared
87
+ * input methods do not line up with the coordinates, a keyboard selection
88
+ * carries a position, or a pointer position repeats.
89
+ * @param pairsLists
90
+ * @param inputMethods the same shape as `pairsLists`, or `undefined` when the
91
+ * declared methods did not line up with the coordinates
92
+ */
93
+ var selectionsLookScripted = (pairsLists, inputMethods) => inputMethods === void 0 || keyboardSelectionHasPosition(pairsLists, inputMethods) || containsIdenticalPairs(pairsLists, inputMethods);
34
94
  //#endregion
35
95
  exports.constructPairList = constructPairList;
36
96
  exports.containsIdenticalPairs = containsIdenticalPairs;
97
+ exports.keyboardSelectionHasPosition = keyboardSelectionHasPosition;
98
+ exports.peelCheckboxInputMethod = peelCheckboxInputMethod;
37
99
  exports.peelCheckboxPrefix = peelCheckboxPrefix;
100
+ exports.resolveInputMethods = resolveInputMethods;
101
+ exports.selectionsLookScripted = selectionsLookScripted;
@@ -294,6 +294,21 @@ var CaptchaManager = class CaptchaManager {
294
294
  }
295
295
  sessionId = resolvedSessionId;
296
296
  if (this.writeQueue) await Promise.all([this.writeQueue.invalidateCachedSession(sessionId), sessionRecord.userSitekeyIpHash ? this.writeQueue.invalidateCachedSessionByHash(sessionRecord.userSitekeyIpHash) : Promise.resolve()]);
297
+ if (sessionRecord.siteKey !== void 0 && sessionRecord.siteKey !== clientSettings.account) {
298
+ this.logger.warn(() => ({
299
+ msg: "Session was issued for a different site key",
300
+ data: {
301
+ account: clientSettings.account,
302
+ sessionId,
303
+ sessionSiteKey: sessionRecord.siteKey
304
+ }
305
+ }));
306
+ return {
307
+ valid: false,
308
+ reason: _prosopo_types.ResultReason.CAPTCHA_NO_SESSION_FOUND,
309
+ type: requestedCaptchaType
310
+ };
311
+ }
297
312
  if (currentIP) {
298
313
  const ipValidation = await this.validateSessionIP(sessionRecord, currentIP, env);
299
314
  if (!ipValidation.valid) return {
@@ -217,7 +217,10 @@ var FrictionlessManager = class extends require_captchaManager.CaptchaManager {
217
217
  verified: false,
218
218
  status: "API.CLIENT_SESSION_MISMATCH"
219
219
  };
220
- await this.db.updateSessionRecord(sessionId, { serverChecked: true });
220
+ if (!await this.db.claimSessionServerCheck(sessionId)) return {
221
+ verified: false,
222
+ status: "API.USER_ALREADY_VERIFIED"
223
+ };
221
224
  return {
222
225
  verified: true,
223
226
  status: "API.USER_VERIFIED"
@@ -124,10 +124,16 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
124
124
  const { checkbox: checkboxCoordPair, flat } = require_pairs.peelCheckboxPrefix(rawFlat, receivedCaptchas.map((c) => c.solution.length));
125
125
  const shapePairs = flat.map((list) => require_pairs.constructPairList(list));
126
126
  const pairs = checkboxCoordPair ? [[checkboxCoordPair], ...shapePairs] : shapePairs;
127
+ const rawInputMethods = require_pairs.resolveInputMethods(rawFlat, receivedCaptchas.map((c) => c.inputMethods));
128
+ const inputMethods = rawInputMethods && checkboxCoordPair ? require_pairs.peelCheckboxInputMethod(rawInputMethods) : rawInputMethods;
129
+ const inputMethodsDeclared = receivedCaptchas.some((c) => c.inputMethods !== void 0);
127
130
  const { tree, commitmentId } = require_imgCaptchaTasksUtils.buildTreeAndGetCommitmentId(receivedCaptchas);
128
131
  const datasetId = (0, _prosopo_util.at)(storedCaptchas, 0).datasetId;
129
132
  if (!datasetId) throw new _prosopo_common.ProsopoEnvError("CAPTCHA.ID_MISMATCH", { context: { failedFuncName: this.dappUserSolution.name } });
130
- await this.db.updatePendingImageCommitmentStatus(requestHash);
133
+ if (!await this.db.updatePendingImageCommitmentStatus(requestHash)) {
134
+ this.logger.info(() => ({ msg: "Request hash already consumed by a concurrent submission" }));
135
+ return response;
136
+ }
131
137
  let behavioralDataPacked;
132
138
  let deviceCapability;
133
139
  if (behavioralData) try {
@@ -185,7 +191,8 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
185
191
  deadlineTimestamp: pendingRecord.deadlineTimestamp,
186
192
  ...behavioralDataPacked && { behavioralDataPacked },
187
193
  ...deviceCapability && { deviceCapability },
188
- ...storedClientMetaData && { clientMetaData: storedClientMetaData }
194
+ ...storedClientMetaData && { clientMetaData: storedClientMetaData },
195
+ ...inputMethodsDeclared && inputMethods && { inputMethods }
189
196
  };
190
197
  await this.db.storeUserImageCaptchaSolution(receivedCaptchas, commit);
191
198
  const solutionRecords = await Promise.all(storedCaptchas.map(async (captcha) => {
@@ -194,7 +201,7 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
194
201
  return solutionRecord;
195
202
  }));
196
203
  const totalImages = storedCaptchas[0]?.items.length || 0;
197
- if (require_pairs.containsIdenticalPairs(pairs) && process.env.NODE_ENV !== "test") {
204
+ if (require_pairs.selectionsLookScripted(pairs, inputMethods) && process.env.NODE_ENV !== "test") {
198
205
  const writePromises = [this.db.disapproveDappUserCommitment(commitmentId, "CAPTCHA.INVALID_SOLUTION", pairs)];
199
206
  if (pendingRecord.sessionId) {
200
207
  writePromises.push(this.updateSessionRecordWithCache(pendingRecord.sessionId, {
@@ -219,9 +226,9 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
219
226
  }
220
227
  if ((0, _prosopo_datasets.compareCaptchaSolutions)(receivedCaptchas, solutionRecords, totalImages, pendingRecord.threshold)) {
221
228
  response = {
222
- captchas: captchaIds.map((id) => ({
229
+ captchas: captchaIds.map((id, index) => ({
223
230
  captchaId: id,
224
- proof: tree.proof(id)
231
+ proof: tree.proof((0, _prosopo_util.at)(tree.leaves, index).hash)
225
232
  })),
226
233
  verified: true
227
234
  };
@@ -335,7 +342,11 @@ var ImgCaptchaManager = class extends require_captchaManager.CaptchaManager {
335
342
  verified: false,
336
343
  ...solution.sessionId && { sessionId: solution.sessionId }
337
344
  };
338
- await this.db.markDappUserCommitmentsChecked([solution.id]);
345
+ if (await this.db.markDappUserCommitmentsChecked([solution.id]) === 0) return {
346
+ status: "API.USER_ALREADY_VERIFIED",
347
+ verified: false,
348
+ ...solution.sessionId && { sessionId: solution.sessionId }
349
+ };
339
350
  if (solution.result.status === _prosopo_types.CaptchaStatus.disapproved) return {
340
351
  status: solution.result.reason || "API.USER_NOT_VERIFIED",
341
352
  verified: false,
@@ -75,6 +75,10 @@ var PowCaptchaManager = class extends require_captchaManager.CaptchaManager {
75
75
  this.logger.debug(() => ({ msg: `No record of this challenge: ${challenge}` }));
76
76
  return { verified: false };
77
77
  }
78
+ if (challengeRecord.userSubmitted) {
79
+ this.logger.debug(() => ({ msg: `Challenge already submitted: ${challenge}` }));
80
+ return { verified: false };
81
+ }
78
82
  const difficulty = challengeRecord.difficulty;
79
83
  let coords;
80
84
  let saltDecodeError;
@@ -314,7 +318,7 @@ var PowCaptchaManager = class extends require_captchaManager.CaptchaManager {
314
318
  dappAccount,
315
319
  challengeDappAccount
316
320
  } });
317
- await this.db.markDappUserPoWCommitmentsChecked([challengeRecord.challenge]);
321
+ if (await this.db.markDappUserPoWCommitmentsChecked([challengeRecord.challenge]) === 0) return notVerified("API.USER_ALREADY_VERIFIED", challengeRecord.sessionId);
318
322
  const powRecordUpdates = {};
319
323
  let failResult;
320
324
  let failReason;
@@ -229,10 +229,7 @@ var PuzzleCaptchaManager = class extends require_captchaManager.CaptchaManager {
229
229
  dappAccount,
230
230
  challengeDappAccount
231
231
  } });
232
- await this.db.updatePuzzleCaptchaRecord(challengeRecord.challenge, {
233
- serverChecked: true,
234
- lastUpdatedTimestamp: /* @__PURE__ */ new Date()
235
- });
232
+ if (!await this.db.markPuzzleCaptchaRecordChecked(challengeRecord.challenge)) return notVerifiedResponse;
236
233
  const submittedAt = challengeRecord.submittedAtTimestamp;
237
234
  if ((submittedAt instanceof Date ? Date.now() - submittedAt.getTime() : Number.POSITIVE_INFINITY) > timeout) {
238
235
  const disapprovedResult = {
@@ -165,6 +165,16 @@ var resolveChallengePolicy = (matches) => {
165
165
  sourceCategories: challenges.map((m) => m.category)
166
166
  };
167
167
  };
168
+ /**
169
+ * Largest `padBytes` across all matched categories, block or challenge. A
170
+ * blocked category still resolves to a deferred challenge at request time, so
171
+ * padding it burns the caller's bandwidth on the way to being blocked.
172
+ */
173
+ var resolvePadBytes = (matches) => {
174
+ let padBytes;
175
+ for (const m of matches) if (m.policy.padBytes !== void 0) padBytes = padBytes === void 0 ? m.policy.padBytes : Math.max(padBytes, m.policy.padBytes);
176
+ return padBytes;
177
+ };
168
178
  //#endregion
169
179
  exports.categoryToReason = categoryToReason;
170
180
  exports.checkTrafficFilter = checkTrafficFilter;
@@ -172,3 +182,4 @@ exports.isDatacenterAllowlisted = isDatacenterAllowlisted;
172
182
  exports.isDatacenterDenylisted = isDatacenterDenylisted;
173
183
  exports.isEffectivelyDatacenter = isEffectivelyDatacenter;
174
184
  exports.resolveChallengePolicy = resolveChallengePolicy;
185
+ exports.resolvePadBytes = resolvePadBytes;
@@ -10,16 +10,11 @@ let _prosopo_common = require("@prosopo/common");
10
10
  let _prosopo_database = require("@prosopo/database");
11
11
  let _prosopo_logger = require("@prosopo/logger");
12
12
  //#region src/tasks/tasks.ts
13
- /**
14
- * Singleton write queue manager.
15
- * Ensures only one flush timer exists across all Tasks instances.
16
- */
17
13
  var globalWriteQueue = null;
18
- var flushStarted = false;
19
14
  /**
20
15
  * @description Tasks that are shared by the API and CLI
21
16
  */
22
- var Tasks = class Tasks {
17
+ var Tasks = class {
23
18
  constructor(env, logger) {
24
19
  this.env = env;
25
20
  this.config = env.config;
@@ -57,43 +52,12 @@ var Tasks = class Tasks {
57
52
  try {
58
53
  const redisConnection = this.db.getRedisConnection();
59
54
  globalWriteQueue = new _prosopo_database.RedisWriteQueue(redisConnection, this.logger);
60
- if (!flushStarted) {
61
- flushStarted = true;
62
- const db = this.db;
63
- const logger = this.logger;
64
- globalWriteQueue.startPeriodicFlush(async (queue) => {
65
- await Tasks.flushWriteQueue(queue, db, logger);
66
- }, 1e4);
67
- }
68
55
  return globalWriteQueue;
69
56
  } catch {
70
57
  this.logger.debug(() => ({ msg: "Redis not available for write queue - falling back to direct writes" }));
71
58
  return null;
72
59
  }
73
60
  }
74
- /**
75
- * Flush queued session records from Redis to MongoDB in bulk.
76
- * Called periodically by the write queue timer.
77
- *
78
- * Note: PoW challenge and pending image commitment records are written
79
- * directly to MongoDB (not queued) because verification endpoints need
80
- * to read them immediately after creation. Session records are safe to
81
- * queue because they are not read in the immediate request path.
82
- */
83
- static async flushWriteQueue(queue, db, logger) {
84
- const sessionRecords = await queue.drainSessionRecords();
85
- if (sessionRecords.length > 0) {
86
- logger.info(() => ({ msg: `Flushing ${sessionRecords.length} queued session records to MongoDB` }));
87
- for (const { record } of sessionRecords) try {
88
- await db.storeSessionRecord(record);
89
- } catch (error) {
90
- logger.error(() => ({
91
- msg: "Failed to flush queued session record",
92
- err: error
93
- }));
94
- }
95
- }
96
- }
97
61
  setLogger(logger) {
98
62
  this.logger = logger;
99
63
  this.powCaptchaManager.logger = logger;
@@ -0,0 +1,23 @@
1
+ let _prosopo_types = require("@prosopo/types");
2
+ //#region src/utils/tarpitPadding.ts
3
+ var POOL = (0, require("node:crypto").randomBytes)(Math.ceil(_prosopo_types.MAX_PAD_BYTES * 3 / 4)).toString("base64");
4
+ var clampPadBytes = (padBytes) => padBytes && padBytes > 0 ? Math.min(Math.floor(padBytes), _prosopo_types.MAX_PAD_BYTES) : 0;
5
+ var streamWithPad = (res, body, n) => {
6
+ const offset = Math.floor(Math.random() * (POOL.length - n + 1));
7
+ const rest = JSON.stringify(body);
8
+ res.setHeader("content-type", "application/json; charset=utf-8");
9
+ res.write("{\"pad\":\"");
10
+ res.write(POOL.slice(offset, offset + n));
11
+ res.write(`",${rest.slice(1)}`);
12
+ return res.end();
13
+ };
14
+ var padResponseMiddleware = (_req, res, next) => {
15
+ const originalJson = res.json.bind(res);
16
+ res.json = (body) => {
17
+ const n = clampPadBytes(res.locals.padBytes);
18
+ return n === 0 ? originalJson(body) : streamWithPad(res, body, n);
19
+ };
20
+ next();
21
+ };
22
+ //#endregion
23
+ exports.padResponseMiddleware = padResponseMiddleware;
package/dist/pairs.d.ts CHANGED
@@ -1,7 +1,12 @@
1
+ import { InputMethod } from "@prosopo/types";
1
2
  export declare const constructPairList: (list: number[]) => [number, number][];
2
3
  export declare const peelCheckboxPrefix: (flat: number[][], solutionLengths: number[]) => {
3
4
  checkbox?: [number, number];
4
5
  flat: number[][];
5
6
  };
6
- export declare const containsIdenticalPairs: (pairsLists: [number, number][][]) => boolean;
7
+ export declare const resolveInputMethods: (flat: number[][], declared: (readonly InputMethod[] | undefined)[]) => InputMethod[][] | undefined;
8
+ export declare const peelCheckboxInputMethod: (methods: InputMethod[][]) => InputMethod[][];
9
+ export declare const keyboardSelectionHasPosition: (pairsLists: [number, number][][], inputMethods: InputMethod[][]) => boolean;
10
+ export declare const containsIdenticalPairs: (pairsLists: [number, number][][], inputMethods?: InputMethod[][]) => boolean;
11
+ export declare const selectionsLookScripted: (pairsLists: [number, number][][], inputMethods: InputMethod[][] | undefined) => boolean;
7
12
  //# sourceMappingURL=pairs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pairs.d.ts","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,iBAAiB,SAAU,MAAM,EAAE,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAWlE,CAAC;AAEF,eAAO,MAAM,kBAAkB,SACxB,MAAM,EAAE,EAAE,mBACC,MAAM,EAAE,KACvB;IAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;CAYjD,CAAC;AAMF,eAAO,MAAM,sBAAsB,eAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,YActE,CAAC"}
1
+ {"version":3,"file":"pairs.d.ts","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,eAAO,MAAM,iBAAiB,SAAU,MAAM,EAAE,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAWlE,CAAC;AAEF,eAAO,MAAM,kBAAkB,SACxB,MAAM,EAAE,EAAE,mBACC,MAAM,EAAE,KACvB;IAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;CAYjD,CAAC;AAWF,eAAO,MAAM,mBAAmB,SACzB,MAAM,EAAE,EAAE,YACN,CAAC,SAAS,WAAW,EAAE,GAAG,SAAS,CAAC,EAAE,KAC9C,WAAW,EAAE,EAAE,GAAG,SAgBpB,CAAC;AAOF,eAAO,MAAM,uBAAuB,YAC1B,WAAW,EAAE,EAAE,KACtB,WAAW,EAAE,EAMf,CAAC;AAeF,eAAO,MAAM,4BAA4B,eAC5B,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,gBAClB,WAAW,EAAE,EAAE,KAC3B,OAMD,CAAC;AAWH,eAAO,MAAM,sBAAsB,eACtB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,iBACjB,WAAW,EAAE,EAAE,KAC5B,OAeF,CAAC;AAUF,eAAO,MAAM,sBAAsB,eACtB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,gBAClB,WAAW,EAAE,EAAE,GAAG,SAAS,KACvC,OAG8C,CAAC"}
package/dist/pairs.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { InputMethod } from "@prosopo/types";
1
2
  import { at } from "@prosopo/util";
2
3
  //#region src/pairs.ts
3
4
  /** Construct list of pairs from flat list
@@ -20,16 +21,75 @@ var peelCheckboxPrefix = (flat, solutionLengths) => {
20
21
  return { flat };
21
22
  };
22
23
  /**
23
- * Check if there are identical pairs in flattened lists of pairs
24
+ * The input method of every coordinate pair embedded in each captcha's salt.
25
+ * A captcha that declares none gets pointer for every pair, which keeps
26
+ * requests from older widgets under the full repeated-position check.
27
+ * Returns `undefined` when a captcha declares a different number of methods
28
+ * than it has pairs: the official widget never sends that.
29
+ * @param flat the coordinates extracted from each captcha's salt
30
+ * @param declared the input methods each captcha declared, if any
31
+ */
32
+ var resolveInputMethods = (flat, declared) => {
33
+ const resolved = [];
34
+ for (const [index, list] of flat.entries()) {
35
+ const pairCount = list.length / 2;
36
+ const methods = declared[index];
37
+ if (methods === void 0) resolved.push(new Array(pairCount).fill(InputMethod.pointer));
38
+ else if (methods.length === pairCount) resolved.push([...methods]);
39
+ else return;
40
+ }
41
+ return resolved;
42
+ };
43
+ /**
44
+ * Give the checkbox's input method its own list, as `peelCheckboxPrefix` does
45
+ * for its coordinates, so the result lines up with the pair lists.
46
+ * @param methods the input methods of each captcha, checkbox first
47
+ */
48
+ var peelCheckboxInputMethod = (methods) => {
49
+ const [first, ...rest] = methods;
50
+ if (first === void 0 || first.length === 0) return methods;
51
+ return [
52
+ first.slice(0, 1),
53
+ first.slice(1),
54
+ ...rest
55
+ ];
56
+ };
57
+ var isKeyboard = (inputMethods, listIndex, pairIndex) => inputMethods?.[listIndex]?.[pairIndex] === InputMethod.keyboard;
58
+ /**
59
+ * Whether any keyboard selection carries a pointer position. Keyboard
60
+ * activation has none, and the widget sends (0, 0) for it, so a position here
61
+ * means the request did not come from the widget.
24
62
  * @param pairsLists
63
+ * @param inputMethods the same shape as `pairsLists`
25
64
  */
26
- var containsIdenticalPairs = (pairsLists) => {
27
- const set = /* @__PURE__ */ new Set();
28
- for (const pairList of pairsLists) for (const pair of pairList) {
65
+ var keyboardSelectionHasPosition = (pairsLists, inputMethods) => pairsLists.some((pairList, listIndex) => pairList.some(([x, y], pairIndex) => isKeyboard(inputMethods, listIndex, pairIndex) && (x !== 0 || y !== 0)));
66
+ /**
67
+ * Check whether any pointer position repeats across the lists of pairs. A
68
+ * person selecting the same tile in two rounds almost never lands on the same
69
+ * pixel twice, whereas a script clicking each element's centre does. Keyboard
70
+ * selections have no position and are left out; without `inputMethods` every
71
+ * pair is a pointer selection.
72
+ * @param pairsLists
73
+ * @param inputMethods the same shape as `pairsLists`
74
+ */
75
+ var containsIdenticalPairs = (pairsLists, inputMethods) => {
76
+ const seen = /* @__PURE__ */ new Set();
77
+ for (const [listIndex, pairList] of pairsLists.entries()) for (const [pairIndex, pair] of pairList.entries()) {
78
+ if (isKeyboard(inputMethods, listIndex, pairIndex)) continue;
29
79
  const coordString = `${at(pair, 0)},${at(pair, 1)}`;
30
- set.add(coordString);
80
+ if (seen.has(coordString)) return true;
81
+ seen.add(coordString);
31
82
  }
32
- return set.size !== pairsLists.flat().flat().length / 2;
83
+ return false;
33
84
  };
85
+ /**
86
+ * Whether the selections point to a script rather than a person: the declared
87
+ * input methods do not line up with the coordinates, a keyboard selection
88
+ * carries a position, or a pointer position repeats.
89
+ * @param pairsLists
90
+ * @param inputMethods the same shape as `pairsLists`, or `undefined` when the
91
+ * declared methods did not line up with the coordinates
92
+ */
93
+ var selectionsLookScripted = (pairsLists, inputMethods) => inputMethods === void 0 || keyboardSelectionHasPosition(pairsLists, inputMethods) || containsIdenticalPairs(pairsLists, inputMethods);
34
94
  //#endregion
35
- export { constructPairList, containsIdenticalPairs, peelCheckboxPrefix };
95
+ export { constructPairList, containsIdenticalPairs, keyboardSelectionHasPosition, peelCheckboxInputMethod, peelCheckboxPrefix, resolveInputMethods, selectionsLookScripted };
package/dist/pairs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pairs.js","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAKnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAsB,EAAE;IAEvE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,IAAgB,EAChB,eAAyB,EAC2B,EAAE;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAgC,EAAE,EAAE;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAGD,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,CAAC,CAAC"}
1
+ {"version":3,"file":"pairs.js","sourceRoot":"","sources":["../src/pairs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"captchaManager.d.ts","sourceRoot":"","sources":["../../src/tasks/captchaManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captchaManager.d.ts","sourceRoot":"","sources":["../../src/tasks/captchaManager.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EAEnB,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACtB,IAAI,EAEJ,KAAK,cAAc,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACN,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,MAAM,6BAA6B,CAAC;AAQrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,OAAO,EACN,KAAK,kBAAkB,EAEvB,MAAM,8BAA8B,CAAC;AAStC,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IAMpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,qBAAa,cAAc;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,iBAAiB,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;gBAGlC,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI;IAqBvB,4BAA4B,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,eAAe,CAAC,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC;IAkBH,4BAA4B,CACxC,sBAAsB,EAAE,MAAM,EAC9B,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACnC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC;IAgC/C,kCAAkC,CAC9C,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAmD3B,wBAAwB,CACpC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC;QACV,WAAW,CAAC,EAAE,oBAAoB,CAAC;QACnC,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;KAC5C,CAAC;IA+DW,oCAAoC,CAChD,SAAS,EAAE,MAAM,EACjB,sBAAsB,EAAE,MAAM,EAC9B,KAAK,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC;IAkBH,0CAA0C,CACtD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAC9C,KAAK,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC;IAgBT,0BAA0B,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,eAAe,CAAC,EAAE,OAAO,GACvB,IAAI;IAqBA,+BAA+B,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAC9C,KAAK,EAAE,iBAAiB,GACtB,IAAI;IAYD,iBAAiB,CACtB,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAMjD,cAAc,CACnB,cAAc,EAAE,YAAY,GAAG,aAAa,EAC5C,oBAAoB,EAAE,WAAW,EACjC,GAAG,EAAE,mBAAmB,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,YAAY,EAC/B,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QACV,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,WAAW,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAI3B,MAAM,CAAC,EAAE,cAAc,CAAC;KACxB,CAAC;IAyTF,uBAAuB,CACtB,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACpC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM;;;;;;;IAoBb,4BAA4B,CACjC,sBAAsB,EAAE,kBAAkB,EAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,GAAG,eAAe,EAGtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;QACT,SAAS,CAAC,EAAE,OAAO,CAAC;QAGpB,eAAe,CAAC,EAAE,OAAO,CAAC;QAK1B,eAAe,CAAC,EAAE,MAAM,CAAC;KACzB;IAgBF,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,SAAS;IAsBpE,8BAA8B,CACnC,iBAAiB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,CAAC,iBAAiB,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IA6BlE,OAAO,CAAC,2BAA2B;IAgB7B,wBAAwB,CAC7B,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAsBnC,mBAAmB,CACxB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACnC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAsB/B,qBAAqB,CAC1B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACnC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAuCjC,iBAAiB,CACtB,sBAAsB,EAAE,kBAAkB,EAC1C,eAAe,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,cAAc,EACxE,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAC7B,WAAW,CAAC,EAAE,MAAM,EACpB,GAAG,CAAC,EAAE,MAAM,GAIV,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IA0D5B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B/C,yBAAyB,CAC9B,GAAG,EAAE,mBAAmB,EACxB,YAAY,EAAE,cAAc,GAAG,SAAS,EACxC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,EAClD,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,gBAAgB,GACjC,OAAO,CAAC,kBAAkB,CAAC;IA4C9B,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;CAG7D"}
@@ -294,6 +294,21 @@ var CaptchaManager = class CaptchaManager {
294
294
  }
295
295
  sessionId = resolvedSessionId;
296
296
  if (this.writeQueue) await Promise.all([this.writeQueue.invalidateCachedSession(sessionId), sessionRecord.userSitekeyIpHash ? this.writeQueue.invalidateCachedSessionByHash(sessionRecord.userSitekeyIpHash) : Promise.resolve()]);
297
+ if (sessionRecord.siteKey !== void 0 && sessionRecord.siteKey !== clientSettings.account) {
298
+ this.logger.warn(() => ({
299
+ msg: "Session was issued for a different site key",
300
+ data: {
301
+ account: clientSettings.account,
302
+ sessionId,
303
+ sessionSiteKey: sessionRecord.siteKey
304
+ }
305
+ }));
306
+ return {
307
+ valid: false,
308
+ reason: ResultReason.CAPTCHA_NO_SESSION_FOUND,
309
+ type: requestedCaptchaType
310
+ };
311
+ }
297
312
  if (currentIP) {
298
313
  const ipValidation = await this.validateSessionIP(sessionRecord, currentIP, env);
299
314
  if (!ipValidation.valid) return {