libddwaf 1.22.0.0.4 → 1.24.1.0.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug.md +32 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +17 -0
  4. data/.github/actions/docker-build-ruby/Dockerfile +5 -0
  5. data/.github/actions/docker-build-ruby/Dockerfile.alpine +7 -0
  6. data/.github/actions/docker-build-ruby/Dockerfile.jruby +6 -0
  7. data/.github/actions/docker-build-ruby/action.yml +46 -0
  8. data/.github/workflows/lint.yml +34 -0
  9. data/.github/workflows/package.yml +130 -0
  10. data/.github/workflows/test-for-memory-leaks.yml +15 -0
  11. data/.github/workflows/test.yml +123 -0
  12. data/.gitignore +10 -0
  13. data/.steepignore +4 -0
  14. data/CHANGELOG.md +21 -2
  15. data/CONTRIBUTING.md +84 -0
  16. data/Dockerfile +11 -0
  17. data/Steepfile +21 -0
  18. data/lib/datadog/appsec/waf/context.rb +24 -38
  19. data/lib/datadog/appsec/waf/converter.rb +62 -69
  20. data/lib/datadog/appsec/waf/errors.rb +19 -0
  21. data/lib/datadog/appsec/waf/handle.rb +30 -77
  22. data/lib/datadog/appsec/waf/handle_builder.rb +91 -0
  23. data/lib/datadog/appsec/waf/lib_ddwaf.rb +94 -97
  24. data/lib/datadog/appsec/waf/version.rb +3 -3
  25. data/lib/datadog/appsec/waf.rb +9 -7
  26. data/lib/libddwaf.rb +1 -1
  27. data/libddwaf.gemspec +8 -13
  28. data/shell.nix +35 -0
  29. data/sig/datadog/appsec/waf/context.rbs +5 -15
  30. data/sig/datadog/appsec/waf/errors.rbs +20 -0
  31. data/sig/datadog/appsec/waf/handle.rbs +6 -27
  32. data/sig/datadog/appsec/waf/handle_builder.rbs +23 -0
  33. data/sig/datadog/appsec/waf/lib_ddwaf.rbs +19 -17
  34. metadata +23 -10
  35. data/vendor/libddwaf/libddwaf-1.22.0-darwin-arm64/lib/libddwaf.dylib +0 -0
  36. data/vendor/libddwaf/libddwaf-1.22.0-darwin-x86_64/lib/libddwaf.dylib +0 -0
  37. data/vendor/libddwaf/libddwaf-1.22.0-linux-aarch64/lib/libddwaf.so +0 -0
  38. data/vendor/libddwaf/libddwaf-1.22.0-linux-x86_64/lib/libddwaf.so +0 -0
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi'
4
- require 'datadog/appsec/waf/version'
3
+ require "ffi"
4
+ require "datadog/appsec/waf/version"
5
5
 
6
6
  module Datadog
7
7
  module AppSec
@@ -9,28 +9,27 @@ module Datadog
9
9
  # FFI-binding for C-libddwaf
10
10
  # See https://github.com/DataDog/libddwaf
11
11
  module LibDDWAF
12
- # An exception binding raises in most of the cases
13
- class Error < StandardError
14
- attr_reader :diagnostics
12
+ DEFAULT_MAX_CONTAINER_SIZE = 256
13
+ DEFAULT_MAX_CONTAINER_DEPTH = 20
14
+ DEFAULT_MAX_STRING_LENGTH = 16_384 # in bytes, UTF-8 worst case being 4x size in terms of code point
15
15
 
16
- def initialize(msg, diagnostics: nil)
17
- @diagnostics = diagnostics
16
+ DDWAF_MAX_CONTAINER_SIZE = 256
17
+ DDWAF_MAX_CONTAINER_DEPTH = 20
18
+ DDWAF_MAX_STRING_LENGTH = 4096
18
19
 
19
- super(msg)
20
- end
21
- end
20
+ DDWAF_RUN_TIMEOUT = 5000
22
21
 
