aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorJakub Jirutka <jakub@jirutka.cz>2019-10-27 19:59:52 +0100
committerJakub Jirutka <jakub@jirutka.cz>2019-10-27 20:25:27 +0100
commit5681c8e06c3b98f9e0e5e5ad568d283fe7583dfa (patch)
treee6f3fe7a74145dfaeaa0b1d1f5b29de0ebd4ebfc /main
parent8823ed4d1ad86a528819a7568862ddbc1475aeb9 (diff)
downloadaports-5681c8e06c3b98f9e0e5e5ad568d283fe7583dfa.tar.bz2
aports-5681c8e06c3b98f9e0e5e5ad568d283fe7583dfa.tar.xz
main/ruby: add support for .include directive used by OpenSSL config files
Diffstat (limited to 'main')
-rw-r--r--main/ruby/APKBUILD4
-rw-r--r--main/ruby/openssl-config-support-include-directive.patch184
2 files changed, 187 insertions, 1 deletions
diff --git a/main/ruby/APKBUILD b/main/ruby/APKBUILD
index c4f1cd0600..82b39c69a3 100644
--- a/main/ruby/APKBUILD
+++ b/main/ruby/APKBUILD
@@ -70,6 +70,7 @@ source="https://cache.ruby-lang.org/pub/$pkgname/${pkgver%.*}/$pkgname-$pkgver.t
test_insns-lower-recursion-depth.patch
fix-get_main_stack.patch
avoid-rdoc-hook-when-its-failed-to-load-rdoc-library.patch
+ openssl-config-support-include-directive.patch
"
replaces="ruby-gems"
builddir="$srcdir/$pkgname-$pkgver"
@@ -357,4 +358,5 @@ sha512sums="7ab7a0cdaf4863152efc86dbcfada7f10ab3fe33590eee3b6ab7b26fc27835a8a0de
cfdc5ea3b2e2ea69c51f38e8e2180cb1dc27008ca55cc6301f142ebafdbab31c3379b3b6bba9ff543153876dd98ed2ad194df3255b7ea77a62e931c935f80538 rubygems-avoid-platform-specific-gems.patch
814fe6359505b70d8ff680adf22f20a74b4dbd3fecc9a63a6c2456ee9824257815929917b6df5394ed069a6869511b8c6dce5b95b4acbbb7867c1f3a975a0150 test_insns-lower-recursion-depth.patch
8d730f02f76e53799f1c220eb23e3d2305940bb31216a7ab1e42d3256149c0721c7d173cdbfe505023b1af2f5cb3faa233dcc1b5d560fa8f980c17c2d29a9d81 fix-get_main_stack.patch
-cc6acabcf8d237ba75309f7c3b5fbe6bd68b2e355d2c4a656a50dea6dda4ab8153db90399b23d301ee463d56274f629aa40b2958646122f71925b4e2e602304d avoid-rdoc-hook-when-its-failed-to-load-rdoc-library.patch"
+cc6acabcf8d237ba75309f7c3b5fbe6bd68b2e355d2c4a656a50dea6dda4ab8153db90399b23d301ee463d56274f629aa40b2958646122f71925b4e2e602304d avoid-rdoc-hook-when-its-failed-to-load-rdoc-library.patch
+a67813d7aa3553ed336f04b17461c5129546afb71a2a7cca6d1b1c860f8dd5839ca2f7695c971369f295aced3580687a28881ccd6c305f6dbdfe6b0ecf584d0e openssl-config-support-include-directive.patch"
diff --git a/main/ruby/openssl-config-support-include-directive.patch b/main/ruby/openssl-config-support-include-directive.patch
new file mode 100644
index 0000000000..2abf463760
--- /dev/null
+++ b/main/ruby/openssl-config-support-include-directive.patch
@@ -0,0 +1,184 @@
+From f46bac1f3e8634e24c747d06b28e11b874f1e488 Mon Sep 17 00:00:00 2001
+From: Kazuki Yamaguchi <k@rhe.jp>
+Date: Thu, 16 Aug 2018 19:40:48 +0900
+Subject: [PATCH] config: support .include directive
+
+OpenSSL 1.1.1 introduces a new '.include' directive. Update our config
+parser to support that.
+
+As mentioned in the referenced GitHub issue, we should use the OpenSSL
+API instead of implementing the parsing logic ourselves, but it will
+need backwards-incompatible changes which we can't backport to stable
+versions. So continue to use the Ruby implementation for now.
+
+Reference: https://github.com/ruby/openssl/issues/208
+
+Patch-Source: https://src.fedoraproject.org/rpms/ruby/blob/04b63f48ea89ff10fcffafe2ff3815dfa0e16e99/f/ruby-2.6.0-config-support-include-directive.patch
+---
+ ext/openssl/lib/openssl/config.rb | 54 ++++++++++++++++++++-----------
+ test/openssl/test_config.rb | 54 +++++++++++++++++++++++++++++++
+ 2 files changed, 90 insertions(+), 18 deletions(-)
+
+diff --git a/ext/openssl/lib/openssl/config.rb b/ext/openssl/lib/openssl/config.rb
+index 88225451..ba3a54c8 100644
+--- a/ext/openssl/lib/openssl/config.rb
++++ b/ext/openssl/lib/openssl/config.rb
+@@ -77,29 +77,44 @@ def get_key_string(data, section, key) # :nodoc:
+ def parse_config_lines(io)
+ section = 'default'
+ data = {section => {}}
+- while definition = get_definition(io)
++ io_stack = [io]
++ while definition = get_definition(io_stack)
+ definition = clear_comments(definition)
+ next if definition.empty?
+- if definition[0] == ?[
++ case definition
++ when /\A\[/
+ if /\[([^\]]*)\]/ =~ definition
+ section = $1.strip
+ data[section] ||= {}
+ else
+ raise ConfigError, "missing close square bracket"
+ end
+- else
+- if /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/ =~ definition
+- if $2
+- section = $1
+- key = $2
+- else
+- key = $1
++ when /\A\.include (\s*=\s*)?(.+)\z/
++ path = $2
++ if File.directory?(path)
++ files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB)
++ else
++ files = [path]
++ end
++
++ files.each do |filename|
++ begin
++ io_stack << StringIO.new(File.read(filename))
++ rescue
++ raise ConfigError, "could not include file '%s'" % filename
+ end
+- value = unescape_value(data, section, $3)
+- (data[section] ||= {})[key] = value.strip
++ end
++ when /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/
++ if $2
++ section = $1
++ key = $2
+ else
+- raise ConfigError, "missing equal sign"
++ key = $1
+ end
++ value = unescape_value(data, section, $3)
++ (data[section] ||= {})[key] = value.strip
++ else
++ raise ConfigError, "missing equal sign"
+ end
+ end
+ data
+@@ -212,10 +227,10 @@ def clear_comments(line)
+ scanned.join
+ end
+
+- def get_definition(io)
+- if line = get_line(io)
++ def get_definition(io_stack)
++ if line = get_line(io_stack)
+ while /[^\\]\\\z/ =~ line
+- if extra = get_line(io)
++ if extra = get_line(io_stack)
+ line += extra
+ else
+ break
+@@ -225,9 +240,12 @@ def get_definition(io)
+ end
+ end
+
+- def get_line(io)
+- if line = io.gets
+- line.gsub(/[\r\n]*/, '')
++ def get_line(io_stack)
++ while io = io_stack.last
++ if line = io.gets
++ return line.gsub(/[\r\n]*/, '')
++ end
++ io_stack.pop
+ end
+ end
+ end
+diff --git a/test/openssl/test_config.rb b/test/openssl/test_config.rb
+index 99dcc497..5653b5d0 100644
+--- a/test/openssl/test_config.rb
++++ b/test/openssl/test_config.rb
+@@ -120,6 +120,49 @@ def test_s_parse_format
+ assert_equal("error in line 7: missing close square bracket", excn.message)
+ end
+
++ def test_s_parse_include
++ in_tmpdir("ossl-config-include-test") do |dir|
++ Dir.mkdir("child")
++ File.write("child/a.conf", <<~__EOC__)
++ [default]
++ file-a = a.conf
++ [sec-a]
++ a = 123
++ __EOC__
++ File.write("child/b.cnf", <<~__EOC__)
++ [default]
++ file-b = b.cnf
++ [sec-b]
++ b = 123
++ __EOC__
++ File.write("include-child.conf", <<~__EOC__)
++ key_outside_section = value_a
++ .include child
++ __EOC__
++
++ include_file = <<~__EOC__
++ [default]
++ file-main = unnamed
++ [sec-main]
++ main = 123
++ .include = include-child.conf
++ __EOC__
++
++ # Include a file by relative path
++ c1 = OpenSSL::Config.parse(include_file)
++ assert_equal(["default", "sec-a", "sec-b", "sec-main"], c1.sections.sort)
++ assert_equal(["file-main", "file-a", "file-b"], c1["default"].keys)
++ assert_equal({"a" => "123"}, c1["sec-a"])
++ assert_equal({"b" => "123"}, c1["sec-b"])
++ assert_equal({"main" => "123", "key_outside_section" => "value_a"}, c1["sec-main"])
++
++ # Relative paths are from the working directory
++ assert_raise(OpenSSL::ConfigError) do
++ Dir.chdir("child") { OpenSSL::Config.parse(include_file) }
++ end
++ end
++ end
++
+ def test_s_load
+ # alias of new
+ c = OpenSSL::Config.load
+@@ -299,6 +342,17 @@ def test_clone
+ @it['newsection'] = {'a' => 'b'}
+ assert_not_equal(@it.sections.sort, c.sections.sort)
+ end
++
++ private
++
++ def in_tmpdir(*args)
++ Dir.mktmpdir(*args) do |dir|
++ dir = File.realpath(dir)
++ Dir.chdir(dir) do
++ yield dir
++ end
++ end
++ end
+ end
+
+ end