libddwaf 1.3.0.0.0 → 1.5.1.0.1
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/workflows/lint.yml +33 -0
- data/.github/workflows/package.yml +32 -19
- data/.github/workflows/test.yml +9 -12
- data/CHANGELOG.md +79 -0
- data/README.md +118 -0
- data/Steepfile +22 -0
- data/lib/datadog/appsec/waf/version.rb +2 -2
- data/lib/datadog/appsec/waf.rb +345 -96
- data/libddwaf.gemspec +1 -1
- data/sig/datadog/appsec/waf/version.rbs +13 -0
- data/sig/datadog/appsec/waf.rbs +230 -0
- data/sig/libddwaf.rbs +0 -0
- data/vendor/rbs/ffi/0/ffi.rbs +62 -0
- data/vendor/rbs/gem/0/gem.rbs +7 -0
- data/vendor/rbs/jruby/0/jruby.rbs +3 -0
- metadata +12 -3
@@ -0,0 +1,230 @@
|
|
1
|
+
module Datadog
|
2
|
+
module AppSec
|
3
|
+
module WAF
|
4
|
+
module LibDDWAF
|
5
|
+
class Error < StandardError
|
6
|
+
attr_reader ruleset_info: Hash[Symbol, untyped] | nil
|
7
|
+
|
8
|
+
def initialize: (::String msg, ?ruleset_info: Hash[Symbol, untyped]?) -> void
|
9
|
+
end
|
10
|
+
|
11
|
+
extend ::FFI::Library
|
12
|
+
|
13
|
+
def self.local_os: () -> ::String
|
14
|
+
def self.local_cpu: () -> ::String
|
15
|
+
def self.local_version: () -> (::String | nil)
|
16
|
+
def self.source_dir: () -> ::String
|
17
|
+
def self.vendor_dir: () -> ::String
|
18
|
+
def self.libddwaf_vendor_dir: () -> ::String
|
19
|
+
def self.shared_lib_triplet: (?version: ::String?) -> ::String
|
20
|
+
def self.libddwaf_dir: () -> ::String
|
21
|
+
def self.shared_lib_extname: () -> ::String
|
22
|
+
def self.shared_lib_path: () -> ::String
|
23
|
+
|
24
|
+
# version
|
25
|
+
|
26
|
+
def self.ddwaf_get_version: () -> ::String
|
27
|
+
|
28
|
+
# ddwaf::object data structure
|
29
|
+
|
30
|
+
DDWAF_OBJ_TYPE: ::FFI::Enum
|
31
|
+
|
32
|
+
class UInt32Ptr < ::FFI::Struct
|
33
|
+
end
|
34
|
+
|
35
|
+
class UInt64Ptr < ::FFI::Struct
|
36
|
+
end
|
37
|
+
|
38
|
+
class SizeTPtr < ::FFI::Struct
|
39
|
+
end
|
40
|
+
|
41
|
+
class ObjectValueUnion < ::FFI::Union
|
42
|
+
end
|
43
|
+
|
44
|
+
class Object < ::FFI::Struct
|
45
|
+
end
|
46
|
+
|
47
|
+
# setters
|
48
|
+
|
49
|
+
def self.ddwaf_object_invalid: (LibDDWAF::Object) -> ::FFI::Pointer
|
50
|
+
def self.ddwaf_object_string: (LibDDWAF::Object, ::String) -> ::FFI::Pointer
|
51
|
+
def self.ddwaf_object_stringl: (LibDDWAF::Object, ::String, ::Integer) -> ::FFI::Pointer
|
52
|
+
def self.ddwaf_object_stringl_nc: (LibDDWAF::Object, ::String, ::Integer) -> ::FFI::Pointer
|
53
|
+
def self.ddwaf_object_unsigned: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
54
|
+
def self.ddwaf_object_signed: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
55
|
+
def self.ddwaf_object_unsigned_force: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
56
|
+
def self.ddwaf_object_signed_force: (LibDDWAF::Object, ::Integer) -> ::FFI::Pointer
|
57
|
+
def self.ddwaf_object_bool: (LibDDWAF::Object, bool) -> ::FFI::Pointer
|
58
|
+
|
59
|
+
def self.ddwaf_object_array: (LibDDWAF::Object) -> ::FFI::Pointer
|
60
|
+
def self.ddwaf_object_array_add: (LibDDWAF::Object, LibDDWAF::Object) -> bool
|
61
|
+
|
62
|
+
def self.ddwaf_object_map: (LibDDWAF::Object) -> ::FFI::Pointer
|
63
|
+
def self.ddwaf_object_map_add: (LibDDWAF::Object, ::String, LibDDWAF::Object) -> bool
|
64
|
+
def self.ddwaf_object_map_addl: (LibDDWAF::Object, ::String, ::Integer, LibDDWAF::Object) -> bool
|
65
|
+
def self.ddwaf_object_map_addl_nc: (LibDDWAF::Object, ::String, ::Integer, LibDDWAF::Object) -> bool
|
66
|
+
|
67
|
+
# getters
|
68
|
+
|
69
|
+
def self.ddwaf_object_type: (LibDDWAF::Object) -> ::FFI::Enum
|
70
|
+
def self.ddwaf_object_size: (LibDDWAF::Object) -> ::Integer
|
71
|
+
def self.ddwaf_object_length: (LibDDWAF::Object) -> ::Integer
|
72
|
+
def self.ddwaf_object_get_key: (LibDDWAF::Object, SizeTPtr) -> ::String
|
73
|
+
def self.ddwaf_object_get_string: (LibDDWAF::Object, SizeTPtr) -> ::String
|
74
|
+
def self.ddwaf_object_get_unsigned: (LibDDWAF::Object, SizeTPtr) -> ::Integer
|
75
|
+
def self.ddwaf_object_get_signed: (LibDDWAF::Object, SizeTPtr) -> ::Integer
|
76
|
+
def self.ddwaf_object_get_index: (LibDDWAF::Object, ::Integer) -> LibDDWAF::Object
|
77
|
+
|
78
|
+
# freeers
|
79
|
+
|
80
|
+
def self.ddwaf_object_free: (LibDDWAF::Object) -> void
|
81
|
+
|
82
|
+
ObjectFree: ::FFI::Function
|
83
|
+
ObjectNoFree: ::FFI::Pointer
|
84
|
+
|
85
|
+
# main handle
|
86
|
+
|
87
|
+
class Config < ::FFI::Struct
|
88
|
+
class Limits < ::FFI::Struct
|
89
|
+
end
|
90
|
+
|
91
|
+
class Obfuscator < ::FFI::Struct
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class RuleSetInfo < ::FFI::Struct
|
96
|
+
end
|
97
|
+
|
98
|
+
RuleSetInfoNone: ::Datadog::AppSec::WAF::LibDDWAF::RuleSetInfo
|
99
|
+
|
100
|
+
def self.ddwaf_ruleset_info_free: (RuleSetInfo) -> void
|
101
|
+
|
102
|
+
def self.ddwaf_init: (top, Config, RuleSetInfo) -> ::FFI::Pointer
|
103
|
+
def self.ddwaf_destroy: (::FFI::Pointer) -> void
|
104
|
+
|
105
|
+
def self.ddwaf_required_addresses: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
|
106
|
+
def self.ddwaf_rule_data_ids: (::FFI::Pointer, UInt32Ptr) -> ::FFI::Pointer
|
107
|
+
|
108
|
+
# updating
|
109
|
+
|
110
|
+
DDWAF_RET_CODE: ::FFI::Enum
|
111
|
+
|
112
|
+
def self.ddwaf_update_rule_data: (::FFI::Pointer, LibDDWAF::Object) -> ::Symbol
|
113
|
+
def self.ddwaf_toggle_rules: (::FFI::Pointer, LibDDWAF::Object) -> ::Symbol
|
114
|
+
|
115
|
+
# running
|
116
|
+
|
117
|
+
def self.ddwaf_context_init: (::FFI::Pointer) -> ::FFI::Pointer
|
118
|
+
def self.ddwaf_context_destroy: (::FFI::Pointer) -> void
|
119
|
+
|
120
|
+
class ResultActions < ::FFI::Struct
|
121
|
+
end
|
122
|
+
|
123
|
+
class Result < ::FFI::Struct
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.ddwaf_run: (::FFI::Pointer, Object, Result, ::Integer) -> ::Symbol
|
127
|
+
def self.ddwaf_result_free: (Result) -> void
|
128
|
+
|
129
|
+
# logging
|
130
|
+
|
131
|
+
DDWAF_LOG_LEVEL: ::FFI::Enum
|
132
|
+
|
133
|
+
type ddwaf_log_level = ::Symbol
|
134
|
+
|
135
|
+
# TODO: signature is as below but steep 1.1 does not yet support method/proc/block mapping
|
136
|
+
# type ddwaf_log_cb = ^(ddwaf_log_level, ::String, ::String, ::Integer, ::FFI::Pointer, ::Integer) -> void
|
137
|
+
type ddwaf_log_cb = ::Method | ::Proc
|
138
|
+
def self.ddwaf_set_log_cb: (ddwaf_log_cb, ddwaf_log_level) -> bool
|
139
|
+
|
140
|
+
DEFAULT_MAX_CONTAINER_SIZE: ::Integer
|
141
|
+
DEFAULT_MAX_CONTAINER_DEPTH: ::Integer
|
142
|
+
DEFAULT_MAX_STRING_LENGTH: ::Integer
|
143
|
+
|
144
|
+
DDWAF_MAX_CONTAINER_SIZE: ::Integer
|
145
|
+
DDWAF_MAX_CONTAINER_DEPTH: ::Integer
|
146
|
+
DDWAF_MAX_STRING_LENGTH: ::Integer
|
147
|
+
|
148
|
+
DDWAF_RUN_TIMEOUT: ::Integer
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.version: () -> ::String
|
152
|
+
|
153
|
+
type data = String | Symbol | Integer | Float | TrueClass | FalseClass | Array[data] | Hash[String | Symbol, data] | nil
|
154
|
+
|
155
|
+
def self.ruby_to_object: (data val, ?max_container_size: ::Integer?, ?max_container_depth: ::Integer?, ?max_string_length: ::Integer?, ?coerce: bool?) -> ::Datadog::AppSec::WAF::LibDDWAF::Object
|
156
|
+
def self.object_to_ruby: (::Datadog::AppSec::WAF::LibDDWAF::Object obj) -> data
|
157
|
+
|
158
|
+
self.@logger: ::Logger
|
159
|
+
self.@log_callback: LibDDWAF::ddwaf_log_cb
|
160
|
+
|
161
|
+
def self.log_callback: (LibDDWAF::ddwaf_log_level, ::String, ::String, ::Integer, ::FFI::Pointer, ::Integer) -> void
|
162
|
+
def self.logger: () -> ::Logger
|
163
|
+
def self.logger=: (::Logger logger) -> void
|
164
|
+
|
165
|
+
RESULT_CODE: ::Hash[::Symbol, ::Symbol]
|
166
|
+
|
167
|
+
class Handle
|
168
|
+
attr_reader handle_obj: ::FFI::Pointer
|
169
|
+
attr_reader ruleset_info: Hash[Symbol, untyped]
|
170
|
+
|
171
|
+
def initialize: (data rule, ?limits: ::Hash[::Symbol, ::Integer], ?obfuscator: ::Hash[::Symbol, ::String]) -> void
|
172
|
+
def finalize: () -> untyped
|
173
|
+
def required_addresses: () -> ::Array[::String]
|
174
|
+
def update_rule_data: (::Array[untyped]) -> ::Symbol
|
175
|
+
def toggle_rules: (::Hash[::String, bool]) -> ::Symbol
|
176
|
+
|
177
|
+
private
|
178
|
+
|
179
|
+
@valid: bool
|
180
|
+
|
181
|
+
def validate!: () -> void
|
182
|
+
def invalidate!: () -> void
|
183
|
+
def valid?: () -> (nil | bool)
|
184
|
+
def valid!: () -> void
|
185
|
+
|
186
|
+
@retained: Array[untyped]
|
187
|
+
|
188
|
+
def retained: () -> Array[untyped]
|
189
|
+
def retain: (top object) -> void
|
190
|
+
def release: (top object) -> void
|
191
|
+
end
|
192
|
+
|
193
|
+
type result_data = Array[untyped] | nil
|
194
|
+
|
195
|
+
class Result
|
196
|
+
attr_reader status: ::Symbol
|
197
|
+
attr_reader data: untyped
|
198
|
+
attr_reader total_runtime: ::Float
|
199
|
+
attr_reader timeout: bool
|
200
|
+
attr_reader actions: ::Array[::String]
|
201
|
+
|
202
|
+
def initialize: (::Symbol, result_data, ::Float, bool, ::Array[::String]) -> void
|
203
|
+
end
|
204
|
+
|
205
|
+
class Context
|
206
|
+
attr_reader context_obj: ::FFI::Pointer
|
207
|
+
|
208
|
+
def initialize: (Handle handle) -> void
|
209
|
+
def finalize: () -> void
|
210
|
+
|
211
|
+
def run: (data input, ?::Integer timeout) -> ::Array[top]
|
212
|
+
|
213
|
+
private
|
214
|
+
|
215
|
+
@valid: bool
|
216
|
+
|
217
|
+
def validate!: () -> void
|
218
|
+
def invalidate!: () -> void
|
219
|
+
def valid?: () -> (nil | bool)
|
220
|
+
def valid!: () -> void
|
221
|
+
|
222
|
+
@retained: Array[untyped]
|
223
|
+
|
224
|
+
def retained: () -> Array[untyped]
|
225
|
+
def retain: (top object) -> void
|
226
|
+
def release: (top object) -> void
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
data/sig/libddwaf.rbs
ADDED
File without changes
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module FFI
|
2
|
+
module Type
|
3
|
+
class Builtin
|
4
|
+
end
|
5
|
+
|
6
|
+
class Mapped
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class AbstractMemory
|
11
|
+
def get_array_of_string: (::Integer, ::Integer) -> Array[String]
|
12
|
+
def read_bytes: (::Integer) -> ::String
|
13
|
+
end
|
14
|
+
|
15
|
+
class Pointer < AbstractMemory
|
16
|
+
NULL: Pointer
|
17
|
+
|
18
|
+
def null?: () -> bool
|
19
|
+
end
|
20
|
+
|
21
|
+
class MemoryPointer < Pointer
|
22
|
+
def self.from_string: (::String) -> MemoryPointer
|
23
|
+
end
|
24
|
+
|
25
|
+
class Enum
|
26
|
+
end
|
27
|
+
|
28
|
+
class Union
|
29
|
+
def self.layout: (*(Symbol | Integer)) -> void
|
30
|
+
end
|
31
|
+
|
32
|
+
type union = top # TODO: handle user-defined unions
|
33
|
+
|
34
|
+
class Struct
|
35
|
+
# TODO: layout args are actually "Symbol | Union, Integer, *(Symbol | Union, Integer)"
|
36
|
+
def self.layout: (*(Symbol | Integer | union)) -> void
|
37
|
+
def self.by_ref: () -> Type::Mapped
|
38
|
+
def self.size: () -> Integer
|
39
|
+
|
40
|
+
def null?: () -> bool
|
41
|
+
def initialize: (?Pointer) -> void
|
42
|
+
def []: (Symbol) -> untyped
|
43
|
+
def []=: (Symbol, untyped) -> untyped
|
44
|
+
def pointer: () -> Pointer
|
45
|
+
end
|
46
|
+
|
47
|
+
class Function < Pointer
|
48
|
+
end
|
49
|
+
|
50
|
+
module Library
|
51
|
+
# these can be worked around by typedef'ing to a Symbol
|
52
|
+
type enum = top # TODO: handle user-defined enum constants
|
53
|
+
type ref = top # TODO: handle by_ref references
|
54
|
+
type typedef = top # TODO: handle non-builtin types
|
55
|
+
|
56
|
+
def ffi_lib: (Array[String]) -> void
|
57
|
+
def typedef: (ref | Symbol, Symbol) -> (Type::Builtin | Type::Mapped | typedef)
|
58
|
+
def attach_function: (Symbol, Array[Symbol | Struct | enum], Symbol | Enum, ?blocking: bool) -> Function
|
59
|
+
def callback: (Symbol, Array[Symbol | Enum | Struct], Symbol | Enum) -> Function
|
60
|
+
def enum: (*untyped) -> Enum
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libddwaf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -33,9 +33,11 @@ executables: []
|
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
|
+
- ".github/workflows/lint.yml"
|
36
37
|
- ".github/workflows/package.yml"
|
37
38
|
- ".github/workflows/test.yml"
|
38
39
|
- ".gitignore"
|
40
|
+
- CHANGELOG.md
|
39
41
|
- CONTRIBUTING.md
|
40
42
|
- LICENSE
|
41
43
|
- LICENSE-3rdparty.csv
|
@@ -43,11 +45,18 @@ files:
|
|
43
45
|
- LICENSE.BSD3
|
44
46
|
- NOTICE
|
45
47
|
- README.md
|
48
|
+
- Steepfile
|
46
49
|
- lib/datadog/appsec/waf.rb
|
47
50
|
- lib/datadog/appsec/waf/version.rb
|
48
51
|
- lib/libddwaf.rb
|
49
52
|
- libddwaf.gemspec
|
50
|
-
|
53
|
+
- sig/datadog/appsec/waf.rbs
|
54
|
+
- sig/datadog/appsec/waf/version.rbs
|
55
|
+
- sig/libddwaf.rbs
|
56
|
+
- vendor/rbs/ffi/0/ffi.rbs
|
57
|
+
- vendor/rbs/gem/0/gem.rbs
|
58
|
+
- vendor/rbs/jruby/0/jruby.rbs
|
59
|
+
homepage: https://github.com/DataDog/libddwaf-rb
|
51
60
|
licenses:
|
52
61
|
- BSD-3-Clause
|
53
62
|
metadata:
|