@prosopo/provider 5.15.0 → 5.17.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 (236) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +52 -34
  2. package/.turbo/turbo-build$colon$tsc.log +36 -30
  3. package/.turbo/turbo-build.log +53 -35
  4. package/CHANGELOG.md +94 -0
  5. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +4 -0
  6. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -1
  7. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +63 -3
  8. package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -1
  9. package/dist/api/blacklistRequestInspector.js +2 -2
  10. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts +5 -0
  11. package/dist/api/captcha/getAudioCaptchaChallenge.d.ts.map +1 -0
  12. package/dist/api/captcha/getAudioCaptchaChallenge.js +37 -0
  13. package/dist/api/captcha/getAudioCaptchaChallenge.js.map +1 -0
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +1 -0
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
  16. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +7 -2
  17. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
  18. package/dist/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.js +1 -1
  19. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  20. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +17 -12
  21. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  22. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +7 -2
  23. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -1
  24. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +14 -4
  25. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -1
  26. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  27. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +1 -0
  28. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  29. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts +5 -0
  30. package/dist/api/captcha/getIconOrderCaptchaChallenge.d.ts.map +1 -0
  31. package/dist/api/captcha/getIconOrderCaptchaChallenge.js +37 -0
  32. package/dist/api/captcha/getIconOrderCaptchaChallenge.js.map +1 -0
  33. package/dist/api/captcha/getImageCaptchaChallenge.js +2 -2
  34. package/dist/api/captcha/getPoWCaptchaChallenge.js +4 -4
  35. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +1 -3
  36. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  37. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +55 -170
  38. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  39. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts +42 -0
  40. package/dist/api/captcha/interactiveCaptchaChallenge.d.ts.map +1 -0
  41. package/dist/api/captcha/interactiveCaptchaChallenge.js +154 -0
  42. package/dist/api/captcha/interactiveCaptchaChallenge.js.map +1 -0
  43. package/dist/api/captcha/interactiveCaptchaSolution.d.ts +14 -0
  44. package/dist/api/captcha/interactiveCaptchaSolution.d.ts.map +1 -0
  45. package/dist/api/captcha/interactiveCaptchaSolution.js +77 -0
  46. package/dist/api/captcha/interactiveCaptchaSolution.js.map +1 -0
  47. package/dist/api/captcha/maintenanceModeResponses.d.ts +4 -2
  48. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
  49. package/dist/api/captcha/maintenanceModeResponses.js +28 -1
  50. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
  51. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts +4 -0
  52. package/dist/api/captcha/submitAudioCaptchaSolution.d.ts.map +1 -0
  53. package/dist/api/captcha/submitAudioCaptchaSolution.js +11 -0
  54. package/dist/api/captcha/submitAudioCaptchaSolution.js.map +1 -0
  55. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts +4 -0
  56. package/dist/api/captcha/submitIconOrderCaptchaSolution.d.ts.map +1 -0
  57. package/dist/api/captcha/submitIconOrderCaptchaSolution.js +11 -0
  58. package/dist/api/captcha/submitIconOrderCaptchaSolution.js.map +1 -0
  59. package/dist/api/captcha/submitPoWCaptchaSolution.js +2 -2
  60. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts +1 -3
  61. package/dist/api/captcha/submitPuzzleCaptchaSolution.d.ts.map +1 -1
  62. package/dist/api/captcha/submitPuzzleCaptchaSolution.js +6 -73
  63. package/dist/api/captcha/submitPuzzleCaptchaSolution.js.map +1 -1
  64. package/dist/api/captcha/trafficFilterRequestTime.d.ts +4 -1
  65. package/dist/api/captcha/trafficFilterRequestTime.d.ts.map +1 -1
  66. package/dist/api/captcha/trafficFilterRequestTime.js +3 -0
  67. package/dist/api/captcha/trafficFilterRequestTime.js.map +1 -1
  68. package/dist/api/captcha.d.ts.map +1 -1
  69. package/dist/api/captcha.js +8 -0
  70. package/dist/api/captcha.js.map +1 -1
  71. package/dist/api/domainMiddleware.js +1 -1
  72. package/dist/api/ja4Middleware.js +1 -1
  73. package/dist/api/startProviderApi.js +1 -1
  74. package/dist/api/verify.d.ts.map +1 -1
  75. package/dist/api/verify.js +153 -96
  76. package/dist/api/verify.js.map +1 -1
  77. package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +65 -2
  78. package/dist/cjs/api/blacklistRequestInspector.cjs +2 -2
  79. package/dist/cjs/api/captcha/getAudioCaptchaChallenge.cjs +37 -0
  80. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +6 -0
  81. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/decisionMachine.cjs +1 -1
  82. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +15 -10
  83. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +14 -3
  84. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +1 -0
  85. package/dist/cjs/api/captcha/getIconOrderCaptchaChallenge.cjs +37 -0
  86. package/dist/cjs/api/captcha/getImageCaptchaChallenge.cjs +2 -2
  87. package/dist/cjs/api/captcha/getPoWCaptchaChallenge.cjs +4 -4
  88. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +54 -169
  89. package/dist/cjs/api/captcha/interactiveCaptchaChallenge.cjs +154 -0
  90. package/dist/cjs/api/captcha/interactiveCaptchaSolution.cjs +77 -0
  91. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +29 -0
  92. package/dist/cjs/api/captcha/submitAudioCaptchaSolution.cjs +11 -0
  93. package/dist/cjs/api/captcha/submitIconOrderCaptchaSolution.cjs +11 -0
  94. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +2 -2
  95. package/dist/cjs/api/captcha/submitPuzzleCaptchaSolution.cjs +6 -73
  96. package/dist/cjs/api/captcha/trafficFilterRequestTime.cjs +3 -0
  97. package/dist/cjs/api/captcha.cjs +8 -0
  98. package/dist/cjs/api/domainMiddleware.cjs +1 -1
  99. package/dist/cjs/api/ja4Middleware.cjs +1 -1
  100. package/dist/cjs/api/startProviderApi.cjs +1 -1
  101. package/dist/cjs/api/verify.cjs +152 -95
  102. package/dist/cjs/index.cjs +1 -1
  103. package/dist/cjs/tasks/audio/audioBuffer.cjs +72 -0
  104. package/dist/cjs/tasks/audio/audioRenderer.cjs +32 -0
  105. package/dist/cjs/tasks/audioAlternative.cjs +23 -0
  106. package/dist/cjs/tasks/audioCaptcha/audioTasks.cjs +65 -0
  107. package/dist/cjs/tasks/audioCaptcha/audioTasksUtils.cjs +19 -0
  108. package/dist/cjs/tasks/captchaManager.cjs +14 -2
  109. package/dist/cjs/tasks/captchaTypeSelection.cjs +20 -3
  110. package/dist/cjs/tasks/client/clientTasks.cjs +2 -2
  111. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +40 -9
  112. package/dist/cjs/tasks/iconOrder/iconOrderRenderer.cjs +42 -0
  113. package/dist/cjs/tasks/iconOrderCaptcha/iconOrderTasks.cjs +69 -0
  114. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +8 -8
  115. package/dist/cjs/tasks/interactiveCaptcha/interactiveCaptchaManager.cjs +423 -0
  116. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +8 -8
  117. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +1 -1
  118. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +40 -486
  119. package/dist/cjs/tasks/spam/checkTrafficFilter.cjs +18 -1
  120. package/dist/cjs/tasks/tasks.cjs +6 -0
  121. package/dist/cjs/util.cjs +1 -1
  122. package/dist/index.js +2 -2
  123. package/dist/tasks/audio/audioBuffer.d.ts +23 -0
  124. package/dist/tasks/audio/audioBuffer.d.ts.map +1 -0
  125. package/dist/tasks/audio/audioBuffer.js +70 -0
  126. package/dist/tasks/audio/audioBuffer.js.map +1 -0
  127. package/dist/tasks/audio/audioRenderer.d.ts +11 -0
  128. package/dist/tasks/audio/audioRenderer.d.ts.map +1 -0
  129. package/dist/tasks/audio/audioRenderer.js +31 -0
  130. package/dist/tasks/audio/audioRenderer.js.map +1 -0
  131. package/dist/tasks/audioAlternative.d.ts +8 -0
  132. package/dist/tasks/audioAlternative.d.ts.map +1 -0
  133. package/dist/tasks/audioAlternative.js +20 -0
  134. package/dist/tasks/audioAlternative.js.map +1 -0
  135. package/dist/tasks/audioCaptcha/audioTasks.d.ts +19 -0
  136. package/dist/tasks/audioCaptcha/audioTasks.d.ts.map +1 -0
  137. package/dist/tasks/audioCaptcha/audioTasks.js +65 -0
  138. package/dist/tasks/audioCaptcha/audioTasks.js.map +1 -0
  139. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts +3 -0
  140. package/dist/tasks/audioCaptcha/audioTasksUtils.d.ts.map +1 -0
  141. package/dist/tasks/audioCaptcha/audioTasksUtils.js +18 -0
  142. package/dist/tasks/audioCaptcha/audioTasksUtils.js.map +1 -0
  143. package/dist/tasks/captchaManager.d.ts +9 -3
  144. package/dist/tasks/captchaManager.d.ts.map +1 -1
  145. package/dist/tasks/captchaManager.js +15 -3
  146. package/dist/tasks/captchaManager.js.map +1 -1
  147. package/dist/tasks/captchaTypeSelection.d.ts +2 -1
  148. package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
  149. package/dist/tasks/captchaTypeSelection.js +21 -5
  150. package/dist/tasks/captchaTypeSelection.js.map +1 -1
  151. package/dist/tasks/client/clientTasks.js +2 -2
  152. package/dist/tasks/frictionless/frictionlessTasks.d.ts +5 -0
  153. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  154. package/dist/tasks/frictionless/frictionlessTasks.js +41 -10
  155. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  156. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts +12 -0
  157. package/dist/tasks/iconOrder/iconOrderRenderer.d.ts.map +1 -0
  158. package/dist/tasks/iconOrder/iconOrderRenderer.js +40 -0
  159. package/dist/tasks/iconOrder/iconOrderRenderer.js.map +1 -0
  160. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts +22 -0
  161. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.d.ts.map +1 -0
  162. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js +69 -0
  163. package/dist/tasks/iconOrderCaptcha/iconOrderTasks.js.map +1 -0
  164. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +8 -8
  165. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts +52 -0
  166. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.d.ts.map +1 -0
  167. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js +423 -0
  168. package/dist/tasks/interactiveCaptcha/interactiveCaptchaManager.js.map +1 -0
  169. package/dist/tasks/powCaptcha/powTasks.js +8 -8
  170. package/dist/tasks/powCaptcha/powTasksUtils.js +1 -1
  171. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts +14 -16
  172. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  173. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +41 -487
  174. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  175. package/dist/tasks/spam/checkTrafficFilter.d.ts +4 -1
  176. package/dist/tasks/spam/checkTrafficFilter.d.ts.map +1 -1
  177. package/dist/tasks/spam/checkTrafficFilter.js +18 -1
  178. package/dist/tasks/spam/checkTrafficFilter.js.map +1 -1
  179. package/dist/tasks/tasks.d.ts +4 -0
  180. package/dist/tasks/tasks.d.ts.map +1 -1
  181. package/dist/tasks/tasks.js +6 -0
  182. package/dist/tasks/tasks.js.map +1 -1
  183. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +7 -3
  184. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  185. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +45 -3
  186. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  187. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js +4 -2
  188. package/dist/tests/unit/api/admin/apiRegisterSiteKeyEndpoint.unit.test.js.map +1 -1
  189. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js +76 -1
  190. package/dist/tests/unit/api/admin/apiToggleMaintenanceModeEndpoint.unit.test.js.map +1 -1
  191. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +27 -8
  192. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
  193. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +29 -3
  194. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -1
  195. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js +20 -0
  196. package/dist/tests/unit/api/captcha/maintenanceModeShortCircuit.unit.test.js.map +1 -1
  197. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +81 -2
  198. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  199. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts +2 -0
  200. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.d.ts.map +1 -0
  201. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js +105 -0
  202. package/dist/tests/unit/tasks/audio/audioBuffer.unit.test.js.map +1 -0
  203. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts +2 -0
  204. package/dist/tests/unit/tasks/audioAlternative.unit.test.d.ts.map +1 -0
  205. package/dist/tests/unit/tasks/audioAlternative.unit.test.js +76 -0
  206. package/dist/tests/unit/tasks/audioAlternative.unit.test.js.map +1 -0
  207. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts +2 -0
  208. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.d.ts.map +1 -0
  209. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js +259 -0
  210. package/dist/tests/unit/tasks/audioCaptcha/audioTasks.unit.test.js.map +1 -0
  211. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts +2 -0
  212. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.d.ts.map +1 -0
  213. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js +52 -0
  214. package/dist/tests/unit/tasks/audioCaptcha/audioTasksUtils.unit.test.js.map +1 -0
  215. package/dist/tests/unit/tasks/captchaManager.unit.test.js +120 -2
  216. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  217. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +65 -6
  218. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
  219. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +29 -0
  220. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -1
  221. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +31 -0
  222. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  223. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +27 -2
  224. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -1
  225. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js +28 -0
  226. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js.map +1 -1
  227. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts +2 -0
  228. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.d.ts.map +1 -0
  229. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js +60 -0
  230. package/dist/tests/unit/tasks/iconOrder/iconOrderRenderer.unit.test.js.map +1 -0
  231. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts +2 -0
  232. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.d.ts.map +1 -0
  233. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js +225 -0
  234. package/dist/tests/unit/tasks/iconOrderCaptcha/iconOrderTasks.unit.test.js.map +1 -0
  235. package/dist/util.js +1 -1
  236. package/package.json +19 -17