23
22
  extend ::FFI::Library
24
23
 
25
24
  def self.local_os
26
- if RUBY_ENGINE == 'jruby'
27
- os_name = java.lang.System.get_property('os.name')
25
+ if RUBY_ENGINE == "jruby"
26
+ os_name = java.lang.System.get_property("os.name")
28
27
 
29
28
  os = case os_name
30
- when /linux/i then 'linux'
31
- when /mac/i then 'darwin'
32
- else raise Error, "unsupported JRuby os.name: #{os_name.inspect}"
33
- end
29
+ when /linux/i then "linux"
30
+ when /mac/i then "darwin"
31
+ else raise Error, "unsupported JRuby os.name: #{os_name.inspect}"
32
+ end
34
33
 
35
34
  return os
36
35
  end
@@ -39,23 +38,23 @@ module Datadog
39
38
  end
40
39
 
41
40
  def self.local_version
42
- return nil unless local_os == 'linux'
41
+ return nil unless local_os == "linux"
43
42
 
44
43
  # Old rubygems don't handle non-gnu linux correctly
45
44
  return ::Regexp.last_match(1) if RUBY_PLATFORM =~ /linux-(.+)$/
46
45
 
47
- 'gnu'
46
+ "gnu"
48
47
  end
49
48
 
50
49
  def self.local_cpu
51
- if RUBY_ENGINE == 'jruby'
52
- os_arch = java.lang.System.get_property('os.arch')
50
+ if RUBY_ENGINE == "jruby"
51
+ os_arch = java.lang.System.get_property("os.arch")
53
52
 
54
53
  cpu = case os_arch
55
- when 'amd64' then 'x86_64'
56
- when 'aarch64' then local_os == 'darwin' ? 'arm64' : 'aarch64'
57
- else raise Error, "unsupported JRuby os.arch: #{os_arch.inspect}"
58
- end
54
+ when "amd64" then "x86_64"
55
+ when "aarch64" then (local_os == "darwin") ? "arm64" : "aarch64"
56
+ else raise Error, "unsupported JRuby os.arch: #{os_arch.inspect}"
57
+ end
59
58
 
60
59
  return cpu
61
60
  end
@@ -64,15 +63,15 @@ module Datadog
64
63
  end
65
64
 
66
65
  def self.source_dir
67
- __dir__ || raise('__dir__ is nil: eval?')
66
+ __dir__ || raise("__dir__ is nil: eval?")
68
67
  end
69
68
 
70
69
  def self.vendor_dir
71
- File.join(source_dir, '../../../../vendor')
70
+ File.join(source_dir, "../../../../vendor")
72
71
  end
73
72
 
74
73
  def self.libddwaf_vendor_dir
75
- File.join(vendor_dir, 'libddwaf')
74
+ File.join(vendor_dir, "libddwaf")
76
75
  end
77
76
 
78
77
  def self.shared_lib_triplet(version: local_version)
@@ -81,34 +80,31 @@ module Datadog
81
80
 
82
81
  def self.libddwaf_dir
83
82
  default = File.join(libddwaf_vendor_dir,
84
- "libddwaf-#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{shared_lib_triplet}")
83
+ "libddwaf-#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{shared_lib_triplet}")
85
84
  candidates = [
86
85
  default
87
86
  ]
88
87
 
89
- if local_os == 'linux'
88
+ if local_os == "linux"
90
89
  candidates << File.join(libddwaf_vendor_dir,
91
- "libddwaf-#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{shared_lib_triplet(version: nil)}")
90
+ "libddwaf-#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{shared_lib_triplet(version: nil)}")
92
91
  end
93
92
 
94
93
  candidates.find { |d| Dir.exist?(d) } || default
95
94
  end
96
95
 
97
96
  def self.shared_lib_extname
