Module: Datadog::AppSec::WAF::LibDDWAF

Extended by:
FFI::Library
Defined in:
lib/datadog/appsec/waf/lib_ddwaf.rb

Overview

FFI-binding for C-libddwaf See github.com/DataDog/libddwaf

Defined Under Namespace

Classes: HandleBuilderConfig, Object, ObjectValueUnion, Result, SizeTPtr, UInt32Ptr, UInt64Ptr

Constant Summary collapse

DEFAULT_MAX_CONTAINER_SIZE =
256
DEFAULT_MAX_CONTAINER_DEPTH =
20
DEFAULT_MAX_STRING_LENGTH =

in bytes, UTF-8 worst case being 4x size in terms of code point

16_384
DDWAF_MAX_CONTAINER_SIZE =
256
DDWAF_MAX_CONTAINER_DEPTH =
20
DDWAF_MAX_STRING_LENGTH =
4096
DDWAF_RUN_TIMEOUT =
5000
DDWAF_OBJ_TYPE =

ddwaf::object data structure

enum :ddwaf_obj_invalid, 0,
:ddwaf_obj_signed, 1 << 0,
:ddwaf_obj_unsigned, 1 << 1,
:ddwaf_obj_string, 1 << 2,
:ddwaf_obj_array, 1 << 3,
:ddwaf_obj_map, 1 << 4,
:ddwaf_obj_bool, 1 << 5,
:ddwaf_obj_float, 1 << 6,
:ddwaf_obj_null, 1 << 7
ObjectFree =

freeers

attach_function :ddwaf_object_free, [:ddwaf_object], :void
ObjectNoFree =
::FFI::Pointer::NULL
DDWAF_RET_CODE =

updating

enum :ddwaf_err_internal, -3,
:ddwaf_err_invalid_object, -2,
:ddwaf_err_invalid_argument, -1,
:ddwaf_ok, 0,
:ddwaf_match, 1
DDWAF_LOG_LEVEL =

logging

enum :ddwaf_log_trace,
:ddwaf_log_debug,
:ddwaf_log_info,
:ddwaf_log_warn,
:ddwaf_log_error,
:ddwaf_log_off

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.local_cpuObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 40

def self.local_cpu
  if RUBY_ENGINE == "jruby"
    os_arch = java.lang.System.get_property("os.arch")

    cpu = case os_arch
    when "amd64" then "x86_64"
    when "aarch64" then (local_os == "darwin") ? "arm64" : "aarch64"
    else raise Error, "unsupported JRuby os.arch: #{os_arch.inspect}"
    end

    return cpu
  end

  Gem::Platform.local.cpu
end

.local_osObject



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 24

def self.local_os
  if RUBY_ENGINE == "jruby"
    os_name = java.lang.System.get_property("os.name")

    os = case os_name
    when /linux/i then "linux"
    when /mac/i then "darwin"
    else raise Error, "unsupported JRuby os.name: #{os_name.inspect}"
    end

    return os
  end

  Gem::Platform.local.os
end

.shared_lib_extnameObject



60
61
62
63
64
65
66
67
68
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 60

def self.shared_lib_extname
  if Gem::Platform.local.os == "darwin"
    ".dylib"
  elsif Gem::Platform.local.os == "java" && java.lang.System.get_property("os.name").match(/mac/i)
    ".dylib"
  else
    ".so"
  end
end

.shared_lib_pathObject



70
71
72
73
74
75
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 70

def self.shared_lib_path
  variant = "#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{local_os}-#{local_cpu}"
  libddwaf_dir = File.join(source_dir, "../../../../vendor/libddwaf/libddwaf-#{variant}")

  File.join(libddwaf_dir, "lib", "libddwaf#{shared_lib_extname}")
end

.source_dirObject



56
57
58
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 56

def self.source_dir
  __dir__ || raise("__dir__ is nil: eval?")
end

Instance Method Details

#ddwaf_object_invalidObject

setters



153
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 153

attach_function :ddwaf_object_invalid, [:ddwaf_object], :ddwaf_object

#ddwaf_object_typeObject

getters



175
# File 'lib/datadog/appsec/waf/lib_ddwaf.rb', line 175

attach_function :ddwaf_object_type, [:ddwaf_object], DDWAF_OBJ_TYPE