libddwaf 1.15.0.0.2 → 1.18.0.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.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug.md +32 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- data/.github/actions/docker-build-ruby/Dockerfile +5 -0
- data/.github/actions/docker-build-ruby/Dockerfile.alpine +7 -0
- data/.github/actions/docker-build-ruby/Dockerfile.jruby +6 -0
- data/.github/actions/docker-build-ruby/action.yml +57 -0
- data/.github/workflows/lint.yml +34 -0
- data/.github/workflows/package.yml +134 -0
- data/.github/workflows/test.yml +118 -0
- data/.gitignore +10 -0
- data/.steepignore +4 -0
- data/CONTRIBUTING.md +84 -0
- data/Steepfile +21 -0
- data/lib/datadog/appsec/waf/context.rb +122 -0
- data/lib/datadog/appsec/waf/converter.rb +172 -0
- data/lib/datadog/appsec/waf/handle.rb +108 -0
- data/lib/datadog/appsec/waf/lib_ddwaf.rb +307 -0
- data/lib/datadog/appsec/waf/result.rb +33 -0
- data/lib/datadog/appsec/waf/version.rb +2 -2
- data/lib/datadog/appsec/waf.rb +17 -682
- data/libddwaf.gemspec +26 -29
- data/shell.nix +35 -0
- data/sig/datadog/appsec/waf/context.rbs +39 -0
- data/sig/datadog/appsec/waf/converter.rbs +11 -0
- data/sig/datadog/appsec/waf/handle.rbs +42 -0
- data/sig/datadog/appsec/waf/lib_ddwaf.rbs +156 -0
- data/sig/datadog/appsec/waf/result.rbs +33 -0
- data/sig/datadog/appsec/waf.rbs +1 -213
- metadata +27 -7
- data/vendor/libddwaf/libddwaf-1.15.0-darwin-arm64/lib/libddwaf.dylib +0 -0
- data/vendor/libddwaf/libddwaf-1.15.0-darwin-x86_64/lib/libddwaf.dylib +0 -0
- data/vendor/libddwaf/libddwaf-1.15.0-linux-aarch64/lib/libddwaf.so +0 -0
- data/vendor/libddwaf/libddwaf-1.15.0-linux-x86_64/lib/libddwaf.so +0 -0
data/libddwaf.gemspec
CHANGED
@@ -1,43 +1,40 @@
|
|
1
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require
|
5
|
+
require 'datadog/appsec/waf/version'
|
4
6
|
|
5
7
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name
|
7
|
-
spec.version
|
8
|
+
spec.name = 'libddwaf'
|
9
|
+
spec.version = Datadog::AppSec::WAF::VERSION::STRING
|
8
10
|
spec.required_ruby_version = [">= #{Datadog::AppSec::WAF::VERSION::MINIMUM_RUBY_VERSION}"]
|
9
|
-
spec.required_rubygems_version =
|
10
|
-
spec.authors
|
11
|
-
spec.email
|
11
|
+
spec.required_rubygems_version = '>= 2.0.0'
|
12
|
+
spec.authors = ['Datadog, Inc.']
|
13
|
+
spec.email = ['dev@datadoghq.com']
|
12
14
|
|
13
|
-
spec.summary
|
14
|
-
spec.description = <<-EOS.gsub(/^[\s]+/,
|
15
|
+
spec.summary = 'Datadog WAF'
|
16
|
+
spec.description = <<-EOS.gsub(/^[\s]+/, '')
|
15
17
|
libddwaf packages a WAF implementation in C++, exposed to Ruby
|
16
18
|
EOS
|
17
19
|
|
18
|
-
spec.homepage =
|
19
|
-
spec.license
|
20
|
+
spec.homepage = 'https://github.com/DataDog/libddwaf-rb'
|
21
|
+
spec.license = 'BSD-3-Clause'
|
20
22
|
|
21
23
|
if spec.respond_to?(:metadata)
|
22
|
-
spec.metadata[
|
24
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
23
25
|
else
|
24
|
-
raise
|
26
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
25
27
|
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
])
|
39
|
-
|
40
|
-
spec.require_paths = ["lib"]
|
41
|
-
|
42
|
-
spec.add_dependency "ffi", "~> 1.0"
|
29
|
+
spec.files =
|
30
|
+
`git ls-files -z`
|
31
|
+
.split("\x0")
|
32
|
+
.reject { |f| f.match(%r{^(spec|[.]circleci)/}) }
|
33
|
+
.reject do |f|
|
34
|
+
['.dockerignore', '.env', '.rspec', '.rubocop.yml', '.rubocop_todo.yml',
|
35
|
+
'.simplecov', 'Gemfile', 'Rakefile', 'docker-compose.yml'].include?(f)
|
36
|
+
end
|
37
|
+
spec.require_paths = ['lib']
|
38
|
+
|
39
|
+
spec.add_dependency 'ffi', '~> 1.0'
|
43
40
|
end
|
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
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Datadog
|
2
|
+
module AppSec
|
3
|
+
module WAF
|
4
|
+
class Context
|
5
|
+
@context_obj: ::FFI::Pointer
|
6
|
+
|
7
|
+
@valid: bool
|
8
|
+
|
9
|
+
@retained: Array[untyped]
|
10
|
+
|
11
|
+
RESULT_CODE: ::Hash[::Symbol, ::Symbol]
|
12
|
+
|
13
|
+
attr_reader context_obj: ::FFI::Pointer
|
14
|
+
|
15
|
+
def initialize: (Handle handle) -> void
|
16
|
+
|
17
|
+
def finalize: () -> void
|
18
|
+
|
19
|
+
def run: (WAF::data persistent_data, WAF::data ephemeral_data, ?::Integer timeout) -> ::Array[top]
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def validate!: () -> void
|
24
|
+
|
25
|
+
def invalidate!: () -> void
|
26
|
+
|
27
|
+
def valid?: () -> bool?
|
28
|
+
|
29
|
+
def valid!: () -> void
|
30
|
+
|
31
|
+
def retained: () -> Array[untyped]
|
32
|
+
|
33
|
+
def retain: (top object) -> void
|
34
|
+
|
35
|
+
def release: (top object) -> void
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Datadog
|
2
|
+
module AppSec
|
3
|
+
module WAF
|
4
|
+
module Converter
|
5
|
+
def self.ruby_to_object: (top val, ?max_container_size: ::Integer?, ?max_container_depth: ::Integer?, ?max_string_length: ::Integer?, ?coerce: bool?) -> LibDDWAF::Object
|
6
|
+
|
7
|
+
def self.object_to_ruby: (LibDDWAF::Object obj) -> WAF::data
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Datadog
|
2
|
+
module AppSec
|
3
|
+
module WAF
|
4
|
+
class Handle
|
5
|
+
@config: LibDDWAF::Config
|
6
|
+
|
7
|
+
@handle_obj: ::FFI::Pointer
|
8
|
+
|
9
|
+
@diagnostics: WAF::data
|
10
|
+
|
11
|
+
@valid: bool
|
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?
|
27
|
+
|
28
|
+
private
|
29
|
+
|
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
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
module Datadog
|
2
|
+
module AppSec
|
3
|
+
module WAF
|
4
|
+
module LibDDWAF
|
5
|
+
class Error < StandardError
|
6
|
+
attr_reader diagnostics: WAF::data
|
7
|
+
|
8
|
+
def initialize: (::String msg, ?diagnostics: WAF::data?) -> void
|
9
|
+
end
|
10
|
+
|
11
|
+
extend ::FFI::Library
|
12
|
+
|
13
|
+
def self.typedef: [T < ::FFI::Type, N, R, C] (T old, Symbol | ::FFI::DataConverter[N, R, C] add, ?untyped) -> T
|
14
|
+
| (Symbol old, Symbol add, ?untyped) -> (::FFI::Type | ::FFI::Enum)
|
15
|
+
| [X < ::FFI::DataConverter[N, R, C], N, R, C] (X old, Symbol add, ?untyped) -> ::FFI::Type::Mapped[X, N, R, C]
|
16
|
+
| (:enum old, Array[Symbol | Integer] add, ?untyped) -> ::FFI::Enum
|
17
|
+
| (:enum old, Symbol | ::FFI::Type add, Array[Symbol | Integer] info) -> ::FFI::Enum
|
18
|
+
| (untyped, ::Symbol) -> void
|
19
|
+
|
20
|
+
def self.callback: (::Symbol name, Array[::FFI::Library::ffi_lib_type] params, ::FFI::Library::ffi_lib_type ret) -> ::FFI::CallbackInfo
|
21
|
+
|
22
|
+
def self.enum: (*(Symbol | Integer) args) -> ::FFI::Enum
|
23
|
+
| (Array[Symbol | Integer] values) -> ::FFI::Enum
|
24
|
+
|
25
|
+
def self.local_os: () -> ::String
|
26
|
+
def self.local_cpu: () -> ::String
|
27
|
+
def self.local_version: () -> (::String | nil)
|
28
|
+
def self.source_dir: () -> ::String
|
29
|
+
def self.vendor_dir: () -> ::String
|
30
|
+
def self.libddwaf_vendor_dir: () -> ::String
|
31
|
+
def self.shared_lib_triplet: (?version: ::String?) -> ::String
|
32
|
+
def self.libddwaf_dir: () -> ::String
|
33
|
+
def self.shared_lib_extname: () -> ::String
|
34
|
+
def self.shared_lib_path: () -> ::String
|
35
|
+
|
36
|
+
# version
|
37
|
+
|
38
|
+
def self.ddwaf_get_version: () -> ::String
|
39
|
+
|
40
|
+
# ddwaf::object data structure
|
41
|
+
|
42
|
+
DDWAF_OBJ_TYPE: ::FFI::Enum
|
43
|
+
|
44
|
+
class UInt32Ptr < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
45
|
+
end
|
46
|
+
|
47
|
+
class UInt64Ptr < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
48
|
+
end
|
49
|
+
|
50
|
+
class SizeTPtr < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
51
|
+
end
|
52
|
+
|
53
|
+
class ObjectValueUnion < ::FFI::Union[::FFI::AbstractMemory, untyped]
|
54
|
+
end
|
55
|
+
|
56
|
+
class Object < ::FFI::Struct[::FFI::AbstractMemory, untyped]
|
57
|
+
end
|
58
|
+
|
59
|
+
# setters
|
60
|
+
|
61
|
+
def self.ddwaf_object_invalid: (LibDDWAF::Object) -> ::FFI::Pointer
|
62
|
+
def self.ddwaf_object_string: (LibDDWAF::Object, ::String) -> ::FFI::Pointer
|
63
|
+
def self.ddwaf_object_stringl: (LibDDWAF::Object, ::String, ::Integer) -> ::FFI::Pointer
|
64
|
+
def self.ddwaf_object_stringl_nc: (LibDDWAF::Object, ::String, ::Integer) -> ::FFI::Pointer
|
65
|
+
def self.ddwaf_object_unsigned: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
66
|
+
def self.ddwaf_object_signed: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
67
|
+
def self.ddwaf_object_string_from_unsigned: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
68
|
+
def self.ddwaf_object_string_from_signed: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
69
|
+
def self.ddwaf_object_bool: (LibDDWAF::Object, bool) -> ::FFI::Pointer
|
70
|
+
def self.ddwaf_object_float: (LibDDWAF::Object, ::Float) -> ::FFI::Pointer
|
71
|
+
def self.ddwaf_object_null: (LibDDWAF::Object) -> ::FFI::Pointer
|
72
|
+
|
73
|
+
def self.ddwaf_object_array: (LibDDWAF::Object) -> ::FFI::Pointer
|
74
|
+
def self.ddwaf_object_array_add: (LibDDWAF::Object, LibDDWAF::Object) -> bool
|
75
|
+
|
76
|
+
def self.ddwaf_object_map: (LibDDWAF::Object) -> ::FFI::Pointer
|
77
|
+
def self.ddwaf_object_map_add: (LibDDWAF::Object, ::String, LibDDWAF::Object) -> bool
|
78
|
+
def self.ddwaf_object_map_addl: (LibDDWAF::Object, ::String, ::Integer, LibDDWAF::Object) -> bool
|
79
|
+
def self.ddwaf_object_map_addl_nc: (LibDDWAF::Object, ::String, ::Integer, LibDDWAF::Object) -> bool
|
80
|
+
|
81
|
+
# getters
|
82
|
+
|
83
|
+
def self.ddwaf_object_type: (LibDDWAF::Object) -> ::FFI::Enum
|
84
|
+
def self.ddwaf_object_size: (LibDDWAF::Object) -> ::Integer
|
85
|
+
def self.ddwaf_object_length: (LibDDWAF::Object) -> ::Integer
|
86
|
+
def self.ddwaf_object_get_key: (LibDDWAF::Object, SizeTPtr) -> ::String
|
87
|
+
def self.ddwaf_object_get_string: (LibDDWAF::Object, SizeTPtr) -> ::String
|
88
|
+
def self.ddwaf_object_get_unsigned: (LibDDWAF::Object, SizeTPtr) -> ::Integer
|
89
|
+
def self.ddwaf_object_get_signed: (LibDDWAF::Object, SizeTPtr) -> ::Integer
|
90
|
+
def self.ddwaf_object_get_index: (LibDDWAF::Object, ::Integer) -> LibDDWAF::Object
|
91
|
+
def self.ddwaf_object_get_bool: (LibDDWAF::Object) -> bool
|
92
|
+
def self.ddwaf_object_get_float: (LibDDWAF::Object) -> ::Float
|
93
|
+
|
94
|
+
# freeers
|
95
|
+
|
96
|
+
def self.ddwaf_object_free: (LibDDWAF::Object) -> void
|
97
|
+
|
98
|
+
ObjectFree: ::FFI::Function
|
99
|
+
ObjectNoFree: ::FFI::Pointer
|
100
|
+
|
101
|
+
# main handle
|
102
|
+
|
103
|
+
class Config < ::FFI::Struct[::FFI::AbstractMemory, untyped]
|
104
|
+
class Limits < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
105
|
+
end
|
106
|
+
|
107
|
+
class Obfuscator < ::FFI::Struct[::FFI::AbstractMemory, ::FFI::Pointer]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.ddwaf_init: (top, Config, Object) -> ::FFI::Pointer
|
112
|
+
def self.ddwaf_update: (::FFI::Pointer, LibDDWAF::Object, LibDDWAF::Object) -> ::FFI::Pointer
|
113
|
+
def self.ddwaf_destroy: (::FFI::Pointer) -> void
|
114
|
+
|
115
|
+
def self.ddwaf_known_addresses: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
|
116
|
+
def self.ddwaf_rule_data_ids: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
|
117
|
+
|
118
|
+
# updating
|
119
|
+
|
120
|
+
DDWAF_RET_CODE: ::FFI::Enum
|
121
|
+
|
122
|
+
# running
|
123
|
+
|
124
|
+
def self.ddwaf_context_init: (::FFI::Pointer) -> ::FFI::Pointer
|
125
|
+
def self.ddwaf_context_destroy: (::FFI::Pointer) -> void
|
126
|
+
|
127
|
+
class Result < ::FFI::Struct[::FFI::AbstractMemory, untyped]
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.ddwaf_run: (::FFI::Pointer, Object, Object, Result, ::Integer) -> ::Symbol
|
131
|
+
def self.ddwaf_result_free: (Result) -> void
|
132
|
+
|
133
|
+
# logging
|
134
|
+
|
135
|
+
DDWAF_LOG_LEVEL: ::FFI::Enum
|
136
|
+
|
137
|
+
type ddwaf_log_level = ::Symbol
|
138
|
+
|
139
|
+
# TODO: signature is as below but steep 1.1 does not yet support method/proc/block mapping
|
140
|
+
# type ddwaf_log_cb = ^(ddwaf_log_level, ::String, ::String, ::Integer, ::FFI::Pointer, ::Integer) -> void
|
141
|
+
type ddwaf_log_cb = ::Method | ::Proc
|
142
|
+
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
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Datadog
|
2
|
+
module AppSec
|
3
|
+
module WAF
|
4
|
+
class Result
|
5
|
+
@status: ::Symbol
|
6
|
+
|
7
|
+
@events: WAF::data
|
8
|
+
|
9
|
+
@total_runtime: ::Float
|
10
|
+
|
11
|
+
@timeout: bool
|
12
|
+
|
13
|
+
@actions: WAF::data
|
14
|
+
|
15
|
+
@derivatives: WAF::data
|
16
|
+
|
17
|
+
attr_reader status: ::Symbol
|
18
|
+
|
19
|
+
attr_reader events: WAF::data
|
20
|
+
|
21
|
+
attr_reader total_runtime: ::Float
|
22
|
+
|
23
|
+
attr_reader timeout: bool
|
24
|
+
|
25
|
+
attr_reader actions: WAF::data
|
26
|
+
|
27
|
+
attr_reader derivatives: WAF::data
|
28
|
+
|
29
|
+
def initialize: (::Symbol status, WAF::data events, ::Float total_runtime, bool timeout, WAF::data actions, WAF::data derivatives) -> void
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/sig/datadog/appsec/waf.rbs
CHANGED
@@ -1,163 +1,9 @@
|
|
1
1
|
module Datadog
|
2
2
|
module AppSec
|
3
3
|
module WAF
|
4
|
-
module LibDDWAF
|
5
|
-
class Error < StandardError
|
6
|
-
attr_reader diagnostics: ::Datadog::AppSec::WAF::data
|
7
|
-
|
8
|
-
def initialize: (::String msg, ?diagnostics: ::Datadog::AppSec::WAF::data?) -> void
|
9
|
-
end
|
10
|
-
|
11
|
-
extend ::FFI::Library
|
12
|
-
|
13
|
-
def self.typedef: [T < ::FFI::Type, N, R, C] (T old, Symbol | ::FFI::DataConverter[N, R, C] add, ?untyped) -> T
|
14
|
-
| (Symbol old, Symbol add, ?untyped) -> (::FFI::Type | ::FFI::Enum)
|
15
|
-
| [X < ::FFI::DataConverter[N, R, C], N, R, C] (X old, Symbol add, ?untyped) -> ::FFI::Type::Mapped[X, N, R, C]
|
16
|
-
| (:enum old, Array[Symbol | Integer] add, ?untyped) -> ::FFI::Enum
|
17
|
-
| (:enum old, Symbol | ::FFI::Type add, Array[Symbol | Integer] info) -> ::FFI::Enum
|
18
|
-
| (untyped, ::Symbol) -> void
|
19
|
-
|
20
|
-
def self.callback: (::Symbol name, Array[::FFI::Library::ffi_lib_type] params, ::FFI::Library::ffi_lib_type ret) -> ::FFI::CallbackInfo
|
21
|
-
|
22
|
-
def self.enum: (*(Symbol | Integer) args) -> ::FFI::Enum
|
23
|
-
| (Array[Symbol | Integer] values) -> ::FFI::Enum
|
24
|
-
|
25
|
-
def self.local_os: () -> ::String
|
26
|
-
def self.local_cpu: () -> ::String
|
27
|
-
def self.local_version: () -> (::String | nil)
|
28
|
-
def self.source_dir: () -> ::String
|
29
|
-
def self.vendor_dir: () -> ::String
|
30
|
-
def self.libddwaf_vendor_dir: () -> ::String
|
31
|
-
def self.shared_lib_triplet: (?version: ::String?) -> ::String
|
32
|
-
def self.libddwaf_dir: () -> ::String
|
33
|
-
def self.shared_lib_extname: () -> ::String
|
34
|
-
def self.shared_lib_path: () -> ::String
|
35
|
-
|
36
|
-
# version
|
37
|
-
|
38
|
-
def self.ddwaf_get_version: () -> ::String
|
39
|
-
|
40
|
-
# ddwaf::object data structure
|
41
|
-
|
42
|
-
DDWAF_OBJ_TYPE: ::FFI::Enum
|
43
|
-
|
44
|
-
class UInt32Ptr < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
45
|
-
end
|
46
|
-
|
47
|
-
class UInt64Ptr < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
48
|
-
end
|
49
|
-
|
50
|
-
class SizeTPtr < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
51
|
-
end
|
52
|
-
|
53
|
-
class ObjectValueUnion < ::FFI::Union[::FFI::AbstractMemory, untyped]
|
54
|
-
end
|
55
|
-
|
56
|
-
class Object < ::FFI::Struct[::FFI::AbstractMemory, untyped]
|
57
|
-
end
|
58
|
-
|
59
|
-
# setters
|
60
|
-
|
61
|
-
def self.ddwaf_object_invalid: (LibDDWAF::Object) -> ::FFI::Pointer
|
62
|
-
def self.ddwaf_object_string: (LibDDWAF::Object, ::String) -> ::FFI::Pointer
|
63
|
-
def self.ddwaf_object_stringl: (LibDDWAF::Object, ::String, ::Integer) -> ::FFI::Pointer
|
64
|
-
def self.ddwaf_object_stringl_nc: (LibDDWAF::Object, ::String, ::Integer) -> ::FFI::Pointer
|
65
|
-
def self.ddwaf_object_unsigned: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
66
|
-
def self.ddwaf_object_signed: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
67
|
-
def self.ddwaf_object_string_from_unsigned: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
68
|
-
def self.ddwaf_object_string_from_signed: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
69
|
-
def self.ddwaf_object_bool: (LibDDWAF::Object, bool) -> ::FFI::Pointer
|
70
|
-
def self.ddwaf_object_float: (LibDDWAF::Object, ::Float) -> ::FFI::Pointer
|
71
|
-
def self.ddwaf_object_null: (LibDDWAF::Object) -> ::FFI::Pointer
|
72
|
-
|
73
|
-
def self.ddwaf_object_array: (LibDDWAF::Object) -> ::FFI::Pointer
|
74
|
-
def self.ddwaf_object_array_add: (LibDDWAF::Object, LibDDWAF::Object) -> bool
|
75
|
-
|
76
|
-
def self.ddwaf_object_map: (LibDDWAF::Object) -> ::FFI::Pointer
|
77
|
-
def self.ddwaf_object_map_add: (LibDDWAF::Object, ::String, LibDDWAF::Object) -> bool
|
78
|
-
def self.ddwaf_object_map_addl: (LibDDWAF::Object, ::String, ::Integer, LibDDWAF::Object) -> bool
|
79
|
-
def self.ddwaf_object_map_addl_nc: (LibDDWAF::Object, ::String, ::Integer, LibDDWAF::Object) -> bool
|
80
|
-
|
81
|
-
# getters
|
82
|
-
|
83
|
-
def self.ddwaf_object_type: (LibDDWAF::Object) -> ::FFI::Enum
|
84
|
-
def self.ddwaf_object_size: (LibDDWAF::Object) -> ::Integer
|
85
|
-
def self.ddwaf_object_length: (LibDDWAF::Object) -> ::Integer
|
86
|
-
def self.ddwaf_object_get_key: (LibDDWAF::Object, SizeTPtr) -> ::String
|
87
|
-
def self.ddwaf_object_get_string: (LibDDWAF::Object, SizeTPtr) -> ::String
|
88
|
-
def self.ddwaf_object_get_unsigned: (LibDDWAF::Object, SizeTPtr) -> ::Integer
|
89
|
-
def self.ddwaf_object_get_signed: (LibDDWAF::Object, SizeTPtr) -> ::Integer
|
90
|
-
def self.ddwaf_object_get_index: (LibDDWAF::Object, ::Integer) -> LibDDWAF::Object
|
91
|
-
def self.ddwaf_object_get_bool: (LibDDWAF::Object) -> bool
|
92
|
-
def self.ddwaf_object_get_float: (LibDDWAF::Object) -> ::Float
|
93
|
-
|
94
|
-
# freeers
|
95
|
-
|
96
|
-
def self.ddwaf_object_free: (LibDDWAF::Object) -> void
|
97
|
-
|
98
|
-
ObjectFree: ::FFI::Function
|
99
|
-
ObjectNoFree: ::FFI::Pointer
|
100
|
-
|
101
|
-
# main handle
|
102
|
-
|
103
|
-
class Config < ::FFI::Struct[::FFI::AbstractMemory, untyped]
|
104
|
-
class Limits < ::FFI::Struct[::FFI::AbstractMemory, ::Integer]
|
105
|
-
end
|
106
|
-
|
107
|
-
class Obfuscator < ::FFI::Struct[::FFI::AbstractMemory, ::FFI::Pointer]
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def self.ddwaf_init: (top, Config, Object) -> ::FFI::Pointer
|
112
|
-
def self.ddwaf_update: (::FFI::Pointer, LibDDWAF::Object, LibDDWAF::Object) -> ::FFI::Pointer
|
113
|
-
def self.ddwaf_destroy: (::FFI::Pointer) -> void
|
114
|
-
|
115
|
-
def self.ddwaf_known_addresses: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
|
116
|
-
def self.ddwaf_rule_data_ids: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
|
117
|
-
|
118
|
-
# updating
|
119
|
-
|
120
|
-
DDWAF_RET_CODE: ::FFI::Enum
|
121
|
-
|
122
|
-
# running
|
123
|
-
|
124
|
-
def self.ddwaf_context_init: (::FFI::Pointer) -> ::FFI::Pointer
|
125
|
-
def self.ddwaf_context_destroy: (::FFI::Pointer) -> void
|
126
|
-
|
127
|
-
class Result < ::FFI::Struct[::FFI::AbstractMemory, untyped]
|
128
|
-
end
|
129
|
-
|
130
|
-
def self.ddwaf_run: (::FFI::Pointer, Object, Object, Result, ::Integer) -> ::Symbol
|
131
|
-
def self.ddwaf_result_free: (Result) -> void
|
132
|
-
|
133
|
-
# logging
|
134
|
-
|
135
|
-
DDWAF_LOG_LEVEL: ::FFI::Enum
|
136
|
-
|
137
|
-
type ddwaf_log_level = ::Symbol
|
138
|
-
|
139
|
-
# TODO: signature is as below but steep 1.1 does not yet support method/proc/block mapping
|
140
|
-
# type ddwaf_log_cb = ^(ddwaf_log_level, ::String, ::String, ::Integer, ::FFI::Pointer, ::Integer) -> void
|
141
|
-
type ddwaf_log_cb = ::Method | ::Proc
|
142
|
-
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
|
-
end
|
154
|
-
|
155
|
-
def self.version: () -> ::String
|
156
|
-
|
157
4
|
type data = String | Symbol | Integer | Float | TrueClass | FalseClass | Array[data] | Hash[(String | Symbol | nil), data] | nil
|
158
5
|
|
159
|
-
def self.
|
160
|
-
def self.object_to_ruby: (::Datadog::AppSec::WAF::LibDDWAF::Object obj) -> data
|
6
|
+
def self.version: () -> ::String
|
161
7
|
|
162
8
|
self.@logger: ::Logger
|
163
9
|
self.@log_callback: LibDDWAF::ddwaf_log_cb
|
@@ -165,64 +11,6 @@ module Datadog
|
|
165
11
|
def self.log_callback: (LibDDWAF::ddwaf_log_level, ::String, ::String, ::Integer, ::FFI::Pointer, ::Integer) -> void
|
166
12
|
def self.logger: () -> ::Logger
|
167
13
|
def self.logger=: (::Logger logger) -> void
|
168
|
-
|
169
|
-
RESULT_CODE: ::Hash[::Symbol, ::Symbol]
|
170
|
-
|
171
|
-
class Handle
|
172
|
-
attr_reader handle_obj: ::FFI::Pointer
|
173
|
-
attr_reader diagnostics: data
|
174
|
-
attr_reader config: WAF::LibDDWAF::Config
|
175
|
-
|
176
|
-
def initialize: (data rule, ?limits: ::Hash[::Symbol, ::Integer], ?obfuscator: ::Hash[::Symbol, ::String]) -> void
|
177
|
-
def finalize: () -> untyped
|
178
|
-
def required_addresses: () -> ::Array[::String?]
|
179
|
-
def merge: (untyped data) -> Handle?
|
180
|
-
|
181
|
-
private
|
182
|
-
|
183
|
-
@valid: bool
|
184
|
-
|
185
|
-
def new_from_handle: (::FFI::Pointer handle_object, data diagnostics, WAF::LibDDWAF::Config config) -> untyped
|
186
|
-
def validate!: () -> void
|
187
|
-
def invalidate!: () -> void
|
188
|
-
def valid?: () -> (nil | bool)
|
189
|
-
def valid!: () -> void
|
190
|
-
end
|
191
|
-
|
192
|
-
class Result
|
193
|
-
attr_reader status: ::Symbol
|
194
|
-
attr_reader events: data
|
195
|
-
attr_reader total_runtime: ::Float
|
196
|
-
attr_reader timeout: bool
|
197
|
-
attr_reader actions: data
|
198
|
-
attr_reader derivatives: data
|
199
|
-
|
200
|
-
def initialize: (::Symbol, data, ::Float, bool, data, data) -> void
|
201
|
-
end
|
202
|
-
|
203
|
-
class Context
|
204
|
-
attr_reader context_obj: ::FFI::Pointer
|
205
|
-
|
206
|
-
def initialize: (Handle handle) -> void
|
207
|
-
def finalize: () -> void
|
208
|
-
|
209
|
-
def run: (data persistent_data, data ephemeral_data, ?::Integer timeout) -> ::Array[top]
|
210
|
-
|
211
|
-
private
|
212
|
-
|
213
|
-
@valid: bool
|
214
|
-
|
215
|
-
def validate!: () -> void
|
216
|
-
def invalidate!: () -> void
|
217
|
-
def valid?: () -> (nil | bool)
|
218
|
-
def valid!: () -> void
|
219
|
-
|
220
|
-
@retained: Array[untyped]
|
221
|
-
|
222
|
-
def retained: () -> Array[untyped]
|
223
|
-
def retain: (top object) -> void
|
224
|
-
def release: (top object) -> void
|
225
|
-
end
|
226
14
|
end
|
227
15
|
end
|
228
16
|
end
|