98
- if Gem::Platform.local.os == 'darwin'
99
- '.dylib'
100
- elsif Gem::Platform.local.os == 'java' && java.lang.System.get_property('os.name').match(/mac/i)
101
- '.dylib'
97
+ if Gem::Platform.local.os == "darwin"
98
+ ".dylib"
99
+ elsif Gem::Platform.local.os == "java" && java.lang.System.get_property("os.name").match(/mac/i)
100
+ ".dylib"
102
101
  else
103
- '.so'
102
+ ".so"
104
103
  end
105
104
  end
106
105
 
107
106
  def self.shared_lib_path
108
- variant = "#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{local_os}-#{local_cpu}"
109
- libddwaf_dir = File.join(source_dir, "../../../../vendor/libddwaf/libddwaf-#{variant}")
110
-
111
- File.join(libddwaf_dir, 'lib', "libddwaf#{shared_lib_extname}")
107
+ File.join(libddwaf_dir, "lib", "libddwaf#{shared_lib_extname}")
112
108
  end
113
109
 
114
110
  ffi_lib [shared_lib_path]
@@ -119,15 +115,15 @@ module Datadog
119
115
 
120
116
  # ddwaf::object data structure
121
117
 
122
- DDWAF_OBJ_TYPE = enum :ddwaf_obj_invalid, 0,
123
- :ddwaf_obj_signed, 1 << 0,
124
- :ddwaf_obj_unsigned, 1 << 1,
125
- :ddwaf_obj_string, 1 << 2,
126
- :ddwaf_obj_array, 1 << 3,
127
- :ddwaf_obj_map, 1 << 4,
128
- :ddwaf_obj_bool, 1 << 5,
129
- :ddwaf_obj_float, 1 << 6,
130
- :ddwaf_obj_null, 1 << 7
118
+ DDWAF_OBJ_TYPE = enum :ddwaf_obj_invalid, 0,
119
+ :ddwaf_obj_signed, 1 << 0,
120
+ :ddwaf_obj_unsigned, 1 << 1,
121
+ :ddwaf_obj_string, 1 << 2,
122
+ :ddwaf_obj_array, 1 << 3,
123
+ :ddwaf_obj_map, 1 << 4,
124
+ :ddwaf_obj_bool, 1 << 5,
125
+ :ddwaf_obj_float, 1 << 6,
126
+ :ddwaf_obj_null, 1 << 7
131
127
 
132
128
  typedef DDWAF_OBJ_TYPE, :ddwaf_obj_type
133
129
 
@@ -158,21 +154,21 @@ module Datadog
158
154
  # Ruby representation of C union
159
155
  class ObjectValueUnion < ::FFI::Union
160
156
  layout :stringValue, :charptr,
161
- :uintValue, :uint64,
162
- :intValue, :int64,
163
- :array, :pointer,
164
- :boolean, :bool,
165
- :f64, :double
157
+ :uintValue, :uint64,
158
+ :intValue, :int64,
159
+ :array, :pointer,
160
+ :boolean, :bool,
161
+ :f64, :double
166
162
  end
167
163
 
168
164
  # Ruby representation of ddwaf_object
169
165
  # See https://github.com/DataDog/libddwaf/blob/10e3a1dfc7bc9bb8ab11a09a9f8b6b339eaf3271/include/ddwaf.h#L94C1-L115C3
170
166
  class Object < ::FFI::Struct
171
- layout :parameterName, :charptr,
172
- :parameterNameLength, :uint64,
173
- :valueUnion, ObjectValueUnion,
174
- :nbEntries, :uint64,
175
- :type, :ddwaf_obj_type
167
+ layout :parameterName, :charptr,
168
+ :parameterNameLength, :uint64,
169
+ :valueUnion, ObjectValueUnion,
170
+ :nbEntries, :uint64,
171
+ :type, :ddwaf_obj_type
176
172
  end
177
173
 
178
174
  typedef Object.by_ref, :ddwaf_object
@@ -217,51 +213,62 @@ module Datadog
217
213
  ObjectFree = attach_function :ddwaf_object_free, [:ddwaf_object], :void
