@tellescope/sdk 1.256.13 → 1.256.15

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 (352) hide show
  1. package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.js +1 -1
  2. package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.js.map +1 -1
  3. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts +5 -0
  4. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -0
  5. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js +388 -0
  6. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -0
  7. package/lib/cjs/tests/api_tests/integrations_redacted.test.js +3 -3
  8. package/lib/cjs/tests/api_tests/integrations_redacted.test.js.map +1 -1
  9. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts +20 -0
  10. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts.map +1 -0
  11. package/lib/cjs/tests/api_tests/organization_signup.test.js +272 -0
  12. package/lib/cjs/tests/api_tests/organization_signup.test.js.map +1 -0
  13. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.d.ts.map +1 -1
  14. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.js +103 -162
  15. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.js.map +1 -1
  16. package/lib/cjs/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.d.ts +30 -0
  17. package/lib/cjs/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.d.ts.map +1 -0
  18. package/lib/cjs/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.js +336 -0
  19. package/lib/cjs/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.js.map +1 -0
  20. package/lib/cjs/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.d.ts +6 -0
  21. package/lib/cjs/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -0
  22. package/lib/cjs/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.js +354 -0
  23. package/lib/cjs/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.js.map +1 -0
  24. package/lib/cjs/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.d.ts +46 -0
  25. package/lib/cjs/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.d.ts.map +1 -0
  26. package/lib/cjs/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.js +389 -0
  27. package/lib/cjs/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.js.map +1 -0
  28. package/lib/cjs/tests/api_tests/security/F-0192-automated-actions-process-gate.test.d.ts +43 -0
  29. package/lib/cjs/tests/api_tests/security/F-0192-automated-actions-process-gate.test.d.ts.map +1 -0
  30. package/lib/cjs/tests/api_tests/security/F-0192-automated-actions-process-gate.test.js +324 -0
  31. package/lib/cjs/tests/api_tests/security/F-0192-automated-actions-process-gate.test.js.map +1 -0
  32. package/lib/cjs/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.d.ts +43 -0
  33. package/lib/cjs/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.d.ts.map +1 -0
  34. package/lib/cjs/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.js +282 -0
  35. package/lib/cjs/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.js.map +1 -0
  36. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts +33 -0
  37. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts.map +1 -0
  38. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.js +249 -0
  39. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.js.map +1 -0
  40. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +42 -0
  41. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -0
  42. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +281 -0
  43. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -0
  44. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.d.ts +38 -0
  45. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.d.ts.map +1 -0
  46. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.js +390 -0
  47. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.js.map +1 -0
  48. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.d.ts +6 -0
  49. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.d.ts.map +1 -0
  50. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js +1003 -0
  51. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -0
  52. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.d.ts +42 -0
  53. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.d.ts.map +1 -0
  54. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.js +323 -0
  55. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.js.map +1 -0
  56. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts +29 -0
  57. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts.map +1 -0
  58. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js +335 -0
  59. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -0
  60. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts +32 -0
  61. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts.map +1 -0
  62. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js +237 -0
  63. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js.map +1 -0
  64. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts +28 -0
  65. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts.map +1 -0
  66. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.js +349 -0
  67. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.js.map +1 -0
  68. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts +30 -0
  69. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts.map +1 -0
  70. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js +314 -0
  71. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js.map +1 -0
  72. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.d.ts +21 -0
  73. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.d.ts.map +1 -0
  74. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js +362 -0
  75. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js.map +1 -0
  76. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.d.ts +21 -0
  77. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.d.ts.map +1 -0
  78. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js +366 -0
  79. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -0
  80. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts +32 -0
  81. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -0
  82. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js +248 -0
  83. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -0
  84. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts +19 -0
  85. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts.map +1 -0
  86. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.js +138 -0
  87. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.js.map +1 -0
  88. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts +24 -0
  89. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts.map +1 -0
  90. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js +201 -0
  91. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js.map +1 -0
  92. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.d.ts +29 -0
  93. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.d.ts.map +1 -0
  94. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js +278 -0
  95. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -0
  96. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.d.ts +17 -0
  97. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.d.ts.map +1 -0
  98. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.js +155 -0
  99. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.js.map +1 -0
  100. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.d.ts +2 -0
  101. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.d.ts.map +1 -0
  102. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.js +88 -0
  103. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.js.map +1 -0
  104. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts +34 -0
  105. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts.map +1 -0
  106. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.js +230 -0
  107. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.js.map +1 -0
  108. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts +2 -0
  109. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -0
  110. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +242 -0
  111. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -0
  112. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.d.ts +2 -0
  113. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.d.ts.map +1 -0
  114. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.js +148 -0
  115. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.js.map +1 -0
  116. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts +45 -0
  117. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts.map +1 -0
  118. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.js +388 -0
  119. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.js.map +1 -0
  120. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.d.ts +38 -0
  121. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.d.ts.map +1 -0
  122. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.js +222 -0
  123. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.js.map +1 -0
  124. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts +6 -0
  125. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -0
  126. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js +354 -0
  127. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js.map +1 -0
  128. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts +28 -0
  129. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts.map +1 -0
  130. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.js +442 -0
  131. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.js.map +1 -0
  132. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.d.ts +19 -0
  133. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.d.ts.map +1 -0
  134. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.js +156 -0
  135. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.js.map +1 -0
  136. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +5 -0
  137. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -0
  138. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js +329 -0
  139. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -0
  140. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js +2 -2
  141. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js.map +1 -1
  142. package/lib/cjs/tests/setup_isolated.d.ts +68 -0
  143. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -0
  144. package/lib/cjs/tests/setup_isolated.js +232 -0
  145. package/lib/cjs/tests/setup_isolated.js.map +1 -0
  146. package/lib/cjs/tests/tests.d.ts.map +1 -1
  147. package/lib/cjs/tests/tests.js +287 -227
  148. package/lib/cjs/tests/tests.js.map +1 -1
  149. package/lib/cjs/tests/unit_tests/do_not_send_address.test.d.ts +2 -0
  150. package/lib/cjs/tests/unit_tests/do_not_send_address.test.d.ts.map +1 -0
  151. package/lib/cjs/tests/unit_tests/do_not_send_address.test.js +89 -0
  152. package/lib/cjs/tests/unit_tests/do_not_send_address.test.js.map +1 -0
  153. package/lib/cjs/tests/unit_tests/openapi_spec_freshness.test.d.ts +17 -0
  154. package/lib/cjs/tests/unit_tests/openapi_spec_freshness.test.d.ts.map +1 -0
  155. package/lib/cjs/tests/unit_tests/openapi_spec_freshness.test.js +140 -0
  156. package/lib/cjs/tests/unit_tests/openapi_spec_freshness.test.js.map +1 -0
  157. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  158. package/lib/esm/tests/api_tests/auto_merge_form_submission.test.js +1 -1
  159. package/lib/esm/tests/api_tests/auto_merge_form_submission.test.js.map +1 -1
  160. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts +5 -0
  161. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -0
  162. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js +383 -0
  163. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -0
  164. package/lib/esm/tests/api_tests/integrations_redacted.test.js +3 -3
  165. package/lib/esm/tests/api_tests/integrations_redacted.test.js.map +1 -1
  166. package/lib/esm/tests/api_tests/organization_signup.test.d.ts +20 -0
  167. package/lib/esm/tests/api_tests/organization_signup.test.d.ts.map +1 -0
  168. package/lib/esm/tests/api_tests/organization_signup.test.js +264 -0
  169. package/lib/esm/tests/api_tests/organization_signup.test.js.map +1 -0
  170. package/lib/esm/tests/api_tests/purchase_made_trigger.test.d.ts.map +1 -1
  171. package/lib/esm/tests/api_tests/purchase_made_trigger.test.js +104 -163
  172. package/lib/esm/tests/api_tests/purchase_made_trigger.test.js.map +1 -1
  173. package/lib/esm/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.d.ts +30 -0
  174. package/lib/esm/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.d.ts.map +1 -0
  175. package/lib/esm/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.js +332 -0
  176. package/lib/esm/tests/api_tests/security/F-0179-booking-info-idor-token-mint.test.js.map +1 -0
  177. package/lib/esm/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.d.ts +6 -0
  178. package/lib/esm/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -0
  179. package/lib/esm/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.js +350 -0
  180. package/lib/esm/tests/api_tests/security/F-0185-startlinktoken-enduser-staff-escalation.test.js.map +1 -0
  181. package/lib/esm/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.d.ts +46 -0
  182. package/lib/esm/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.d.ts.map +1 -0
  183. package/lib/esm/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.js +382 -0
  184. package/lib/esm/tests/api_tests/security/F-0191-schema-adminonly-enforcement.test.js.map +1 -0
  185. package/lib/esm/tests/api_tests/security/F-0192-automated-actions-process-gate.test.d.ts +43 -0
  186. package/lib/esm/tests/api_tests/security/F-0192-automated-actions-process-gate.test.d.ts.map +1 -0
  187. package/lib/esm/tests/api_tests/security/F-0192-automated-actions-process-gate.test.js +317 -0
  188. package/lib/esm/tests/api_tests/security/F-0192-automated-actions-process-gate.test.js.map +1 -0
  189. package/lib/esm/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.d.ts +43 -0
  190. package/lib/esm/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.d.ts.map +1 -0
  191. package/lib/esm/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.js +277 -0
  192. package/lib/esm/tests/api_tests/security/F-0196-add-to-journey-foreign-enduserid.test.js.map +1 -0
  193. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts +33 -0
  194. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts.map +1 -0
  195. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.js +244 -0
  196. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.js.map +1 -0
  197. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +42 -0
  198. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -0
  199. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +276 -0
  200. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -0
  201. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.d.ts +38 -0
  202. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.d.ts.map +1 -0
  203. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.js +386 -0
  204. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.js.map +1 -0
  205. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.d.ts +6 -0
  206. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.d.ts.map +1 -0
  207. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js +996 -0
  208. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -0
  209. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.d.ts +42 -0
  210. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.d.ts.map +1 -0
  211. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.js +316 -0
  212. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.js.map +1 -0
  213. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts +29 -0
  214. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts.map +1 -0
  215. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js +331 -0
  216. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -0
  217. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts +32 -0
  218. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts.map +1 -0
  219. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js +233 -0
  220. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js.map +1 -0
  221. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts +28 -0
  222. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts.map +1 -0
  223. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.js +345 -0
  224. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.js.map +1 -0
  225. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts +30 -0
  226. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts.map +1 -0
  227. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js +310 -0
  228. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js.map +1 -0
  229. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.d.ts +21 -0
  230. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.d.ts.map +1 -0
  231. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js +358 -0
  232. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js.map +1 -0
  233. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.d.ts +21 -0
  234. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.d.ts.map +1 -0
  235. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js +362 -0
  236. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -0
  237. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts +32 -0
  238. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -0
  239. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js +243 -0
  240. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -0
  241. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts +19 -0
  242. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts.map +1 -0
  243. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.js +134 -0
  244. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.js.map +1 -0
  245. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts +24 -0
  246. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts.map +1 -0
  247. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js +194 -0
  248. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js.map +1 -0
  249. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.d.ts +29 -0
  250. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.d.ts.map +1 -0
  251. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js +271 -0
  252. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -0
  253. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.d.ts +17 -0
  254. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.d.ts.map +1 -0
  255. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.js +151 -0
  256. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.js.map +1 -0
  257. package/lib/esm/tests/api_tests/security/prototype-pollution.test.d.ts +2 -0
  258. package/lib/esm/tests/api_tests/security/prototype-pollution.test.d.ts.map +1 -0
  259. package/lib/esm/tests/api_tests/security/prototype-pollution.test.js +84 -0
  260. package/lib/esm/tests/api_tests/security/prototype-pollution.test.js.map +1 -0
  261. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts +34 -0
  262. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts.map +1 -0
  263. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.js +223 -0
  264. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.js.map +1 -0
  265. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts +2 -0
  266. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -0
  267. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +238 -0
  268. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -0
  269. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.d.ts +2 -0
  270. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.d.ts.map +1 -0
  271. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.js +144 -0
  272. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.js.map +1 -0
  273. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts +45 -0
  274. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts.map +1 -0
  275. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.js +381 -0
  276. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.js.map +1 -0
  277. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.d.ts +38 -0
  278. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.d.ts.map +1 -0
  279. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.js +218 -0
  280. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.js.map +1 -0
  281. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts +6 -0
  282. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -0
  283. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js +350 -0
  284. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js.map +1 -0
  285. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts +28 -0
  286. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts.map +1 -0
  287. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.js +435 -0
  288. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.js.map +1 -0
  289. package/lib/esm/tests/api_tests/security/webhook-timeout.test.d.ts +19 -0
  290. package/lib/esm/tests/api_tests/security/webhook-timeout.test.d.ts.map +1 -0
  291. package/lib/esm/tests/api_tests/security/webhook-timeout.test.js +149 -0
  292. package/lib/esm/tests/api_tests/security/webhook-timeout.test.js.map +1 -0
  293. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +5 -0
  294. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -0
  295. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js +324 -0
  296. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -0
  297. package/lib/esm/tests/api_tests/webhook_error_handling.test.js +2 -2
  298. package/lib/esm/tests/api_tests/webhook_error_handling.test.js.map +1 -1
  299. package/lib/esm/tests/setup_isolated.d.ts +68 -0
  300. package/lib/esm/tests/setup_isolated.d.ts.map +1 -0
  301. package/lib/esm/tests/setup_isolated.js +221 -0
  302. package/lib/esm/tests/setup_isolated.js.map +1 -0
  303. package/lib/esm/tests/tests.d.ts.map +1 -1
  304. package/lib/esm/tests/tests.js +287 -227
  305. package/lib/esm/tests/tests.js.map +1 -1
  306. package/lib/esm/tests/unit_tests/do_not_send_address.test.d.ts +2 -0
  307. package/lib/esm/tests/unit_tests/do_not_send_address.test.d.ts.map +1 -0
  308. package/lib/esm/tests/unit_tests/do_not_send_address.test.js +85 -0
  309. package/lib/esm/tests/unit_tests/do_not_send_address.test.js.map +1 -0
  310. package/lib/esm/tests/unit_tests/openapi_spec_freshness.test.d.ts +17 -0
  311. package/lib/esm/tests/unit_tests/openapi_spec_freshness.test.d.ts.map +1 -0
  312. package/lib/esm/tests/unit_tests/openapi_spec_freshness.test.js +113 -0
  313. package/lib/esm/tests/unit_tests/openapi_spec_freshness.test.js.map +1 -0
  314. package/lib/tsconfig.tsbuildinfo +1 -1
  315. package/package.json +10 -10
  316. package/src/tests/api_tests/auto_merge_form_submission.test.ts +1 -1
  317. package/src/tests/api_tests/enduser_observations_auto_review.test.ts +358 -0
  318. package/src/tests/api_tests/integrations_redacted.test.ts +1 -1
  319. package/src/tests/api_tests/organization_signup.test.ts +240 -0
  320. package/src/tests/api_tests/purchase_made_trigger.test.ts +29 -41
  321. package/src/tests/api_tests/security/add-to-journey-foreign-enduserid.test.ts +207 -0
  322. package/src/tests/api_tests/security/{F-0005-ai-conversations-rbac.test.ts → ai-conversations-rbac.test.ts} +14 -14
  323. package/src/tests/api_tests/security/{F-0166-allowed-paths-wildcard-bypass.test.ts → allowed-paths-confinement.test.ts} +11 -11
  324. package/src/tests/api_tests/security/automated-actions-process-gate.test.ts +237 -0
  325. package/src/tests/api_tests/security/booking-info-idor-token-mint.test.ts +224 -0
  326. package/src/tests/api_tests/security/{F-0053-cascade-role-rename-cross-tenant.test.ts → cascade-role-rename-cross-tenant.test.ts} +10 -10
  327. package/src/tests/api_tests/security/{F-0001-data-sync-redaction-bypass.test.ts → data-sync-redaction-bypass.test.ts} +9 -9
  328. package/src/tests/api_tests/security/{F-0006-develop-health-benefit-verification-rbac.test.ts → develop-health-benefit-verification-rbac.test.ts} +7 -8
  329. package/src/tests/api_tests/security/{F-0116-F-0119-enduser-cross-create.test.ts → enduser-cross-create.test.ts} +25 -25
  330. package/src/tests/api_tests/security/{F-0106-F-0110-enduser-write-restrictions.test.ts → enduser-write-restrictions.test.ts} +12 -14
  331. package/src/tests/api_tests/security/form-logic-js-execution.test.ts +183 -0
  332. package/src/tests/api_tests/security/{F-0145-globalunique-leak.test.ts → globalunique-conflict-redaction.test.ts} +5 -6
  333. package/src/tests/api_tests/security/{F-0008-handle-incoming-communication-cross-tenant.test.ts → handle-incoming-communication-cross-tenant.test.ts} +8 -8
  334. package/src/tests/api_tests/security/{F-0007-invite-user-enumeration.test.ts → invite-user-enumeration.test.ts} +8 -8
  335. package/src/tests/api_tests/security/{F-0151-load-inbox-redaction.test.ts → load-inbox-redaction.test.ts} +5 -6
  336. package/src/tests/api_tests/security/{F-0016-prototype-pollution.test.ts → prototype-pollution.test.ts} +4 -4
  337. package/src/tests/api_tests/security/{F-0025-proxy-image-unauth-ssrf.test.ts → proxy-image-unauth-ssrf.test.ts} +11 -12
  338. package/src/tests/api_tests/security/{F-0013-sanitize-user-html-with-iframes.test.ts → sanitize-user-html-with-iframes.test.ts} +5 -5
  339. package/src/tests/api_tests/security/{F-0013-sanitize-user-html.test.ts → sanitize-user-html.test.ts} +4 -4
  340. package/src/tests/api_tests/security/schema-adminonly-enforcement.test.ts +287 -0
  341. package/src/tests/api_tests/security/{F-0076-self-admin-role-assignment.test.ts → self-admin-role-assignment.test.ts} +13 -13
  342. package/src/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.ts +162 -0
  343. package/src/tests/api_tests/security/{F-0015-webhook-outbound-ssrf.test.ts → webhook-outbound-ssrf.test.ts} +13 -14
  344. package/src/tests/api_tests/security/{F-0155-webhook-timeout.test.ts → webhook-timeout.test.ts} +6 -7
  345. package/src/tests/api_tests/tickets_bulk_assign_from_queue.test.ts +279 -0
  346. package/src/tests/api_tests/webhook_error_handling.test.ts +1 -1
  347. package/src/tests/setup_isolated.ts +170 -0
  348. package/src/tests/tests.ts +60 -18
  349. package/src/tests/unit_tests/do_not_send_address.test.ts +60 -0
  350. package/src/tests/unit_tests/openapi_spec_freshness.test.ts +88 -0
  351. package/test_generated.pdf +0 -0
  352. package/src/tests/api_tests/security/readonly-enduser-preview.test.ts +0 -301
