Class: Datadog::AppSec::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/datadog/appsec/context.rb

Overview

This class accumulates the context over the request life-cycle and exposes interface sufficient for instrumentation to perform threat detection.

Constant Summary collapse

ActiveContextError =
Class.new(StandardError)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(trace, span, waf_runner) ⇒ Context

Returns a new instance of Context.



35
36
37
38
39
40
41
42
# File 'lib/datadog/appsec/context.rb', line 35

def initialize(trace, span, waf_runner)
  @trace = trace
  @span = span
  @events = []
  @waf_runner = waf_runner
  @metrics = Metrics::Collector.new
  @interrupted = false
end

Instance Attribute Details

#eventsObject (readonly)

TODO: add delegators for active trace span



14
15
16
# File 'lib/datadog/appsec/context.rb', line 14

def events
  @events
end

#spanObject (readonly)

TODO: add delegators for active trace span



14
15
16
# File 'lib/datadog/appsec/context.rb', line 14

def span
  @span
end

#traceObject (readonly)

TODO: add delegators for active trace span



14
15
16
# File 'lib/datadog/appsec/context.rb', line 14

def trace
  @trace
end

Class Method Details

.activate(context) ⇒ Object

Raises:

  • (ArgumentError)


17
18
19
20
21
22
# File 'lib/datadog/appsec/context.rb', line 17

def activate(context)
  raise ArgumentError, 'not a Datadog::AppSec::Context' unless context.instance_of?(Context)
  raise ActiveContextError, 'another context is active, nested contexts are not supported' if active

  Thread.current[Ext::ACTIVE_CONTEXT_KEY] = context
end

.activeObject



30
31
32
# File 'lib/datadog/appsec/context.rb', line 30

def active
  Thread.current[Ext::ACTIVE_CONTEXT_KEY]
end

.deactivateObject



24
25
26
27
28
# File 'lib/datadog/appsec/context.rb', line 24

def deactivate
  active&.finalize!
ensure
  Thread.current[Ext::ACTIVE_CONTEXT_KEY] = nil
end

Instance Method Details

#export_metricsObject



80
81
82
83
84
85
# File 'lib/datadog/appsec/context.rb', line 80

def export_metrics
  return if @span.nil?

  Metrics::Exporter.export_waf_metrics(@metrics.waf, @span)
  Metrics::Exporter.export_rasp_metrics(@metrics.rasp, @span)
end

#export_request_telemetryObject



87
88
89
90
91
# File 'lib/datadog/appsec/context.rb', line 87

def export_request_telemetry
  return if @trace.nil?

  Metrics::TelemetryExporter.export_waf_request_metrics(@metrics.waf, self)
end

#extract_schemaObject



76
77
78
# File 'lib/datadog/appsec/context.rb', line 76

def extract_schema
  @waf_runner.run({'waf.context.processor' => {'extract-schema' => true}}, {})
end

#finalize!Object



93
94
95
# File 'lib/datadog/appsec/context.rb', line 93

def finalize!
  @waf_runner.finalize!
end

#interrupted?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/datadog/appsec/context.rb', line 64

def interrupted?
  @interrupted
end

#mark_as_interrupted!Object



60
61
62
# File 'lib/datadog/appsec/context.rb', line 60

def mark_as_interrupted!
  @interrupted = true
end

#run_rasp(type, persistent_data, ephemeral_data, timeout = WAF::LibDDWAF::DDWAF_RUN_TIMEOUT, phase: nil) ⇒ Object



51
52
53
54
55
56
57
58
# File 'lib/datadog/appsec/context.rb', line 51

def run_rasp(type, persistent_data, ephemeral_data, timeout = WAF::LibDDWAF::DDWAF_RUN_TIMEOUT, phase: nil)
  result = @waf_runner.run(persistent_data, ephemeral_data, timeout)

  Metrics::Telemetry.report_rasp(type, result, phase: phase)
  @metrics.record_rasp(result, type: type, phase: phase)

  result
end

#run_waf(persistent_data, ephemeral_data, timeout = WAF::LibDDWAF::DDWAF_RUN_TIMEOUT) ⇒ Object



44
45
46
47
48
49
# File 'lib/datadog/appsec/context.rb', line 44

def run_waf(persistent_data, ephemeral_data, timeout = WAF::LibDDWAF::DDWAF_RUN_TIMEOUT)
  result = @waf_runner.run(persistent_data, ephemeral_data, timeout)

  @metrics.record_waf(result)
  result
end

#waf_runner_known_addressesObject



72
73
74
# File 'lib/datadog/appsec/context.rb', line 72

def waf_runner_known_addresses
  @waf_runner.waf_addresses
end

#waf_runner_ruleset_versionObject



68
69
70
# File 'lib/datadog/appsec/context.rb', line 68

def waf_runner_ruleset_version
  @waf_runner.ruleset_version
end