218
214
  ObjectNoFree = ::FFI::Pointer::NULL
219
215
 
220
- # main handle
216
+ # handle builder
221
217
 
218
+ typedef :pointer, :ddwaf_builder
222
219
  typedef :pointer, :ddwaf_handle
223
- typedef Object.by_ref, :ddwaf_rule
220
+ typedef :pointer, :ddwaf_diagnostics
224
221
 
225
222
  callback :ddwaf_object_free_fn, [:ddwaf_object], :void
226
223
 
227
224
  # Ruby representation of ddwaf_config
228
225
  # https://github.com/DataDog/libddwaf/blob/10e3a1dfc7bc9bb8ab11a09a9f8b6b339eaf3271/include/ddwaf.h#L129-L152
229
- class Config < ::FFI::Struct
226
+ class HandleBuilderConfig < ::FFI::Struct
230
227
  # Ruby representation of ddwaf_config_limits
231
228
  # https://github.com/DataDog/libddwaf/blob/10e3a1dfc7bc9bb8ab11a09a9f8b6b339eaf3271/include/ddwaf.h#L131-L138
232
229
  class Limits < ::FFI::Struct
233
- layout :max_container_size, :uint32,
234
- :max_container_depth, :uint32,
235
- :max_string_length, :uint32
230
+ layout :max_container_size, :uint32,
231
+ :max_container_depth, :uint32,
232
+ :max_string_length, :uint32
236
233
  end
237
234
 
238
235
  # Ruby representation of ddwaf_config_obfuscator
239
236
  # https://github.com/DataDog/libddwaf/blob/10e3a1dfc7bc9bb8ab11a09a9f8b6b339eaf3271/include/ddwaf.h#L141-L146
240
237
  class Obfuscator < ::FFI::Struct
241
- layout :key_regex, :pointer, # should be :charptr
242
- :value_regex, :pointer # should be :charptr
238
+ layout :key_regex, :pointer, # should be :charptr
239
+ :value_regex, :pointer # should be :charptr
243
240
  end
244
241
 
245
- layout :limits, Limits,
246
- :obfuscator, Obfuscator,
247
- :free_fn, :pointer # :ddwaf_object_free_fn
242
+ layout :limits, Limits,
243
+ :obfuscator, Obfuscator,
244
+ :free_fn, :pointer # :ddwaf_object_free_fn
248
245
  end
249
246
 
250
- typedef Config.by_ref, :ddwaf_config
247
+ typedef HandleBuilderConfig.by_ref, :ddwaf_config
248
+
249
+ attach_function :ddwaf_builder_init, [:ddwaf_config], :ddwaf_builder
250
+ attach_function :ddwaf_builder_destroy, [:ddwaf_builder], :void
251
+
252
+ attach_function :ddwaf_builder_add_or_update_config, [:ddwaf_builder, :string, :size_t, :ddwaf_object, :ddwaf_diagnostics], :bool
253
+ attach_function :ddwaf_builder_remove_config, [:ddwaf_builder, :string, :size_t], :bool
254
+
255
+ attach_function :ddwaf_builder_build_instance, [:ddwaf_builder], :ddwaf_handle
256
+
257
+ # handle
258
+
259
+ callback :ddwaf_object_free_fn, [:ddwaf_object], :void
251
260
 
252
- attach_function :ddwaf_init, [:ddwaf_rule, :ddwaf_config, :ddwaf_object], :ddwaf_handle
253
- attach_function :ddwaf_update, [:ddwaf_handle, :ddwaf_object, :ddwaf_object], :ddwaf_handle
254
261
  attach_function :ddwaf_destroy, [:ddwaf_handle], :void
255
262
 
256
263
  attach_function :ddwaf_known_addresses, [:ddwaf_handle, UInt32Ptr], :charptrptr
257
264
 
258
265
  # updating
259
266
 
