Class: Datadog::AppSec::Processor

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

Overview

Processor integrates libddwaf into datadog/appsec

Defined Under Namespace

Classes: AlreadyActiveContextError, Context, NoActiveContextError

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeProcessor

Returns a new instance of Processor.



66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/datadog/appsec/processor.rb', line 66

def initialize
  @ruleset_info = nil
  @addresses = []
  settings = Datadog::AppSec.settings

  unless load_libddwaf && load_ruleset(settings) && create_waf_handle(settings)
    Datadog.logger.warn { 'AppSec is disabled, see logged errors above' }

    return
  end

  apply_denylist_data(settings)
end

Instance Attribute Details

#addressesObject (readonly)

Returns the value of attribute addresses.



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

def addresses
  @addresses
end

#ruleset_infoObject (readonly)

Returns the value of attribute ruleset_info.



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

def ruleset_info
  @ruleset_info
end

Class Method Details

.active_contextObject



41
42
43
# File 'lib/datadog/appsec/processor.rb', line 41

def active_context
  Thread.current[:datadog_current_waf_context]
end

.libddwaf_platformObject



233
234
235
# File 'lib/datadog/appsec/processor.rb', line 233

def libddwaf_platform
  libddwaf_spec ? libddwaf_spec.platform.to_s : 'unknown'
end

.libddwaf_provides_waf?Boolean

check whether libddwaf is required and able to provide the needed feature

Returns:



208
209
210
# File 'lib/datadog/appsec/processor.rb', line 208

def libddwaf_provides_waf?
  defined?(Datadog::AppSec::WAF) ? true : false
end

.libddwaf_specObject



229
230
231
# File 'lib/datadog/appsec/processor.rb', line 229

def libddwaf_spec
  Gem.loaded_specs['libddwaf']
end

.require_libddwafObject

libddwaf raises a LoadError on unsupported platforms; it may at some point succeed in being required yet not provide a specific needed feature.



214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/datadog/appsec/processor.rb', line 214

def require_libddwaf
  Datadog.logger.debug { "libddwaf platform: #{libddwaf_platform}" }

  require 'libddwaf'

  true
rescue LoadError => e
  Datadog.logger.error do
    'libddwaf failed to load,' \
      "installed platform: #{libddwaf_platform} ruby platforms: #{ruby_platforms} error: #{e.inspect}"
  end

  false
end

.ruby_platformsObject



237
238
239
# File 'lib/datadog/appsec/processor.rb', line 237

def ruby_platforms
  Gem.platforms.map(&:to_s)
end

Instance Method Details

#activate_contextObject

Raises:



88
89
90
91
92
93
94
95
# File 'lib/datadog/appsec/processor.rb', line 88

def activate_context
  existing_active_context = Processor.active_context
  raise AlreadyActiveContextError if existing_active_context

  context = new_context
  Processor.send(:active_context=, context)
  context
end

#deactivate_contextObject

Raises:



97
98
99
100
101
102
103
# File 'lib/datadog/appsec/processor.rb', line 97

def deactivate_context
  context = Processor.active_context
  raise NoActiveContextError unless context

  Processor.send(:reset_active_context)
  context.finalize
end

#finalizeObject



113
114
115
# File 'lib/datadog/appsec/processor.rb', line 113

def finalize
  @handle.finalize
end

#new_contextObject



84
85
86
# File 'lib/datadog/appsec/processor.rb', line 84

def new_context
  Context.new(self)
end

#ready?Boolean

Returns:



80
81
82
# File 'lib/datadog/appsec/processor.rb', line 80

def ready?
  !@ruleset.nil? && !@handle.nil?
end

#toggle_rules(map) ⇒ Object



109
110
111
# File 'lib/datadog/appsec/processor.rb', line 109

def toggle_rules(map)
  @handle.toggle_rules(map)
end

#update_rule_data(data) ⇒ Object



105
106
107
# File 'lib/datadog/appsec/processor.rb', line 105

def update_rule_data(data)
  @handle.update_rule_data(data)
end