@@ -0,0 +1,435 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import http from "http";
39
+ import os from "os";
40
+ import { Session } from "../../../sdk";
41
+ import { assert, async_test, log_header, } from "@tellescope/testing";
42
+ import { setup_tests } from "../../setup";
43
+ var host = process.env.API_URL || 'http://localhost:8080';
44
+ var LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1'];
45
+ var TEST_SECRET = "f0015 outbound ssrf test secret";
46
+ /**
47
+ * The sentinel — the destination that must NEVER be reached — is bound to this machine's own RFC1918
48
+ * address rather than to loopback, and that choice is load-bearing.
49
+ *
50
+ * Loopback is deliberately permitted outside prod/staging (see api/modules/outbound_url.ts), because
51
+ * several test suites bind their receivers with `listen(0, '127.0.0.1')` and an ephemeral port cannot be
52
+ * allowlisted ahead of time. A loopback sentinel would therefore be ALLOWED in exactly the environment
53
+ * where this test runs, and "the sentinel was not contacted" would pass by allowance while proving
54
+ * nothing.
55
+ *
56
+ * RFC1918 is refused in every environment, so binding there keeps the assertion meaningful AND keeps a
57
+ * real listener present — which is what lets us prove non-delivery by observation rather than by
58
+ * reading a log message.
59
+ */
60
+ var first_private_ipv4 = function () {
61
+ for (var _i = 0, _a = Object.values(os.networkInterfaces()); _i < _a.length; _i++) {
62
+ var addresses = _a[_i];
63
+ for (var _b = 0, _c = addresses !== null && addresses !== void 0 ? addresses : []; _b < _c.length; _b++) {
64
+ var address = _c[_b];
65
+ if (address.family !== 'IPv4' || address.internal)
66
+ continue;
67
+ if (/^10\./.test(address.address))
68
+ return address.address;
69
+ if (/^192\.168\./.test(address.address))
70
+ return address.address;
71
+ if (/^172\.(1[6-9]|2\d|3[01])\./.test(address.address))
72
+ return address.address;
73
+ }
74
+ }
75
+ return undefined;
76
+ };
77
+ /**
78
+ * 127.0.0.1 only means "the machine running this test" when the API is also local. Against staging or
79
+ * prod it is the API server itself — the sentinel would never be contacted, every assertion here would
80
+ * pass for the wrong reason, and we would be creating a real webhook in a live tenant. Fail loudly.
81
+ */
82
+ var assert_local_api = function () {
83
+ var hostname = new URL(host).hostname;
84
+ if (!LOCAL_HOSTNAMES.includes(hostname)) {
85
+ throw new Error("SSRF tests must run against a local API (got ".concat(host, "). ")
86
+ + "127.0.0.1 would resolve to the API server rather than this machine, and this test configures a webhook.");
87
+ }
88
+ };
89
+ var listen = function (server, address) { return new Promise(function (resolve, reject) {
90
+ server.once('error', reject);
91
+ server.listen(0, address, function () { return resolve(); }); // ephemeral port — nothing here needs a fixed one
92
+ }); };
93
+ var port_of = function (server) { return server.address().port; };
94
+ /** Webhook delivery is fire-and-forget, so absence has to be established by waiting. */
95
+ var settle = function (ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); };
96
+ var wait_until = function (predicate, ms) { return __awaiter(void 0, void 0, void 0, function () {
97
+ var deadline;
98
+ return __generator(this, function (_a) {
99
+ switch (_a.label) {
100
+ case 0:
101
+ deadline = Date.now() + ms;
102
+ _a.label = 1;
103
+ case 1:
104
+ if (!(Date.now() < deadline)) return [3 /*break*/, 3];
105
+ if (predicate())
106
+ return [2 /*return*/, true];
107
+ return [4 /*yield*/, settle(100)];
108
+ case 2:
109
+ _a.sent();
110
+ return [3 /*break*/, 1];
111
+ case 3: return [2 /*return*/, predicate()];
112
+ }
113
+ });
114
+ }); };
115
+ /**
116
+ * Regression tests: outbound webhook delivery must refuse internal destinations.
117
+ *
118
+ * Outbound webhooks request customer-configured URLs that are validated only for SYNTAX
119
+ * (urlValidator -> validator.isURL, which happily accepts http://10.0.0.1/). Four call sites are
120
+ * affected: api/modules/webhooks.ts:145, :214, :270, and the five-method block at api/v1/api.ts:9723.
121
+ *
122
+ * Two properties make this worse than a blind SSRF:
123
+ * - A non-2xx response body is stored in log.response, and webhook_logs is surfaced to customers for
124
+ * debugging — so an internal endpoint's error body is readable by the tenant that configured it.
125
+ * - The automation send-webhook action builds its URL at runtime through five nested template
126
+ * replacers over action.info.url, so patient-controlled field values can reach the destination.
127
+ *
128
+ * And critically: axios@0.30.2 follows redirects by default (maxRedirects: 5). A pre-flight check on
129
+ * the configured URL is therefore NOT sufficient — a receiver can simply 302 to an internal address
130
+ * after validation has already passed. T4 exists to prove exactly that, which is why the fix has to
131
+ * validate at connect time (a guarded agent) rather than as a string check.
132
+ *
133
+ * Each test below asserts ABSENCE ("the sentinel was never contacted"), which passes trivially if the
134
+ * request never happened at all — a missing allowlist entry, a webhook that never fired, a broken
135
+ * subscription. So each is paired with a positive control that proves the attempt really was made.
136
+ */
137
+ export var webhook_outbound_ssrf_tests = function (_a) {
138
+ var sdk = _a.sdk;
139
+ return __awaiter(void 0, void 0, void 0, function () {
140
+ var SENTINEL, privateIP, sentinelHits, okHits, redirectHits, sentinelURL, sentinel, allowed, enduserId, templateEnduserId, configuredWebhook, sentinelPort, okURL_1, redirectURL_1, enduser_1, send_automation_webhook_to_1, templateEnduser_1, webhooks, _i, _b, w, _c, _d, _e;
141
+ return __generator(this, function (_f) {
142
+ switch (_f.label) {
143
+ case 0:
144
+ log_header("outbound webhook SSRF");
145
+ assert_local_api();
146
+ SENTINEL = "f0015-sentinel-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2));
147
+ privateIP = first_private_ipv4();
148
+ if (!privateIP) {
149
+ // Degrade loudly rather than silently passing. Everything below needs a bindable address that the
150
+ // guard refuses in every environment, and loopback does not qualify (see the note above).
151
+ assert(false, 'SKIPPED: no non-loopback RFC1918 interface on this host, so the SSRF sentinel cannot be '
152
+ + 'bound anywhere the guard refuses. Run on a host with a private network interface.', 'outbound SSRF');
153
+ return [2 /*return*/];
154
+ }
155
+ sentinelHits = 0 // must NEVER be reached once fixed
156
+ ;
157
+ okHits = 0 // permitted target: must stay reachable
158
+ ;
159
+ redirectHits = 0 // permitted hop 1 of the redirect chain
160
+ ;
161
+ sentinelURL = '';
162
+ sentinel = http.createServer(function (_, res) {
163
+ sentinelHits++;
164
+ res.writeHead(200, { 'content-type': 'application/json' });
165
+ res.end(JSON.stringify({ sentinel: SENTINEL, credentials: 'internal-only' }));
166
+ });
167
+ allowed = http.createServer(function (req, res) {
168
+ if ((req.url || '').startsWith('/redirect-to-internal')) {
169
+ redirectHits++;
170
+ // Hop 1 is permitted and genuinely succeeds; hop 2 points somewhere that is not.
171
+ res.writeHead(302, { location: sentinelURL });
172
+ res.end();
173
+ return;
174
+ }
175
+ okHits++;
176
+ res.writeHead(200, { 'content-type': 'application/json' });
177
+ res.end(JSON.stringify({ ok: true }));
178
+ });
179
+ configuredWebhook = false;
180
+ _f.label = 1;
181
+ case 1:
182
+ _f.trys.push([1, , 14, 31]);
183
+ return [4 /*yield*/, listen(sentinel, privateIP)];
184
+ case 2:
185
+ _f.sent();
186
+ sentinelPort = port_of(sentinel);
187
+ sentinelURL = "http://".concat(privateIP, ":").concat(sentinelPort, "/ssrf-sentinel");
188
+ return [4 /*yield*/, listen(allowed, '127.0.0.1')];
189
+ case 3:
190
+ _f.sent();
191
+ okURL_1 = "http://127.0.0.1:".concat(port_of(allowed), "/webhook-ok");
192
+ redirectURL_1 = "http://127.0.0.1:".concat(port_of(allowed), "/redirect-to-internal");
193
+ return [4 /*yield*/, sdk.api.endusers.createOne({
194
+ email: "f0015-".concat(Date.now(), "@example.com"), fname: 'F0015', lname: 'Ssrf',
195
+ })];
196
+ case 4:
197
+ enduser_1 = _f.sent();
198
+ enduserId = enduser_1.id;
199
+ send_automation_webhook_to_1 = function (url, forEnduserId) {
200
+ if (forEnduserId === void 0) { forEnduserId = enduser_1.id; }
201
+ return __awaiter(void 0, void 0, void 0, function () {
202
+ var outcome;
203
+ return __generator(this, function (_a) {
204
+ switch (_a.label) {
205
+ case 0:
206
+ sentinelHits = 0;
207
+ okHits = 0;
208
+ redirectHits = 0;
209
+ return [4 /*yield*/, sdk.api.webhooks.send_automation_webhook({
210
+ enduserId: forEnduserId,
211
+ action: { info: { url: url } },
212
+ }).then(function () { return 'resolved'; }).catch(function () { return 'rejected'; })
213
+ // The action awaits its own axios call, but give redirect chains a moment to land.
214
+ ];
215
+ case 1:
216
+ outcome = _a.sent();
217
+ // The action awaits its own axios call, but give redirect chains a moment to land.
218
+ return [4 /*yield*/, settle(750)];
219
+ case 2:
220
+ // The action awaits its own axios call, but give redirect chains a moment to land.
221
+ _a.sent();
222
+ return [2 /*return*/, { outcome: outcome, sentinelHits: sentinelHits, okHits: okHits, redirectHits: redirectHits }];
223
+ }
224
+ });
225
+ });
226
+ };
227
+ // ---------------------------------------------------------------------------------------------
228
+ // T6 first: the positive control for the whole file. If an allowlisted target does not receive the
229
+ // webhook, every "sentinel not contacted" assertion below is meaningless.
230
+ // ---------------------------------------------------------------------------------------------
231
+ return [4 /*yield*/, async_test('automation webhook to a permitted target still delivers (regression baseline)', function () { return send_automation_webhook_to_1(okURL_1); }, { onResult: function (r) { return r.okHits === 1 && r.sentinelHits === 0; } })
232
+ // T3 — direct non-allowlisted private destination.
233
+ ];
234
+ case 5:
235
+ // ---------------------------------------------------------------------------------------------
236
+ // T6 first: the positive control for the whole file. If an allowlisted target does not receive the
237
+ // webhook, every "sentinel not contacted" assertion below is meaningless.
238
+ // ---------------------------------------------------------------------------------------------
239
+ _f.sent();
240
+ // T3 — direct non-allowlisted private destination.
241
+ return [4 /*yield*/, async_test('automation webhook does not reach a private destination', function () { return send_automation_webhook_to_1(sentinelURL); }, { onResult: function (r) { return r.sentinelHits === 0; } })
242
+ // T4 — the redirect bypass. THE test that justifies a connect-time guard over a pre-flight check.
243
+ ];
244
+ case 6:
245
+ // T3 — direct non-allowlisted private destination.
246
+ _f.sent();
247
+ // T4 — the redirect bypass. THE test that justifies a connect-time guard over a pre-flight check.
248
+ return [4 /*yield*/, async_test('automation webhook does not follow a redirect from a permitted host into a private one', function () { return send_automation_webhook_to_1(redirectURL_1); }, {
249
+ // redirectHits === 1 is the positive control: hop 1 was allowlisted and really was reached, so
250
+ // sentinelHits === 0 can only mean hop 2 was refused — not that the request never happened.
251
+ onResult: function (r) { return r.redirectHits === 1 && r.sentinelHits === 0; },
252
+ })
253
+ // T5 — the destination arrives via template interpolation, so validation must run AFTER the
254
+ // replacers rather than against the stored config. {{enduser.<key>}} resolves from enduser.fields.
255
+ ];
256
+ case 7:
257
+ // T4 — the redirect bypass. THE test that justifies a connect-time guard over a pre-flight check.
258
+ _f.sent();
259
+ return [4 /*yield*/, sdk.api.endusers.createOne({
260
+ email: "f0015-tpl-".concat(Date.now(), "@example.com"),
261
+ fname: 'F0015', lname: 'Template',
262
+ fields: { ssrfTarget: "".concat(privateIP, ":").concat(sentinelPort) },
263
+ })];
264
+ case 8:
265
+ templateEnduser_1 = _f.sent();
266
+ templateEnduserId = templateEnduser_1.id;
267
+ return [4 /*yield*/, async_test('automation webhook validates the URL after template interpolation, not before', function () { return send_automation_webhook_to_1('http://{{enduser.ssrfTarget}}/ssrf-sentinel', templateEnduser_1.id); }, { onResult: function (r) { return r.sentinelHits === 0; } })
268
+ // ---------------------------------------------------------------------------------------------
269
+ // The configured-webhook delivery path (api/modules/webhooks.ts:145), which is a different code
270
+ // path from the automation action above. Paired: allowlisted target proves the subscription and
271
+ // trigger plumbing works, then the same plumbing pointed at the sentinel must not reach it.
272
+ // ---------------------------------------------------------------------------------------------
273
+ // CUDSubscription is an object of booleans, not a list of verbs (see webhooks_tests.ts fullSubscription).
274
+ ];
275
+ case 9:
276
+ _f.sent();
277
+ // ---------------------------------------------------------------------------------------------
278
+ // The configured-webhook delivery path (api/modules/webhooks.ts:145), which is a different code
279
+ // path from the automation action above. Paired: allowlisted target proves the subscription and
280
+ // trigger plumbing works, then the same plumbing pointed at the sentinel must not reach it.
281
+ // ---------------------------------------------------------------------------------------------
282
+ // CUDSubscription is an object of booleans, not a list of verbs (see webhooks_tests.ts fullSubscription).
283
+ return [4 /*yield*/, sdk.api.webhooks.configure({
284
+ url: okURL_1, secret: TEST_SECRET, subscriptions: { endusers: { create: true } },
285
+ })];
286
+ case 10:
287
+ // ---------------------------------------------------------------------------------------------
288
+ // The configured-webhook delivery path (api/modules/webhooks.ts:145), which is a different code
289
+ // path from the automation action above. Paired: allowlisted target proves the subscription and
290
+ // trigger plumbing works, then the same plumbing pointed at the sentinel must not reach it.
291
+ // ---------------------------------------------------------------------------------------------
292
+ // CUDSubscription is an object of booleans, not a list of verbs (see webhooks_tests.ts fullSubscription).
293
+ _f.sent();
294
+ configuredWebhook = true;
295
+ return [4 /*yield*/, async_test('configured webhook to a permitted target still delivers (positive control)', function () { return __awaiter(void 0, void 0, void 0, function () {
296
+ var e, delivered;
297
+ return __generator(this, function (_a) {
298
+ switch (_a.label) {
299
+ case 0:
300
+ sentinelHits = 0;
301
+ okHits = 0;
302
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: "f0015-ok-".concat(Date.now(), "@example.com") })];
303
+ case 1:
304
+ e = _a.sent();
305
+ return [4 /*yield*/, wait_until(function () { return okHits > 0; }, 8000)];
306
+ case 2:
307
+ delivered = _a.sent();
308
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(e.id).catch(function () { })];
309
+ case 3:
310
+ _a.sent();
311
+ return [2 /*return*/, { delivered: delivered, okHits: okHits, sentinelHits: sentinelHits }];
312
+ }
313
+ });
314
+ }); }, { onResult: function (r) { return r.delivered === true && r.sentinelHits === 0; } })
315
+ // Repoint the same configuration at the sentinel, keeping the subscription intact.
316
+ ];
317
+ case 11:
318
+ _f.sent();
319
+ // Repoint the same configuration at the sentinel, keeping the subscription intact.
320
+ return [4 /*yield*/, sdk.api.webhooks.update({ url: sentinelURL })];
321
+ case 12:
322
+ // Repoint the same configuration at the sentinel, keeping the subscription intact.
323
+ _f.sent();
324
+ return [4 /*yield*/, async_test('configured webhook does not deliver to a private destination', function () { return __awaiter(void 0, void 0, void 0, function () {
325
+ var e;
326
+ return __generator(this, function (_a) {
327
+ switch (_a.label) {
328
+ case 0:
329
+ sentinelHits = 0;
330
+ okHits = 0;
331
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: "f0015-blocked-".concat(Date.now(), "@example.com") })
332
+ // Wait out the window a real delivery would have landed in, then assert it did not.
333
+ ];
334
+ case 1:
335
+ e = _a.sent();
336
+ // Wait out the window a real delivery would have landed in, then assert it did not.
337
+ return [4 /*yield*/, settle(6000)];
338
+ case 2:
339
+ // Wait out the window a real delivery would have landed in, then assert it did not.
340
+ _a.sent();
341
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(e.id).catch(function () { })];
342
+ case 3:
343
+ _a.sent();
344
+ return [2 /*return*/, { sentinelHits: sentinelHits }];
345
+ }
346
+ });
347
+ }); }, { onResult: function (r) { return r.sentinelHits === 0; } })];
348
+ case 13:
349
+ _f.sent();
350
+ return [3 /*break*/, 31];
351
+ case 14:
352
+ if (!configuredWebhook) return [3 /*break*/, 22];
353
+ _f.label = 15;
354
+ case 15:
355
+ _f.trys.push([15, 21, , 22]);
356
+ return [4 /*yield*/, sdk.api.webhooks.getSome({})];
357
+ case 16:
358
+ webhooks = (_f.sent()).webhooks;
359
+ _i = 0, _b = (webhooks !== null && webhooks !== void 0 ? webhooks : []);
360
+ _f.label = 17;
361
+ case 17:
362
+ if (!(_i < _b.length)) return [3 /*break*/, 20];
363
+ w = _b[_i];
364
+ return [4 /*yield*/, sdk.api.webhooks.deleteOne(w.id).catch(function () { })];
365
+ case 18:
366
+ _f.sent();
367
+ _f.label = 19;
368
+ case 19:
369
+ _i++;
370
+ return [3 /*break*/, 17];
371
+ case 20: return [3 /*break*/, 22];
372
+ case 21:
373
+ _c = _f.sent();
374
+ return [3 /*break*/, 22];
375
+ case 22:
376
+ if (!enduserId) return [3 /*break*/, 26];
377
+ _f.label = 23;
378
+ case 23:
379
+ _f.trys.push([23, 25, , 26]);
380
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserId)];
381
+ case 24:
382
+ _f.sent();
383
+ return [3 /*break*/, 26];
384
+ case 25:
385
+ _d = _f.sent();
386
+ return [3 /*break*/, 26];
387
+ case 26:
388
+ if (!templateEnduserId) return [3 /*break*/, 30];
389
+ _f.label = 27;
390
+ case 27:
391
+ _f.trys.push([27, 29, , 30]);
392
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(templateEnduserId)];
393
+ case 28:
394
+ _f.sent();
395
+ return [3 /*break*/, 30];
396
+ case 29:
397
+ _e = _f.sent();
398
+ return [3 /*break*/, 30];
399
+ case 30:
400
+ sentinel.close();
401
+ allowed.close();
402
+ return [7 /*endfinally*/];
403
+ case 31: return [2 /*return*/];
404
+ }
405
+ });
406
+ });
407
+ };
408
+ if (require.main === module) {
409
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
410
+ var sdk_1 = new Session({ host: host });
411
+ var sdkNonAdmin_1 = new Session({ host: host });
412
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
413
+ return __generator(this, function (_a) {
414
+ switch (_a.label) {
415
+ case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
416
+ case 1:
417
+ _a.sent();
418
+ return [4 /*yield*/, webhook_outbound_ssrf_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
419
+ case 2:
420
+ _a.sent();
421
+ return [2 /*return*/];
422
+ }
423
+ });
424
+ }); };
425
+ runTests()
426
+ .then(function () {
427
+ console.log("✅ outbound webhook SSRF test suite completed successfully");
428
+ process.exit(0);
429
+ })
430
+ .catch(function (error) {
431
+ console.error("❌ outbound webhook SSRF test suite failed:", error);
432
+ process.exit(1);
433
+ });
434
+ }
435
+ //# sourceMappingURL=webhook-outbound-ssrf.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-outbound-ssrf.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/webhook-outbound-ssrf.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Session } from "../../../sdk";
2
+ /**
3
+ * Regression test: outbound webhook delivery must time out rather than hang.
4
+ *
5
+ * Outbound webhook delivery used axios.post(url, ...) with no `timeout` (axios default = infinite).
6
+ * A tenant-controlled receiver that accepts the connection and never responds hangs the awaited
7
+ * request indefinitely (slow-loris → worker exhaustion). Fix: timeout: 15_000 on the axios calls.
8
+ *
9
+ * Repro: stand up a local HTTP server that accepts the connection but NEVER responds, point
10
+ * send_automation_webhook (which awaits the axios call) at it, and race the call against a 20s
11
+ * client timer.
12
+ * - green (fixed): server times out at ~15s → handler returns 400 → SDK call rejects < 20s
13
+ * - red (unfixed): the call is still pending at 20s → client timer wins
14
+ */
15
+ export declare const webhook_timeout_tests: ({ sdk }: {
16
+ sdk: Session;
17
+ sdkNonAdmin: Session;
18
+ }) => Promise<void>;
19
+ //# sourceMappingURL=webhook-timeout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-timeout.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/webhook-timeout.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAYtC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB;SAA2B,OAAO;iBAAe,OAAO;mBAkCzF,CAAA"}
@@ -0,0 +1,149 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import http from "http";
39
+ import { Session } from "../../../sdk";
40
+ import { async_test, log_header, } from "@tellescope/testing";
41
+ import { setup_tests } from "../../setup";
42
+ var host = process.env.API_URL || 'http://localhost:8080';
43
+ // The server-side axios timeout is 15s (the fix under test). We bound our own wait above that.
44
+ var CLIENT_WAIT_MS = 20000;
45
+ /**
46
+ * Regression test: outbound webhook delivery must time out rather than hang.
47
+ *
48
+ * Outbound webhook delivery used axios.post(url, ...) with no `timeout` (axios default = infinite).
49
+ * A tenant-controlled receiver that accepts the connection and never responds hangs the awaited
50
+ * request indefinitely (slow-loris → worker exhaustion). Fix: timeout: 15_000 on the axios calls.
51
+ *
52
+ * Repro: stand up a local HTTP server that accepts the connection but NEVER responds, point
53
+ * send_automation_webhook (which awaits the axios call) at it, and race the call against a 20s
54
+ * client timer.
55
+ * - green (fixed): server times out at ~15s → handler returns 400 → SDK call rejects < 20s
56
+ * - red (unfixed): the call is still pending at 20s → client timer wins
57
+ */
58
+ export var webhook_timeout_tests = function (_a) {
59
+ var sdk = _a.sdk;
60
+ return __awaiter(void 0, void 0, void 0, function () {
61
+ var enduserId, slowServer, port, blackholeUrl_1, enduser_1, _b;
62
+ return __generator(this, function (_c) {
63
+ switch (_c.label) {
64
+ case 0:
65
+ log_header("outbound webhook timeout");
66
+ slowServer = http.createServer(function () { });
67
+ _c.label = 1;
68
+ case 1:
69
+ _c.trys.push([1, , 5, 10]);
70
+ return [4 /*yield*/, new Promise(function (resolve) { return slowServer.listen(0, '127.0.0.1', function () { return resolve(); }); })];
71
+ case 2:
72
+ _c.sent();
73
+ port = slowServer.address().port;
74
+ blackholeUrl_1 = "http://127.0.0.1:".concat(port, "/hook");
75
+ return [4 /*yield*/, sdk.api.endusers.createOne({ email: "f0155-".concat(Date.now(), "@example.com"), fname: 'F0155', lname: 'Webhook' })];
76
+ case 3:
77
+ enduser_1 = _c.sent();
78
+ enduserId = enduser_1.id;
79
+ return [4 /*yield*/, async_test('outbound webhook to a non-responding receiver times out server-side (does not hang)', function () { return __awaiter(void 0, void 0, void 0, function () {
80
+ var start, outcome;
81
+ return __generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0:
84
+ start = Date.now();
85
+ return [4 /*yield*/, Promise.race([
86
+ sdk.api.webhooks.send_automation_webhook({
87
+ enduserId: enduser_1.id,
88
+ action: { info: { url: blackholeUrl_1 } },
89
+ }).then(function () { return 'completed'; }).catch(function () { return 'errored'; }),
90
+ new Promise(function (r) { return setTimeout(function () { return r('client-timeout'); }, CLIENT_WAIT_MS); }),
91
+ ])];
92
+ case 1:
93
+ outcome = _a.sent();
94
+ return [2 /*return*/, { outcome: outcome, elapsed: Date.now() - start }];
95
+ }
96
+ });
97
+ }); },
98
+ // green: the server-side axios timeout fired (call settled) before our 20s client wait
99
+ { onResult: function (r) { return r.outcome !== 'client-timeout' && r.elapsed < CLIENT_WAIT_MS; } })];
100
+ case 4:
101
+ _c.sent();
102
+ return [3 /*break*/, 10];
103
+ case 5:
104
+ slowServer.close();
105
+ if (!enduserId) return [3 /*break*/, 9];
106
+ _c.label = 6;
107
+ case 6:
108
+ _c.trys.push([6, 8, , 9]);
109
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserId)];
110
+ case 7:
111
+ _c.sent();
112
+ return [3 /*break*/, 9];
113
+ case 8:
114
+ _b = _c.sent();
115
+ return [3 /*break*/, 9];
116
+ case 9: return [7 /*endfinally*/];
117
+ case 10: return [2 /*return*/];
118
+ }
119
+ });
120
+ });
121
+ };
122
+ if (require.main === module) {
123
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
124
+ var sdk_1 = new Session({ host: host });
125
+ var sdkNonAdmin_1 = new Session({ host: host });
126
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
127
+ return __generator(this, function (_a) {
128
+ switch (_a.label) {
129
+ case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
130
+ case 1:
131
+ _a.sent();
132
+ return [4 /*yield*/, webhook_timeout_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
133
+ case 2:
134
+ _a.sent();
135
+ return [2 /*return*/];
136
+ }
137
+ });
138
+ }); };
139
+ runTests()
140
+ .then(function () {
141
+ console.log("✅ webhook timeout test suite completed successfully");
142
+ process.exit(0);
143
+ })
144
+ .catch(function (error) {
145
+ console.error("❌ webhook timeout test suite failed:", error);
146
+ process.exit(1);
147
+ });
148
+ }
149
+ //# sourceMappingURL=webhook-timeout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-timeout.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/webhook-timeout.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Check } from "../setup_isolated";
2
+ export declare const tickets_bulk_assign_from_queue_checks: () => Promise<Check[]>;
3
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
4
+ export declare const tickets_bulk_assign_from_queue_tests: () => Promise<void>;
5
+ //# sourceMappingURL=tickets_bulk_assign_from_queue.test.d.ts.map