260
- DDWAF_RET_CODE = enum :ddwaf_err_internal, -3,
261
- :ddwaf_err_invalid_object, -2,
262
- :ddwaf_err_invalid_argument, -1,
263
- :ddwaf_ok, 0,
264
- :ddwaf_match, 1
267
+ DDWAF_RET_CODE = enum :ddwaf_err_internal, -3,
268
+ :ddwaf_err_invalid_object, -2,
269
+ :ddwaf_err_invalid_argument, -1,
270
+ :ddwaf_ok, 0,
271
+ :ddwaf_match, 1
265
272
  typedef DDWAF_RET_CODE, :ddwaf_ret_code
266
273
 
267
274
  # running
@@ -274,11 +281,11 @@ module Datadog
274
281
  # Ruby representation of ddwaf_result
275
282
  # See https://github.com/DataDog/libddwaf/blob/10e3a1dfc7bc9bb8ab11a09a9f8b6b339eaf3271/include/ddwaf.h#L154-L173
276
283
  class Result < ::FFI::Struct
277
- layout :timeout, :bool,
278
- :events, Object,
279
- :actions, Object,
280
- :derivatives, Object,
281
- :total_runtime, :uint64
284
+ layout :timeout, :bool,
285
+ :events, Object,
286
+ :actions, Object,
287
+ :derivatives, Object,
288
+ :total_runtime, :uint64
282
289
  end
283
290
 
284
291
  typedef Result.by_ref, :ddwaf_result
@@ -290,26 +297,16 @@ module Datadog
290
297
  # logging
291
298
 
292
299
  DDWAF_LOG_LEVEL = enum :ddwaf_log_trace,
293
- :ddwaf_log_debug,
294
- :ddwaf_log_info,
295
- :ddwaf_log_warn,
296
- :ddwaf_log_error,
297
- :ddwaf_log_off
300
+ :ddwaf_log_debug,
301
+ :ddwaf_log_info,
302
+ :ddwaf_log_warn,
303
+ :ddwaf_log_error,
304
+ :ddwaf_log_off
298
305
  typedef DDWAF_LOG_LEVEL, :ddwaf_log_level
299
306
 
300
307
  callback :ddwaf_log_cb, [:ddwaf_log_level, :string, :string, :uint, :charptr, :uint64], :void
301
308
 
302
309
  attach_function :ddwaf_set_log_cb, [:ddwaf_log_cb, :ddwaf_log_level], :bool
303
-
304
- DEFAULT_MAX_CONTAINER_SIZE = 256
305
- DEFAULT_MAX_CONTAINER_DEPTH = 20
306
- DEFAULT_MAX_STRING_LENGTH = 16_384 # in bytes, UTF-8 worst case being 4x size in terms of code point)
307
-
308
- DDWAF_MAX_CONTAINER_SIZE = 256
309
- DDWAF_MAX_CONTAINER_DEPTH = 20
310
- DDWAF_MAX_STRING_LENGTH = 4096
311
-
312
- DDWAF_RUN_TIMEOUT = 5000
313
310
  end
314
311
  end
315
312
  end
@@ -2,11 +2,11 @@ module Datadog
2
2
  module AppSec
3
3
  module WAF
4
4
  module VERSION
5
- BASE_STRING = '1.22.0'
5
+ BASE_STRING = "1.24.1"
6
6
  # NOTE: Every change to the `BASE_STRING` should be accompanied
7
7
  # by a reset of the patch version in the `STRING` below.
8
- STRING = "#{BASE_STRING}.0.4"
9
- MINIMUM_RUBY_VERSION = '2.5'
8
+ STRING = "#{BASE_STRING}.0.0"
9
+ MINIMUM_RUBY_VERSION = "2.5"
10
10
  end
11
11
  end
12
12
  end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'datadog/appsec/waf/lib_ddwaf'
