Skip to content

Commit cf6bd45

Browse files
authored
Merge pull request #4029 from DataDog/appsec-55378-refactor-processor-context
[APPSEC-55378] Move AppSec Context creation into Processor
2 parents 7d65372 + 4f25696 commit cf6bd45

File tree

7 files changed

+58
-31
lines changed

7 files changed

+58
-31
lines changed

lib/datadog/appsec/processor.rb

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
# frozen_string_literal: true
22

3+
require_relative 'processor/context'
4+
35
module Datadog
46
module AppSec
57
# Processor integrates libddwaf into datadog/appsec
68
class Processor
79
attr_reader :diagnostics, :addresses
810

911
def initialize(ruleset:, telemetry:)
12+
@telemetry = telemetry
1013
@diagnostics = nil
1114
@addresses = []
15+
1216
settings = Datadog.configuration.appsec
13-
@telemetry = telemetry
1417

1518
# TODO: Refactor to make it easier to test
1619
unless require_libddwaf && libddwaf_provides_waf? && create_waf_handle(settings, ruleset)
@@ -26,9 +29,9 @@ def finalize
2629
@handle.finalize
2730
end
2831

29-
protected
30-
31-
attr_reader :handle
32+
def new_context
33+
Context.new(@handle, telemetry: @telemetry)
34+
end
3235

3336
private
3437

lib/datadog/appsec/processor/context.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ class Processor
77
class Context
88
attr_reader :time_ns, :time_ext_ns, :timeouts, :events
99

10-
def initialize(processor)
11-
@context = Datadog::AppSec::WAF::Context.new(processor.send(:handle))
10+
def initialize(handle, telemetry:)
11+
@context = Datadog::AppSec::WAF::Context.new(handle)
12+
@telemetry = telemetry
13+
1214
@time_ns = 0.0
1315
@time_ext_ns = 0.0
1416
@timeouts = 0

lib/datadog/appsec/scope.rb

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# frozen_string_literal: true
22

3-
require_relative 'processor/context'
4-
53
module Datadog
64
module AppSec
75
# Capture context essential to consistently call processor and report via traces
@@ -22,8 +20,7 @@ class << self
2220
def activate_scope(trace, service_entry_span, processor)
2321
raise ActiveScopeError, 'another scope is active, nested scopes are not supported' if active_scope
2422

25-
context = Datadog::AppSec::Processor::Context.new(processor)
26-
23+
context = processor.new_context
2724
self.active_scope = new(trace, service_entry_span, context)
2825
end
2926

sig/datadog/appsec/processor.rbs

+18-8
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,39 @@
11
module Datadog
22
module AppSec
33
class Processor
4-
def self.active_context: () -> Context
4+
type rule = bool | ::Integer | ::String | ::Hash[::String, rule] | ::Array[rule]
5+
type ruleset = ::Hash[::String, rule]
56

6-
private
7+
@telemetry: Core::Telemetry::Component
8+
9+
@diagnostics: WAF::LibDDWAF::Object?
10+
11+
@addresses: ::Array[::String]
12+
13+
@handle: WAF::Handle
714

815
attr_reader diagnostics: WAF::LibDDWAF::Object?
16+
917
attr_reader addresses: ::Array[::String]
1018

11-
@handle: WAF::Handle
12-
@ruleset: ::Hash[::String, untyped]
13-
@addresses: ::Array[::String]
19+
def initialize: (ruleset: ruleset, telemetry: Core::Telemetry::Component) -> void
1420

15-
def initialize: (ruleset: ::Hash[untyped, untyped], telemetry: Core::Telemetry::Component) -> void
1621
def ready?: () -> bool
22+
1723
def finalize: () -> void
1824

19-
attr_reader handle: untyped
25+
def new_context: () -> Context
2026

2127
private
2228

2329
def require_libddwaf: () -> bool
30+
2431
def libddwaf_provides_waf?: () -> bool
25-
def create_waf_handle: (Core::Configuration::Settings::_AppSec settings, ::Hash[String, untyped] ruleset) -> bool
32+
33+
def create_waf_handle: (Core::Configuration::Settings::_AppSec settings, ruleset ruleset) -> bool
34+
2635
def libddwaf_platform: () -> ::String
36+
2737
def ruby_platforms: () -> ::Array[::String]
2838
end
2939
end

sig/datadog/appsec/processor/context.rbs

+20-6
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,38 @@ module Datadog
22
module AppSec
33
class Processor
44
class Context
5-
type event = untyped
6-
type data = WAF::data
5+
@context: WAF::Context
6+
7+
@telemetry: Core::Telemetry::Component
8+
9+
@time_ns: ::Float
10+
11+
@time_ext_ns: ::Float
12+
13+
@timeouts: ::Integer
14+
15+
@events: ::Array[untyped]
16+
17+
@run_mutex: ::Thread::Mutex
718

819
attr_reader time_ns: ::Float
20+
921
attr_reader time_ext_ns: ::Float
22+
1023
attr_reader timeouts: ::Integer
11-
attr_reader events: ::Array[event]
1224

13-
@context: WAF::Context
25+
attr_reader events: ::Array[untyped]
1426

15-
@run_mutex: ::Thread::Mutex
27+
def initialize: (WAF::Handle handle, telemetry: Core::Telemetry::Component) -> void
1628

17-
def initialize: (Processor processor) -> void
1829
def run: (Hash[untyped, untyped] input, ?::Integer timeout) -> WAF::Result
30+
1931
def extract_schema: () -> WAF::Result?
32+
2033
def finalize: () -> void
2134

2235
private
36+
2337
def extract_schema?: () -> bool
2438
end
2539
end

spec/datadog/appsec/processor/context_spec.rb

+2-7
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
let(:input_client_ip) { { 'http.client_ip' => '1.2.3.4' } }
1919

2020
let(:client_ip) { '1.2.3.4' }
21-
2221
let(:input) { input_scanner }
23-
2422
let(:processor) { Datadog::AppSec::Processor.new(ruleset: ruleset, telemetry: telemetry) }
2523

2624
let(:run_count) { 1 }
@@ -36,12 +34,9 @@
3634
results.first
3735
end
3836

39-
subject(:context) { described_class.new(processor) }
40-
41-
before do
42-
runs
43-
end
37+
subject(:context) { processor.new_context }
4438

39+
before { runs }
4540
after do
4641
context.finalize
4742
processor.finalize

spec/datadog/appsec/processor_spec.rb

+6
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,10 @@ def diagnostics
283283
end
284284
end
285285
end
286+
287+
describe '#new_context' do
288+
let(:processor) { described_class.new(ruleset: ruleset, telemetry: telemetry) }
289+
290+
it { expect(processor.new_context).to be_instance_of(described_class::Context) }
291+
end
286292
end

0 commit comments

Comments
 (0)