@prosopo/provider 5.0.1 → 5.0.4

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 (96) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +16 -16
  2. package/.turbo/turbo-build$colon$tsc.log +24 -24
  3. package/.turbo/turbo-build.log +17 -17
  4. package/CHANGELOG.md +147 -0
  5. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  6. package/dist/api/blacklistRequestInspector.js +5 -2
  7. package/dist/api/blacklistRequestInspector.js.map +1 -1
  8. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  9. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +3 -1
  10. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  11. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts +1 -0
  12. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.d.ts.map +1 -1
  13. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js +23 -19
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.js.map +1 -1
  15. package/dist/api/captcha/maintenanceModeResponses.d.ts +3 -1
  16. package/dist/api/captcha/maintenanceModeResponses.d.ts.map +1 -1
  17. package/dist/api/captcha/maintenanceModeResponses.js +6 -1
  18. package/dist/api/captcha/maintenanceModeResponses.js.map +1 -1
  19. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  20. package/dist/api/captcha/submitPoWCaptchaSolution.js +1 -1
  21. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  22. package/dist/api/verify.d.ts.map +1 -1
  23. package/dist/api/verify.js +7 -12
  24. package/dist/api/verify.js.map +1 -1
  25. package/dist/cjs/api/blacklistRequestInspector.cjs +5 -2
  26. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +3 -1
  27. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.cjs +23 -19
  28. package/dist/cjs/api/captcha/maintenanceModeResponses.cjs +6 -0
  29. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +1 -1
  30. package/dist/cjs/api/verify.cjs +7 -12
  31. package/dist/cjs/tasks/captchaManager.cjs +62 -14
  32. package/dist/cjs/tasks/detection/decodePayload.cjs +890 -905
  33. package/dist/cjs/tasks/detection/decodePayload.js +1 -1
  34. package/dist/cjs/tasks/detection/getBotScore.cjs +3 -1
  35. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +10 -3
  36. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +3 -2
  37. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +13 -6
  38. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +54 -18
  39. package/dist/cjs/util.cjs +13 -31
  40. package/dist/tasks/captchaManager.d.ts +1 -0
  41. package/dist/tasks/captchaManager.d.ts.map +1 -1
  42. package/dist/tasks/captchaManager.js +62 -14
  43. package/dist/tasks/captchaManager.js.map +1 -1
  44. package/dist/tasks/detection/decodePayload.d.ts +3 -2
  45. package/dist/tasks/detection/decodePayload.d.ts.map +1 -1
  46. package/dist/tasks/detection/decodePayload.js +1 -1
  47. package/dist/tasks/detection/decodePayload.js.map +1 -1
  48. package/dist/tasks/detection/getBotScore.d.ts +2 -0
  49. package/dist/tasks/detection/getBotScore.d.ts.map +1 -1
  50. package/dist/tasks/detection/getBotScore.js +5 -3
  51. package/dist/tasks/detection/getBotScore.js.map +1 -1
  52. package/dist/tasks/frictionless/frictionlessTasks.d.ts +2 -1
  53. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  54. package/dist/tasks/frictionless/frictionlessTasks.js +10 -3
  55. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  56. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  57. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +4 -3
  58. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  59. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  60. package/dist/tasks/powCaptcha/powTasks.js +14 -7
  61. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  62. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  63. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +55 -19
  64. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  65. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +1 -1
  66. package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -1
  67. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js +1 -1
  68. package/dist/tests/integration/api/admin/apiRegisterSiteKeysEndpoint.integration.test.js.map +1 -1
  69. package/dist/tests/integration/api/blacklistRequestInspector.storm.integration.test.js +1 -1
  70. package/dist/tests/integration/api/blacklistRequestInspector.storm.integration.test.js.map +1 -1
  71. package/dist/tests/integration/usageCounters.integration.test.js +10 -6
  72. package/dist/tests/integration/usageCounters.integration.test.js.map +1 -1
  73. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +4 -1
  74. package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -1
  75. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js +53 -1
  76. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/shortCircuit.unit.test.js.map +1 -1
  77. package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.js +16 -1
  78. package/dist/tests/unit/api/captcha/maintenanceModeResponses.unit.test.js.map +1 -1
  79. package/dist/tests/unit/api/verifyMaintenanceMode.unit.test.d.ts +2 -0
  80. package/dist/tests/unit/api/verifyMaintenanceMode.unit.test.d.ts.map +1 -0
  81. package/dist/tests/unit/api/verifyMaintenanceMode.unit.test.js +82 -0
  82. package/dist/tests/unit/api/verifyMaintenanceMode.unit.test.js.map +1 -0
  83. package/dist/tests/unit/tasks/captchaManager.unit.test.js +211 -0
  84. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  85. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.js +19 -0
  86. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.js.map +1 -1
  87. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +2 -0
  88. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  89. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +8 -0
  90. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  91. package/dist/tests/unit/util.ipDistance.unit.test.js +2 -0
  92. package/dist/tests/unit/util.ipDistance.unit.test.js.map +1 -1
  93. package/dist/util.d.ts.map +1 -1
  94. package/dist/util.js +13 -31
  95. package/dist/util.js.map +1 -1
  96. package/package.json +21 -21
@@ -71,6 +71,53 @@ var CaptchaManager = class CaptchaManager {
71
71
  return readings;
72
72
  }