4
-
5
- require 'datadog/appsec/waf/converter'
6
- require 'datadog/appsec/waf/result'
7
- require 'datadog/appsec/waf/context'
8
- require 'datadog/appsec/waf/handle'
9
- require 'datadog/appsec/waf/version'
3
+ require "datadog/appsec/waf/lib_ddwaf"
4
+
5
+ require "datadog/appsec/waf/handle_builder"
6
+ require "datadog/appsec/waf/handle"
7
+ require "datadog/appsec/waf/converter"
8
+ require "datadog/appsec/waf/errors"
9
+ require "datadog/appsec/waf/result"
10
+ require "datadog/appsec/waf/context"
11
+ require "datadog/appsec/waf/version"
10
12
 
11
13
  module Datadog
12
14
  module AppSec
data/lib/libddwaf.rb CHANGED
@@ -1 +1 @@
1
- require 'datadog/appsec/waf'
1
+ require "datadog/appsec/waf"
data/libddwaf.gemspec CHANGED
@@ -24,19 +24,14 @@ Gem::Specification.new do |spec|
24
24
  raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
25
25
  end
26
26
 
27
- libddwaf_version = Datadog::AppSec::WAF::VERSION::BASE_STRING
28
-
29
- spec.files = ["libddwaf.gemspec"]
30
- spec.files.concat(Dir.glob("lib/**/*.rb"))
31
- spec.files.concat(Dir.glob("{vendor/rbs,sig}/**/*.rbs"))
32
- spec.files.concat(Dir.glob("{README,CHANGELOG,LICENSE,NOTICE}*"))
33
- spec.files.concat(%W[
34
- vendor/libddwaf/libddwaf-#{libddwaf_version}-darwin-arm64/lib/libddwaf.dylib
35
- vendor/libddwaf/libddwaf-#{libddwaf_version}-darwin-x86_64/lib/libddwaf.dylib
36
- vendor/libddwaf/libddwaf-#{libddwaf_version}-linux-aarch64/lib/libddwaf.so
37
- vendor/libddwaf/libddwaf-#{libddwaf_version}-linux-x86_64/lib/libddwaf.so
38
- ])
39
-
27
+ spec.files =
28
+ `git ls-files -z`
29
+ .split("\x0")
30
+ .reject { |f| f.match(%r{^(spec|[.]circleci)/}) }
31
+ .reject do |f|
32
+ [".dockerignore", ".env", ".rspec", ".rubocop.yml", ".rubocop_todo.yml",
33
+ ".simplecov", "Gemfile", "Rakefile", "docker-compose.yml"].include?(f)
34
+ end
40
35
  spec.require_paths = ["lib"]
41
36
 
42
37
  spec.add_dependency "ffi", "~> 1.0"
data/shell.nix ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ # use the environment channel
3
+ pkgs ? import <nixpkgs> {},
4
+
5
+ # use a pinned package state
6
+ pinned ? import(fetchTarball("https://github.com/NixOS/nixpkgs/archive/14d9b465c71.tar.gz")) {},
7
+ }:
8
+ let
9
+ # specify ruby version to use
10
+ ruby = pinned.ruby_3_1;
11
+
12
+ # control llvm/clang version (e.g for packages built form source)
13
+ llvm = pinned.llvmPackages_12;
14
+ in llvm.stdenv.mkDerivation {
15
+ # unique project name for this environment derivation
16
+ name = "libddwaf-rb.devshell";
17
+
18
+ buildInputs = [
19
+ ruby
20
+ ];
21
+
22
+ shellHook = ''
23
+ # get major.minor.0 ruby version
24
+ export RUBY_VERSION="$(ruby -e 'puts RUBY_VERSION.gsub(/\d+$/, "0")')"
25
+
26
+ # make gem install work in-project, compatibly with bundler
27
+ export GEM_HOME="$(pwd)/vendor/bundle/ruby/$RUBY_VERSION"
28
+
29
+ # make bundle work in-project
30
+ export BUNDLE_PATH="$(pwd)/vendor/bundle"
31
+
32
+ # enable calling gem scripts without bundle exec
33
+ export PATH="$GEM_HOME/bin:$PATH"
34
+ '';
35
+ }
@@ -2,31 +2,21 @@ module Datadog
2
2
  module AppSec