@@ -68,6 +68,7 @@ var runConfiguredCaptchaTypeShortCircuit = async (input, res) => {
68
68
  }));
69
69
  case CaptchaType.pow: return res.json(await input.tasks.frictionlessManager.sendPowCaptcha(sessionParams));
70
70
  case CaptchaType.puzzle: return res.json(await input.tasks.frictionlessManager.sendPuzzleCaptcha(sessionParams));
71
+ case CaptchaType.iconOrder: return res.json(await input.tasks.frictionlessManager.sendIconOrderCaptcha(sessionParams));
71
72
  default: throw new Error(`Unhandled configured captchaType in /frictionless short-circuit: ${configuredType}`);
72
73
  }
73
74
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shortCircuit.js","sourceRoot":"","sources":["../../../../src/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shortCircuit.js","sourceRoot":"","sources":["../../../../src/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ProviderEnvironment } from "@prosopo/types-env";
2
+ import type { AccessRulesStorage } from "@prosopo/user-access-policy";
3
+ declare const _default: (env: ProviderEnvironment, userAccessRulesStorage: AccessRulesStorage) => (req: import("express").Request & import("../../express.js").AugmentedRequest, res: import("express").Response, next: import("express").NextFunction) => Promise<void | import("express").Response<any, Record<string, any>>>;
4
+ export default _default;
5
+ //# sourceMappingURL=getIconOrderCaptchaChallenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getIconOrderCaptchaChallenge.d.ts","sourceRoot":"","sources":["../../../src/api/captcha/getIconOrderCaptchaChallenge.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;8BAkFhE,mBAAmB,0BACA,kBAAkB;AAF3C,wBAUI"}
@@ -0,0 +1,37 @@
1
+ import { renderIconOrderImages, resolveIconOrderRenderSettings } from "../../tasks/iconOrder/iconOrderRenderer.js";
2
+ import { interactiveChallengeHandler } from "./interactiveCaptchaChallenge.js";
3
+ import { buildIconOrderMaintenanceResponse } from "./maintenanceModeResponses.js";
4
+ import { ApiParams, CaptchaType } from "@prosopo/types";
5
+ //#region src/api/captcha/getIconOrderCaptchaChallenge.ts
6
+ var issueIconOrderChallenge = async ({ tasks, user, dapp, clientSettings, sessionRecord, trafficVerdict, provenance }) => {
7
+ const challengeVerdict = trafficVerdict.kind === "challenge" ? trafficVerdict : void 0;
8
+ const tolerance = challengeVerdict?.iconOrderTolerance ?? sessionRecord?.iconOrderTolerance ?? clientSettings?.settings?.iconOrderTolerance;
9
+ const renderSettings = resolveIconOrderRenderSettings(clientSettings?.settings?.iconOrder, challengeVerdict?.iconOrderSettings ?? sessionRecord?.iconOrder);
10
+ const challenge = await tasks.iconOrderCaptchaManager.getIconOrderCaptchaChallenge(user, dapp, tolerance, () => renderIconOrderImages(renderSettings));
11
+ await tasks.db.storeIconOrderCaptchaRecord(challenge.challenge, {
12
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
13
+ userAccount: user,
14
+ dappAccount: dapp
15
+ }, challenge.targets, challenge.tolerance, challenge.providerSignature, provenance.ipAddress, provenance.headers, provenance.ja4, provenance.sessionId, provenance.ipInfo);
16
+ return {
17
+ logData: { tolerance: challenge.tolerance },
18
+ response: {
19
+ [ApiParams.status]: "ok",
20
+ [ApiParams.challenge]: challenge.challenge,
21
+ [ApiParams.background]: challenge.images.background,
22
+ [ApiParams.legend]: challenge.images.legend,
23
+ [ApiParams.legendIconSize]: challenge.images.legendIconSize,
24
+ [ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
25
+ [ApiParams.signature]: { [ApiParams.provider]: { [ApiParams.challenge]: challenge.providerSignature } }
26
+ }
27
+ };
28
+ };
29
+ var getIconOrderCaptchaChallenge_default = (env, userAccessRulesStorage) => interactiveChallengeHandler(env, userAccessRulesStorage, {
30
+ captchaType: CaptchaType.iconOrder,
31
+ label: "icon-order",
32
+ manager: (tasks) => tasks.iconOrderCaptchaManager,
33
+ maintenanceResponse: buildIconOrderMaintenanceResponse,
34
+ issue: issueIconOrderChallenge
35
+ });
36
+ //#endregion
37
+ export { getIconOrderCaptchaChallenge_default as default };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getIconOrderCaptchaChallenge.js","sourceRoot":"","sources":["../../../src/api/captcha/getIconOrderCaptchaChallenge.ts"],"names":[],"mappings":"AAaA,OAAO,EACN,SAAS,EACT,WAAW,GAEX,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACN,qBAAqB,EACrB,8BAA8B,GAC9B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAGN,2BAA2B,GAC3B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAElF,MAAM,uBAAuB,GAAG,KAAK,EAAE,EACtC,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,aAAa,EACb,cAAc,EACd,UAAU,GACa,EAEtB,EAAE;IACH,MAAM,gBAAgB,GACrB,cAAc,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IAGlE,MAAM,SAAS,GACd,gBAAgB,EAAE,kBAAkB;QACpC,aAAa,EAAE,kBAAkB;QACjC,cAAc,EAAE,QAAQ,EAAE,kBAAkB,CAAC;IAC9C,MAAM,cAAc,GAAG,8BAA8B,CACpD,cAAc,EAAE,QAAQ,EAAE,SAAS,EACnC,gBAAgB,EAAE,iBAAiB,IAAI,aAAa,EAAE,SAAS,CAC/D,CAAC;IAEF,MAAM,SAAS,GACd,MAAM,KAAK,CAAC,uBAAuB,CAAC,4BAA4B,CAC/D,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,GAAG,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAC3C,CAAC;IAIH,MAAM,KAAK,CAAC,EAAE,CAAC,2BAA2B,CACzC,SAAS,CAAC,SAAS,EACnB;QACC,oBAAoB,EAAE,SAAS,CAAC,oBAAoB;QACpD,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;KACjB,EACD,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,iBAAiB,EAC3B,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,GAAG,EACd,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,MAAM,CACjB,CAAC;IAEF,OAAO;QACN,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE;QAC3C,QAAQ,EAAE;YACT,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;YACxB,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS;YAC1C,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;YACnD,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;YAC3C,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc;YAC3D,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE;YAChE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;gBACtB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;oBACrB,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,iBAAiB;iBAClD;aACD;SACD;KACD,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,CACd,GAAwB,EACxB,sBAA0C,EACzC,EAAE,CACH,2BAA2B,CAAC,GAAG,EAAE,sBAAsB,EAAE;IACxD,WAAW,EAAE,WAAW,CAAC,SAAS;IAClC,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,uBAAuB;IACjD,mBAAmB,EAAE,iCAAiC;IACtD,KAAK,EAAE,uBAAuB;CAC9B,CAAC,CAAC"}
@@ -1,12 +1,12 @@
1
- import { validateAddr, validateSiteKey } from "../validateAddress.js";
2
1
  import { recordCaptchaIssueError, recordCaptchaIssued } from "../metrics.js";
3
2
  import { getRequestUserScope, normalizeHeadersForMatching } from "../blacklistRequestInspector.js";
3
+ import { validateAddr, validateSiteKey } from "../validateAddress.js";
4
4
  import { Tasks } from "../../tasks/tasks.js";
5
5
  import { getMaintenanceMode } from "../admin/apiToggleMaintenanceModeEndpoint.js";
6
6
  import { isReservedTestSiteKey } from "../testSiteKey.js";
7
7
  import { normalizeRequestIp } from "../../utils/normalizeRequestIp.js";
8
- import { buildImageMaintenanceResponse } from "./maintenanceModeResponses.js";
9
8
  import { applyTrafficFilterAtRequestTime } from "./trafficFilterRequestTime.js";
9
+ import { buildImageMaintenanceResponse } from "./maintenanceModeResponses.js";
10
10
  import { getSealedAssetsResolver } from "./sealedAssetsResolver.js";
11
11
  import { getSignedAssetsResolver } from "./signedAssetsResolver.js";
12
12
  import { ProsopoApiError } from "@prosopo/common";
@@ -1,14 +1,14 @@
1
- import { validateAddr, validateSiteKey } from "../validateAddress.js";
2
- import { recordCaptchaIssueError, recordCaptchaIssued } from "../metrics.js";
3
1
  import { getCompositeIpAddress } from "../../compositeIpAddress.js";
2
+ import { recordCaptchaIssueError, recordCaptchaIssued } from "../metrics.js";
4
3
  import { getRequestUserScope, normalizeHeadersForMatching } from "../blacklistRequestInspector.js";
4
+ import { validateAddr, validateSiteKey } from "../validateAddress.js";
5
5
  import { Tasks } from "../../tasks/tasks.js";
6
6
  import { getMaintenanceMode } from "../admin/apiToggleMaintenanceModeEndpoint.js";
7
7
  import { isReservedTestSiteKey } from "../testSiteKey.js";
8
8
  import { normalizeRequestIp } from "../../utils/normalizeRequestIp.js";
9
- import { buildPowMaintenanceResponse } from "./maintenanceModeResponses.js";
10
- import { applyTrafficFilterAtRequestTime } from "./trafficFilterRequestTime.js";
11
9
  import { summariseRequestBody } from "../requestBodySummary.js";
10
+ import { applyTrafficFilterAtRequestTime } from "./trafficFilterRequestTime.js";
11
+ import { buildPowMaintenanceResponse } from "./maintenanceModeResponses.js";
12
12
  import { ProsopoApiError } from "@prosopo/common";
13
13
  import { ApiParams, CaptchaType, GetPowCaptchaChallengeRequestBody, SimdReadingsStage } from "@prosopo/types";
14
14
  import { flatten } from "@prosopo/util";
@@ -1,7 +1,5 @@
1
1
  import type { ProviderEnvironment } from "@prosopo/types-env";
2
2
  import type { AccessRulesStorage } from "@prosopo/user-access-policy";
3
- import type { NextFunction, Request, Response } from "express";
4
- import type { AugmentedRequest } from "../../express.js";
5
- declare const _default: (env: ProviderEnvironment, userAccessRulesStorage: AccessRulesStorage) => (req: Request & AugmentedRequest, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
3
+ declare const _default: (env: ProviderEnvironment, userAccessRulesStorage: AccessRulesStorage) => (req: import("express").Request & import("../../express.js").AugmentedRequest, res: import("express").Response, next: import("express").NextFunction) => Promise<void | import("express").Response<any, Record<string, any>>>;
6
4
  export default _default;
7
5
  //# sourceMappingURL=getPuzzleCaptchaChallenge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getPuzzleCaptchaChallenge.d.ts","sourceRoot":"","sources":["../../../src/api/captcha/getPuzzleCaptchaChallenge.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;8BAqBnD,mBAAmB,0BACA,kBAAkB,WAGpC,OAAO,GAAG,gBAAgB,OAC1B,QAAQ,QACP,YAAY;AAPpB,wBA8VG"}
1
+ {"version":3,"file":"getPuzzleCaptchaChallenge.d.ts","sourceRoot":"","sources":["../../../src/api/captcha/getPuzzleCaptchaChallenge.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;8BA2JhE,mBAAmB,0BACA,kBAAkB;AAF3C,wBAUI"}
@@ -1,144 +1,52 @@
1
- import { validateAddr, validateSiteKey } from "../validateAddress.js";
2
- import { recordCaptchaIssueError, recordCaptchaIssued } from "../metrics.js";
3
- import { getCompositeIpAddress } from "../../compositeIpAddress.js";
4
- import { getRequestUserScope, normalizeHeadersForMatching } from "../blacklistRequestInspector.js";
5
1
  import { renderPuzzleImages, resolvePuzzlePieceSize, resolvePuzzleRenderSettings } from "../../tasks/puzzle/puzzleRenderer.js";
6
- import { Tasks } from "../../tasks/tasks.js";
7
- import { getMaintenanceMode } from "../admin/apiToggleMaintenanceModeEndpoint.js";
8
- import { isReservedTestSiteKey } from "../testSiteKey.js";
9
- import { normalizeRequestIp } from "../../utils/normalizeRequestIp.js";
2
+ import { interactiveChallengeHandler } from "./interactiveCaptchaChallenge.js";
10
3
  import { buildPuzzleMaintenanceResponse } from "./maintenanceModeResponses.js";
11
- import { applyTrafficFilterAtRequestTime } from "./trafficFilterRequestTime.js";
12
- import { summariseRequestBody } from "../requestBodySummary.js";
13
- import { ProsopoApiError } from "@prosopo/common";
14
- import { ApiParams, CaptchaType, GetPuzzleCaptchaChallengeRequestBody, SimdReadingsStage } from "@prosopo/types";
15
- import { flatten } from "@prosopo/util";
4
+ import { isPuzzleImageSwitchAvailable } from "./getFrictionlessCaptchaChallenge/constants.js";
5
+ import { ApiParams, CaptchaType } from "@prosopo/types";
16
6
  import { DEFAULT_GEOMETRY } from "@prosopo/puzzle-assets";
17
7
  //#region src/api/captcha/getPuzzleCaptchaChallenge.ts
18
- var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (req, res, next) => {
19
- let parsed;
20
- try {
21
- parsed = GetPuzzleCaptchaChallengeRequestBody.parse(req.body);
22
- } catch (err) {
23
- return next(new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
24
- context: {
25
- code: 400,
26
- error: err
27
- },
28
- i18n: req.i18n,
29
- logger: req.logger
8
+ var issuePuzzleChallenge = async ({ tasks, user, dapp, origin, clientSettings, sessionRecord, trafficVerdict, provenance }) => {
9
+ const challengeVerdict = trafficVerdict.kind === "challenge" ? trafficVerdict : void 0;
10
+ const tolerance = challengeVerdict?.puzzleTolerance ?? sessionRecord?.puzzleTolerance ?? clientSettings?.settings?.puzzleTolerance;
11
+ const routedPuzzleSettings = challengeVerdict?.puzzleSettings ?? sessionRecord?.puzzle;
12
+ const effectivePuzzleSettings = resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, routedPuzzleSettings);
13
+ const effectivePieceSize = resolvePuzzlePieceSize(clientSettings?.settings?.puzzle, routedPuzzleSettings);
14
+ const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
15
+ await tasks.db.storePuzzleCaptchaRecord(challenge.challenge, {
16
+ requestedAtTimestamp: challenge.requestedAtTimestamp,
17
+ userAccount: user,
18
+ dappAccount: dapp
19
+ }, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, provenance.ipAddress, provenance.headers, provenance.ja4, provenance.sessionId, provenance.ipInfo);
20
+ const images = await renderPuzzleImages({
21
+ targetX: challenge.targetX,
22
+ targetY: challenge.targetY
23
+ }, effectivePuzzleSettings, effectivePieceSize);
24
+ await tasks.db.updatePuzzleCaptchaRecord(challenge.challenge, { render: {
25
+ ...sessionRecord?.puzzleLevel !== void 0 && { level: sessionRecord.puzzleLevel },
26
+ pieceSize: images.pieceSize,
27
+ geometry: {
28
+ width: DEFAULT_GEOMETRY.width,
29
+ height: DEFAULT_GEOMETRY.height,
30
+ notchSize: DEFAULT_GEOMETRY.notchSize
31
+ },
32
+ settings: {
33
+ decoyCount: effectivePuzzleSettings.decoyCount,
34
+ decoyEdgeDarkness: effectivePuzzleSettings.decoyEdgeDarkness,
35
+ decoyBodyBrightness: effectivePuzzleSettings.decoyBodyBrightness,
36
+ holeDarken: effectivePuzzleSettings.holeDarken,
37
+ decoyHoleDarken: effectivePuzzleSettings.decoyHoleDarken
38
+ },
39
+ backgroundSeed: images.backgroundSeed,
40
+ renderSeed: images.renderSeed
41
+ } }).catch((updateErr) => {
42
+ tasks.logger.warn(() => ({
43
+ err: updateErr,
44
+ msg: "Failed to patch puzzle render inputs onto the challenge record"
30
45
  }));
31
- }
32
- const { user, dapp, sessionId, simdReadings } = parsed;
33
- validateSiteKey(dapp);
34
- validateAddr(user);
35
- if (getMaintenanceMode()) {
36
- req.logger.info(() => ({
37
- msg: "Maintenance mode active - returning dummy puzzle challenge",
38
- data: {
39
- dapp,
40
- user,
41
- sessionId
42
- }
43
- }));
44
- return res.json(await buildPuzzleMaintenanceResponse(user, dapp));
45
- }
46
- if (isReservedTestSiteKey(dapp)) {
47
- req.logger.warn(() => ({
48
- msg: "Reserved TEST site key - returning dummy puzzle challenge",
49
- data: {
50
- dapp,
51
- user,
52
- sessionId
53
- }
54
- }));
55
- return res.json(await buildPuzzleMaintenanceResponse(user, dapp));
56
- }
57
- const tasks = new Tasks(env, req.logger);
58
- try {
59
- const clientSettings = await tasks.db.getClientRecord(dapp);
60
- if (!clientSettings) return next(new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
61
- context: {
62
- code: 400,
63
- siteKey: dapp
64
- },
65
- i18n: req.i18n,
66
- logger: req.logger
67
- }));
68
- const normalizedIp = normalizeRequestIp(req.ip, req.logger);
69
- if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
70
- const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
71
- const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
72
- const sessionRecord = sessionId ? await tasks.db.getSessionRecordBySessionId(sessionId) : void 0;
73
- const userScope = getRequestUserScope(flatten(req.headers), req.ja4, normalizedIp, user, sessionRecord?.decryptedHeadHash, void 0, countryCode, asn);
74
- const userAccessPolicy = (await tasks.puzzleCaptchaManager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope, normalizeHeadersForMatching(req.headers))).find((p) => !p.deferToVerify);
75
- const { valid, reason, sessionId: validSessionId } = await tasks.puzzleCaptchaManager.isValidRequest(clientSettings, CaptchaType.puzzle, env, sessionId, userAccessPolicy, normalizedIp);
76
- if (!valid) return next(new ProsopoApiError(reason || "API.BAD_REQUEST", {
77
- context: {
78
- code: 400,
79
- siteKey: dapp,
80
- user
81
- },
82
- i18n: req.i18n,
83
- logger: req.logger
84
- }));
85
- const origin = req.headers.origin;
86
- if (!origin) return next(new ProsopoApiError("API.BAD_REQUEST", {
87
- context: {
88
- error: "Origin header not found",
89
- code: 400,
90
- siteKey: dapp,
91
- user
92
- },
93
- i18n: req.i18n,
94
- logger: req.logger
95
- }));
96
- const trafficVerdict = applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
97
- const tolerance = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleTolerance : void 0) ?? sessionRecord?.puzzleTolerance ?? clientSettings?.settings?.puzzleTolerance;
98
- const routedPuzzleSettings = (trafficVerdict.kind === "challenge" ? trafficVerdict.puzzleSettings : void 0) ?? sessionRecord?.puzzle;
99
- const effectivePuzzleSettings = resolvePuzzleRenderSettings(clientSettings?.settings?.puzzle, routedPuzzleSettings);
100
- const effectivePieceSize = resolvePuzzlePieceSize(clientSettings?.settings?.puzzle, routedPuzzleSettings);
101
- const challenge = await tasks.puzzleCaptchaManager.getPuzzleCaptchaChallenge(user, dapp, origin, tolerance);
102
- if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, SimdReadingsStage.challenge).catch((updateErr) => {
103
- req.logger.warn(() => ({
104
- err: updateErr,
105
- msg: "Failed to patch session with SIMD readings on puzzle challenge"
106
- }));
107
- });
108
- await tasks.db.storePuzzleCaptchaRecord(challenge.challenge, {
109
- requestedAtTimestamp: challenge.requestedAtTimestamp,
110
- userAccount: user,
111
- dappAccount: dapp
112
- }, challenge.targetX, challenge.targetY, challenge.originX, challenge.originY, challenge.tolerance, challenge.providerSignature, getCompositeIpAddress(normalizedIp), flatten(req.headers), req.ja4, validSessionId, req.ipInfo);
113
- const images = await renderPuzzleImages({
114
- targetX: challenge.targetX,
115
- targetY: challenge.targetY
116
- }, effectivePuzzleSettings, effectivePieceSize);
117
- await tasks.db.updatePuzzleCaptchaRecord(challenge.challenge, { render: {
118
- ...sessionRecord?.puzzleLevel !== void 0 && { level: sessionRecord.puzzleLevel },
119
- pieceSize: images.pieceSize,
120
- geometry: {
121
- width: DEFAULT_GEOMETRY.width,
122
- height: DEFAULT_GEOMETRY.height,
123
- notchSize: DEFAULT_GEOMETRY.notchSize
124
- },
125
- settings: {
126
- decoyCount: effectivePuzzleSettings.decoyCount,
127
- decoyEdgeDarkness: effectivePuzzleSettings.decoyEdgeDarkness,
128
- decoyBodyBrightness: effectivePuzzleSettings.decoyBodyBrightness,
129
- holeDarken: effectivePuzzleSettings.holeDarken,
130
- decoyHoleDarken: effectivePuzzleSettings.decoyHoleDarken
131
- },
132
- backgroundSeed: images.backgroundSeed,
133
- renderSeed: images.renderSeed
134
- } }).catch((updateErr) => {
135
- req.logger.warn(() => ({
136
- err: updateErr,
137
- msg: "Failed to patch puzzle render inputs onto the challenge record"
138
- }));
139
- });
140
- const padBytes = trafficVerdict.padBytes;
141
- const getPuzzleCaptchaResponse = {
46
+ });
47
+ return {
48
+ logData: { tolerance: challenge.tolerance },
49
+ response: {
142
50
  [ApiParams.status]: "ok",
143
51
  [ApiParams.challenge]: challenge.challenge,
144
52
  [ApiParams.background]: images.background,
@@ -147,40 +55,17 @@ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => async (
147
55
  [ApiParams.originX]: challenge.originX,
148
56
  [ApiParams.originY]: challenge.originY,
149
57
  [ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),
150
- [ApiParams.signature]: { [ApiParams.provider]: { [ApiParams.challenge]: challenge.providerSignature } }
151
- };
152
- req.logger.info(() => ({
153
- msg: "Puzzle captcha challenge issued",
154
- data: {
155
- captchaType: CaptchaType.puzzle,
156
- challenge: challenge.challenge,
157
- tolerance: challenge.tolerance,
158
- user,
159
- dapp,
160
- session: sessionId
161
- }
162
- }));
163
- res.locals.padBytes = padBytes;
164
- recordCaptchaIssued(CaptchaType.puzzle);
165
- return res.json(getPuzzleCaptchaResponse);
166
- } catch (err) {
167
- recordCaptchaIssueError(CaptchaType.puzzle);
168
- req.logger.error(() => ({
169
- err,
170
- body: summariseRequestBody(req),
171
- msg: "Error in puzzle captcha challenge request"
172
- }));
173
- return next(new ProsopoApiError("API.BAD_REQUEST", {
174
- context: {
175
- code: 500,
176
- siteKey: req.body.dapp,
177
- user: req.body.user,
178
- error: err
179
- },
180
- i18n: req.i18n,
181
- logger: req.logger
182
- }));
183
- }
58
+ [ApiParams.signature]: { [ApiParams.provider]: { [ApiParams.challenge]: challenge.providerSignature } },
59
+ ...isPuzzleImageSwitchAvailable(clientSettings?.settings ?? {}) && { [ApiParams.imageSwitchAvailable]: true }
60
+ }
61
+ };
184
62
  };