73
73
  /**
74
+ * Read a session and, if it's an escalation missing one of the
75
+ * inherently-origin-populated fields, walk to `originSessionId` and fill
76
+ * the gap. Intended for the decision-machine input read path only —
77
+ * `simdReadings`, `dnsEvent`, `entropyMathRandomFingerprint` etc. are
78
+ * populated on the origin session (SIMD via pow-submit's fire-and-forget
79
+ * attach; DNS via the sidecar's origin-TLS-scoped patch) and don't
80
+ * automatically end up on the escalation record because
81
+ * `buildEscalation` reads the origin from Mongo before the async writes
82
+ * settle. Rather than duplicating the origin's state onto every
83
+ * escalation at write time, keep the origin as the source of truth and
84
+ * fall back to it at read time.
85
+ *
86
+ * Fields intentionally NOT walked:
87
+ * - captchaType / sessionId / score / threshold / scoreComponents /
88
+ * ipAddress / ipInfo / headers — these describe the escalation
89
+ * itself and must never be overridden by the origin.
90
+ * - Anything already present on the escalation — first-write wins.
91
+ *
92
+ * Non-escalation sessions and escalations without `originSessionId`
93
+ * (older records) fall through as no-op.
94
+ */
95
+ async getSessionRecordWithOriginFallback(sessionId) {
96
+ const session = await this.db.getSessionRecordBySessionId(sessionId);
97
+ if (!session) return void 0;
98
+ if (!session.originSessionId) return session;
99
+ const needsSimd = session.simdReadings === void 0 || session.simdReadings === null;
100
+ const needsDns = session.dnsEvent === void 0 || session.dnsEvent === null;
101
+ const needsEntropyMath = session.entropyMathRandomFingerprint === void 0;
102
+ const needsEntropyCrypto = session.entropyCryptoFingerprint === void 0;
103
+ const needsEntropyWall = session.entropyWallClockOffsetMs === void 0;
104
+ const needsEntropyFirst = session.entropyMathRandomFirst === void 0;
105
+ const needsG = session.g === void 0;
106
+ if (!needsSimd && !needsDns && !needsEntropyMath && !needsEntropyCrypto && !needsEntropyWall && !needsEntropyFirst && !needsG) return session;
107
+ const origin = await this.db.getSessionRecordBySessionId(session.originSessionId);
108
+ if (!origin) return session;
109
+ return {
110
+ ...session,
111
+ ...needsSimd && origin.simdReadings && { simdReadings: origin.simdReadings },
112
+ ...needsDns && origin.dnsEvent && { dnsEvent: origin.dnsEvent },
113
+ ...needsEntropyMath && origin.entropyMathRandomFingerprint !== void 0 && { entropyMathRandomFingerprint: origin.entropyMathRandomFingerprint },
114
+ ...needsEntropyCrypto && origin.entropyCryptoFingerprint !== void 0 && { entropyCryptoFingerprint: origin.entropyCryptoFingerprint },
115
+ ...needsEntropyWall && origin.entropyWallClockOffsetMs !== void 0 && { entropyWallClockOffsetMs: origin.entropyWallClockOffsetMs },
116
+ ...needsEntropyFirst && origin.entropyMathRandomFirst !== void 0 && { entropyMathRandomFirst: origin.entropyMathRandomFirst },
117
+ ...needsG && origin.g !== void 0 && { g: origin.g }
118
+ };
119
+ }
120
+ /**
74
121
  * Decrypt + first-hop-wins attach. Resolves the session's detector pool
75
122
  * bundle (promoted onto the session record at frictionless time) to decrypt.
76
123
  * No-op on decrypt failure / no bundle.
@@ -130,20 +177,6 @@ var CaptchaManager = class CaptchaManager {
130
177
  sessionId
131
178
  }
132
179
  }));
133
- if (userAccessPolicy?.captchaType !== void 0 && userAccessPolicy.captchaType !== requestedCaptchaType) {
134
- this.logger.warn(() => ({
135
- msg: "Invalid captcha type for user access policy",
136
- data: {
137
- account: clientSettings.account,
138
- captchaType: userAccessPolicy.captchaType
139
- }
140
- }));
141
- return {
142
- valid: false,
143
- reason: _prosopo_types.ResultReason.INCORRECT_CAPTCHA_TYPE,
144
- type: requestedCaptchaType
145
- };
146
- }
147
180
  if (sessionId) {
148
181
  const cachedBeforeRemove = this.writeQueue ? await this.writeQueue.getCachedSession(sessionId) : null;
149
182
  const cachedHash = typeof cachedBeforeRemove?.userSitekeyIpHash === "string" ? cachedBeforeRemove.userSitekeyIpHash : void 0;
@@ -246,6 +279,21 @@ var CaptchaManager = class CaptchaManager {
246
279
  ipInfo: sessionRecord.ipInfo
247
280
  };
248
281
  }
282
+ if (userAccessPolicy?.captchaType !== void 0 && userAccessPolicy.captchaType !== requestedCaptchaType) {
283
+ this.logger.warn(() => ({
284
+ msg: "Invalid captcha type for user access policy (sessionless)",
285
+ data: {
286
+ account: clientSettings.account,
287
+ captchaType: userAccessPolicy.captchaType,
288
+ requestedCaptchaType
289
+ }
290
+ }));
291
+ return {
292
+ valid: false,
293
+ reason: _prosopo_types.ResultReason.INCORRECT_CAPTCHA_TYPE,
294
+ type: requestedCaptchaType
295
+ };
296
+ }
249
297
  if (clientSettings?.settings?.captchaType !== requestedCaptchaType) {
250
298
  this.logger.warn(() => ({
251
299
  msg: `Invalid ${requestedCaptchaType} request`,