3
3
  module WAF
4
4
  class Context
5
- @context_obj: ::FFI::Pointer
6
-
7
- @valid: bool
5
+ @context_ptr: ::FFI::Pointer
8
6
 
9
7
  @retained: Array[untyped]
10
8
 
11
9
  RESULT_CODE: ::Hash[::Symbol, ::Symbol]
12
10
 
13
- attr_reader context_obj: ::FFI::Pointer
14
-
15
- def initialize: (Handle handle) -> void
11
+ def initialize: (::FFI::Pointer context_ptr) -> void
16
12
 
17
- def finalize: () -> void
13
+ def finalize!: () -> void
18
14
 
19
- def run: (WAF::data persistent_data, WAF::data ephemeral_data, ?::Integer timeout) -> ::Array[top]
15
+ def run: (WAF::data persistent_data, WAF::data ephemeral_data, ?::Integer timeout) -> Result
20
16
 
21
17
  private
22
18
 
23
- def validate!: () -> void
24
-
25
- def invalidate!: () -> void
26
-
27
- def valid?: () -> bool?
28
-
29
- def valid!: () -> void
19
+ def ensure_pointer_presence!: () -> void
30
20
 
31
21
  def retained: () -> Array[untyped]
32
22
 
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module AppSec
3
+ module WAF
4
+ class Error < StandardError
5
+ end
6
+
7
+ class InstanceFinalizedError < Error
8
+ end
9
+
10
+ class ConversionError < Error
11
+ end
12
+
13
+ class LibDDWAFError < Error
14
+ attr_reader diagnostics: WAF::data
15
+
16
+ def initialize: (::String msg, ?diagnostics: WAF::data?) -> void
17
+ end
18
+ end
19
+ end
20
+ end
@@ -2,40 +2,19 @@ module Datadog
2
2
  module AppSec
3
3
  module WAF
4
4
  class Handle
5
- @config: LibDDWAF::Config
5
+ @handle_ptr: ::FFI::Pointer
6
6
 
7
- @handle_obj: ::FFI::Pointer
7
+ def initialize: (::FFI::Pointer handle_ptr) -> void
8
8
 
9
- @diagnostics: WAF::data
9
+ def finalize!: () -> void
10
10
 
11
- @valid: bool
11
+ def build_context: () -> Context
12
12
 
13
- attr_reader handle_obj: ::FFI::Pointer
14
-
15
- attr_reader diagnostics: WAF::data
16
-
17
- attr_reader config: LibDDWAF::Config
18
-
19
- def initialize: (data rule, ?limits: ::Hash[::Symbol, ::Integer], ?obfuscator: ::Hash[::Symbol, ::String]) -> void
20
-
21
- def finalize: () -> void
22
-
23
- def required_addresses: () -> ::Array[::String?]
24
-
25
- # TODO: WAF::data
26
- def merge: (untyped data) -> Handle?
13
+ def known_addresses: () -> ::Array[::String?]
27
14
 
28
15
  private
29
16
 
30
- def new_from_handle: (::FFI::Pointer handle_object, data diagnostics, WAF::LibDDWAF::Config config) -> Handle
31
-
32
- def validate!: () -> void
33
-
34
- def invalidate!: () -> void
35
-
36
- def valid?: () -> bool?
37
-
38
- def valid!: () -> void
17
+ def ensure_pointer_presence!: () -> void
39
18
  end
40
19
  end
41
20
  end
@@ -0,0 +1,23 @@
1
+ module Datadog
2
+ module AppSec
3
+ module WAF
4
+ class HandleBuilder
5
+ @builder_ptr: ::FFI::Pointer
6
+
7
+ def initialize: (?limits: ::Hash[::Symbol, ::Integer], ?obfuscator: ::Hash[::Symbol, ::String]) -> void
8
+
9
+ def finalize!: () -> void
10
+
11
+ def build_handle: () -> Handle
12
+
13
+ def add_or_update_config: (data config, path: ::String) -> data
14
+
15
+ def remove_config_at_path: (::String path) -> bool
16
+
17
+ private
18
+
19
+ def ensure_pointer_presence!: () -> void
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,11 +2,15 @@ module Datadog
2
2
  module AppSec
