dd-trace 5.53.0 → 5.55.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 (368) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/index.d.ts +33 -16
  6. package/initialize.mjs +5 -6
  7. package/package.json +40 -38
  8. package/packages/datadog-code-origin/index.js +22 -4
  9. package/packages/datadog-core/src/utils/src/get.js +1 -1
  10. package/packages/datadog-core/src/utils/src/has.js +1 -1
  11. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  12. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  13. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  14. package/packages/datadog-core/src/utils/src/set.js +1 -1
  15. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  16. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  17. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  18. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  19. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  20. package/packages/datadog-instrumentations/src/cassandra-driver.js +10 -10
  21. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  22. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +89 -75
  23. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  24. package/packages/datadog-instrumentations/src/couchbase.js +6 -9
  25. package/packages/datadog-instrumentations/src/cucumber.js +108 -68
  26. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  27. package/packages/datadog-instrumentations/src/dns.js +5 -5
  28. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  29. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  30. package/packages/datadog-instrumentations/src/fs.js +1 -1
  31. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +35 -43
  32. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  33. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  34. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  35. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  36. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  37. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  38. package/packages/datadog-instrumentations/src/helpers/hook.js +2 -3
  39. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  40. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  41. package/packages/datadog-instrumentations/src/helpers/register.js +11 -12
  42. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  43. package/packages/datadog-instrumentations/src/jest.js +201 -143
  44. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  45. package/packages/datadog-instrumentations/src/knex.js +4 -4
  46. package/packages/datadog-instrumentations/src/koa.js +2 -3
  47. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  48. package/packages/datadog-instrumentations/src/mariadb.js +49 -65
  49. package/packages/datadog-instrumentations/src/mocha/main.js +116 -73
  50. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  51. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  52. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  53. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  54. package/packages/datadog-instrumentations/src/mysql.js +30 -37
  55. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  56. package/packages/datadog-instrumentations/src/net.js +1 -1
  57. package/packages/datadog-instrumentations/src/next.js +1 -0
  58. package/packages/datadog-instrumentations/src/nyc.js +3 -2
  59. package/packages/datadog-instrumentations/src/openai.js +22 -24
  60. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  61. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  62. package/packages/datadog-instrumentations/src/pg.js +3 -5
  63. package/packages/datadog-instrumentations/src/playwright.js +123 -83
  64. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  65. package/packages/datadog-instrumentations/src/redis.js +4 -4
  66. package/packages/datadog-instrumentations/src/restify.js +9 -13
  67. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  68. package/packages/datadog-instrumentations/src/router.js +30 -32
  69. package/packages/datadog-instrumentations/src/tedious.js +2 -3
  70. package/packages/datadog-instrumentations/src/vitest.js +87 -52
  71. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  72. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  73. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  74. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  75. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  76. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  77. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  78. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  79. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  80. package/packages/datadog-plugin-aws-sdk/src/base.js +15 -10
  81. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  82. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  83. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  84. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +28 -43
  85. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  86. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +10 -11
  87. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -6
  88. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  89. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  90. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -3
  91. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +11 -15
  92. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  93. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  94. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  95. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  96. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  97. package/packages/datadog-plugin-cucumber/src/index.js +60 -4
  98. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +99 -28
  99. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  100. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  101. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  102. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  103. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  104. package/packages/datadog-plugin-express/src/index.js +10 -12
  105. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  106. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  107. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  108. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  109. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +27 -10
  110. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  111. package/packages/datadog-plugin-graphql/src/index.js +10 -8
  112. package/packages/datadog-plugin-graphql/src/resolve.js +19 -12
  113. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  114. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  115. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  116. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  117. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  118. package/packages/datadog-plugin-http/src/client.js +23 -13
  119. package/packages/datadog-plugin-http2/src/client.js +24 -25
  120. package/packages/datadog-plugin-jest/src/index.js +26 -23
  121. package/packages/datadog-plugin-jest/src/util.js +8 -8
  122. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  123. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  124. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  125. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  126. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  127. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  128. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  129. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  130. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  131. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  132. package/packages/datadog-plugin-mocha/src/index.js +39 -14
  133. package/packages/datadog-plugin-mongodb-core/src/index.js +3 -2
  134. package/packages/datadog-plugin-mysql/src/index.js +22 -9
  135. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  136. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  137. package/packages/datadog-plugin-next/src/index.js +7 -6
  138. package/packages/datadog-plugin-openai/src/services.js +6 -10
  139. package/packages/datadog-plugin-openai/src/tracing.js +12 -18
  140. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  141. package/packages/datadog-plugin-playwright/src/index.js +25 -4
  142. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  143. package/packages/datadog-plugin-redis/src/index.js +2 -4
  144. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  145. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  146. package/packages/datadog-plugin-router/src/index.js +1 -1
  147. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  148. package/packages/datadog-plugin-vitest/src/index.js +52 -35
  149. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  150. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  151. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  152. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  153. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  154. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  155. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  156. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  157. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  158. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +5 -8
  159. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  160. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  161. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  162. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  163. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  165. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  166. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  167. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +16 -24
  168. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  169. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  170. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  171. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  172. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +2 -8
  173. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  174. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  175. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +7 -8
  176. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  177. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +7 -7
  178. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +2 -3
  179. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  180. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -28
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  185. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  186. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  187. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  188. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  189. package/packages/dd-trace/src/appsec/index.js +5 -5
  190. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  191. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  192. package/packages/dd-trace/src/appsec/reporter.js +232 -41
  193. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  194. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  195. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  196. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  197. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  198. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  199. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  200. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  201. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -4
  202. package/packages/dd-trace/src/azure_metadata.js +9 -9
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +9 -8
  204. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  205. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +3 -2
  206. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +3 -2
  208. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +3 -2
  209. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +3 -2
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  211. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -5
  212. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  214. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +3 -2
  215. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +5 -4
  216. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +12 -8
  217. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  218. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +3 -2
  219. package/packages/dd-trace/src/config-helper.js +89 -0
  220. package/packages/dd-trace/src/config.js +159 -129
  221. package/packages/dd-trace/src/config_stable.js +10 -7
  222. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  223. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  224. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  225. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  226. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +7 -7
  227. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  228. package/packages/dd-trace/src/datastreams/size.js +1 -1
  229. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +75 -69
  230. package/packages/dd-trace/src/debugger/devtools_client/condition.js +7 -10
  231. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/index.js +9 -2
  233. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  234. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  235. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  236. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  237. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +11 -14
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +4 -4
  239. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  240. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  241. package/packages/dd-trace/src/debugger/index.js +1 -0
  242. package/packages/dd-trace/src/dogstatsd.js +7 -6
  243. package/packages/dd-trace/src/encode/0.4.js +14 -11
  244. package/packages/dd-trace/src/encode/0.5.js +4 -6
  245. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +8 -8
  246. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  247. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  248. package/packages/dd-trace/src/exporter.js +7 -6
  249. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  250. package/packages/dd-trace/src/exporters/common/docker.js +4 -3
  251. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  252. package/packages/dd-trace/src/exporters/common/request.js +5 -2
  253. package/packages/dd-trace/src/exporters/common/util.js +4 -2
  254. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  255. package/packages/dd-trace/src/flare/file.js +1 -5
  256. package/packages/dd-trace/src/format.js +1 -1
  257. package/packages/dd-trace/src/git_properties.js +1 -1
  258. package/packages/dd-trace/src/id.js +15 -9
  259. package/packages/dd-trace/src/iitm.js +10 -22
  260. package/packages/dd-trace/src/index.js +4 -3
  261. package/packages/dd-trace/src/lambda/handler.js +7 -6
  262. package/packages/dd-trace/src/lambda/index.js +2 -1
  263. package/packages/dd-trace/src/lambda/runtime/patch.js +7 -6
  264. package/packages/dd-trace/src/lambda/runtime/ritm.js +4 -3
  265. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  266. package/packages/dd-trace/src/llmobs/index.js +21 -5
  267. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  268. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  269. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  270. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  271. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  272. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  273. package/packages/dd-trace/src/llmobs/plugins/openai.js +2 -3
  274. package/packages/dd-trace/src/llmobs/sdk.js +4 -3
  275. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  276. package/packages/dd-trace/src/llmobs/tagger.js +129 -102
  277. package/packages/dd-trace/src/llmobs/util.js +9 -9
  278. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  279. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  280. package/packages/dd-trace/src/log/index.js +9 -8
  281. package/packages/dd-trace/src/log/log.js +1 -1
  282. package/packages/dd-trace/src/log/writer.js +3 -4
  283. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  284. package/packages/dd-trace/src/msgpack/encoder.js +31 -31
  285. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  286. package/packages/dd-trace/src/noop/span.js +4 -6
  287. package/packages/dd-trace/src/noop/tracer.js +1 -2
  288. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  289. package/packages/dd-trace/src/opentelemetry/tracer.js +7 -6
  290. package/packages/dd-trace/src/opentracing/propagation/log.js +10 -13
  291. package/packages/dd-trace/src/opentracing/propagation/text_map.js +40 -37
  292. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  293. package/packages/dd-trace/src/opentracing/span.js +16 -20
  294. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  295. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  296. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  297. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  298. package/packages/dd-trace/src/pkg.js +1 -1
  299. package/packages/dd-trace/src/plugin_manager.js +4 -3
  300. package/packages/dd-trace/src/plugins/ci_plugin.js +87 -11
  301. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  302. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  303. package/packages/dd-trace/src/plugins/index.js +0 -1
  304. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  305. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  306. package/packages/dd-trace/src/plugins/producer.js +2 -2
  307. package/packages/dd-trace/src/plugins/storage.js +2 -2
  308. package/packages/dd-trace/src/plugins/util/ci.js +28 -20
  309. package/packages/dd-trace/src/plugins/util/git.js +166 -12
  310. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  311. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  312. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  313. package/packages/dd-trace/src/plugins/util/stacktrace.js +9 -2
  314. package/packages/dd-trace/src/plugins/util/test.js +315 -51
  315. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  316. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  317. package/packages/dd-trace/src/plugins/util/user-provided-git.js +14 -4
  318. package/packages/dd-trace/src/plugins/util/web.js +8 -8
  319. package/packages/dd-trace/src/priority_sampler.js +64 -53
  320. package/packages/dd-trace/src/profiling/config.js +51 -35
  321. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  322. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  323. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +7 -6
  324. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  325. package/packages/dd-trace/src/profiling/index.js +2 -1
  326. package/packages/dd-trace/src/profiling/profiler.js +44 -6
  327. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  328. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  329. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  330. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  331. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  332. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  333. package/packages/dd-trace/src/profiling/tagger.js +21 -13
  334. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  335. package/packages/dd-trace/src/proxy.js +9 -10
  336. package/packages/dd-trace/src/random_sampler.js +40 -0
  337. package/packages/dd-trace/src/rate_limiter.js +4 -4
  338. package/packages/dd-trace/src/remote_config/index.js +3 -7
  339. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  340. package/packages/dd-trace/src/require-package-json.js +1 -1
  341. package/packages/dd-trace/src/ritm.js +8 -8
  342. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -4
  343. package/packages/dd-trace/src/sampler.js +41 -4
  344. package/packages/dd-trace/src/sampling_rule.js +12 -3
  345. package/packages/dd-trace/src/scope.js +1 -1
  346. package/packages/dd-trace/src/serverless.js +11 -4
  347. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  348. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  349. package/packages/dd-trace/src/span_processor.js +5 -4
  350. package/packages/dd-trace/src/span_sampler.js +4 -1
  351. package/packages/dd-trace/src/standalone/tracesource.js +2 -3
  352. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  353. package/packages/dd-trace/src/startup-log.js +6 -18
  354. package/packages/dd-trace/src/supported-configurations.json +439 -0
  355. package/packages/dd-trace/src/telemetry/dependencies.js +64 -59
  356. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  357. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  358. package/packages/dd-trace/src/telemetry/send-data.js +8 -7
  359. package/packages/dd-trace/src/telemetry/telemetry.js +31 -45
  360. package/packages/dd-trace/src/tracer.js +3 -7
  361. package/packages/dd-trace/src/util.js +1 -6
  362. package/version.js +1 -0
  363. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  364. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  365. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  366. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
  367. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -122
  368. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -10,8 +10,8 @@ const SC_NOT_FOUND = 404
