Top Level Namespace

Defined Under Namespace

Modules: LibInjection, Rack

Constant Summary collapse

USE_SYSTEM =
arg_config("--use-system-libinjection") || ENV["LIBINJECTION_USE_SYSTEM"] == "1"
EXT_DIR =
__dir__
PRIMARY_VENDOR_DIR =
File.join(EXT_DIR, "vendor", "libinjection")
REQUIRED_VENDOR_FILES =
%w[
  src/libinjection.h
  src/libinjection_error.h
  src/libinjection_sqli.h
  src/libinjection_sqli_data.h
  src/libinjection_xss.h
  src/libinjection_html5.h
  src/libinjection_sqli.c
  src/libinjection_xss.c
  src/libinjection_html5.c
].freeze

Instance Method Summary collapse

Instance Method Details

#abort_missing_vendor!Object



39
40
41
42
43
44
45
46
47
48
# File 'ext/libinjection/extconf.rb', line 39

def abort_missing_vendor!
  abort <<~MSG
    libinjection vendored sources are missing.

    Run:
      ruby script/vendor_libs.rb

    Security note: extconf.rb does not auto-download native sources during build.
  MSG
end

#compiler_versionObject



24
25
26
27
28
29
# File 'ext/libinjection/extconf.rb', line 24

def compiler_version
  cc = RbConfig::CONFIG.fetch("CC", "cc")
  `#{cc} --version 2>&1`
rescue StandardError
  ""
end

#configure_system!Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'ext/libinjection/extconf.rb', line 66

def configure_system!
  puts "Building with SYSTEM libinjection"

  if find_executable("pkg-config")
    cflags = `pkg-config --cflags libinjection 2>/dev/null`.strip
    libs   = `pkg-config --libs   libinjection 2>/dev/null`.strip
    $CPPFLAGS << " #{cflags}" unless cflags.empty?
    $libs     << " #{libs}"   unless libs.empty?
  end

  abort "libinjection.h is required"        unless have_header("libinjection.h")
  abort "libinjection_sqli.h is required"   unless have_header("libinjection_sqli.h")
  abort "libinjection_xss.h is required"    unless have_header("libinjection_xss.h")
  abort "libinjection library is required"  unless have_library("injection", "libinjection_sqli")
  abort "libinjection_version() is required" unless have_func("libinjection_version")
end

#configure_vendored!(vendor_dir) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
# File 'ext/libinjection/extconf.rb', line 83

def configure_vendored!(vendor_dir)
  abort "libinjection vendored sources are missing" unless vendor_dir

  versions = File.read(File.join(vendor_dir, ".vendored"))
  puts "Building with VENDORED libinjection from #{vendor_dir}"
  puts "  #{versions.tr("\n", ", ")}"

  src_dir = File.join(vendor_dir, "src")
  $CPPFLAGS << " -I#{src_dir}"
  $srcs  = %w[libinjection_ext.c libinjection_sqli.c libinjection_xss.c libinjection_html5.c]
  $VPATH = [EXT_DIR, src_dir]
end

#find_vendor_dirObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'ext/libinjection/extconf.rb', line 50

def find_vendor_dir
  candidates = [PRIMARY_VENDOR_DIR]

  dir = __dir__
  6.times do
    candidates << File.join(dir, "ext", "libinjection", "vendor", "libinjection")
    dir = File.dirname(dir)
  end

  candidates.map! { |path| File.expand_path(path) }
  candidates.uniq!

  abort_missing_vendor! unless vendor_ready?(PRIMARY_VENDOR_DIR)
  candidates.find { |path| vendor_ready?(path) }
end

#gcc_without_clang?Boolean

Returns:

  • (Boolean)


31
32
33
34
# File 'ext/libinjection/extconf.rb', line 31

def gcc_without_clang?
  version = compiler_version.downcase
  version.include?("gcc") && !version.include?("clang")
end

#vendor_ready?(dir) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
# File 'ext/libinjection/extconf.rb', line 35

def vendor_ready?(dir)
  File.file?(File.join(dir, ".vendored")) && REQUIRED_VENDOR_FILES.all? { |path| File.file?(File.join(dir, path)) }
end