3
3
  module WAF
4
4
  module LibDDWAF
5
- class Error < StandardError
6
- attr_reader diagnostics: WAF::data
5
+ DEFAULT_MAX_CONTAINER_SIZE: ::Integer
6
+ DEFAULT_MAX_CONTAINER_DEPTH: ::Integer
7
+ DEFAULT_MAX_STRING_LENGTH: ::Integer
7
8
 
8
- def initialize: (::String msg, ?diagnostics: WAF::data?) -> void
9
- end
9
+ DDWAF_MAX_CONTAINER_SIZE: ::Integer
10
+ DDWAF_MAX_CONTAINER_DEPTH: ::Integer
11
+ DDWAF_MAX_STRING_LENGTH: ::Integer
12
+
13
+ DDWAF_RUN_TIMEOUT: ::Integer
10
14
 
11
15
  extend ::FFI::Library
12
16
 
@@ -98,9 +102,19 @@ module Datadog
98
102
  ObjectFree: ::FFI::Function
99
103
  ObjectNoFree: ::FFI::Pointer
100
104
 
105
+ # handle builder
106
+
107
+ def self.ddwaf_builder_init: (HandleBuilderConfig) -> ::FFI::Pointer
108
+ def self.ddwaf_builder_destroy: (::FFI::Pointer) -> void
109
+
110
+ def self.ddwaf_builder_add_or_update_config: (::FFI::Pointer, ::String, ::Integer, LibDDWAF::Object, LibDDWAF::Object) -> bool
111
+ def self.ddwaf_builder_remove_config: (::FFI::Pointer, ::String, ::Integer) -> bool
112
+
113
+ def self.ddwaf_builder_build_instance: (::FFI::Pointer) -> ::FFI::Pointer
114
+
101
115
  # main handle
102
116
 
103
- class Config < ::FFI::Struct[::FFI::AbstractMemory, untyped]
117
+ class HandleBuilderConfig < ::FFI::Struct[::FFI::AbstractMemory, untyped]
104
118
  class Limits < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
105
119
  end
106
120
 
@@ -108,8 +122,6 @@ module Datadog
108
122
  end
109
123
  end
110
124
 
111
- def self.ddwaf_init: (top, Config, Object) -> ::FFI::Pointer
112
- def self.ddwaf_update: (::FFI::Pointer, LibDDWAF::Object, LibDDWAF::Object) -> ::FFI::Pointer
113
125
  def self.ddwaf_destroy: (::FFI::Pointer) -> void
114
126
 
115
127
  def self.ddwaf_known_addresses: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
@@ -140,16 +152,6 @@ module Datadog
140
152
  # type ddwaf_log_cb = ^(ddwaf_log_level, ::String, ::String, ::Integer, ::FFI::Pointer, ::Integer) -> void
141
153
  type ddwaf_log_cb = ::Method | ::Proc
142
154
  def self.ddwaf_set_log_cb: (ddwaf_log_cb, ddwaf_log_level) -> bool
143
-
144
- DEFAULT_MAX_CONTAINER_SIZE: ::Integer
145
- DEFAULT_MAX_CONTAINER_DEPTH: ::Integer
146
- DEFAULT_MAX_STRING_LENGTH: ::Integer
147
-
148
- DDWAF_MAX_CONTAINER_SIZE: ::Integer
149
- DDWAF_MAX_CONTAINER_DEPTH: ::Integer
150
- DDWAF_MAX_STRING_LENGTH: ::Integer
151
-
152
- DDWAF_RUN_TIMEOUT: ::Integer
153
155
  end
154
156
  end
155
157
  end