63
+ var getPuzzleCaptchaChallenge_default = (env, userAccessRulesStorage) => interactiveChallengeHandler(env, userAccessRulesStorage, {
64
+ captchaType: CaptchaType.puzzle,
65
+ label: "puzzle",
66
+ manager: (tasks) => tasks.puzzleCaptchaManager,
67
+ maintenanceResponse: buildPuzzleMaintenanceResponse,
68
+ issue: issuePuzzleChallenge
69
+ });
185
70
  //#endregion
186
71
  export { getPuzzleCaptchaChallenge_default as default };
@@ -1 +1 @@
1
- {"version":3,"file":"getPuzzleCaptchaChallenge.js","sourceRoot":"","sources":["../../../src/api/captcha/getPuzzleCaptchaChallenge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getPuzzleCaptchaChallenge.js","sourceRoot":"","sources":["../../../src/api/captcha/getPuzzleCaptchaChallenge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type ApiResponse, type CaptchaType, type CompositeIpAddress, type IPInfoResponse, type PoWChallengeId, type RequestHeaders } from "@prosopo/types";
2
+ import type { ClientRecord, ProjectedSession } from "@prosopo/types-database";
3
+ import type { ProviderEnvironment } from "@prosopo/types-env";
4
+ import type { AccessRulesStorage } from "@prosopo/user-access-policy";
5
+ import type { NextFunction, Request, Response } from "express";
6
+ import type { AugmentedRequest } from "../../express.js";
7
+ import type { CaptchaManager } from "../../tasks/captchaManager.js";
8
+ import { Tasks } from "../../tasks/index.js";
9
+ import { type RequestTimeTrafficVerdict } from "./trafficFilterRequestTime.js";
10
+ export interface ChallengeIssueContext {
11
+ tasks: Tasks;
12
+ user: string;
13
+ dapp: string;
14
+ origin: string;
15
+ clientSettings: ClientRecord;
16
+ sessionRecord: ProjectedSession | undefined;
17
+ trafficVerdict: RequestTimeTrafficVerdict;
18
+ provenance: {
19
+ ipAddress: CompositeIpAddress;
20
+ headers: RequestHeaders;
21
+ ja4: string;
22
+ sessionId?: string;
23
+ ipInfo?: IPInfoResponse;
24
+ };
25
+ }
26
+ type ChallengeResponse = ApiResponse & {
27
+ challenge: PoWChallengeId;
28
+ };
29
+ export interface IssuedChallenge<TResponse> {
30
+ response: TResponse;
31
+ logData: Readonly<Record<string, number>>;
32
+ }
33
+ export interface InteractiveChallengeSpec<TResponse extends ChallengeResponse> {
34
+ captchaType: CaptchaType.puzzle | CaptchaType.iconOrder | CaptchaType.audio;
35
+ label: string;
36
+ manager: (tasks: Tasks) => CaptchaManager;
37
+ maintenanceResponse: (user: string, dapp: string) => Promise<TResponse>;
38
+ issue: (context: ChallengeIssueContext) => Promise<IssuedChallenge<TResponse>>;
39
+ }
40
+ export declare const interactiveChallengeHandler: <TResponse extends ChallengeResponse>(env: ProviderEnvironment, userAccessRulesStorage: AccessRulesStorage, spec: InteractiveChallengeSpec<TResponse>) => (req: Request & AugmentedRequest, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
41
+ export {};
42
+ //# sourceMappingURL=interactiveCaptchaChallenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactiveCaptchaChallenge.d.ts","sourceRoot":"","sources":["../../../src/api/captcha/interactiveCaptchaChallenge.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EAGvB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAW7C,OAAO,EACN,KAAK,yBAAyB,EAE9B,MAAM,+BAA+B,CAAC;AAGvC,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,YAAY,CAAC;IAC7B,aAAa,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC5C,cAAc,EAAE,yBAAyB,CAAC;IAE1C,UAAU,EAAE;QACX,SAAS,EAAE,kBAAkB,CAAC;QAC9B,OAAO,EAAE,cAAc,CAAC;QACxB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,cAAc,CAAC;KACxB,CAAC;CACF;AAED,KAAK,iBAAiB,GAAG,WAAW,GAAG;IAAE,SAAS,EAAE,cAAc,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,eAAe,CAAC,SAAS;IACzC,QAAQ,EAAE,SAAS,CAAC;IAEpB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,wBAAwB,CAAC,SAAS,SAAS,iBAAiB;IAC5E,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAE5E,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,cAAc,CAAC;IAC1C,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAExE,KAAK,EAAE,CACN,OAAO,EAAE,qBAAqB,KAC1B,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;CACzC;AAMD,eAAO,MAAM,2BAA2B,GACtC,SAAS,SAAS,iBAAiB,OAC9B,mBAAmB,0BACA,kBAAkB,QACpC,wBAAwB,CAAC,SAAS,CAAC,WAGpC,OAAO,GAAG,gBAAgB,OAC1B,QAAQ,QACP,YAAY,uDAoOlB,CAAC"}
@@ -0,0 +1,154 @@
1
+ import { getCompositeIpAddress } from "../../compositeIpAddress.js";
2
+ import { recordCaptchaIssueError, recordCaptchaIssued } from "../metrics.js";
3
+ import { getRequestUserScope, normalizeHeadersForMatching } from "../blacklistRequestInspector.js";
4
+ import { validateAddr, validateSiteKey } from "../validateAddress.js";
5
+ import { Tasks } from "../../tasks/tasks.js";
6
+ import { getMaintenanceMode } from "../admin/apiToggleMaintenanceModeEndpoint.js";
7
+ import { isReservedTestSiteKey } from "../testSiteKey.js";
8
+ import { normalizeRequestIp } from "../../utils/normalizeRequestIp.js";
9
+ import { summariseRequestBody } from "../requestBodySummary.js";
10
+ import { applyTrafficFilterAtRequestTime } from "./trafficFilterRequestTime.js";
11
+ import { ProsopoApiError } from "@prosopo/common";
12
+ import { GetPuzzleCaptchaChallengeRequestBody, SimdReadingsStage } from "@prosopo/types";
13
+ import { flatten } from "@prosopo/util";
14
+ //#region src/api/captcha/interactiveCaptchaChallenge.ts
15
+ var capitalise = (text) => text.charAt(0).toUpperCase() + text.slice(1);
16
+ /** Request handling shared by the challenge endpoints of the interactive types. */
17
+ var interactiveChallengeHandler = (env, userAccessRulesStorage, spec) => async (req, res, next) => {
18
+ const { captchaType, label } = spec;
19
+ let parsed;
20
+ try {
21
+ parsed = GetPuzzleCaptchaChallengeRequestBody.parse(req.body);
22
+ } catch (err) {
23
+ return next(new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
24
+ context: {
25
+ code: 400,
26
+ error: err
27
+ },
28
+ i18n: req.i18n,
29
+ logger: req.logger
30
+ }));
31
+ }
32
+ const { user, dapp, sessionId, simdReadings } = parsed;
33
+ validateSiteKey(dapp);
34
+ validateAddr(user);
35
+ if (getMaintenanceMode()) {
36
+ req.logger.info(() => ({
37
+ msg: `Maintenance mode active - returning dummy ${label} challenge`,
38
+ data: {
39
+ dapp,
40
+ user,
41
+ sessionId
42
+ }
43
+ }));
44
+ return res.json(await spec.maintenanceResponse(user, dapp));
45
+ }
46
+ if (isReservedTestSiteKey(dapp)) {
47
+ req.logger.warn(() => ({
48
+ msg: `Reserved TEST site key - returning dummy ${label} challenge`,
49
+ data: {
50
+ dapp,
51
+ user,
52
+ sessionId
53
+ }
54
+ }));
55
+ return res.json(await spec.maintenanceResponse(user, dapp));
56
+ }
57
+ const tasks = new Tasks(env, req.logger);
58
+ const manager = spec.manager(tasks);
59
+ try {
60
+ const clientSettings = await tasks.db.getClientRecord(dapp);
61
+ if (!clientSettings) return next(new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {
62
+ context: {
63
+ code: 400,
64
+ siteKey: dapp
65
+ },
66
+ i18n: req.i18n,
67
+ logger: req.logger
68
+ }));
69
+ const normalizedIp = normalizeRequestIp(req.ip, req.logger);
70
+ if (!normalizedIp) req.logger.warn(() => ({ msg: "Request missing IP; geoblocking will be skipped" }));
71
+ const countryCode = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.countryCode : void 0;
72
+ const asn = req.ipInfo && "isValid" in req.ipInfo && req.ipInfo.isValid ? req.ipInfo.asnNumber : void 0;
73
+ const sessionRecord = sessionId ? await tasks.db.getSessionRecordBySessionId(sessionId) : void 0;
74
+ const userScope = getRequestUserScope(flatten(req.headers), req.ja4, normalizedIp, user, sessionRecord?.decryptedHeadHash, void 0, countryCode, asn);
75
+ const userAccessPolicy = (await manager.getPrioritisedAccessPolicies(userAccessRulesStorage, dapp, userScope, normalizeHeadersForMatching(req.headers))).find((p) => !p.deferToVerify);
76
+ const { valid, reason, sessionId: validSessionId } = await manager.isValidRequest(clientSettings, captchaType, env, sessionId, userAccessPolicy, normalizedIp);
77
+ if (!valid) return next(new ProsopoApiError(reason || "API.BAD_REQUEST", {
78
+ context: {
79
+ code: 400,
80
+ siteKey: dapp,
81
+ user
82
+ },
83
+ i18n: req.i18n,
84
+ logger: req.logger
85
+ }));
86
+ const origin = req.headers.origin;
87
+ if (!origin) return next(new ProsopoApiError("API.BAD_REQUEST", {
88
+ context: {
89
+ error: "Origin header not found",
90
+ code: 400,
91
+ siteKey: dapp,
92
+ user
93
+ },
94
+ i18n: req.i18n,
95
+ logger: req.logger
96
+ }));
97
+ const trafficVerdict = applyTrafficFilterAtRequestTime(req.ipInfo, clientSettings.settings?.trafficFilter, req.logger);
98
+ if (validSessionId && simdReadings) await tasks.frictionlessManager.decryptAndAttachSimdReadingsIfAbsent(validSessionId, simdReadings, SimdReadingsStage.challenge).catch((updateErr) => {
99
+ req.logger.warn(() => ({
100
+ err: updateErr,
101
+ msg: `Failed to patch session with SIMD readings on ${label} challenge`
102
+ }));
103
+ });
104
+ const { response, logData } = await spec.issue({
105
+ tasks,
106
+ user,
107
+ dapp,
108
+ origin,
109
+ clientSettings,
110
+ sessionRecord,
111
+ trafficVerdict,
112
+ provenance: {
113
+ ipAddress: getCompositeIpAddress(normalizedIp),
114
+ headers: flatten(req.headers),
115
+ ja4: req.ja4,
116
+ sessionId: validSessionId,
117
+ ipInfo: req.ipInfo
118
+ }
119
+ });
120
+ req.logger.info(() => ({
121
+ msg: `${capitalise(label)} captcha challenge issued`,
122
+ data: {
123
+ captchaType,
124
+ challenge: response.challenge,
125
+ ...logData,
126
+ user,
127
+ dapp,
128
+ session: sessionId
129
+ }
130
+ }));
131
+ res.locals.padBytes = trafficVerdict.padBytes;
132
+ recordCaptchaIssued(captchaType);
133
+ return res.json(response);
134
+ } catch (err) {
135
+ recordCaptchaIssueError(captchaType);
136
+ req.logger.error(() => ({
137
+ err,
138
+ body: summariseRequestBody(req),
139
+ msg: `Error in ${label} captcha challenge request`
140
+ }));
141
+ return next(new ProsopoApiError("API.BAD_REQUEST", {
142
+ context: {
143
+ code: 500,
144
+ siteKey: req.body.dapp,
145
+ user: req.body.user,
146
+ error: err
147
+ },
148
+ i18n: req.i18n,
149
+ logger: req.logger
150
+ }));
151
+ }
152
+ };
153
+ //#endregion
154
+ export { interactiveChallengeHandler };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactiveCaptchaChallenge.js","sourceRoot":"","sources":["../../../src/api/captcha/interactiveCaptchaChallenge.ts"],"names":[],"mappings":"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"}