10
10
  const SC_GONE = 410
11
11
  const SC_INTERNAL_SERVER_ERROR = 500
12
12
 
13
- const IGNORED_RESPONSE_STATUS_LIST = [SC_MOVED_PERMANENTLY, SC_MOVED_TEMPORARILY, SC_NOT_MODIFIED,
14
- SC_TEMPORARY_REDIRECT, SC_NOT_FOUND, SC_GONE, SC_INTERNAL_SERVER_ERROR]
13
+ const IGNORED_RESPONSE_STATUS_LIST = new Set([SC_MOVED_PERMANENTLY, SC_MOVED_TEMPORARILY, SC_NOT_MODIFIED,
14
+ SC_TEMPORARY_REDIRECT, SC_NOT_FOUND, SC_GONE, SC_INTERNAL_SERVER_ERROR])
15
15
  const HTML_CONTENT_TYPES = ['text/html', 'application/xhtml+xml']
16
16
 
17
17
  class MissingHeaderAnalyzer extends Analyzer {
@@ -32,14 +32,11 @@ class MissingHeaderAnalyzer extends Analyzer {
32
32
  const headerValue = res.getHeader(headerName)
33
33
  if (Array.isArray(headerValue)) {
34
34
  return headerValue
35
- } else {
36
- return headerValue ? [headerValue.toString()] : []
37
35
  }
36
+ return headerValue ? [headerValue.toString()] : []
38
37
  }
39
38
 
40
- _getLocation () {
41
- return undefined
42
- }
39
+ _getLocation () {}
43
40
 
44
41
  _checkOCE (context) {
45
42
  return true
@@ -61,7 +58,7 @@ class MissingHeaderAnalyzer extends Analyzer {
61
58
  }
62
59
 
63
60
  _isVulnerable ({ req, res }, context) {
64
- if (!IGNORED_RESPONSE_STATUS_LIST.includes(res.statusCode) && this._isResponseHtml(res)) {
61
+ if (!IGNORED_RESPONSE_STATUS_LIST.has(res.statusCode) && this._isResponseHtml(res)) {
65
62
  return this._isVulnerableFromRequestAndResponse(req, res)
66
63
  }
67
64
  return false
@@ -24,6 +24,8 @@ class NosqlInjectionMongodbAnalyzer extends InjectionAnalyzer {
24
24
  onConfigure () {
25
25
  this.configureSanitizers()
26
26
 
27
+ // Anything that accesses the storage is context dependent
28
+ // eslint-disable-next-line unicorn/consistent-function-scoping
27
29
  const onStart = ({ filters }) => {
28
30
  const store = storage('legacy').getStore()
29
31
  if (store && !store.nosqlAnalyzed && filters?.length) {
@@ -42,6 +44,8 @@ class NosqlInjectionMongodbAnalyzer extends InjectionAnalyzer {
42
44
  }
43
45
  }
44
46
 
47
+ // Anything that accesses the storage is context dependent
48
+ // eslint-disable-next-line unicorn/consistent-function-scoping
45
49
  const onFinish = () => {
46
50
  const store = storage('legacy').getStore()
47
51
  if (store?.nosqlParentStore) {
@@ -7,7 +7,7 @@ const { getIastContext } = require('../iast-context')
7
7
  const { storage } = require('../../../../../datadog-core')
8
8
  const { PATH_TRAVERSAL } = require('../vulnerabilities')
9
9
 
10
- const ignoredOperations = ['dir.close', 'close']
10
+ const ignoredOperations = new Set(['dir.close', 'close'])
11
11
 
12
12
  class PathTraversalAnalyzer extends InjectionAnalyzer {
13
13
  constructor () {
@@ -20,10 +20,10 @@ class PathTraversalAnalyzer extends InjectionAnalyzer {
20
20
  this.internalExclusionList = [
21
21
  'node:fs',
22
22
  'node:internal/fs',
23
- 'node:internal\\fs',
23
+ String.raw`node:internal\fs`,
24
24
  'fs.js',
25
25
  'internal/fs',
26
- 'internal\\fs'
26
+ String.raw`internal\fs`
27
27
  ]
28
28
  }
29
29
 
@@ -36,7 +36,7 @@ class PathTraversalAnalyzer extends InjectionAnalyzer {
36
36
  // but if we spect a store in the context to be present we are going to exclude
37
37
  // all out_of_the_request fs.operations
38
38
  // AppsecFsPlugin must be enabled
39
- if (ignoredOperations.includes(obj.operation) || outOfReqOrChild) return
39
+ if (ignoredOperations.has(obj.operation) || outOfReqOrChild) return
40
40
 
41
41
  const pathArguments = []
42
42
  if (obj.dest) {
@@ -71,16 +71,13 @@ class PathTraversalAnalyzer extends InjectionAnalyzer {
71
71
  }
72
72
 
73
73
  _isExcluded (location) {
74
- let ret = true
75
- if (location && location.path) {
74
+ if (location?.path) {
76
75
  // Exclude from reporting those vulnerabilities which location is from an internal fs call
77
- if (location.isInternal) {
78
- ret = this.internalExclusionList.some(elem => location.path.includes(elem))
79
- } else {
80
- ret = this.exclusionList.some(elem => location.path.includes(elem))
81
- }
76
+ return location.isInternal
77
+ ? this.internalExclusionList.some(elem => location.path.includes(elem))
78
+ : this.exclusionList.some(elem => location.path.includes(elem))
82
79
  }
83
- return ret
80
+ return true
84
81
  }
85
82
 
86
83
  analyze (value) {
@@ -41,7 +41,7 @@ class Analyzer extends SinkIastPlugin {
41
41
 
42
42
  if (!this._isExcluded(location)) {
43
43
  const originalLocation = this._getOriginalLocation(location)
44
- const spanId = context && context.rootSpan && context.rootSpan.context().toSpanId()
44
+ const spanId = context?.rootSpan?.context().toSpanId()
45
45
  const stackId = getIastStackTraceId(context)
46
46
  const vulnerability = this._createVulnerability(
47
47
  this._type,
@@ -112,9 +112,10 @@ class Analyzer extends SinkIastPlugin {
112
112
  const iastContext = getIastContext(store)
113
113
  if (this._isInvalidContext(store, iastContext)) return
114
114
 
115
- for (let i = 0; i < values.length; i++) {
116
- const value = values[i]
115
+ for (const value of values) {
117
116
  if (this._isVulnerable(value, iastContext)) {
117
+ // TODO(BridgeAR): Here are multiple cases that receive a different
118
+ // number of arguments than passed through. Fix those cases.
118
119
  if (this._checkOCE(iastContext, value)) {
119
120
  this._report(value, iastContext)
120
121
  }
@@ -124,7 +125,7 @@ class Analyzer extends SinkIastPlugin {
124
125
  }
125
126
 
126
127
  _checkOCE (context) {
127
- return overheadController.hasQuota(overheadController.OPERATIONS.REPORT_VULNERABILITY, context)
128
+ return overheadController.hasQuota(overheadController.OPERATIONS.REPORT_VULNERABILITY, context, this._type)
128
129
  }
129
130
 
130
131
  _createVulnerability (type, evidence, spanId, location, stackId) {
@@ -11,7 +11,7 @@ const { TagKey } = require('../telemetry/iast-metric')
11
11
 
12
12
  class IastContextPlugin extends IastPlugin {
13
13
  startCtxOn (channelName, tag) {
14
- super.addSub(channelName, (message) => this.startContext())
14
+ super.addSub(channelName, (message) => this.startContext(message?.currentStore))
15
15
 
16
16
  this._getAndRegisterSubscription({
17
17
  channelName,
@@ -44,11 +44,10 @@ class IastContextPlugin extends IastPlugin {
44
44
  }
45
45
  }
46
46
 
47
- startContext () {
47
+ startContext (store = storage('legacy').getStore()) {
48
48
  let isRequestAcquired = false
49
49
  let iastContext
50
50
 
51
- const store = storage('legacy').getStore()
52
51
  if (store) {
53
52
  const topContext = this.getTopContext()
54
53
  const rootSpan = this.getRootSpan(store)
@@ -130,9 +130,9 @@ class IastPlugin extends Plugin {
130
130
  }
131
131
 
132
132
  _getAndRegisterSubscription ({ moduleName, channelName, tag, tagKey }) {
133
- if (!channelName && !moduleName) return
134
-
135
133
  if (!moduleName) {
134
+ if (!channelName) return
135
+
136
136
  let firstSep = channelName.indexOf(':')
137
137
  if (firstSep === -1) {
138
138
  moduleName = channelName
@@ -141,7 +141,7 @@ class IastPlugin extends Plugin {
141
141
  firstSep = channelName.indexOf(':', 'tracing:'.length + 1)
142
142
  }
143
143
  const lastSep = channelName.indexOf(':', firstSep + 1)
144
- moduleName = channelName.substring(firstSep + 1, lastSep !== -1 ? lastSep : channelName.length)
144
+ moduleName = channelName.slice(firstSep + 1, lastSep === -1 ? channelName.length : lastSep)
145
145
  }
146
146
  }
147
147
 
@@ -92,6 +92,7 @@ function onIncomingHttpRequestEnd (data) {
92
92
  const vulnerabilities = iastContext.vulnerabilities
93
93
  const rootSpan = iastContext.rootSpan
94
94
  vulnerabilityReporter.sendVulnerabilities(vulnerabilities, rootSpan)
95
+ overheadController.consolidateVulnerabilities(iastContext)
95
96
  removeTransaction(iastContext)
96
97
  iastTelemetry.onRequestEnd(iastContext, iastContext.rootSpan)
97
98
  }
@@ -1,5 +1,9 @@
1
1
  'use strict'
2
2
 
3
+ const LRUCache = require('lru-cache')
4
+ const web = require('../../plugins/util/web')
5
+ const vulnerabilities = require('./vulnerabilities')
6
+
3
7
  const OVERHEAD_CONTROLLER_CONTEXT_KEY = 'oce'
4
8
  const REPORT_VULNERABILITY = 'REPORT_VULNERABILITY'
5
9
  const INTERVAL_RESET_GLOBAL_CONTEXT = 60 * 1000
@@ -9,13 +13,62 @@ const GLOBAL_OCE_CONTEXT = {}
9
13
  let resetGlobalContextInterval
10
14
  let config = {}
11
15
  let availableRequest = 0
16
+
17
+ const globalRouteMap = new LRUCache({ max: 4096 })
18
+ let vulnerabilitiesSize = 0
19
+ const vulnerabilityIndexes = Object.values(vulnerabilities).reduce((obj, item, index) => {
20
+ obj[item] = index
21
+ vulnerabilitiesSize++
22
+ return obj
23
+ }, {})
24
+
25
+ function newCountersArray () {
26
+ return (new Array(vulnerabilitiesSize)).fill(0)
27
+ }
28
+
29
+ function copyFromGlobalMap (route) {
30
+ const vulnerabilityCounters = globalRouteMap.get(route)
31
+ return vulnerabilityCounters ? [...vulnerabilityCounters] : newCountersArray()
32
+ }
33
+
34
+ // for testing purposes
35
+ function clearGlobalRouteMap () {
36
+ globalRouteMap.clear()
37
+ }
38
+
12
39
  const OPERATIONS = {
13
40
  REPORT_VULNERABILITY: {
14
- hasQuota: (context) => {
15
- const reserved = context && context.tokens && context.tokens[REPORT_VULNERABILITY] > 0
41
+ hasQuota: (context, vulnerabilityType) => {
42
+ const reserved = context?.tokens?.[REPORT_VULNERABILITY] > 0
43
+ if (reserved && context.route != null) {
44
+ let copyMap = context.copyMap
45
+ let localMap = context.localMap
46
+
47
+ if (context.loadedRoute !== context.route) {
48
+ context.copyMaps ??= {}
49
+ context.copyMaps[context.route] ??= copyFromGlobalMap(context.route)
50
+ context.localMaps ??= {}
51
+ context.localMaps[context.route] ??= newCountersArray()
52
+ context.loadedRoute = context.route
53
+ copyMap = context.copyMaps[context.route]
54
+ localMap = context.localMaps[context.route]
55
+ context.copyMap = copyMap
56
+ context.localMap = localMap
57
+ }
58
+
59
+ const vulnerabilityIndex = vulnerabilityIndexes[vulnerabilityType]
60
+ const counter = localMap[vulnerabilityIndex]++
61
+ const storedCounter = copyMap[vulnerabilityIndex]
62
+
63
+ if (counter < storedCounter) {
64
+ return false
65
+ }
66
+ }
67
+
16
68
  if (reserved) {
17
69
  context.tokens[REPORT_VULNERABILITY]--
18
70
  }
71
+
19
72
  return reserved
20
73
  },
21
74
  name: REPORT_VULNERABILITY,
@@ -41,12 +94,52 @@ function _getNewContext () {
41
94
  }
42
95
 
43
96
  function _getContext (iastContext) {
44
- if (iastContext && iastContext[OVERHEAD_CONTROLLER_CONTEXT_KEY]) {
97
+ if (iastContext?.[OVERHEAD_CONTROLLER_CONTEXT_KEY]) {
98
+ const oceContext = iastContext[OVERHEAD_CONTROLLER_CONTEXT_KEY]
99
+ if (!oceContext.webContext) {
100
+ oceContext.webContext = web.getContext(iastContext.req)
101
+ oceContext.method = iastContext.req?.method
102
+ }
103
+
104
+ const currentPaths = oceContext.webContext?.paths
105
+ if (currentPaths !== oceContext.paths || !oceContext.route) {
106
+ oceContext.paths = currentPaths
107
+ oceContext.route = '#' + oceContext.method + '#' + (currentPaths?.join('') || '')
108
+ }
109
+
45
110
  return iastContext[OVERHEAD_CONTROLLER_CONTEXT_KEY]
46
111
  }
47
112
  return GLOBAL_OCE_CONTEXT
48
113
  }
49
114
 
115
+ function consolidateVulnerabilities (iastContext) {
116
+ const context = _getContext(iastContext)
117
+ if (!context.localMaps) return
118
+
119
+ const reserved = context.tokens?.[REPORT_VULNERABILITY] > 0
120
+
121
+ if (reserved) { // still a bit of budget available
122
+ Object.keys(context.localMaps).forEach(route => {
123
+ globalRouteMap.set(route, newCountersArray())
124
+ })
125
+ } else {
126
+ Object.keys(context.localMaps).forEach(route => {
127
+ const localMap = context.localMaps[route]
128
+ const globalMap = globalRouteMap.get(route)
129
+ if (!globalMap) {
130
+ globalRouteMap.set(route, localMap)
131
+ return
132
+ }
133
+
134
+ for (let i = 0; i < vulnerabilitiesSize; i++) {
135
+ if (localMap[i] > globalMap[i]) {
136
+ globalMap[i] = localMap[i]
137
+ }
138
+ }
139
+ })
140
+ }
141
+ }
142
+
50
143
  function _resetGlobalContext () {
51
144
  Object.assign(GLOBAL_OCE_CONTEXT, _getNewContext())
52
145
  }
@@ -70,9 +163,9 @@ function releaseRequest () {
70
163
  }
71
164
  }
72
165
 
73
- function hasQuota (operation, iastContext) {
166
+ function hasQuota (operation, iastContext, vulnerabilityType) {
74
167
  const oceContext = _getContext(iastContext)
75
- return operation.hasQuota(oceContext)
168
+ return operation.hasQuota(oceContext, vulnerabilityType)
76
169
  }
77
170
 
78
171
  function initializeRequestContext (iastContext) {
@@ -90,7 +183,7 @@ function startGlobalContext () {
90
183
  resetGlobalContextInterval = setInterval(() => {
91
184
  _resetGlobalContext()
92
185
  }, INTERVAL_RESET_GLOBAL_CONTEXT)
93
- resetGlobalContextInterval.unref && resetGlobalContextInterval.unref()
186
+ resetGlobalContextInterval.unref?.()
94
187
  }
95
188
 
96
189
  function finishGlobalContext () {
@@ -110,5 +203,7 @@ module.exports = {
110
203
  hasQuota,
111
204
  acquireRequest,
112
205
  releaseRequest,
113
- configure
206
+ configure,
207
+ consolidateVulnerabilities,
208
+ clearGlobalRouteMap
114
209
  }
@@ -2,13 +2,12 @@
2
2
 
3
3
  const path = require('path')
4
4
  const process = require('process')
5
- const { calculateDDBasePath } = require('../../util')
5
+ const { ddBasePath } = require('../../util')
6
6
  const pathLine = {
7
7
  getNodeModulesPaths,
8
8
  getRelativePath,
9
9
  getNonDDCallSiteFrames,
10
- calculateDDBasePath, // Exported only for test purposes
11
- ddBasePath: calculateDDBasePath(__dirname) // Only for test purposes
10
+ ddBasePath // Exported only for test purposes
12
11
  }
13
12
 
14
13
  const EXCLUDED_PATHS = [
@@ -32,7 +31,7 @@ function getNonDDCallSiteFrames (callSiteFrames, externallyExcludedPaths) {
32
31
 
33
32
  for (const callsite of callSiteFrames) {
34
33
  const filepath = callsite.file
35
- if (!isExcluded(callsite, externallyExcludedPaths) && filepath.indexOf(pathLine.ddBasePath) === -1) {
34
+ if (!isExcluded(callsite, externallyExcludedPaths) && !filepath.includes(pathLine.ddBasePath)) {
36
35
  callsite.path = getRelativePath(filepath)
37
36
  callsite.isInternal = !path.isAbsolute(filepath)
38
37
 
@@ -58,14 +57,14 @@ function isExcluded (callsite, externallyExcludedPaths) {
58
57
  excludedPaths = [...excludedPaths, ...externallyExcludedPaths]
59
58
  }
60
59
 
61
- for (let i = 0; i < excludedPaths.length; i++) {
62
- if (filename.indexOf(excludedPaths[i]) > -1) {
60
+ for (const excludedPath of excludedPaths) {
61
+ if (filename.includes(excludedPath)) {
63
62
  return true
64
63
  }
65
64
  }
66
65
 
67
- for (let i = 0; i < EXCLUDED_PATH_PREFIXES.length; i++) {
68
- if (filename.indexOf(EXCLUDED_PATH_PREFIXES[i]) === 0) {
66
+ for (const EXCLUDED_PATH_PREFIX of EXCLUDED_PATH_PREFIXES) {
67
+ if (filename.indexOf(EXCLUDED_PATH_PREFIX) === 0) {
69
68
  return true
70
69
  }
71
70
  }
@@ -52,7 +52,7 @@ function onModuleLoaded (payload) {
52
52
 
53
53
  function getControls (filename) {
54
54
  if (filename.startsWith('file://')) {
55
- filename = filename.substring(7)
55
+ filename = filename.slice(7)
56
56
  }
57
57
 
58
58
  let key = path.isAbsolute(filename) ? path.relative(process.cwd(), filename) : filename
@@ -74,12 +74,9 @@ function hookModule (filename, module, controlsByFile) {
74
74
  return
75
75
  }
76
76
 
77
- let wrapper
78
- if (type === SANITIZER_TYPE) {
79
- wrapper = wrapSanitizer(target, secureMarks)
80
- } else {
81
- wrapper = wrapInputValidator(target, parameters, secureMarks)
82
- }
77
+ const wrapper = type === SANITIZER_TYPE
78
+ ? wrapSanitizer(target, secureMarks)
79
+ : wrapInputValidator(target, parameters, secureMarks)
83
80
 
84
81
  if (methodName) {
85
82
  parent[methodName] = wrapper
@@ -97,11 +94,7 @@ function hookModule (filename, module, controlsByFile) {
97
94
  function resolve (path, obj, separator = '.') {
98
95
  if (!path) {
99
96
  // esm module with default export
100
- if (obj?.default) {
101
- return { target: obj.default, parent: obj, methodName: 'default' }
102
- } else {
103
- return { target: obj, parent: obj }
104
- }
97
+ return obj?.default ? { target: obj.default, parent: obj, methodName: 'default' } : { target: obj, parent: obj }
105
98
  }
106
99
 
107
100
  const properties = path.split(separator)
@@ -157,19 +150,18 @@ function addSecureMarks (value, secureMarks, createNewTainted = true) {
157
150
 
158
151
  if (typeof value === 'string') {
159
152
  return TaintTrackingOperations.addSecureMark(iastContext, value, secureMarks, createNewTainted)
160
- } else {
161
- iterateObjectStrings(value, (value, levelKeys, parent, lastKey) => {
162
- try {
163
- const securedTainted = TaintTrackingOperations.addSecureMark(iastContext, value, secureMarks, createNewTainted)
164
- if (createNewTainted) {
165
- parent[lastKey] = securedTainted
166
- }
167
- } catch (e) {
168
- // if it is a readonly property, do nothing
169
- }
170
- })
171
- return value
172
153
  }
154
+ iterateObjectStrings(value, (value, levelKeys, parent, lastKey) => {
155
+ try {
156
+ const securedTainted = TaintTrackingOperations.addSecureMark(iastContext, value, secureMarks, createNewTainted)
157
+ if (createNewTainted) {
158
+ parent[lastKey] = securedTainted
159
+ }
160
+ } catch {
161
+ // if it is a readonly property, do nothing
162
+ }
163
+ })
164
+ return value
173
165
  }
174
166
 
175
167
  function disable () {
@@ -10,7 +10,7 @@ const SECURITY_CONTROL_ELEMENT_DELIMITER = ','
10
10
  const INPUT_VALIDATOR_TYPE = 'INPUT_VALIDATOR'
11
11
  const SANITIZER_TYPE = 'SANITIZER'
12
12
 
13
- const validTypes = [INPUT_VALIDATOR_TYPE, SANITIZER_TYPE]
13
+ const validTypes = new Set([INPUT_VALIDATOR_TYPE, SANITIZER_TYPE])
14
14
 
15
15
  function parse (securityControlsConfiguration) {
16
16
  const controls = new Map()
@@ -42,7 +42,7 @@ function parseControl (control) {
42
42
  let [type, marks, file, method, parameters] = fields
43
43
 
44
44
  type = type.trim().toUpperCase()
45
- if (!validTypes.includes(type)) {
45
+ if (!validTypes.has(type)) {
46
46
  log.warn('[ASM] Invalid security control type: %s', type)
47
47
  return
48
48
  }
@@ -60,7 +60,7 @@ function parseControl (control) {
60
60
 
61
61
  try {
62
62
  parameters = getParameters(parameters)
63
- } catch (e) {
63
+ } catch {
64
64
  log.warn('[ASM] Invalid non-numeric security control parameter %s', parameters)
65
65
  return
66
66
  }
@@ -77,11 +77,11 @@ function getSecureMarks (marks) {
77
77
  function getParameters (parameters) {
78
78
  return parameters?.split(SECURITY_CONTROL_ELEMENT_DELIMITER)
79
79
  .map(param => {
80
- const parsedParam = parseInt(param, 10)
80
+ const parsedParam = Number.parseInt(param, 10)
81
81
 
82
82
  // discard the securityControl if there is an incorrect parameter
83
- if (isNaN(parsedParam)) {
84
- throw new Error('Invalid non-numeric security control parameter')
83
+ if (Number.isNaN(parsedParam)) {
84
+ throw new TypeError('Invalid non-numeric security control parameter')
85
85
  }
86
86
 
87
87
  return parsedParam
@@ -3,11 +3,11 @@
3
3
  const NODE_MODULES = 'node_modules'
4
4
 
5
5
  const isPrivateModule = function (file) {
6
- return file && file.indexOf(NODE_MODULES) === -1
6
+ return file && !file.includes(NODE_MODULES)
7
7
  }
8
8
 
9
9
  const isDdTrace = function (file) {
10
- return file && (file.indexOf('dd-trace-js') !== -1 || file.indexOf('dd-trace') !== -1)
10
+ return Boolean(file?.includes('dd-trace'))
11
11
  }
12
12
 
13
13
  module.exports = {
@@ -20,10 +20,10 @@ function taintObject (iastContext, object, type) {
20
20
  try {
21
21
  if (typeof value === 'string') {
22
22
  const tainted = TaintedUtils.newTaintedString(transactionId, value, property, type)
23
- if (!parent) {
24
- result = tainted
25
- } else {
23
+ if (parent) {
26
24
  parent[key] = tainted
25
+ } else {
26
+ result = tainted
27
27
  }
28
28
  } else if (typeof value === 'object' && !visited.has(value)) {
29
29
  visited.add(value)
@@ -41,47 +41,23 @@ function removeTransaction (iastContext) {
41
41
  }
42
42
 
43
43
  function newTaintedString (iastContext, string, name, type) {
44
- let result
45
44
  const transactionId = iastContext?.[IAST_TRANSACTION_ID]
46
- if (transactionId) {
47
- result = TaintedUtils.newTaintedString(transactionId, string, name, type)
48
- } else {
49
- result = string
50
- }
51
- return result
45
+ return transactionId ? TaintedUtils.newTaintedString(transactionId, string, name, type) : string
52
46
  }
53
47
 
54
48
  function newTaintedObject (iastContext, obj, name, type) {
55
- let result
56
49
  const transactionId = iastContext?.[IAST_TRANSACTION_ID]
57
- if (transactionId) {
58
- result = TaintedUtils.newTaintedObject(transactionId, obj, name, type)
59
- } else {
60
- result = obj
61
- }
62
- return result
50
+ return transactionId ? TaintedUtils.newTaintedObject(transactionId, obj, name, type) : obj
63
51
  }
64
52
 
65
53
  function isTainted (iastContext, string) {
66
- let result
67
54
  const transactionId = iastContext?.[IAST_TRANSACTION_ID]
68
- if (transactionId) {
69
- result = TaintedUtils.isTainted(transactionId, string)
70
- } else {
71
- result = false
72
- }
73
- return result
55
+ return transactionId ? TaintedUtils.isTainted(transactionId, string) : false
74
56
  }
75
57
 
76
58
  function getRanges (iastContext, string) {
77
- let result
78
59
  const transactionId = iastContext?.[IAST_TRANSACTION_ID]
79
- if (transactionId) {
80
- result = TaintedUtils.getRanges(transactionId, string)
81
- } else {
82
- result = []
83
- }
84
- return result
60
+ return transactionId ? TaintedUtils.getRanges(transactionId, string) : []
85
61
  }
86
62
 
87
63
  function addSecureMark (iastContext, string, mark, createNewTainted = true) {
@@ -129,13 +129,7 @@ class TaintTrackingPlugin extends SourceIastPlugin {
129
129
  { channelName: 'datadog:url:parse:finish' },
130
130
  ({ input, base, parsed, isURL }) => {
131
131
  const iastContext = getIastContext(storage('legacy').getStore())
132
- let ranges
133
-
134
- if (base) {
135
- ranges = getRanges(iastContext, base)
136
- } else {
137
- ranges = getRanges(iastContext, input)
138
- }
132
+ const ranges = getRanges(iastContext, base || input)
139
133
 
140
134
  if (ranges?.length) {
141
135
  if (isURL) {
@@ -213,7 +207,7 @@ class TaintTrackingPlugin extends SourceIastPlugin {
213
207
 
214
208
  if (Array.isArray(result)) {
215
209
  for (let i = 0; i < result.length && i < this._rowsToTaint; i++) {
216
- const nextName = name ? `${name}.${i}` : '' + i
210
+ const nextName = name ? `${name}.${i}` : String(i)
217
211
  result[i] = this._taintDatabaseResult(result[i], dbOrigin, iastContext, nextName)
218
212
  }
219
213
  } else if (result && typeof result === 'object') {
@@ -1,7 +1,6 @@
1
1
  'use strict'
2
2
 
3
3
  const shimmer = require('../../../../../../datadog-shimmer')
4
- const { storage } = require('../../../../../../datadog-core')
5
4
  const { getIastContext } = require('../../iast-context')
6
5
  const { KAFKA_MESSAGE_KEY, KAFKA_MESSAGE_VALUE } = require('../source-types')
7
6
  const { newTaintedObject, newTaintedString } = require('../operations')
@@ -10,7 +9,7 @@ const { SourceIastPlugin } = require('../../iast-plugin')
10
9
  class KafkaConsumerIastPlugin extends SourceIastPlugin {
11
10
  onConfigure () {
12
11
  this.addSub({ channelName: 'dd-trace:kafkajs:consumer:afterStart', tag: [KAFKA_MESSAGE_KEY, KAFKA_MESSAGE_VALUE] },
13
- ({ message }) => this.taintKafkaMessage(message)
12
+ ({ message, currentStore }) => this.taintKafkaMessage(message, currentStore)
14
13
  )
15
14
  }
16
15
 
@@ -21,8 +20,8 @@ class KafkaConsumerIastPlugin extends SourceIastPlugin {
21
20
  }
22
21
  }
23
22
 
24
- taintKafkaMessage (message) {
25
- const iastContext = getIastContext(storage('legacy').getStore())
23
+ taintKafkaMessage (message, currentStore) {
24
+ const iastContext = getIastContext(currentStore)
26
25
 
27
26
  if (iastContext && message) {
28
27
  const { key, value } = message
@@ -12,7 +12,7 @@ const ddTraceDir = path.join(currentUrl.pathname, '..', '..', '..', '..', '..',
12
12
  let port, rewriter, iastEnabled
13
13
 
14
14
  export async function initialize (data) {
15
- if (rewriter) return Promise.reject(new Error('ALREADY INITIALIZED'))
15
+ if (rewriter) throw new Error('ALREADY INITIALIZED')
16
16
 
17
17
  const { csiMethods, telemetryVerbosity, chainSourceMap, orchestrionConfig } = data
18
18
  port = data.port