Architecture specific change in rpms/blosc.git
by githook-noreply@fedoraproject.org
The package rpms/blosc.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/blosc.git/commit/?id=db930b84568f....
Change:
-%ifarch x86_64
Thanks.
Full change:
============
commit b60ac0409917a1db3856df4be154a6eb429e2f8d
Author: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
Date: Tue Aug 11 05:31:50 2020 -0400
Re-enable Snappy support.
diff --git a/blosc.spec b/blosc.spec
index 13a41bc..5b6282b 100644
--- a/blosc.spec
+++ b/blosc.spec
@@ -60,7 +60,7 @@ sed -i '1i #!/usr/bin/python3' bench/plot-speeds.py
-DBUILD_STATIC:BOOL=OFF \
-DPREFER_EXTERNAL_LZ4:BOOL=ON \
-DTEST_INCLUDE_BENCH_SUITE:BOOL=OFF \
- -DPREFER_EXTERNAL_SNAPPY:BOOL=ON \
+ -DDEACTIVATE_SNAPPY:BOOL=OFF \
-DPREFER_EXTERNAL_ZLIB:BOOL=ON \
-DPREFER_EXTERNAL_ZSTD:BOOL=ON
@@ -100,6 +100,7 @@ install -p bench/plot-speeds.py %{buildroot}/%{_bindir}/%{name}-plot-times
%changelog
* Tue Aug 11 2020 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.19.0-4
- Fix build for new CMake macros (#1863272)
+- Re-enable Snappy support (#1867915)
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.19.0-3
- Second attempt - Rebuilt for
commit db930b84568fa641a5facc04f8bd31b5757ea961
Author: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
Date: Tue Aug 11 04:27:05 2020 -0400
Fix build for new CMake macros.
diff --git a/blosc.spec b/blosc.spec
index f3e512b..13a41bc 100644
--- a/blosc.spec
+++ b/blosc.spec
@@ -1,7 +1,7 @@
Summary: High performance compressor optimized for binary data
Name: blosc
Version: 1.19.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: MIT
Source: https://github.com/Blosc/c-blosc/archive/v%{version}/blosc-%{version}.tar.gz
@@ -57,33 +57,26 @@ sed -i '1i #!/usr/bin/python3' bench/plot-speeds.py
%build
# Use the proper library path and SSE2 instruction on 64bits systems
%cmake \
-%ifarch x86_64
- %{?_cmake_lib_suffix64} \
-%endif
- -DCMAKE_BUILD_TYPE:STRING="Debug" \
- -DCMAKE_C_FLAGS:STRING="%{optflags}" \
- -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DBUILD_STATIC:BOOL=OFF \
-DPREFER_EXTERNAL_LZ4:BOOL=ON \
-DTEST_INCLUDE_BENCH_SUITE:BOOL=OFF \
-DPREFER_EXTERNAL_SNAPPY:BOOL=ON \
-DPREFER_EXTERNAL_ZLIB:BOOL=ON \
- -DPREFER_EXTERNAL_ZSTD:BOOL=ON \
- .
+ -DPREFER_EXTERNAL_ZSTD:BOOL=ON
-# Parallel build failed
-make VERBOSE=1 #{?_smp_mflags}
+%cmake_build
%check
-LD_LIBRARY_PATH=%{buildroot}%{_libdir} make test VERBOSE=1
+export LD_LIBRARY_PATH=%{buildroot}%{_libdir}
+%ctest
%install
-%make_install
+%cmake_install
install -p bench/plot-speeds.py* -Dt %{buildroot}/%{_pkgdocdir}/bench/
install -pm 0644 bench/*.c %{buildroot}/%{_pkgdocdir}/bench
-install -p bench/bench -D %{buildroot}/%{_bindir}/%{name}-bench
+install -p %{_vpath_builddir}/bench/bench -D %{buildroot}/%{_bindir}/%{name}-bench
install -p bench/plot-speeds.py %{buildroot}/%{_bindir}/%{name}-plot-times
%files
@@ -105,6 +98,9 @@ install -p bench/plot-speeds.py %{buildroot}/%{_bindir}/%{name}-plot-times
%changelog
+* Tue Aug 11 2020 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.19.0-4
+- Fix build for new CMake macros (#1863272)
+
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.19.0-3
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
3 years, 8 months
Architecture specific change in rpms/mlpack.git
by githook-noreply@fedoraproject.org
The package rpms/mlpack.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/mlpack.git/commit/?id=a631a4e0646....
Change:
+%ifarch i686
Thanks.
Full change:
============
commit a631a4e064681b210ccd9f07ebb88fd48336ae0b
Author: Ryan Curtin <ryan(a)ratml.org>
Date: Thu Sep 10 02:46:59 2020 +0000
Attempt to reduce RAM usage for i686.
diff --git a/mlpack.spec b/mlpack.spec
index c6cb9cc..5abe8e9 100644
--- a/mlpack.spec
+++ b/mlpack.spec
@@ -155,6 +155,12 @@ cmake -D CMAKE_C_FLAGS="`echo %{optflags} | sed 's/-pipe//g' | sed 's/$/ --param
cd ..;
%endif
+%ifarch i686
+cd %{_vpath_builddir};
+cmake -D CMAKE_C_FLAGS="`echo %{optflags} | sed 's/-pipe//g' | sed 's/$/ --param ggc-min-heapsize=32768 --param ggc-min-expand=1/'`" -D CMAKE_CXX_FLAGS="`echo %{optflags} | sed 's/-pipe//g' | sed 's/$/ --param ggc-min-heapsize=32768 --param ggc-min-expand=1/'`" .
+cd ..;
+%endif
+
# Don't use %make because it could use too much RAM with multiple cores on Koji...
%{cmake_build}
# Build documentation ('doc' is not in the list of default targets).
3 years, 8 months
Architecture specific change in rpms/blosc.git
by githook-noreply@fedoraproject.org
The package rpms/blosc.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/blosc.git/commit/?id=db930b84568f....
Change:
-%ifarch x86_64
Thanks.
Full change:
============
commit b60ac0409917a1db3856df4be154a6eb429e2f8d
Author: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
Date: Tue Aug 11 05:31:50 2020 -0400
Re-enable Snappy support.
diff --git a/blosc.spec b/blosc.spec
index 13a41bc..5b6282b 100644
--- a/blosc.spec
+++ b/blosc.spec
@@ -60,7 +60,7 @@ sed -i '1i #!/usr/bin/python3' bench/plot-speeds.py
-DBUILD_STATIC:BOOL=OFF \
-DPREFER_EXTERNAL_LZ4:BOOL=ON \
-DTEST_INCLUDE_BENCH_SUITE:BOOL=OFF \
- -DPREFER_EXTERNAL_SNAPPY:BOOL=ON \
+ -DDEACTIVATE_SNAPPY:BOOL=OFF \
-DPREFER_EXTERNAL_ZLIB:BOOL=ON \
-DPREFER_EXTERNAL_ZSTD:BOOL=ON
@@ -100,6 +100,7 @@ install -p bench/plot-speeds.py %{buildroot}/%{_bindir}/%{name}-plot-times
%changelog
* Tue Aug 11 2020 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.19.0-4
- Fix build for new CMake macros (#1863272)
+- Re-enable Snappy support (#1867915)
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.19.0-3
- Second attempt - Rebuilt for
commit db930b84568fa641a5facc04f8bd31b5757ea961
Author: Elliott Sales de Andrade <quantum.analyst(a)gmail.com>
Date: Tue Aug 11 04:27:05 2020 -0400
Fix build for new CMake macros.
diff --git a/blosc.spec b/blosc.spec
index f3e512b..13a41bc 100644
--- a/blosc.spec
+++ b/blosc.spec
@@ -1,7 +1,7 @@
Summary: High performance compressor optimized for binary data
Name: blosc
Version: 1.19.0
-Release: 3%{?dist}
+Release: 4%{?dist}
License: MIT
Source: https://github.com/Blosc/c-blosc/archive/v%{version}/blosc-%{version}.tar.gz
@@ -57,33 +57,26 @@ sed -i '1i #!/usr/bin/python3' bench/plot-speeds.py
%build
# Use the proper library path and SSE2 instruction on 64bits systems
%cmake \
-%ifarch x86_64
- %{?_cmake_lib_suffix64} \
-%endif
- -DCMAKE_BUILD_TYPE:STRING="Debug" \
- -DCMAKE_C_FLAGS:STRING="%{optflags}" \
- -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DBUILD_STATIC:BOOL=OFF \
-DPREFER_EXTERNAL_LZ4:BOOL=ON \
-DTEST_INCLUDE_BENCH_SUITE:BOOL=OFF \
-DPREFER_EXTERNAL_SNAPPY:BOOL=ON \
-DPREFER_EXTERNAL_ZLIB:BOOL=ON \
- -DPREFER_EXTERNAL_ZSTD:BOOL=ON \
- .
+ -DPREFER_EXTERNAL_ZSTD:BOOL=ON
-# Parallel build failed
-make VERBOSE=1 #{?_smp_mflags}
+%cmake_build
%check
-LD_LIBRARY_PATH=%{buildroot}%{_libdir} make test VERBOSE=1
+export LD_LIBRARY_PATH=%{buildroot}%{_libdir}
+%ctest
%install
-%make_install
+%cmake_install
install -p bench/plot-speeds.py* -Dt %{buildroot}/%{_pkgdocdir}/bench/
install -pm 0644 bench/*.c %{buildroot}/%{_pkgdocdir}/bench
-install -p bench/bench -D %{buildroot}/%{_bindir}/%{name}-bench
+install -p %{_vpath_builddir}/bench/bench -D %{buildroot}/%{_bindir}/%{name}-bench
install -p bench/plot-speeds.py %{buildroot}/%{_bindir}/%{name}-plot-times
%files
@@ -105,6 +98,9 @@ install -p bench/plot-speeds.py %{buildroot}/%{_bindir}/%{name}-plot-times
%changelog
+* Tue Aug 11 2020 Elliott Sales de Andrade <quantum.analyst(a)gmail.com> - 1.19.0-4
+- Fix build for new CMake macros (#1863272)
+
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.19.0-3
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
3 years, 8 months
Architecture specific change in rpms/golang-github-gin-gonic.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-gin-gonic.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-gin-gonic.git/commi....
Change:
+%ifnarch s390x %{ix86} %{arm}
Thanks.
Full change:
============
commit d44c91213c633571f8a2912b8e6f16997dd0764d
Author: Robert-André Mauchin <zebob.m(a)gmail.com>
Date: Wed Sep 9 21:46:44 2020 +0200
Drop tests for 32 bits arches
Signed-off-by: Robert-André Mauchin <zebob.m(a)gmail.com>
diff --git a/golang-github-gin-gonic.spec b/golang-github-gin-gonic.spec
index 0473723..d759519 100644
--- a/golang-github-gin-gonic.spec
+++ b/golang-github-gin-gonic.spec
@@ -1,5 +1,5 @@
# Generated by go2rpm
-%ifnarch s390x
+%ifnarch s390x %{ix86} %{arm}
%bcond_without check
%endif
@@ -52,7 +52,7 @@ BuildRequires: golang(github.com/stretchr/testify/require)
%if %{with check}
%check
-%gocheck -d render -d binding
+%gocheck -d render
%endif
%gopkgfiles
commit 464ccf1843eb9bb251576a2745e413416e8b34cb
Author: Robert-André Mauchin <zebob.m(a)gmail.com>
Date: Wed Sep 9 21:44:16 2020 +0200
Drop tests for 32 bits arches
Signed-off-by: Robert-André Mauchin <zebob.m(a)gmail.com>
diff --git a/golang-github-gin-gonic.spec b/golang-github-gin-gonic.spec
index cb086aa..0473723 100644
--- a/golang-github-gin-gonic.spec
+++ b/golang-github-gin-gonic.spec
@@ -52,7 +52,7 @@ BuildRequires: golang(github.com/stretchr/testify/require)
%if %{with check}
%check
-%gocheck -d render
+%gocheck -d render -d binding
%endif
%gopkgfiles
commit b79e3d7c9f255ffd4d90b3fac07980db6e2893ff
Author: Robert-André Mauchin <zebob.m(a)gmail.com>
Date: Wed Sep 9 21:32:50 2020 +0200
Update to 1.6.3
Signed-off-by: Robert-André Mauchin <zebob.m(a)gmail.com>
diff --git a/.gitignore b/.gitignore
index 98ca8d3..f193d34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/gin-1.3.0.tar.gz
+/gin-1.6.3.tar.gz
diff --git a/golang-github-gin-gonic.spec b/golang-github-gin-gonic.spec
index cfb9f26..cb086aa 100644
--- a/golang-github-gin-gonic.spec
+++ b/golang-github-gin-gonic.spec
@@ -5,7 +5,7 @@
# https://github.com/gin-gonic/gin
%global goipath github.com/gin-gonic/gin
-Version: 1.3.0
+Version: 1.6.3
%gometa
@@ -19,34 +19,24 @@ performance and good productivity, you will love Gin.}
CODE_OF_CONDUCT.md CONTRIBUTING.md README.md
Name: %{goname}
-Release: 4%{?dist}
+Release: 1%{?dist}
Summary: HTTP web framework written in Go
License: MIT
URL: %{gourl}
Source0: %{gosource}
-BuildRequires: golang(github.com/dustin/go-broadcast)
BuildRequires: golang(github.com/gin-contrib/sse)
-BuildRequires: golang(github.com/gin-gonic/autotls)
+BuildRequires: golang(github.com/go-playground/validator/v10)
BuildRequires: golang(github.com/golang/protobuf/proto)
-BuildRequires: golang(github.com/jessevdk/go-assets)
-BuildRequires: golang(github.com/manucorporat/stats)
BuildRequires: golang(github.com/mattn/go-isatty)
-# Cyclic. Only in examples
-# BuildRequires: golang(github.com/thinkerou/favicon)
BuildRequires: golang(github.com/ugorji/go/codec)
-BuildRequires: golang(golang.org/x/crypto/acme/autocert)
-BuildRequires: golang(golang.org/x/net/context)
-BuildRequires: golang(golang.org/x/sync/errgroup)
-BuildRequires: golang(google.golang.org/grpc)
-BuildRequires: golang(google.golang.org/grpc/reflection)
-BuildRequires: golang(gopkg.in/go-playground/validator.v8)
BuildRequires: golang(gopkg.in/yaml.v2)
%if %{with check}
# Tests
BuildRequires: golang(github.com/stretchr/testify/assert)
+BuildRequires: golang(github.com/stretchr/testify/require)
%endif
%description
@@ -62,12 +52,15 @@ BuildRequires: golang(github.com/stretchr/testify/assert)
%if %{with check}
%check
-%gocheck
+%gocheck -d render
%endif
%gopkgfiles
%changelog
+* Thu Aug 13 23:52:31 CEST 2020 Robert-André Mauchin <zebob.m(a)gmail.com> - 1.6.3-1
+- Update to 1.6.3
+
* Mon Jul 27 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.3.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
diff --git a/sources b/sources
index 907e36b..d588a30 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (gin-1.3.0.tar.gz) = c47cbbe25b3ee8580ea0dd552be6cafa575f4e81b52aaa74f69529185a0e2e60bb00b4cbb86eb39e0004fbe86adb4b084e0c5b6ec733e4a1e74eb6f971290cec
+SHA512 (gin-1.6.3.tar.gz) = feb476a94e34bf5adba0349149d820db8e63a4467db4a7b87789317a8473d21bba89425e3a3ffae481ded861b1b0ec106f33a2eb9ecea5ae6beba3595d14542c
3 years, 8 months
Architecture specific change in rpms/golang-github-gin-gonic.git
by githook-noreply@fedoraproject.org
The package rpms/golang-github-gin-gonic.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/golang-github-gin-gonic.git/commi....
Change:
+%ifnarch s390x %{ix86} %{arm}
Thanks.
Full change:
============
commit d44c91213c633571f8a2912b8e6f16997dd0764d
Author: Robert-André Mauchin <zebob.m(a)gmail.com>
Date: Wed Sep 9 21:46:44 2020 +0200
Drop tests for 32 bits arches
Signed-off-by: Robert-André Mauchin <zebob.m(a)gmail.com>
diff --git a/golang-github-gin-gonic.spec b/golang-github-gin-gonic.spec
index 0473723..d759519 100644
--- a/golang-github-gin-gonic.spec
+++ b/golang-github-gin-gonic.spec
@@ -1,5 +1,5 @@
# Generated by go2rpm
-%ifnarch s390x
+%ifnarch s390x %{ix86} %{arm}
%bcond_without check
%endif
@@ -52,7 +52,7 @@ BuildRequires: golang(github.com/stretchr/testify/require)
%if %{with check}
%check
-%gocheck -d render -d binding
+%gocheck -d render
%endif
%gopkgfiles
3 years, 8 months
Architecture specific change in rpms/dotnet3.1.git
by githook-noreply@fedoraproject.org
The package rpms/dotnet3.1.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/dotnet3.1.git/commit/?id=978753d2....
Change:
+%ifarch aarch64
Thanks.
Full change:
============
commit fac26bd1ab1af64a08f3b9076bcf5d4505842947
Author: Omair Majid <omajid(a)redhat.com>
Date: Wed Sep 9 14:55:25 2020 -0400
Fix building on Fedora 34
Add Fedora 34 RID
Fix build of bundled libunwind
diff --git a/coreclr-libunwind-fno-common.patch b/coreclr-libunwind-fno-common.patch
new file mode 100644
index 0000000..5a1d407
--- /dev/null
+++ b/coreclr-libunwind-fno-common.patch
@@ -0,0 +1,402 @@
+From 29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e Mon Sep 17 00:00:00 2001
+From: Yichao Yu <yyc1992(a)gmail.com>
+Date: Tue, 31 Mar 2020 00:43:32 -0400
+Subject: [PATCH] Fix compilation with -fno-common.
+
+Making all other archs consistent with IA64 which should not have this problem.
+Also move the FIXME to the correct place.
+
+Also add some minimum comments about this...
+---
+ src/aarch64/Ginit.c | 15 +++++++--------
+ src/arm/Ginit.c | 15 +++++++--------
+ src/coredump/_UPT_get_dyn_info_list_addr.c | 5 +++++
+ src/hppa/Ginit.c | 15 +++++++--------
+ src/ia64/Ginit.c | 1 +
+ src/mi/Gfind_dynamic_proc_info.c | 1 +
+ src/mips/Ginit.c | 15 +++++++--------
+ src/ppc32/Ginit.c | 11 +++++++----
+ src/ppc64/Ginit.c | 11 +++++++----
+ src/ptrace/_UPT_get_dyn_info_list_addr.c | 5 +++++
+ src/s390x/Ginit.c | 15 +++++++--------
+ src/sh/Ginit.c | 15 +++++++--------
+ src/tilegx/Ginit.c | 15 +++++++--------
+ src/x86/Ginit.c | 15 +++++++--------
+ src/x86_64/Ginit.c | 15 +++++++--------
+ 15 files changed, 89 insertions(+), 80 deletions(-)
+
+diff --git a/src/pal/src/libunwind/src/aarch64/Ginit.c b/src/pal/src/libunwind/src/aarch64/Ginit.c
+index dec235c82..35389762f 100644
+--- a/src/pal/src/libunwind/src/aarch64/Ginit.c
++++ b/src/pal/src/libunwind/src/aarch64/Ginit.c
+@@ -61,13 +61,6 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -78,7 +71,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/arm/Ginit.c b/ssrc/pal/src/libunwind/src/arm/Ginit.c
+index 2720d063a..0bac0d72d 100644
+--- a/src/pal/src/libunwind/src/arm/Ginit.c
++++ b/src/pal/src/libunwind/src/arm/Ginit.c
+@@ -57,18 +57,17 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c b/src/pal/src/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c
+index 0d1190556..739ed0569 100644
+--- a/src/pal/src/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c
++++ b/src/pal/src/libunwind/src/coredump/_UPT_get_dyn_info_list_addr.c
+@@ -74,6 +74,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+
+ #else
+
++/* XXX fix me: there is currently no way to locate the dyn-info list
++ by a remote unwinder. On ia64, this is done via a special
++ unwind-table entry. Perhaps something similar can be done with
++ DWARF2 unwind info. */
++
+ static inline int
+ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+ int *countp)
+diff --git a/src/pal/src/libunwind/src/hppa/Ginit.c b/src/pal/src/libunwind/src/hppa/Ginit.c
+index 461e4b93d..265455a68 100644
+--- a/src/pal/src/libunwind/src/hppa/Ginit.c
++++ b/src/pal/src/libunwind/src/hppa/Ginit.c
+@@ -64,13 +64,6 @@ _Uhppa_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -81,7 +74,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/ia64/Ginit.c b/src/pal/src/libunwind/src/ia64/Ginit.c
+index b09a2ad57..8601bb3ca 100644
+--- a/src/pal/src/libunwind/src/ia64/Ginit.c
++++ b/src/pal/src/libunwind/src/ia64/Ginit.c
+@@ -68,6 +68,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ if (!_U_dyn_info_list_addr)
+ return -UNW_ENOINFO;
+ #endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
+ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+diff --git a/src/pal/src/libunwind/src/mi/Gfind_dynamic_proc_info.c b/src/pal/src/libunwind/src/mi/Gfind_dynamic_proc_info.c
+index 98d350128..2e7c62e5e 100644
+--- a/src/pal/src/libunwind/src/mi/Gfind_dynamic_proc_info.c
++++ b/src/pal/src/libunwind/src/mi/Gfind_dynamic_proc_info.c
+@@ -49,6 +49,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
+ return -UNW_ENOINFO;
+ #endif
+
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
+ list = (unw_dyn_info_list_t *) (uintptr_t) _U_dyn_info_list_addr ();
+ for (di = list->first; di; di = di->next)
+ if (ip >= di->start_ip && ip < di->end_ip)
+diff --git a/src/pal/src/libunwind/src/mips/Ginit.c b/src/pal/src/libunwind/src/mips/Ginit.c
+index 3df170c75..bf7a8f5a8 100644
+--- a/src/pal/src/libunwind/src/mips/Ginit.c
++++ b/src/pal/src/libunwind/src/mips/Ginit.c
+@@ -69,13 +69,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -86,7 +79,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/ppc32/Ginit.c b/src/pal/src/libunwind/src/ppc32/Ginit.c
+index ba302448a..7b4545580 100644
+--- a/src/pal/src/libunwind/src/ppc32/Ginit.c
++++ b/src/pal/src/libunwind/src/ppc32/Ginit.c
+@@ -91,9 +91,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -104,7 +101,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/ppc64/Ginit.c b/src/pal/src/libunwind/src/ppc64/Ginit.c
+index 4c88cd6e7..7bfb395a7 100644
+--- a/src/pal/src/libunwind/src/ppc64/Ginit.c
++++ b/src/pal/src/libunwind/src/ppc64/Ginit.c
+@@ -95,9 +95,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -108,7 +105,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c b/src/pal/src/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c
+index cc5ed0441..16671d453 100644
+--- a/src/pal/src/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c
++++ b/src/pal/src/libunwind/src/ptrace/_UPT_get_dyn_info_list_addr.c
+@@ -71,6 +71,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+
+ #else
+
++/* XXX fix me: there is currently no way to locate the dyn-info list
++ by a remote unwinder. On ia64, this is done via a special
++ unwind-table entry. Perhaps something similar can be done with
++ DWARF2 unwind info. */
++
+ static inline int
+ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+ int *countp)
+diff --git a/src/pal/src/libunwind/src/sh/Ginit.c b/src/pal/src/libunwind/src/sh/Ginit.c
+index 52988a721..9fe96d2bd 100644
+--- a/src/pal/src/libunwind/src/sh/Ginit.c
++++ b/src/pal/src/libunwind/src/sh/Ginit.c
+@@ -58,13 +58,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -75,7 +68,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/tilegx/Ginit.c b/src/pal/src/libunwind/src/tilegx/Ginit.c
+index 7564a558b..925e64132 100644
+--- a/src/pal/src/libunwind/src/tilegx/Ginit.c
++++ b/src/pal/src/libunwind/src/tilegx/Ginit.c
+@@ -64,13 +64,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -81,7 +74,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/x86/Ginit.c b/src/pal/src/libunwind/src/x86/Ginit.c
+index f6b8dc27d..3cec74a21 100644
+--- a/src/pal/src/libunwind/src/x86/Ginit.c
++++ b/src/pal/src/libunwind/src/x86/Ginit.c
+@@ -54,13 +54,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+
+ # endif /* UNW_LOCAL_ONLY */
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -71,7 +64,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
+diff --git a/src/pal/src/libunwind/src/x86_64/Ginit.c b/src/pal/src/libunwind/src/x86_64/Ginit.c
+index a865d3385..fd8d418b1 100644
+--- a/src/pal/src/libunwind/src/x86_64/Ginit.c
++++ b/src/pal/src/libunwind/src/x86_64/Ginit.c
+@@ -49,13 +49,6 @@ static struct unw_addr_space local_addr_space;
+
+ unw_addr_space_t unw_local_addr_space = &local_addr_space;
+
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+- by a remote unwinder. On ia64, this is done via a special
+- unwind-table entry. Perhaps something similar can be done with
+- DWARF2 unwind info. */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -66,7 +59,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+ void *arg)
+ {
+- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++ if (!_U_dyn_info_list_addr)
++ return -UNW_ENOINFO;
++#endif
++ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++ *dyn_info_list_addr = _U_dyn_info_list_addr ();
+ return 0;
+ }
+
diff --git a/corefx-f34-rid.patch b/corefx-f34-rid.patch
new file mode 100644
index 0000000..055b9b5
--- /dev/null
+++ b/corefx-f34-rid.patch
@@ -0,0 +1,84 @@
+diff --git a/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json b/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json
+index 91766bd892..cc10ebf83d 100644
+--- a/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json
++++ b/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json
+@@ -1026,6 +1026,38 @@
+ "any",
+ "base"
+ ],
++ "fedora.34": [
++ "fedora.34",
++ "fedora",
++ "linux",
++ "unix",
++ "any",
++ "base"
++ ],
++ "fedora.34-arm64": [
++ "fedora.34-arm64",
++ "fedora.34",
++ "fedora-arm64",
++ "fedora",
++ "linux-arm64",
++ "linux",
++ "unix-arm64",
++ "unix",
++ "any",
++ "base"
++ ],
++ "fedora.34-x64": [
++ "fedora.34-x64",
++ "fedora.34",
++ "fedora-x64",
++ "fedora",
++ "linux-x64",
++ "linux",
++ "unix-x64",
++ "unix",
++ "any",
++ "base"
++ ],
+ "freebsd": [
+ "freebsd",
+ "unix",
+diff --git a/pkg/Microsoft.NETCore.Platforms/runtime.json b/pkg/Microsoft.NETCore.Platforms/runtime.json
+index 4159a84e32..4fc2ee175f 100644
+--- a/pkg/Microsoft.NETCore.Platforms/runtime.json
++++ b/pkg/Microsoft.NETCore.Platforms/runtime.json
+@@ -516,6 +516,23 @@
+ "fedora-x64"
+ ]
+ },
++ "fedora.34": {
++ "#import": [
++ "fedora"
++ ]
++ },
++ "fedora.34-arm64": {
++ "#import": [
++ "fedora.34",
++ "fedora-arm64"
++ ]
++ },
++ "fedora.34-x64": {
++ "#import": [
++ "fedora.34",
++ "fedora-x64"
++ ]
++ },
+ "freebsd": {
+ "#import": [
+ "unix"
+diff --git a/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props b/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props
+index e4a6d269d2..333d174360 100644
+--- a/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props
++++ b/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props
+@@ -43,7 +43,7 @@
+ <RuntimeGroup Include="fedora">
+ <Parent>linux</Parent>
+ <Architectures>x64;arm64</Architectures>
+- <Versions>23;24;25;26;27;28;29;30;31;32;33</Versions>
++ <Versions>23;24;25;26;27;28;29;30;31;32;33;34</Versions>
+ <TreatVersionsAsCompatible>false</TreatVersionsAsCompatible>
+ </RuntimeGroup>
+
diff --git a/dotnet3.1.spec b/dotnet3.1.spec
index b84622a..9bce5f6 100644
--- a/dotnet3.1.spec
+++ b/dotnet3.1.spec
@@ -84,6 +84,8 @@ Source0: dotnet-v%{src_version}-SDK.tar.gz
Source1: check-debug-symbols.py
Source2: dotnet.sh.in
+Patch1: source-build-warnings-are-not-errors.patch
+
# Fix building with our additional CFLAGS/CXXFLAGS/LDFLAGS
Patch100: corefx-optflags-support.patch
@@ -93,10 +95,16 @@ Patch101: corefx-39686-cgroupv2-01.patch
Patch102: corefx-39686-cgroupv2-02.patch
Patch103: corefx-39633-cgroupv2-mountpoints.patch
+# Add Fedora 34 RID
+Patch104: corefx-f34-rid.patch
+
# Build with with hardening flags, including -pie
Patch200: coreclr-hardening-flags.patch
# Fix build with clang 10; Already applied at tarball-build time
# Patch201: coreclr-clang10.patch
+# Fix build on recent versions of gcc/clang
+# https://github.com/libunwind/libunwind/pull/166
+Patch202: coreclr-libunwind-fno-common.patch
# Build with with hardening flags, including -pie
Patch300: core-setup-hardening-flags.patch
@@ -363,16 +371,20 @@ sed -i 's|/usr/share/dotnet|%{_libdir}/dotnet|' src/core-setup.*/src/corehost/co
# Disable warnings
sed -i 's|skiptests|skiptests ignorewarnings|' repos/coreclr.proj
+%patch1 -p1
+
pushd src/corefx.*
%patch100 -p1
%patch101 -p1
%patch102 -p1
%patch103 -p1
+%patch104 -p1
popd
pushd src/coreclr.*
%patch200 -p1
#%%patch201 -p1
+%patch202 -p1
popd
pushd src/core-setup.*
@@ -407,6 +419,9 @@ cat /etc/os-release
%if %{without bootstrap}
# We need to create a copy because we will mutate this
cp -a %{_libdir}/dotnet previously-built-dotnet
+#FIXME remove
+sed -i -e 's|fedora.33|fedora.%{fedora}|g' previously-built-dotnet/sdk/3.1.106/RuntimeIdentifierGraph.json
+sed -i -e 's|fedora.33|fedora.%{fedora}|g' previously-built-dotnet/shared/Microsoft.NETCore.App/3.1.6/Microsoft.NETCore.App.deps.json
%endif
export CFLAGS="%{dotnet_cflags}"
@@ -536,6 +551,10 @@ echo "Testing build results for debug symbols..."
%changelog
+* Wed Sep 09 2020 Omair Majid <omajid(a)redhat.com> - 3.1.107-1
+- Add Fedora 34 RID
+- Fix build of bundled libunwind
+
* Wed Aug 19 2020 Omair Majid <omajid(a)redhat.com> - 3.1.107-1
- Update to .NET Core Runtime 3.1.7 and SDK 3.1.107
diff --git a/source-build-warnings-are-not-errors.patch b/source-build-warnings-are-not-errors.patch
new file mode 100644
index 0000000..4f75cfd
--- /dev/null
+++ b/source-build-warnings-are-not-errors.patch
@@ -0,0 +1,21 @@
+From c82976fd5eb4cbcf67faaba62f0bc59634d30338 Mon Sep 17 00:00:00 2001
+From: Chris Rummel <crummel(a)microsoft.com>
+Date: Fri, 14 Aug 2020 15:34:07 -0500
+Subject: [PATCH] Disable XLiff warning as error
+
+---
+ repos/xliff-tasks.proj | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/repos/xliff-tasks.proj b/repos/xliff-tasks.proj
+index da2ae79c5b..9b86754018 100644
+--- a/repos/xliff-tasks.proj
++++ b/repos/xliff-tasks.proj
+@@ -7,6 +7,7 @@
+ <BuildCommandArgs>$(BuildCommandArgs) /v:$(LogVerbosity)</BuildCommandArgs>
+ <BuildCommandArgs>$(BuildCommandArgs) /flp:Verbosity=Diag</BuildCommandArgs>
+ <BuildCommandArgs>$(BuildCommandArgs) /bl</BuildCommandArgs>
++ <BuildCommandArgs>$(BuildCommandArgs) /p:TreatWarningsAsErrors=false</BuildCommandArgs>
+ <BuildCommandArgs>$(BuildCommandArgs) $(RedirectRepoOutputToLog)</BuildCommandArgs>
+
+ <BuildCommand>$(DotnetToolCommand) $(BuildCommandArgs)</BuildCommand>
commit 96d980fa1bdfe9d40706b6a1ec34c0ff066f1b0e
Author: Omair Majid <omajid(a)redhat.com>
Date: Wed Aug 19 16:38:33 2020 -0400
Update to .NET Core Runtime 3.1.7 and SDK 3.1.107
Also work around https://github.com/dotnet/source-build/issues/1711 by
not using the system SDK when building the source-build tarball.
diff --git a/.gitignore b/.gitignore
index 692e6d2..5f27a7f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@
/dotnet-v3.1.105-SDK-arm64.tar.gz
/dotnet-v3.1.105-SDK-x64.tar.gz
/dotnet-v3.1.106-SDK.tar.gz
+/dotnet-v3.1.107-SDK.tar.gz
diff --git a/build-dotnet-tarball b/build-dotnet-tarball
index 9388fbf..e53b8c5 100755
--- a/build-dotnet-tarball
+++ b/build-dotnet-tarball
@@ -98,9 +98,8 @@ if [ ! -f "${unmodified_tarball_name}.tar.gz" ]; then
cp ../../corefx-42900-clang-10.patch patches/corefx
mkdir -p patches/aspnetcore/
cp ../../disable-aspnetcore-targetingpackoverride.patch patches/aspnetcore
- cp -r /usr/lib64/dotnet "${temp_dir}"
- ./build.sh --with-sdk ../dotnet /p:ArchiveDownloadedPackages=true
- ./build-source-tarball.sh "${unmodified_tarball_name}" --skip-build --with-sdk ../dotnet
+ ./build.sh /p:ArchiveDownloadedPackages=true /p:DownloadSourceBuildReferencePackagesTimeoutSeconds=100000 /p:DownloadSourceBuildReferencePackagesTimeoutSeconds=100000
+ ./build-source-tarball.sh "${unmodified_tarball_name}" --skip-build
popd
popd
diff --git a/dotnet3.1.spec b/dotnet3.1.spec
index a0f6312..b84622a 100644
--- a/dotnet3.1.spec
+++ b/dotnet3.1.spec
@@ -31,10 +31,10 @@
%endif
%global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g')
-%global host_version 3.1.6
-%global runtime_version 3.1.6
+%global host_version 3.1.7
+%global runtime_version 3.1.7
%global aspnetcore_runtime_version %{runtime_version}
-%global sdk_version 3.1.106
+%global sdk_version 3.1.107
# upstream can update releases without revving the SDK version so these don't always match
%global src_version %{sdk_version}
%global templates_version %(echo %{runtime_version} | awk 'BEGIN { FS="."; OFS="." } {print $1, $2, $3+1 }')
@@ -73,7 +73,7 @@
Name: dotnet3.1
Version: %{sdk_rpm_version}
-Release: 3%{?dist}
+Release: 1%{?dist}
Summary: .NET Core Runtime and SDK
License: MIT and ASL 2.0 and BSD and LGPLv2+ and CC-BY and CC0 and MS-PL and EPL-1.0 and GPL+ and GPLv2 and ISC and OFL and zlib
URL: https://github.com/dotnet/
@@ -536,6 +536,9 @@ echo "Testing build results for debug symbols..."
%changelog
+* Wed Aug 19 2020 Omair Majid <omajid(a)redhat.com> - 3.1.107-1
+- Update to .NET Core Runtime 3.1.7 and SDK 3.1.107
+
* Thu Aug 13 2020 Omair Majid <omajid(a)redhat.com> - 3.1.106-3
- Filter out -mbranch-protection=standard from cflags
diff --git a/sources b/sources
index af24996..18e7d98 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (dotnet-v3.1.106-SDK.tar.gz) = b9dbf4925c8c50611e42ca620697a1ee1c64ba1da2e1eb43c1bae75f2bbf7dc2fbc2f46e0967e342ce9e637e43e4ce0a2743c7ef51eb899db0cab4cb4fda7985
+SHA512 (dotnet-v3.1.107-SDK.tar.gz) = 8047eba7439412daea66c6c96a06b0bf693a6d34445f371fb21f9c9e55f29e0a717e7c45265839284547d18dc95da5959130c1bfa3b910f078d452b5b4d3d03b
commit 978753d2eec7b5581264819531e47d442d1588e3
Author: Omair Majid <omajid(a)redhat.com>
Date: Thu Aug 13 14:50:40 2020 -0400
Filter out -mbranch-protection=standard from cflags
diff --git a/dotnet3.1.spec b/dotnet3.1.spec
index f145f27..a0f6312 100644
--- a/dotnet3.1.spec
+++ b/dotnet3.1.spec
@@ -25,6 +25,10 @@
# -fstack-clash-protection
# -specs=
%global dotnet_cflags %(echo %optflags | sed -e 's/-fstack-clash-protection//' | sed -re 's/-specs=[^ ]*//g')
+%ifarch aarch64
+# mbranch-protection=standard breaks unwinding in CoreCLR through libunwind
+%global dotnet_cflags %(echo %dotnet_cflags | sed -e 's/-mbranch-protection=standard //')
+%endif
%global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g')
%global host_version 3.1.6
@@ -532,6 +536,9 @@ echo "Testing build results for debug symbols..."
%changelog
+* Thu Aug 13 2020 Omair Majid <omajid(a)redhat.com> - 3.1.106-3
+- Filter out -mbranch-protection=standard from cflags
+
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.1.106-3
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
commit afd34560b0135e0cddfbda1e2fe25e1f28cb4e26
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Sat Aug 1 00:40:12 2020 +0000
- Second attempt - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/dotnet3.1.spec b/dotnet3.1.spec
index be67eeb..f145f27 100644
--- a/dotnet3.1.spec
+++ b/dotnet3.1.spec
@@ -69,7 +69,7 @@
Name: dotnet3.1
Version: %{sdk_rpm_version}
-Release: 2%{?dist}
+Release: 3%{?dist}
Summary: .NET Core Runtime and SDK
License: MIT and ASL 2.0 and BSD and LGPLv2+ and CC-BY and CC0 and MS-PL and EPL-1.0 and GPL+ and GPLv2 and ISC and OFL and zlib
URL: https://github.com/dotnet/
@@ -532,6 +532,10 @@ echo "Testing build results for debug symbols..."
%changelog
+* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.1.106-3
+- Second attempt - Rebuilt for
+ https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
* Mon Jul 27 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.1.106-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
commit 243a228c3c5bd70dc2934e90cf93a321cfbfe5ec
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Mon Jul 27 15:41:15 2020 +0000
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/dotnet3.1.spec b/dotnet3.1.spec
index f32a504..be67eeb 100644
--- a/dotnet3.1.spec
+++ b/dotnet3.1.spec
@@ -69,7 +69,7 @@
Name: dotnet3.1
Version: %{sdk_rpm_version}
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: .NET Core Runtime and SDK
License: MIT and ASL 2.0 and BSD and LGPLv2+ and CC-BY and CC0 and MS-PL and EPL-1.0 and GPL+ and GPLv2 and ISC and OFL and zlib
URL: https://github.com/dotnet/
@@ -532,6 +532,9 @@ echo "Testing build results for debug symbols..."
%changelog
+* Mon Jul 27 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 3.1.106-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
* Tue Jul 21 2020 Jo Shields <joshield(a)microsoft.com> - 3.1.106-1
- Update to .NET Core Runtime 3.1.6 and SDK 3.1.106
3 years, 8 months
Architecture specific change in rpms/dyninst.git
by githook-noreply@fedoraproject.org
The package rpms/dyninst.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/dyninst.git/commit/?id=d51e94a73e....
Change:
+%ifarch %{ix86}
Thanks.
Full change:
============
commit 67da9764dd61988a2be9df5abb518d1aff387ad2
Author: Stan Cox <scox(a)redhat.com>
Date: Wed Sep 9 14:06:45 2020 -0400
Update to 10.2.0
diff --git a/dyninst.spec b/dyninst.spec
index 9235b75..4b33ace 100644
--- a/dyninst.spec
+++ b/dyninst.spec
@@ -91,7 +91,7 @@ cd %{dyninst_base}
CFLAGS="$CFLAGS $RPM_OPT_FLAGS"
LDFLAGS="$LDFLAGS $RPM_LD_FLAGS"
%ifarch %{ix86}
- CFLAGS="$CFLAGS -fno-lto"
+ CFLAGS="$CFLAGS -fno-lto -march=i686"
LDFLAGS="$LDFLAGS -fno-lto"
%endif
CXXFLAGS="$CFLAGS"
commit da6c061ac34c7cd2d4b13cc562ef1a734a09b703
Author: Stan Cox <scox(a)redhat.com>
Date: Wed Sep 2 16:33:16 2020 -0400
Update to 10.2.0
diff --git a/dyninst-10.2.0-pie.patch b/dyninst-10.2.0-pie.patch
new file mode 100644
index 0000000..32262c1
--- /dev/null
+++ b/dyninst-10.2.0-pie.patch
@@ -0,0 +1,8 @@
+--- dyninst-10.2.0/dyninst-10.2.0/dyninstAPI_RT/CMakeLists.txt 2020-02-24 09:41:30.207108160 -0500
++++ dyninst-10.2.0/dyninst-10.2.0/dyninstAPI_RT/CMakeLists.txt 2020-08-25 15:57:28.437496257 -0400
+@@ -5,4 +5,4 @@
+ set (DYNINST_ROOT ${PROJECT_SOURCE_DIR}/..)
+-set(CMAKE_C_FLAGS "${DYNINST_RT_CMAKE_C_FLAGS}")
+-set(CMAKE_CXX_FLAGS "${DYNINST_RT_CMAKE_CXX_FLAGS}")
++# set(CMAKE_C_FLAGS "${DYNINST_RT_CMAKE_C_FLAGS}")
++# set(CMAKE_CXX_FLAGS "${DYNINST_RT_CMAKE_CXX_FLAGS}")
commit d51e94a73e2fc0598070895204dd28945eec3a4b
Author: Stan Cox <scox(a)redhat.com>
Date: Wed Sep 2 13:54:44 2020 -0400
Update to 10.2.0
diff --git a/.gitignore b/.gitignore
index 925d489..b84defc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@
/testsuite-9.4.0.tar.gz
/testsuite-10.1.0.tar.gz
/dyninst-10.1.0.tar.gz
+/dyninst-10.2.0.tar.gz
diff --git a/Object-elf.patch b/Object-elf.patch
deleted file mode 100644
index c579ddb..0000000
--- a/Object-elf.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-# workaround for https://github.com/dyninst/dyninst/issues/396
-
---- ./dyninst-9.3.2/symtabAPI/src/Object-elf.C.sv 2017-09-27 21:43:18.399429243 -0400
-+++ ./dyninst-9.3.2/symtabAPI/src/Object-elf.C 2017-09-27 21:56:14.485125928 -0400
-@@ -1445,6 +1445,24 @@
- if (fbt_iter == -1) { // Create new relocation entry.
- relocationEntry re( next_plt_entry_addr, offset, targ_name,
- NULL, type );
-+ if (type == R_X86_64_IRELATIVE) {
-+ vector<Symbol *> funcs;
-+ dyn_hash_map<std::string, std::vector<Symbol *> >::iterator iter;
-+ // find the resolver function and use that as the
-+ // caller function symbol. The resolver has not run
-+ // so we don't know the ultimate destination.
-+ // Since the funcsByOffset map hasn't been setup yet
-+ // we cannot call associated_symtab->findFuncByEntryOffset
-+ for (iter = symbols_.begin(); iter != symbols_.end(); ++iter) {
-+ std::string name = iter->first;
-+ Symbol *sym = iter->second[0];
-+ if (sym->getOffset() == (Offset)addend) {
-+ // Use dynsym_list.push_back(sym) instead?
-+ re.addDynSym(sym);
-+ break;
-+ }
-+ }
-+ }
- re.setAddend(addend);
- re.setRegionType(rtype);
- if (dynsym_list.size() > 0)
diff --git a/addrtranslate-sysv.patch b/addrtranslate-sysv.patch
deleted file mode 100644
index 3de3a53..0000000
--- a/addrtranslate-sysv.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-# workaround for https://github.com/dyninst/dyninst/issues/406
-
---- dyninst-9.3.2/common/src/addrtranslate-sysv.C.sv 2017-10-03 21:32:23.608614189 -0400
-+++ dyninst-9.3.2/common/src/addrtranslate-sysv.C 2017-10-03 21:33:36.538642148 -0400
-@@ -800,6 +800,7 @@
- continue;
- }
- if (obj_name == "linux-vdso.so.1" ||
-+ obj_name == "linux-vdso64.so.1" ||
- obj_name == "linux-gate.so.1")
- {
- continue;
diff --git a/dyninst-10.0.0-doc.patch b/dyninst-10.0.0-doc.patch
deleted file mode 100644
index 74ff705..0000000
--- a/dyninst-10.0.0-doc.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-
---- ./dyninst-10.0.0/CMakeLists.txt.sv 2018-11-09 11:48:08.000000000 -0500
-+++ ./dyninst-10.0.0/CMakeLists.txt 2018-11-13 11:35:20.109650373 -0500
-@@ -149,7 +149,7 @@ if(BUILD_DOCS)
- foreach(COMPONENT ${WORD_DOCS})
- add_dependencies(doc ${COMPONENT}-doc)
- set_target_properties(${COMPONENT}-doc PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1)
-- install(FILES ${CMAKE_SOURCE_DIR}/${COMPONENT}/doc/${COMPONENT}.pdf
-+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${COMPONENT}/doc/${COMPONENT}.pdf
- DESTINATION ${INSTALL_DOC_DIR}
- RENAME ${COMPONENT}-${VERSION_STRING}.pdf
- OPTIONAL
diff --git a/dyninst-10.0.0-examples.patch b/dyninst-10.0.0-examples.patch
deleted file mode 100644
index aee1d74..0000000
--- a/dyninst-10.0.0-examples.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-# workaround for https://github.com/dyninst/dyninst/issues/396
-
---- ./dyninst-10.0.0/examples/CMakeLists.txt.sv 2018-11-09 11:48:08.000000000 -0500
-+++ ./dyninst-10.0.0/examples/CMakeLists.txt 2018-11-13 11:35:20.109650373 -0500
-@@ -1,19 +1,19 @@
-
-
--add_executable(unstrip unstrip/unstrip.C
-- unstrip/util.C
-- unstrip/types.C
-- unstrip/semanticDescriptor.C
-- unstrip/database.C
-- unstrip/fingerprint.C
-- unstrip/callback.C)
-+add_executable(unstrip unstrip.dir/unstrip.C
-+ unstrip.dir/util.C
-+ unstrip.dir/types.C
-+ unstrip.dir/semanticDescriptor.C
-+ unstrip.dir/database.C
-+ unstrip.dir/fingerprint.C
-+ unstrip.dir/callback.C)
- add_dependencies(unstrip parseAPI symtabAPI instructionAPI common)
- target_link_libraries(unstrip parseAPI symtabAPI instructionAPI common dynDwarf dynElf ${Boost_LIBRARIES})
-
--add_executable(codeCoverage codeCoverage/codeCoverage.C)
-+add_executable(codeCoverage codeCoverage.dir/codeCoverage.C)
- add_dependencies(codeCoverage dyninstAPI patchAPI parseAPI symtabAPI instructionAPI pcontrol common stackwalk dynDwarf dynElf)
- target_link_libraries(codeCoverage dyninstAPI patchAPI parseAPI symtabAPI instructionAPI pcontrol common stackwalk dynDwarf dynElf ${Boost_LIBRARIES})
-
--add_library(Inst SHARED codeCoverage/libInst.C)
-+add_library(Inst SHARED codeCoverage.dir/libInst.C)
-
- add_executable(cfg_to_dot ../parseAPI/doc/example.cc)
-@@ -29,5 +29,5 @@
- )
-
--install (
-- FILES unstrip/ddb.db unstrip/params.db unstrip/unistd.db DESTINATION ${INSTALL_BIN_DIR}
--)
-+# install (
-+# FILES unstrip.dir/ddb.db unstrip.dir/params.db unstrip.dir/unistd.db DESTINATION ${INSTALL_BIN_DIR}
-+# )
diff --git a/dyninst-10.0.0-result.patch b/dyninst-10.0.0-result.patch
deleted file mode 100644
index 89d6e70..0000000
--- a/dyninst-10.0.0-result.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- ./dyninst-10.0.0/instructionAPI/h/Result.h.sv 2018-11-09 11:48:08.000000000 -0500
-+++ ./dyninst-10.0.0/instructionAPI/h/Result.h 2018-12-04 22:12:47.369579566 -0500
-@@ -449,10 +449,10 @@
- snprintf(hex, 20, "%x", val.s32val);
- break;
- case u64:
-- snprintf(hex, 20, "%lx", val.u64val);
-+ snprintf(hex, 20, "%" PRIx64, val.u64val);
- break;
- case s64:
-- snprintf(hex, 20, "%lx", val.s64val);
-+ snprintf(hex, 20, "%" PRIx64, val.s64val);
- break;
- case sp_float:
- snprintf(hex, 20, "%f", val.floatval);
-@@ -464,10 +464,10 @@
- snprintf(hex, 20, "%x", val.bitval);
- break;
- case u48:
-- snprintf(hex, 20, "%lx", val.s48val);
-+ snprintf(hex, 20, "%" PRIx64, val.s48val);
- break;
- case s48:
-- snprintf(hex, 20, "%lx", val.s48val);
-+ snprintf(hex, 20, "%" PRIx64, val.s48val);
- break;
- case m512:
- snprintf(hex, 20, "%p", val.m512val);
diff --git a/dyninst-10.0.0-tribool.patch b/dyninst-10.0.0-tribool.patch
deleted file mode 100644
index 0caec2f..0000000
--- a/dyninst-10.0.0-tribool.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-commit 54a2debd94c3e8df3b6f1e579f1db02dae61cbb7
-Author: Mark W. Krentel <krentel(a)rice.edu>
-Date: Fri Feb 1 13:14:11 2019 -0600
-
- Add some explicit casts from boost::tribool to bool for some code in (#541)
-
- Add some explicit casts from boost::tribool to bool for some code in dataflowAPI/rose/util/Message.[Ch]. This was breaking the build when using boost >= 1.69.
-
-diff --git a/dataflowAPI/rose/util/Message.C b/dataflowAPI/rose/util/Message.C
-index a8a66ad4c..5e276f97d 100644
---- ./dyninst-10.0.0/dataflowAPI/rose/util/Message.C
-+++ ./dyninst-10.0.0/dataflowAPI/rose/util/Message.C
-@@ -1123,7 +1123,7 @@ StreamBuf::bake() {
- destination_->bakeDestinations(message_.properties(), baked_/*out*/);
- anyUnbuffered_ = false;
- for (BakedDestinations::const_iterator bi=baked_.begin(); bi!=baked_.end() && !anyUnbuffered_; ++bi)
-- anyUnbuffered_ = !bi->second.isBuffered;
-+ anyUnbuffered_ = static_cast<bool>(!bi->second.isBuffered);
- isBaked_ = true;
- }
- }
-diff --git a/dataflowAPI/rose/util/Message.h b/dataflowAPI/rose/util/Message.h
-index 816f68d2e..03592cb97 100644
---- ./dyninst-10.0.0/dataflowAPI/rose/util/Message.h
-+++ ./dyninst-10.0.0/dataflowAPI/rose/util/Message.h
-@@ -386,7 +386,8 @@ struct SAWYER_EXPORT ColorSpec {
- ColorSpec(AnsiColor fg, AnsiColor bg, bool bold): foreground(fg), background(bg), bold(bold) {}
-
- /** Returns true if this object is in its default-constructed state. */
-- bool isDefault() const { return COLOR_DEFAULT==foreground && COLOR_DEFAULT==background && !bold; }
-+ bool isDefault() const { return COLOR_DEFAULT==foreground && COLOR_DEFAULT==background
-+ && static_cast<bool>(!bold); }
- };
-
- /** Colors to use for each message importance.
diff --git a/dyninst-9.3.1-Address.patch b/dyninst-9.3.1-Address.patch
deleted file mode 100644
index 213cc4a..0000000
--- a/dyninst-9.3.1-Address.patch
+++ /dev/null
@@ -1,108 +0,0 @@
---- dyninst-9.3.1/common/src/Types.h.sv 2017-03-07 22:05:52.187479600 -0500
-+++ dyninst-9.3.1/common/src/Types.h 2017-03-07 22:06:57.509944790 -0500
-@@ -170,7 +170,7 @@
- static const Address ADDR_NULL = (Address)(0);
- #else
- #define ADDR_NULL (0)
--typedef uintptr_t Address;
-+typedef unsigned long Address;
- #endif
- /* Note the inherent assumption that the size of a "long" integer matches
- that of an address (void*) on every supported Paradyn/Dyninst system!
-
-
---- dyninst-9.3.1/common/h/dyntypes.h.sv 2017-03-08 10:16:18.657768231 -0500
-+++ dyninst-9.3.1/common/h/dyntypes.h 2017-03-08 10:37:07.992634513 -0500
-@@ -124,8 +124,8 @@
-
- namespace Dyninst
- {
-- typedef uintptr_t Address;
-- typedef uintptr_t Offset;
-+ typedef unsigned long Address;
-+ typedef unsigned long Offset;
-
- #if defined(_MSC_VER)
- typedef int PID;
-
-
---- dyninst-9.3.1/dyninstAPI/src/BPatch_memoryAccess.C.sv 2017-03-07 23:07:29.371789000 -0500
-+++ dyninst-9.3.1/dyninstAPI/src/BPatch_memoryAccess.C 2017-03-07 23:07:48.928927991 -0500
-@@ -33,10 +33,10 @@
- #include <stdlib.h>
- #include <string.h>
-
-+#include "../../common/src/Types.h"
- #include "BPatch_memoryAccess_NP.h"
- #include "BPatch_Vector.h"
- #include "BPatch_point.h"
--#include "../../common/src/Types.h"
-
- BPatch_addrSpec_NP::BPatch_addrSpec_NP(long _imm, int _ra, int _rb, int _scale) :
- imm(_imm),
-
-
---- dyninst-9.3.1/dyninstAPI/h/BPatch_instruction.h.sv 2017-03-08 09:06:46.638171175 -0500
-+++ dyninst-9.3.1/dyninstAPI/h/BPatch_instruction.h 2017-03-08 09:00:39.455564403 -0500
-@@ -69,7 +69,7 @@
- public:
-
- BPatch_instruction(internal_instruction *insn,
-- uintptr_t _addr);
-+ Dyninst::Address _addr);
- virtual ~BPatch_instruction();
-
- void getInstruction(const unsigned char *&_buffer, unsigned char &_length);
-
-
---- dyninst-9.3.1/dyninstAPI/h/BPatch_memoryAccess_NP.h.sv 2017-03-07 22:43:56.645745821 -0500
-+++ dyninst-9.3.1/dyninstAPI/h/BPatch_memoryAccess_NP.h 2017-03-08 10:39:30.122643332 -0500
-@@ -121,27 +121,27 @@
- static BPatch_memoryAccess* init_tables();
-
- // initializes only the first access; #bytes is a constant
-- BPatch_memoryAccess(internal_instruction *, uintptr_t _addr,
-+ BPatch_memoryAccess(internal_instruction *, Dyninst::Address _addr,
- bool _isLoad, bool _isStore, unsigned int _bytes,
- long _imm, int _ra, int _rb, unsigned int _scale = 0,
- int _cond = -1, bool _nt = false);
-
- // initializes only the first access; #bytes is an expression w/scale
-- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr,
-+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr,
- bool _isinternal_Load, bool _isStore,
- long _imm_s, int _ra_s, int _rb_s, unsigned int _scale_s,
- long _imm_c, int _ra_c, int _rb_c, unsigned int _scale_c,
- int _cond, bool _nt, int _preFcn = -1);
-
- // initializes only the first access; #bytes is an expression
-- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr,
-+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr,
- bool _isLoad, bool _isStore, bool _isPrefetch,
- long _imm_s, int _ra_s, int _rb_s,
- long _imm_c, int _ra_c, int _rb_c,
- unsigned short _preFcn);
-
- // initializes only the first access; #bytes is an expression & not a prefetch
-- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr,
-+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr,
- bool _isLoad, bool _isStore, long _imm_s, int _ra_s, int _rb_s,
- long _imm_c, int _ra_c, int _rb_c);
-
-@@ -156,14 +156,14 @@
- int _cond, bool _nt);
-
- // initializes both accesses; #bytes is a constant
-- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr,
-+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr,
- bool _isLoad, bool _isStore, unsigned int _bytes,
- long _imm, int _ra, int _rb, unsigned int _scale,
- bool _isLoad2, bool _isStore2, unsigned int _bytes2,
- long _imm2, int _ra2, int _rb2, unsigned int _scale2);
-
- // initializes both accesses; #bytes is an expression & not a prefetch
-- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr, bool _isLoad, bool _isStore,
-+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr, bool _isLoad, bool _isStore,
- long _imm_s, int _ra_s, int _rb_s, unsigned int _scale_s,
- long _imm_c, int _ra_c, int _rb_c, unsigned int _scale_c,
- bool _isLoad2, bool _isStore2, long _imm2_s, int _ra2_s,
diff --git a/dyninst-9.3.2-gcc8.patch b/dyninst-9.3.2-gcc8.patch
deleted file mode 100644
index faec1a1..0000000
--- a/dyninst-9.3.2-gcc8.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -up dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C.me dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C
---- dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C.me 2018-02-07 15:50:36.706363500 +0100
-+++ dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C 2018-02-07 16:30:28.173906877 +0100
-@@ -2512,8 +2512,8 @@ void emitElf<ElfTypes>::createDynamicSec
-
- if (!object->hasReldyn() && !object->hasReladyn()) {
- if (object->getRelType() == Region::RT_REL) {
-- new_dynamic_entries.push_back(make_pair(DT_REL, 0));
-- new_dynamic_entries.push_back(make_pair(DT_RELSZ, 0));
-+ new_dynamic_entries.push_back(std::pair<long, long>(DT_REL, 0));
-+ new_dynamic_entries.push_back(std::pair<long, long>(DT_RELSZ, 0));
-
- dynamicSecData[DT_REL].push_back(dynsecData + curpos);
- dynsecData[curpos].d_tag = DT_NULL;
diff --git a/dyninst-9.3.2-glibc-rpc.patch b/dyninst-9.3.2-glibc-rpc.patch
deleted file mode 100644
index 1f6098e..0000000
--- a/dyninst-9.3.2-glibc-rpc.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff -up dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt.me dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt
---- dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt.me 2018-02-07 15:25:38.925763122 +0100
-+++ dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt 2018-02-07 15:30:42.242099198 +0100
-@@ -19,6 +19,7 @@ include (${DYNINST_ROOT}/cmake/shared.cm
- configure_file(cmake/version.h.in common/h/version.h)
- include_directories(${PROJECT_BINARY_DIR})
- include_directories(${PROJECT_BINARY_DIR}/common/h)
-+include_directories("/usr/include/tirpc/")
- set (HEADER_DIRS common
- dataflowAPI
- dyninstAPI
-diff -up dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h.me dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h
---- dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h.me 2018-02-07 15:06:45.961780668 +0100
-+++ dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h 2018-02-07 15:38:56.832278338 +0100
-@@ -281,7 +281,7 @@ inline bool_t P_xdr_string(XDR *x, char
- inline void P_xdrrec_create(XDR *x, const u_int send_sz, const u_int rec_sz,
- const caddr_t handle,
- xdr_rd_func read_r, xdr_wr_func write_f) {
-- xdrrec_create(x, send_sz, rec_sz, handle, (int(*)(char*, char*, int))read_r, (int(*)(char*, char*, int))write_f);}
-+ xdrrec_create(x, send_sz, rec_sz, handle, (int(*)(void*, void*, int))read_r, (int(*)(void*, void*, int))write_f);}
- inline bool_t P_xdrrec_endofrecord(XDR *x, int now) {
- return (xdrrec_endofrecord(x, now));}
- inline bool_t P_xdrrec_skiprecord(XDR *x) { return (xdrrec_skiprecord(x));}
diff --git a/dyninst.spec b/dyninst.spec
index 94a1a6c..9235b75 100644
--- a/dyninst.spec
+++ b/dyninst.spec
@@ -1,21 +1,21 @@
Summary: An API for Run-time Code Generation
License: LGPLv2+
Name: dyninst
-Release: 10%{?dist}
+Release: 1%{?dist}
URL: http://www.dyninst.org
-Version: 10.1.0
+Version: 10.2.0
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
+%define __testsuite_version 10.1.0
Source0: https://github.com/dyninst/dyninst/archive/v%{version}/dyninst-%{version}...
-Source1: https://github.com/dyninst/testsuite/archive/v%{version}/testsuite-%{vers...
+Source1: https://github.com/dyninst/testsuite/archive/v10.1.0/testsuite-%{__testsu...
-Patch1: dyninst-10.1.0-result.patch
+Patch1: dyninst-10.2.0-pie.patch
Patch2: testsuite-10.1.0-gettid.patch
Patch3: testsuite-10.1.0-386.patch
-Patch4: dyninst-10.1.0-aarch-regs.patch
%global dyninst_base dyninst-%{version}
-%global testsuite_base testsuite-%{version}
+%global testsuite_base testsuite-%{__testsuite_version}
BuildRequires: gcc-c++
BuildRequires: elfutils-devel
@@ -28,7 +28,7 @@ BuildRequires: tbb tbb-devel
BuildRequires: tex-latex
# Extra requires just for the testsuite
-BuildRequires: gcc-gfortran nasm libxml2-devel
+BuildRequires: gcc-gfortran libxml2-devel
# Testsuite files should not provide/require anything
%{?filter_setup:
@@ -75,10 +75,9 @@ making sure that dyninst works properly.
%setup -q -n %{name}-%{version} -c
%setup -q -T -D -a 1
-%patch1 -p1 -b.result
+%patch1 -p1 -b.pie
%patch2 -p1 -b.gettid
%patch3 -p1 -b.386
-%patch4 -p1 -b.aarch
# cotire seems to cause non-deterministic gcc errors
# https://bugzilla.redhat.com/show_bug.cgi?id=1420551
@@ -91,6 +90,10 @@ cd %{dyninst_base}
CFLAGS="$CFLAGS $RPM_OPT_FLAGS"
LDFLAGS="$LDFLAGS $RPM_LD_FLAGS"
+%ifarch %{ix86}
+ CFLAGS="$CFLAGS -fno-lto"
+ LDFLAGS="$LDFLAGS -fno-lto"
+%endif
CXXFLAGS="$CFLAGS"
export CFLAGS CXXFLAGS LDFLAGS
@@ -165,17 +168,14 @@ echo "%{_libdir}/dyninst" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf
%files testsuite
%{_bindir}/parseThat
-%exclude %{_bindir}/cfg_to_dot
-%exclude /usr/bin/codeCoverage
-%exclude /usr/bin/unstrip
-%exclude /usr/bin/ddb.db
-%exclude /usr/bin/params.db
-%exclude /usr/bin/unistd.db
%dir %{_libdir}/dyninst/testsuite/
%attr(755,root,root) %{_libdir}/dyninst/testsuite/*[!a]
%attr(644,root,root) %{_libdir}/dyninst/testsuite/*.a
%changelog
+* Tue Sep 01 2020 Stan Cox <scox(a)redhat.com> - 10.2.0-1
+- Update to 10.2.0
+
* Mon Aug 10 2020 Orion Poplawski <orion(a)nwra.com> - 10.1.0-10
- Use new cmake macros (FTBFS bz#1863463)
- Add BR tex-latex for doc build
diff --git a/sources b/sources
index 1ccb90f..496c76e 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
SHA512 (testsuite-10.1.0.tar.gz) = 47b91ebc0623f672378086a5f8d84e3934bd6b22d8932b12aaad257ccf7eb109505edb63dfbc3eb15aa099fc488a517835412099a77e3e0dd1275b3e3f672b3b
-SHA512 (dyninst-10.1.0.tar.gz) = 41d7b6f0fce56be84091cc9796b7fa3295a652f80203b6e246df3a28a7bdc02a11996a38c9ccfb2ea7c18ee937a93020ff31d5d4652fd8082f99167e94b16df6
+SHA512 (dyninst-10.2.0.tar.gz) = 32ddf871a8b486bb38530a264b140f504bfd5fb9401c940c6e36540f932ad8dd87375a517324416035ba6eeb05107cf03acebc88bdaad4b5d4c3643afaa5ac5c
diff --git a/testsuite-10.1.0-386.patch b/testsuite-10.1.0-386.patch
index 38dcd3a..eb46c9f 100644
--- a/testsuite-10.1.0-386.patch
+++ b/testsuite-10.1.0-386.patch
@@ -1,3 +1,18 @@
+--- dyninst-10.1.0/testsuite-10.1.0/CMakeLists.txt
++++ dyninst-10.1.0/testsuite-10.1.0/CMakeLists.txt
+@@ -111,7 +111,8 @@
+ if(UNIX)
+ enable_language(ASM-ATT)
+- if("${DYNINST_PLATFORM}" MATCHES "i386")
+- enable_language(ASM_NASM)
+- endif()
++# nasm/yasm are deprecated
++# if("${DYNINST_PLATFORM}" MATCHES "i386")
++# enable_language(ASM_NASM)
++# endif()
+ elseif(WIN32)
+ enable_language(ASM_MASM)
+
--- dyninst-10.1.0/testsuite-10.1.0/src/instruction/test_instruction_farcall.C
+++ dyninst-10.1.0/testsuite-10.1.0/src/instruction/test_instruction_farcall.C
@@ -96,21 +96,21 @@ test_results_t test_instruction_farcall_Mutator::executeTest()
diff --git a/testsuite-9.3.0-junit-nullptr.patch b/testsuite-9.3.0-junit-nullptr.patch
deleted file mode 100644
index 6f055c3..0000000
--- a/testsuite-9.3.0-junit-nullptr.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- testsuite-9.3.0/src/JUnitOutputDriver.cpp.nullptr 2016-12-19 14:55:38.000000000 -0800
-+++ testsuite-9.3.0/src/JUnitOutputDriver.cpp 2017-02-15 11:19:22.628056889 -0800
-@@ -35,7 +35,7 @@ void JUnitOutputDriver::startNewTest(std
- {
- std::stringstream suitename;
- suitename << last_group->modname;
-- if(last_group->mutatee != '\0') suitename << "." << last_group->mutatee;
-+ if(last_group->mutatee != nullptr) suitename << "." << last_group->mutatee;
- log(HUMAN, "<testsuite name=\"%s\" errors=\"%d\" skipped=\"%d\" tests=\"%d\" failures=\"%d\">\n",
- suitename.str().c_str(), group_errors, group_skips, group_tests, group_failures);
- log(HUMAN, group_output.str().c_str());
3 years, 8 months
Architecture specific change in rpms/ormolu.git
by githook-noreply@fedoraproject.org
The package rpms/ormolu.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/ormolu.git/commit/?id=792a59dc50f....
Change:
+ExcludeArch: s390x
Thanks.
Full change:
============
commit 7748ba7f2a4f0357b09707828deb352bed7945e6
Author: Jens Petersen <petersen(a)redhat.com>
Date: Thu Sep 10 00:57:21 2020 +0800
fix typo of accommodate (#1875389)
diff --git a/ormolu.spec b/ormolu.spec
index 066bbbf..89049db 100644
--- a/ormolu.spec
+++ b/ormolu.spec
@@ -69,7 +69,7 @@ The project was created with the following goals in mind:
- Choose a style compatible with modern dialects of Haskell. As new
Haskell extensions enter broad use, we may change the style to
- accomodate them.
+ accommodate them.
- Idempotence: formatting already formatted code doesn't change it.
commit 792a59dc50f25510e5f83eabd3569bb9d612462e
Author: Jens Petersen <petersen(a)redhat.com>
Date: Thu Sep 10 00:56:38 2020 +0800
import #1875389
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7bd9ab9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/ormolu-0.1.2.0.tar.gz
diff --git a/ormolu-0.1.2.0.cabal b/ormolu-0.1.2.0.cabal
new file mode 100644
index 0000000..61fd041
--- /dev/null
+++ b/ormolu-0.1.2.0.cabal
@@ -0,0 +1,185 @@
+cabal-version: 1.18
+name: ormolu
+version: 0.1.2.0
+x-revision: 2
+license: BSD3
+license-file: LICENSE.md
+maintainer: Mark Karpov <mark.karpov(a)tweag.io>
+tested-with: ghc ==8.6.5 ghc ==8.8.3 ghc ==8.10.1
+homepage: https://github.com/tweag/ormolu
+bug-reports: https://github.com/tweag/ormolu/issues
+synopsis: A formatter for Haskell source code
+description: A formatter for Haskell source code.
+category: Development, Formatting
+build-type: Simple
+data-files:
+ data/examples/declaration/annotation/*.hs
+ data/examples/declaration/class/*.hs
+ data/examples/declaration/data/*.hs
+ data/examples/declaration/data/gadt/*.hs
+ data/examples/declaration/default/*.hs
+ data/examples/declaration/deriving/*.hs
+ data/examples/declaration/foreign/*.hs
+ data/examples/declaration/instance/*.hs
+ data/examples/declaration/rewrite-rule/*.hs
+ data/examples/declaration/role-annotation/*.hs
+ data/examples/declaration/signature/complete/*.hs
+ data/examples/declaration/signature/fixity/*.hs
+ data/examples/declaration/signature/inline/*.hs
+ data/examples/declaration/signature/minimal/*.hs
+ data/examples/declaration/signature/pattern/*.hs
+ data/examples/declaration/signature/set-cost-centre/*.hs
+ data/examples/declaration/signature/specialize/*.hs
+ data/examples/declaration/signature/type/*.hs
+ data/examples/declaration/splice/*.hs
+ data/examples/declaration/type-families/closed-type-family/*.hs
+ data/examples/declaration/type-families/data-family/*.hs
+ data/examples/declaration/type-families/type-family/*.hs
+ data/examples/declaration/type-synonyms/*.hs
+ data/examples/declaration/type/*.hs
+ data/examples/declaration/value/function/*.hs
+ data/examples/declaration/value/function/arrow/*.hs
+ data/examples/declaration/value/function/comprehension/*.hs
+ data/examples/declaration/value/function/do/*.hs
+ data/examples/declaration/value/function/infix/*.hs
+ data/examples/declaration/value/function/pattern/*.hs
+ data/examples/declaration/value/other/*.hs
+ data/examples/declaration/value/pattern-synonyms/*.hs
+ data/examples/declaration/warning/*.hs
+ data/examples/import/*.hs
+ data/examples/module-header/*.hs
+ data/examples/other/*.hs
+
+extra-doc-files:
+ CONTRIBUTING.md
+ CHANGELOG.md
+ DESIGN.md
+ README.md
+
+source-repository head
+ type: git
+ location: https://github.com/tweag/ormolu.git
+
+flag dev
+ description: Turn on development settings.
+ default: False
+ manual: True
+
+library
+ exposed-modules:
+ Ormolu
+ Ormolu.Config
+ Ormolu.Diff
+ Ormolu.Exception
+ Ormolu.Imports
+ Ormolu.Parser
+ Ormolu.Parser.Anns
+ Ormolu.Parser.CommentStream
+ Ormolu.Parser.Pragma
+ Ormolu.Parser.Result
+ Ormolu.Parser.Shebang
+ Ormolu.Printer
+ Ormolu.Printer.Combinators
+ Ormolu.Printer.Comments
+ Ormolu.Printer.Internal
+ Ormolu.Printer.Meat.Common
+ Ormolu.Printer.Meat.Declaration
+ Ormolu.Printer.Meat.Declaration.Annotation
+ Ormolu.Printer.Meat.Declaration.Class
+ Ormolu.Printer.Meat.Declaration.Data
+ Ormolu.Printer.Meat.Declaration.Default
+ Ormolu.Printer.Meat.Declaration.Foreign
+ Ormolu.Printer.Meat.Declaration.Instance
+ Ormolu.Printer.Meat.Declaration.RoleAnnotation
+ Ormolu.Printer.Meat.Declaration.Rule
+ Ormolu.Printer.Meat.Declaration.Signature
+ Ormolu.Printer.Meat.Declaration.Splice
+ Ormolu.Printer.Meat.Declaration.Type
+ Ormolu.Printer.Meat.Declaration.TypeFamily
+ Ormolu.Printer.Meat.Declaration.Value
+ Ormolu.Printer.Meat.Declaration.Warning
+ Ormolu.Printer.Meat.ImportExport
+ Ormolu.Printer.Meat.Module
+ Ormolu.Printer.Meat.Pragma
+ Ormolu.Printer.Meat.Type
+ Ormolu.Printer.Operators
+ Ormolu.Printer.SpanStream
+ Ormolu.Processing.Common
+ Ormolu.Processing.Cpp
+ Ormolu.Processing.Postprocess
+ Ormolu.Processing.Preprocess
+ Ormolu.Utils
+
+ hs-source-dirs: src
+ other-modules:
+ GHC
+ GHC.DynFlags
+
+ default-language: Haskell2010
+ build-depends:
+ base >=4.12 && <5.0,
+ bytestring >=0.2 && <0.11,
+ containers >=0.5 && <0.7,
+ dlist >=0.8 && <2.0,
+ exceptions >=0.6 && <0.11,
+ ghc-lib-parser >=8.10 && <8.11,
+ mtl >=2.0 && <3.0,
+ syb >=0.7 && <0.8,
+ text >=0.2 && <1.3
+
+ if flag(dev)
+ ghc-options:
+ -Wall -Werror -Wcompat -Wincomplete-record-updates
+ -Wincomplete-uni-patterns -Wnoncanonical-monad-instances
+ -Wno-missing-home-modules
+
+ else
+ ghc-options: -O2 -Wall
+
+executable ormolu
+ main-is: Main.hs
+ hs-source-dirs: app
+ other-modules: Paths_ormolu
+ default-language: Haskell2010
+ build-depends:
+ base >=4.12 && <5.0,
+ ghc-lib-parser >=8.10 && <8.11,
+ gitrev >=1.3 && <1.4,
+ optparse-applicative >=0.14 && <0.17,
+ ormolu -any,
+ text >=0.2 && <1.3
+
+ if flag(dev)
+ ghc-options:
+ -Wall -Werror -Wcompat -Wincomplete-record-updates
+ -Wincomplete-uni-patterns -Wnoncanonical-monad-instances
+ -optP-Wno-nonportable-include-path
+
+ else
+ ghc-options: -O2 -Wall -rtsopts
+
+test-suite tests
+ type: exitcode-stdio-1.0
+ main-is: Spec.hs
+ build-tools: hspec-discover >=2.0 && <3.0
+ hs-source-dirs: tests
+ other-modules:
+ Ormolu.Parser.PragmaSpec
+ Ormolu.PrinterSpec
+
+ default-language: Haskell2010
+ build-depends:
+ base >=4.12 && <5.0,
+ containers >=0.5 && <0.7,
+ filepath >=1.2 && <1.5,
+ hspec >=2.0 && <3.0,
+ ormolu -any,
+ path >=0.6 && <0.8,
+ path-io >=1.4.2 && <2.0,
+ text >=0.2 && <1.3
+
+ if flag(dev)
+ ghc-options: -Wall -Werror
+
+ else
+ ghc-options: -O2 -Wall
diff --git a/ormolu.spec b/ormolu.spec
new file mode 100644
index 0000000..066bbbf
--- /dev/null
+++ b/ormolu.spec
@@ -0,0 +1,189 @@
+# generated by cabal-rpm-2.0.6
+# https://docs.fedoraproject.org/en-US/packaging-guidelines/Haskell/
+
+%global pkg_name ormolu
+%global pkgver %{pkg_name}-%{version}
+
+%bcond_without tests
+
+Name: %{pkg_name}
+Version: 0.1.2.0
+Release: 1%{?dist}
+Summary: A formatter for Haskell source code
+
+License: BSD
+Url: https://hackage.haskell.org/package/%{name}
+# Begin cabal-rpm sources:
+Source0: https://hackage.haskell.org/package/%{pkgver}/%{pkgver}.tar.gz
+Source1: https://hackage.haskell.org/package/%{pkgver}/%{name}.cabal#/%{pkgver}.cabal
+# End cabal-rpm sources
+# ghc-lib-parser cannot build s390x
+# https://bugzilla.redhat.com/show_bug.cgi?id=1806109
+ExcludeArch: s390x
+
+# Begin cabal-rpm deps:
+BuildRequires: ghc-Cabal-devel
+BuildRequires: ghc-rpm-macros
+BuildRequires: ghc-base-prof
+BuildRequires: ghc-bytestring-prof
+BuildRequires: ghc-containers-prof
+BuildRequires: ghc-dlist-prof
+BuildRequires: ghc-exceptions-prof
+BuildRequires: ghc-ghc-lib-parser-prof
+BuildRequires: ghc-gitrev-prof
+BuildRequires: ghc-mtl-prof
+BuildRequires: ghc-optparse-applicative-prof
+BuildRequires: ghc-syb-prof
+BuildRequires: ghc-text-prof
+%if %{with tests}
+BuildRequires: ghc-filepath-devel
+BuildRequires: ghc-hspec-devel
+BuildRequires: ghc-hspec-discover-devel
+BuildRequires: ghc-path-devel
+BuildRequires: ghc-path-io-devel
+%endif
+Requires: %{name}-common = %{version}-%{release}
+# End cabal-rpm deps
+
+%description
+Ormolu is a formatter for Haskell source code.
+The project was created with the following goals in mind:
+
+- Using GHC's own parser to avoid parsing problems caused by haskell-src-exts.
+
+- Let some whitespace be programmable. The layout of the input
+ influences the layout choices in the output. This means that the
+ choices between single-line/multi-line layouts in each particular
+ situation are made by the user, not by an algorithm. This makes the
+ implementation simpler and leaves some control to the user while
+ still guaranteeing that the formatted code is stylistically
+ consistent.
+
+- Writing code in such a way so it's easy to modify and maintain.
+
+- Implementing one “true” formatting style which admits no configuration.
+
+- That formatting style aims to result in minimal diffs while still
+ remaining very close to “conventional” Haskell formatting people
+ use.
+
+- Choose a style compatible with modern dialects of Haskell. As new
+ Haskell extensions enter broad use, we may change the style to
+ accomodate them.
+
+- Idempotence: formatting already formatted code doesn't change it.
+
+- Be well-tested and robust to the point that it can be used in large
+ projects without exposing unfortunate, disappointing bugs here and
+ there.
+
+
+%package common
+Summary: %{name} common files
+BuildArch: noarch
+
+%description common
+This package provides the %{name} common data files.
+
+
+%package -n ghc-%{name}
+Summary: Haskell %{name} library
+Requires: %{name}-common = %{version}-%{release}
+
+%description -n ghc-%{name}
+This package provides the Haskell %{name} shared library.
+
+
+%package -n ghc-%{name}-devel
+Summary: Haskell %{name} library development files
+Provides: ghc-%{name}-static = %{version}-%{release}
+Provides: ghc-%{name}-static%{?_isa} = %{version}-%{release}
+%if %{defined ghc_version}
+Requires: ghc-compiler = %{ghc_version}
+%endif
+Requires: ghc-%{name}%{?_isa} = %{version}-%{release}
+
+%description -n ghc-%{name}-devel
+This package provides the Haskell %{name} library development files.
+
+
+%if %{with haddock}
+%package -n ghc-%{name}-doc
+Summary: Haskell %{name} library documentation
+BuildArch: noarch
+
+%description -n ghc-%{name}-doc
+This package provides the Haskell %{name} library documentation.
+%endif
+
+
+%if %{with ghc_prof}
+%package -n ghc-%{name}-prof
+Summary: Haskell %{name} profiling library
+Requires: ghc-%{name}-devel%{?_isa} = %{version}-%{release}
+Supplements: (ghc-%{name}-devel and ghc-prof)
+
+%description -n ghc-%{name}-prof
+This package provides the Haskell %{name} profiling library.
+%endif
+
+
+%prep
+# Begin cabal-rpm setup:
+%setup -q
+cp -bp %{SOURCE1} %{name}.cabal
+# End cabal-rpm setup
+
+
+%build
+# Begin cabal-rpm build:
+%ghc_lib_build
+# End cabal-rpm build
+
+
+%install
+# Begin cabal-rpm install
+%ghc_lib_install
+mv %{buildroot}%{_ghcdocdir}{,-common}
+# End cabal-rpm install
+
+
+%check
+%cabal_test
+
+
+%files
+# Begin cabal-rpm files:
+%{_bindir}/%{name}
+# End cabal-rpm files
+
+
+%files common
+# Begin cabal-rpm files:
+%license LICENSE.md
+%doc CHANGELOG.md CONTRIBUTING.md README.md
+%{_datadir}/%{pkgver}
+# End cabal-rpm files
+
+
+%files -n ghc-%{name} -f ghc-%{name}.files
+
+
+%files -n ghc-%{name}-devel -f ghc-%{name}-devel.files
+
+
+%if %{with haddock}
+%files -n ghc-%{name}-doc -f ghc-%{name}-doc.files
+%license LICENSE.md
+%endif
+
+
+%if %{with ghc_prof}
+%files -n ghc-%{name}-prof -f ghc-%{name}-prof.files
+%endif
+
+
+%changelog
+* Thu Sep 3 2020 Jens Petersen <petersen(a)redhat.com> - 0.1.2.0-1
+- spec file generated by cabal-rpm-2.0.6
+- exclude s390x because ghc-lib-parser not available
diff --git a/sources b/sources
new file mode 100644
index 0000000..4705512
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (ormolu-0.1.2.0.tar.gz) = 7a56cb78c2ce8585a769f4933ae08cd4a2599f0bcf7bb5734a6677c8a1e7fec3d0905448ef35fa14e461b7e27133cb13aa0dce293514847985002ebd4d660df5
3 years, 8 months
Architecture specific change in rpms/rubygem-puma.git
by githook-noreply@fedoraproject.org
The package rpms/rubygem-puma.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rubygem-puma.git/commit/?id=e3ab8....
Change:
-%ifarch ppc64le
Thanks.
Full change:
============
commit 564e8de9f47f52491bf7c91ee76b8fae82d91ec0
Author: Vít Ondruch <vondruch(a)redhat.com>
Date: Wed Sep 9 15:57:52 2020 +0200
Fix the man pages generation and move them into the main package.
diff --git a/rubygem-puma.spec b/rubygem-puma.spec
index 2c58b6b..26afc54 100644
--- a/rubygem-puma.spec
+++ b/rubygem-puma.spec
@@ -124,9 +124,9 @@ find %{buildroot}%{gem_instdir}/bin -type f | \
%if %{with help2man}
# Turn `puma --help` into man page.
-export GEM_PATH="%{gem_dir}:%{buildroot}/usr/share/gems/gems"
+export RUBYOPT="-I%{buildroot}%{gem_extdir_mri}:%{buildroot}%{gem_libdir}"
mkdir -p %{buildroot}%{_mandir}/man1
-help2man --no-discard-stderr -N -s1 -o %{buildroot}%{_mandir}/man1/%{name}.1 \
+help2man --no-discard-stderr -N -s1 -o %{buildroot}%{_mandir}/man1/%{gem_name}.1 \
%{buildroot}/usr/share/gems/gems/%{gem_name}-%{version}/bin/%{gem_name}
%endif
@@ -180,6 +180,13 @@ RUBYOPT="-Ilib:$(dirs +1 -l)%{gem_extdir_mri}" CI=1 ruby \
# Integration test
# Make binary exension available in Ruby load path.
RUBYOPT="-I$(dirs +1 -l)%{gem_extdir_mri}" ruby test/shell/run.rb
+
+%if %{with help2man}
+# Check `--help` output, using which man page is created
+export RUBYOPT="-I%{buildroot}%{gem_extdir_mri}:%{buildroot}%{gem_libdir}"
+%{buildroot}/usr/share/gems/gems/%{gem_name}-%{version}/bin/%{gem_name} --help 2> /dev/null \
+ | grep -q '^puma <options> <rackup file>'
+%endif
popd
%files
@@ -192,6 +199,9 @@ popd
%{gem_libdir}
%exclude %{gem_cache}
%{gem_spec}
+%if %{with help2man}
+%{_mandir}/man1/%{gem_name}.1*
+%endif
%files doc
%doc %{gem_docdir}
@@ -199,9 +209,6 @@ popd
%doc %{gem_instdir}/README.md
%doc %{gem_instdir}/docs
%{gem_instdir}/tools
-%if %{with help2man}
-%{_mandir}/man1/%{name}.1*
-%endif
%changelog
* Mon Sep 07 2020 Vít Ondruch <vondruch(a)redhat.com> - 4.3.6-1
@@ -210,6 +217,7 @@ popd
Resolves: rhbz#1863729
Resolves: rbhz#1842535
Resolves: rbhz#1842540
+- Fix the man pages generation and move them into the main package.
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 4.3.3-3
- Second attempt - Rebuilt for
commit e3ab8c016e1c24ec56f5b6a8b59d3bc2a886d595
Author: Vít Ondruch <vondruch(a)redhat.com>
Date: Wed Sep 9 15:44:42 2020 +0200
Update to Puma 4.3.6.
Resolves: rhbz#1837148
Resolves: rhbz#1863729
Resolves: rbhz#1842535
Resolves: rbhz#1842540
diff --git a/rubygem-puma-5.0.0-Report-pumactl-exit.patch b/rubygem-puma-5.0.0-Report-pumactl-exit.patch
new file mode 100644
index 0000000..f18f2b6
--- /dev/null
+++ b/rubygem-puma-5.0.0-Report-pumactl-exit.patch
@@ -0,0 +1,32 @@
+From aebca2b3d7f7a8cd51b0a7047851c9a2e0af7013 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch(a)redhat.com>
+Date: Fri, 7 Aug 2020 12:52:31 +0200
+Subject: [PATCH] Do not quite when `pumactl` unexpectedly exits.
+
+When `pumactl` encounters issue, it exits [[1]]. That way also the whole
+test suite unexpectedly exits. Rescuing `SystemExit` exception keeps the
+test suite finish.
+
+Fixes #2329
+
+[1]: https://github.com/puma/puma/blob/0f718d516b92cd8bc4120c543b06792b22ac20b...
+---
+ test/test_pumactl.rb | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/test/test_pumactl.rb b/test/test_pumactl.rb
+index 96bafa28e..e5c5ec7e6 100644
+--- a/test/test_pumactl.rb
++++ b/test/test_pumactl.rb
+@@ -178,7 +178,10 @@ def test_control_ssl
+ def assert_command_cli_output(options, expected_out)
+ cmd = Puma::ControlCLI.new(options)
+ out, _ = capture_subprocess_io do
+- cmd.run
++ begin
++ cmd.run
++ rescue SystemExit => e
++ end
+ end
+ assert_match expected_out, out
+ end
diff --git a/rubygem-puma-5.0.0-Update-test-certs-and-code.patch b/rubygem-puma-5.0.0-Update-test-certs-and-code.patch
new file mode 100644
index 0000000..36671a4
--- /dev/null
+++ b/rubygem-puma-5.0.0-Update-test-certs-and-code.patch
@@ -0,0 +1,1583 @@
+From aac47086f1a6e38baf69159a2bc7e64b0495f080 Mon Sep 17 00:00:00 2001
+From: MSP-Greg <Greg.mpls(a)gmail.com>
+Date: Fri, 7 Aug 2020 16:31:36 -0500
+Subject: [PATCH 2/3] Update test certs to work with more secure OpenSSL
+ (Ubuntu 20.04)
+
+Added code for generating/updating
+---
+ examples/puma/cert_puma.pem | 34 ++---
+ examples/puma/client-certs/ca.crt | 34 ++---
+ examples/puma/client-certs/ca.key | 50 +++----
+ examples/puma/client-certs/client.crt | 34 ++---
+ examples/puma/client-certs/client.key | 50 +++----
+ examples/puma/client-certs/client_expired.crt | 34 ++---
+ examples/puma/client-certs/client_expired.key | 50 +++----
+ examples/puma/client-certs/client_unknown.crt | 34 ++---
+ examples/puma/client-certs/client_unknown.key | 50 +++----
+ examples/puma/client-certs/generate.rb | 78 ----------
+ .../puma/client-certs/generate_client_test.rb | 133 ++++++++++++++++++
+ examples/puma/client-certs/keystore.jks | Bin 3743 -> 3740 bytes
+ .../client-certs/run_server_with_certs.rb | 26 ++++
+ examples/puma/client-certs/server.crt | 34 ++---
+ examples/puma/client-certs/server.key | 50 +++----
+ examples/puma/client-certs/server.p12 | Bin 3274 -> 3266 bytes
+ examples/puma/client-certs/unknown_ca.crt | 34 ++---
+ examples/puma/client-certs/unknown_ca.key | 50 +++----
+ examples/puma/generate_server_test.rb | 56 ++++++++
+ examples/puma/keystore.jks | Bin 2211 -> 2253 bytes
+ examples/puma/puma_keypair.pem | 38 +++--
+ examples/puma/server.p12 | Bin 0 -> 2550 bytes
+ test/helpers/ssl.rb | 2 +-
+ 23 files changed, 511 insertions(+), 360 deletions(-)
+ delete mode 100644 examples/puma/client-certs/generate.rb
+ create mode 100644 examples/puma/client-certs/generate_client_test.rb
+ create mode 100644 examples/puma/client-certs/run_server_with_certs.rb
+ create mode 100644 examples/puma/generate_server_test.rb
+ create mode 100644 examples/puma/server.p12
+
+diff --git a/examples/puma/cert_puma.pem b/examples/puma/cert_puma.pem
+index 7e68d622a..a0730990d 100644
+--- a/examples/puma/cert_puma.pem
++++ b/examples/puma/cert_puma.pem
+@@ -1,19 +1,21 @@
+ -----BEGIN CERTIFICATE-----
+-MIIC/jCCAeagAwIBAgIBAjANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJVUzEO
+-MAwGA1UECgwFbG9jYWwxDTALBgNVBAsMBGFlcm8xCzAJBgNVBAMMAkNBMB4XDTEy
+-MDExNDAwMjcyN1oXDTEzMDExMzAwMjcyN1owSDELMAkGA1UEBhMCVVMxDjAMBgNV
++MIIDgjCCAmqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEO
++MAwGA1UECgwFbG9jYWwxDTALBgNVBAsMBGFlcm8xCzAJBgNVBAMMAkNBMB4XDTIw
++MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowSDELMAkGA1UEBhMCVVMxDjAMBgNV
+ BAoMBWxvY2FsMQ0wCwYDVQQLDARhZXJvMQswCQYDVQQLDAJDQTENMAsGA1UEAwwE
+-cHVtYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArxfNMp+g/pKhsDEkB3KR
+-1MAkbfnN/UKMvfXwlnXpz7YX1LHHnMutiI/PqymAp6BPcu+umuW2qMHQyqqtyATm
+-Z9jr3t837nhmxwG1noRaKRtsckn9FD43ZlpPg0Q5QnhS4oOsXwJzilqPjdDFYrKN
+-3TSvIGM2+hVqpVoGYAHDKbMCAwEAAaOBhTCBgjAMBgNVHRMBAf8EAjAAMDEGCWCG
+-SAGG+EIBDQQkFiJSdWJ5L09wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0G
+-A1UdDgQWBBTyDyJlmYBDwfWdRj6lWGvoY43k9DALBgNVHQ8EBAMCBaAwEwYDVR0l
+-BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQADggEBAIbBVfoVCG8RyVesPW+q
+-5i0wAMbHZ1fwv1RKp17c68DYDs0YYPi0bA0ss8AgpU6thWmskxPiFaE6D5x8iv9f
+-zkcHxgr1Mrbx6RLx9tLUVehSmRv3aiVO4k9Mp6vf+rJK1AYeaGBmvoqTBLwy7Jrt
+-ytKMdqMJj5jKWkWgEGgTnjzbcOClmCQab9isigIzTxMyC/LjeKZe8pPeVX6OM8bY
+-y8XGZp9B7uwdPzqt/g25IzTC0KsQwq8cB0raAtZzIyTNv42zcUjmQNVazAozCTcq
+-MsEtK2z7TYBC3udTsdyS2qVqCpsk7IMOBGrw8vk4SNhO+coiDObW2K/HNvhl0tZC
+-oQI=
++cHVtYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9pa0gvlNdwge/u
++aZNE5hTyBLH3eQzdduGcYjoSy6AVgab8M8s5O7RPMEDORV6xRuGfNgRI40Kkx4E8
++w5icHSp9WumsEi5FrKIcIXttquLdcBkUEq9N/mPVZAlg5Jr5IePzWafM0gTdKlR1
++LN/UHcVaMHWt4/Kz2ja9wlUhaKly7+UG1JdHhQ1yrAVVUTLN9YT8VTkyaB11+K0m
++KpdvHcyFuB4yBcvCd4iGSIqf7wjlEIRp8Pa9C6tR8gAlCi4APlzmngYod3wbXAhE
++psjvSXCWCdeHKD/wAgBz1abA4yNnSIhb4KFFkGMn+F74ZjeCZN287lz/18gQLn06
++3EXVKIECAwEAAaOBhTCBgjAMBgNVHRMBAf8EAjAAMDEGCWCGSAGG+EIBDQQkFiJS
++dWJ5L09wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTyDyJl
++mYBDwfWdRj6lWGvoY43k9DALBgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
++AwEwDQYJKoZIhvcNAQELBQADggEBAH2YCJJY9RFO8a7wW+9LonTVL1QLvpS0bgqC
++1CvW3ANCXriCXHUHc/aLmneRfXhrezCcAgqyqG2+HxJ3fLllec7lbiznnV7DaAmn
++Jhgmlho9fw2FxPA4iZ5DQvCALS0Ho4Vo+kPVExbhH4XKZkVTJosms5TWmDaeyfN0
++PyWDeyKsjqi9oXqqAZKBo9DFWxkJUThzpxXdWo2S9cKt7EWJJlgdlmQGyoo39Xdu
++86MxNGfaS+7ChzcXQVu1B/t0fpFKfkVCEKvNEQ50v/D01Ed0hgQPOaqgFvFMp0eU
++B0b1xpKQ2OshyOK1048ou3Gv+fAw+xtcC840T0DDMte73sysXtg=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/ca.crt b/examples/puma/client-certs/ca.crt
+index 7ca63b0ba..a69ea6fb6 100644
+--- a/examples/puma/client-certs/ca.crt
++++ b/examples/puma/client-certs/ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDEDCCAfigAwIBAgIBATANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwIBcNMTQw
+-MjAyMjAwODI3WhgPMjExNTAxMDkyMDA4MjdaMDgxEzARBgoJkiaJk/IsZAEZFgNu
+-ZXQxFDASBgoJkiaJk/IsZAEZFgRwdW1hMQswCQYDVQQDDAJjYTCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAN0u8/heGbkoFDDsx6uidE6DKPvjIPnZPFzR
+-CMkzrNgIeq/hfAItIJAO0m8YZivkUWeE3ut4ibSL+OVTvLRWDL/L736LILUxrD2f
+-joKHHLSVIUWl3H0VjYDE2RCiVkvxP4sAo7EYecZesTtb7W7DdAjHztFZIl+wT+ri
+-MlxDRmYxwsOPQtL0/wJZF80uTpC29V47NY9ITd/A+1xMblPAuQKO3vqZ4Yq07mO/
+-KKSbepo07v7jMhNOSHf8VBFlTzzG5AHmxZUW0qjCkJBV8N1MiT9cIk81ZuSqOZu3
+-A+aDAlOYPJe2WVpGskCme9HkJaHTeP87tQUsLqRsLgq/AXh5R58CAwEAAaMjMCEw
+-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQAD
+-ggEBAKiGZ57rSAlL9slQ0FklVjpe+YrfZvmaXTRPl+9YhikoVI91u1r/qA9PrXKn
+-cL6u66SU6kJwI5572uT1TpKO7jQLXJZV0LO17WuF3P7y44QnNb53Em2GYi8DD/gq
+-X0Y1u8QzIxo4uomWiE73fnao2I9eErKNi/xCySaX/SLQ/9tcEgUyeLlTtJZ3feVF
+-7K0llR+hSb0Wy/uWnP7qP59YsyCJl1H23j7IEVCTMsOQ4tyIK16+qRA+aVLtE9f5
+-orsrOWWGJOdAn1nCJweKqhG1vd3GKGRW3Rf/iugCbvgJy0NFLfTpeJ4fJosC3A/K
+-6K+pe9hNsi2kBPwC67QeVjnbqd4=
++MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
++DQEBAQUAA4IBDwAwggEKAoIBAQDIHxrFcS2JkRQbXLFosb32unVkVuwHSPSt6Dpl
++2jUQHP/bceAx/d9waHYf8rlbCFAIoduZDOc7XCJUidgcG5NfLJyQpkkWOU8CGWH+
++Ipl4AE8auYCcy/0T7BQqaRC41HPmrJG1CC40rqcY47lUO2haI+vj5TZFHNhAbRat
++rR1iD1veis2gBZtrMzd4IlpvEHGv6ghfnSc20za4exmapjp/uAAIOXpeFX8QHumA
++bty4dd+iHpKjDzUrhG9Qa5v28ii2K1AcbczUQ7FzSp2/GoRSjF+WY6i86N9Z1M97
++2PEgy0IG5l6JHu1P0/rd00hN0h0Owzv3V5ldMLZap7+pVFQTAgMBAAGjIzAhMA8G
++A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
++AQA3GWpy4bYLOHLENDTUBeclF6cDdYiautD6gxd1SDLMWOhAUF7ywwT87OAJdr1I
+++W1TUv5BRG21rNm1QsZfLbStdKA1mpiET/9nYN7m1YauL5hI3yD49TGuO9/sxcE5
++zNW7D3VBVNq+pyT21/TvLAgxCNvjjm7byzyIOcoRUyZx8WhCf8nUT6cEShXqEg4Q
++iUBSLI38tiQoZneuVzDRlXBY0PqoB19l2Kg9yThHjPTVhw5EAQSDKXCCvaxAbVw6
++ZPLNnOdK6DvqEZ3GC5WlaHQdmLxmN4OfV6AEtpgqgGY9u8K1ylTr3ET7xLK7bhcA
++oZsggEVZr1Ifx9BWIazRNwlw
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/ca.key b/examples/puma/client-certs/ca.key
+index e229c7b91..59bc391a2 100644
+--- a/examples/puma/client-certs/ca.key
++++ b/examples/puma/client-certs/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client.crt b/examples/puma/client-certs/client.crt
+index bfb7f668f..9703ebdbd 100644
+--- a/examples/puma/client-certs/client.crt
++++ b/examples/puma/client-certs/client.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDAzCCAeugAwIBAgIBAzANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwIBcNMTQw
+-MjAyMjAwODI3WhgPMjExNTAxMDkyMDA4MjdaMDwxEzARBgoJkiaJk/IsZAEZFgNu
+-ZXQxFDASBgoJkiaJk/IsZAEZFgRwdW1hMQ8wDQYDVQQDDAZjbGllbnQwggEiMA0G
+-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGnFKNrNj9pvHIK+iUf1UoDJ0O7hpj
+-jn7QWd65xnHWN9YF9RfBVRxg7HLcPls6GL4c+e5KQP1W0o4gSzwbUc3a/LyqkTEA
+-dligEjXTkQY6tCn/51CuClynreQ98wdgQrayzobKhWMALG7IRLraprZmiQJpxWOF
+-evd7WkF32AwSklZMEdWcLdI36swTV0UzuR9IDUnIh5GGPbikF/6hQ1E1+rL/sZkh
+-czYNEniJGk2pD3MqJguTvYTF24k1KEOV5koSuAPnyl4E/dX9g3AIHWo8OhqVs/4P
+-hrX6++qmrsVz9LIvPw3+SMAE3QU49J7uAANRQMBlxWhlbIpeFi8zNig7AgMBAAGj
+-EjAQMA4GA1UdDwEB/wQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAtxbX3CfQgMwa
+-CWYTjupyTC+KDajbkLLsNXw49PeTIj0FOjAdKA1zyEZcrxtaU+flJr8QHdI8HyZH
+-hpofnOTSBg5k9y4Qz8gjI1Nsh0H8WU/d7F//2l2fUDOhVAb6JtTAKnMpU4snb0GD
+-bxcO6QxfNh50Qdb7KoJH7baJ3aAnsRrLVGqQ7jH20iMu163j/pYw4dDskFMr65Le
+-bMB3NeQ5pHwtYf2J5EliKCtH+Df/BTIl9u1vviZs84gA0Odai/YaMZWCqFiWqIax
+-lkMHNSDWh2G++qMn9erLjRtYDAbIt3VhMncUpEBx3lBEIaVg7qyfpWQ4EkkkylH6
+-WRv06vukVg==
++MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
++IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
++ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
++E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
++FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
++u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAApaKvnGiRqs
++Vz4B06f/mDLmN7gb0e/evEypB2S06fp9f/oWWHXHCxpx9bKbiHFNNiinoc97/Spb
++GzylHV/n9j8GEtZmJMiSJZubN8vpn1Jg0Usz3ZtAy0fe9ephjBIXPpwrsGF6Oz3u
++U/b2zTpJX3oJ3Eq6Q9hLplYU3bNHfrw6PAbzbB91zVTFsqZUTctKrMRgp68FA4fw
++VWQkb4QwLK1UVJIT/nR3v7nJDktgpR4mfdrtWbWxOGm/ed2oOilpqVhVN99P+bUn
++3cFkQ6PSYK8En9jJhBMe/zQqpSyy09Tfi/Zy6nzZv0ah53bpeCFLZFi+0CU8HwPr
++MuD1XQN72zg=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client.key b/examples/puma/client-certs/client.key
+index a49704121..15820eed7 100644
+--- a/examples/puma/client-certs/client.key
++++ b/examples/puma/client-certs/client.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client_expired.crt b/examples/puma/client-certs/client_expired.crt
+index d0accc885..cd20e0489 100644
+--- a/examples/puma/client-certs/client_expired.crt
++++ b/examples/puma/client-certs/client_expired.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDCTCCAfGgAwIBAgIBBDANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwHhcNMTQw
+-MjAyMjAwODI3WhcNMTQwODA0MDgwODI3WjBEMRMwEQYKCZImiZPyLGQBGRYDbmV0
+-MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEXMBUGA1UEAwwOY2xpZW50LWV4cGlyZWQw
+-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZQSVfI4KNwus/+9gE9Rww
+-+cehxzw80fNi4tmruSApitTIk1u1r1rYVexkBkVTtl6Fg/aNAAdsI4aATanyGj0m
+-yRqEMxYMt8RtzAYHY6ZEJBm4WUAa44W7WNG2ZA/e0bCDq4Sn+hlPJw0e4iQimJqi
+-8+iitgyTdicTKDR+9kTS3W/33PZqSwqqnN55m9n9A5FIKwd8fbPsO8k6xIhFS2sL
+-KZ2TkAYLNXu2vFGJR7b37U8mYcHObB1p7U7WYJ2JCf21WZOC4iI25Xk7MFSUYPqb
+-W/iV+41EcslbHwAZHEjqeNynKNlnZokVrviOFeFrHqXbVKp43027L3RZr/JXfxMl
+-AgMBAAGjEjAQMA4GA1UdDwEB/wQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAdCLR
+-jmHeQDrtl9w0cr8Vls+clhoWSDIEj2NC7PRUbDS5T0kAnF/N64n9RJFPS+4bpZaT
+-c9v3DXzdaTTp7moUrwVc3EKVLV5EJcm+TcuUhbL2ZnRgFHggVaoePShBHkDJGLz9
+-lR30KJnKsyFKEDEyD4rYtYvg98858EtkuxKLsD8efQ/9V8WDLAJJWTsJweEbEpIq
+-GqblQnBeNrLZ7yS32NAM9jnB9wPsMXPZnAAV/o/U6TTwIO9ChApWX+qer1/mIoc7
+-90/XhxEVw6EcXfGPnsLJ85n9FNGbWnLFRxvFAYcD0z6KQYxVHDiUAMSKqAkpENYO
+-k3gVOw5YNxNpPmUrjw==
++MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMTkw
++ODAxMDAwMDAwWhcNMjAwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
++IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
++ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
++E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
++FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
++u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHDfDovSTCmM
++sxDCfTGQUYwnvOohTP0hjUHB6BzNAPVKYoBiq064m/JoDFmOGGtF3CqhWqtE2psl
++eOK8fA/QomyFaIAowhx8qrswMP7T/rRldAG+9QHBYZGkPtbB8evK6XqrMEQTf2Ux
++FlN3p7BZl9rhtuManMb+Wud3HfLYjXn2nTRvkOTi93MP05Vrho8KegZ9Kj4wY1rK
++gOnkbI6bv+1r9yjsZuUKPH/OjFkpmAoOab5hX5R5CmEefGAet2KPCNrApuwfvRHT
++x9jVwtOYBHq3DVcBDBu+O38L+WlKGeXvUK4AzvxQaVUysCG3DA1zrvyI3Y8Jy2Jk
++KfmWZWlvXlM=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client_expired.key b/examples/puma/client-certs/client_expired.key
+index eadc5e8a8..15820eed7 100644
+--- a/examples/puma/client-certs/client_expired.key
++++ b/examples/puma/client-certs/client_expired.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client_unknown.crt b/examples/puma/client-certs/client_unknown.crt
+index 359e33d6c..8cdfc87bb 100644
+--- a/examples/puma/client-certs/client_unknown.crt
++++ b/examples/puma/client-certs/client_unknown.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDEzCCAfugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBAMRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTETMBEGA1UEAwwKY2EtdW5rbm93
+-bjAgFw0xNDAyMDIyMDA4MjdaGA8yMTE1MDEwOTIwMDgyN1owRDETMBEGCgmSJomT
+-8ixkARkWA25ldDEUMBIGCgmSJomT8ixkARkWBHB1bWExFzAVBgNVBAMMDmNsaWVu
+-dC11bmtub3duMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Ewf7nWJ
+-WcHI3NB+gjz5jWnpNwnU47hjIWq+S41iIymN7FsNdssfzeGb3ZElcQAfofvNf75F
+-6mE7YEpbKRU7t/Nptvx+Rd1YGOS2N/PWdj3IcJgvQ2guiU0aYkdB7lC1vlI0QzHT
+-dte9pGK/ZPp/mvRZGwi9WmwlNhBwOzvdyRuLyi63dmZ8vgyZrfbmGhZYdhCZ77Uv
+-i+VYqYv5X30I2gQkV6YQMj/AF5Fmt9a4TNGfIjXb6FKmNhlsDMduovrfQMh2umMK
+-YYQ4A+Vi2yMAZkKeD5cogGLS8wmg76n7miPaKLVU9xTEf55IO+HjIBIqz6VG8qbg
+-iBV4Lr6BkkaKTQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQEF
+-BQADggEBAGGaA7fZLOqxx1wIIay0Ewni3ljzR+RAlpTHAh4x+NilcaQ2ils+JoGH
+-/DCdX2iD5nevGVm1DANBhfAuFxXGGBjoOLqtg/sO7Rk51IV9WjDVB2rGeH3hoTCk
+-Qi6Bazdlcvvs3SyFEKcJm2zXizR7O9I+tDv++F6bbaHSBWB6tB9g93pZuMR+smvR
+-Ll2+/jRGPe1Pif1UFs5DR8QshpvxrIwCmO1vznLhDeA5Pde6CtahGJvi1Y25L1h0
+-9l0LjMxxqgVh8h4A5AR8VufCcDiaT8lzCkz4G4jQYFhrJXmBn8Em6NZfdP/LmM9I
+-0zEB2Y3lp32ng+WMyaqNh6nfpxEfBoY=
++MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTIw
++MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++dDEUMBIGCgmSJomT8ixkARkWBHB1bWExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIw
++DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQo9ve3XI5fiKE5AKI3Qm7aeGwy
++uIR5RBo58Na4saBSfCaKZvNwzuEimKN6S4ShUlV0egKwCs/KvzbhQJpIxVsLQCGs
++AQDxdOGP1FyizQvzDhzL7BC2I/Dp3A5V6uXkxo1qTqoBdTYeJ/mdIVgZ7bgTnUdu
++uY9KErU/ugR8MbqZyQel/04PSmkCTdhzP41w0xvmc7Jgab0vJ0oXU4knXIyKsLeq
++BkL6fevPW4fdaU+ppXBvpsgWfACk/WZs+DyhPndcX7JNrcnYIIAJy75wivqw2RDB
++m59XNhoDwbR21EkcZnlQL59pv4ASA7DrJs+tFoGqsCs7DyEioePNp6ZraSkCAwEA
++AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBMbPmIekCi
++TMLtclXtkhKUefb9hoALhABwRbTbzPjz+MGJX2BMwLt8bAs6AMY8jEazvfm9+G0m
++1liBAGWFojSzAykNIq/zAG2tgDVolQp3x4JcyFDJ0cuR8DIdll2CCnLM2jP8Nek8
++wSyuWDsm1U5kmos/dP/ialCvvCLHULoSCBhsyBFKmH2ViXdW09Wg4jSQ4RIToBBn
++w/VbObeKA8NBUW6/7w6MS1oeFL3PlZJ205zVrZ68nqm/ckYyaBAdlQNTmlThNSQ5
++eL7w2QgfYDM72Sk4/rjZsW0kH+V0ZqmIuyVBE6jo5EulGPLo2eQEfPmhEdbo5rFi
++foV+QKM8z3K0
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client_unknown.key b/examples/puma/client-certs/client_unknown.key
+index 82825f77a..96b41acf9 100644
+--- a/examples/puma/client-certs/client_unknown.key
++++ b/examples/puma/client-certs/client_unknown.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEpAIBAAKCAQEA0Ewf7nWJWcHI3NB+gjz5jWnpNwnU47hjIWq+S41iIymN7FsN
+-dssfzeGb3ZElcQAfofvNf75F6mE7YEpbKRU7t/Nptvx+Rd1YGOS2N/PWdj3IcJgv
+-Q2guiU0aYkdB7lC1vlI0QzHTdte9pGK/ZPp/mvRZGwi9WmwlNhBwOzvdyRuLyi63
+-dmZ8vgyZrfbmGhZYdhCZ77Uvi+VYqYv5X30I2gQkV6YQMj/AF5Fmt9a4TNGfIjXb
+-6FKmNhlsDMduovrfQMh2umMKYYQ4A+Vi2yMAZkKeD5cogGLS8wmg76n7miPaKLVU
+-9xTEf55IO+HjIBIqz6VG8qbgiBV4Lr6BkkaKTQIDAQABAoIBAC41pSPWqWjjJ7ds
+-/ZPRCR/JLjbKlJMMVdmU/7BtJidc0aJstLj06RJYiaaGy8Kc32elH/rF8GbFuVFs
+-TXr4ve3aL0qsCytepmunWZFiI+LJZA0uhdWzaBeHpmHFIyhGeXtGa1e41wvXYrf0
+-PDefpu1uZdIshy1nLn4m+W76ogI6FrcyUQ+XRN6f5x6af70Kfi414qf9NLOvajnl
+-JCx90WpdwBp1jC8totKDp9kvILCymFnGBl93NUl8F3Tz7zLkh2SIhaKxQIHTc9g0
+-LPNkd1Q5tIl/rG3lZ6vw2/UlCVB1NdLsItlJVIJhu6ChIrSXeoDg0GNlJFp7op6W
+-jlJDoRUCgYEA67Nuzrv/lkVljRFDVw97DTiCbLL7SDXDH6Jf43+Bz6prGLqd4Nfd
+-LTO7AdLGd5UTWB1Oj2U94pFXNFkucGv65ck6QAPZ4UrCk9lyjx/dN7d6CxUBDeu2
+-4zPeHy/mAgkVmKSzEy5L2ERwoQqK8A/g6HtuThB87gtKUpnG+QSfz6sCgYEA4jyE
+-kPRudqne0VXWL/Mhnrls2PNo4MDIOxUp+KcFLGY/44RIEoit3WLRDXULAgT3U20Z
+-lY7nQJyU+/CaEH6rIpADp6VRPA0XJo7HCuMGEO7bk8AAXkXTplVs+XbsD0221AKl
+-GRpS0CtcvHllHiwG8iL+zHAJzL4wbNY36L97decCgYB0UuHk9bN2Hlm3/UUWunUo
+-WTNFIjARuzbJbgGU7WDLdHfWhINWbDKkFFu+0p9QdSpO2mfjLTwVjVVUaI8avK/e
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/generate.rb b/examples/puma/client-certs/generate.rb
+deleted file mode 100644
+index 3542057e2..000000000
+--- a/examples/puma/client-certs/generate.rb
++++ /dev/null
+@@ -1,78 +0,0 @@
+-require "bundler/setup"
+-require "puma"
+-require "puma/minissl"
+-
+-case ARGV[0]
+-
+-when "s"
+-
+- app = proc {|env|
+- p env['puma.peercert']
+- [200, {}, [ env['puma.peercert'] ]]
+- }
+- events = Puma::Events.new($stdout, $stderr)
+- server = Puma::Server.new(app, events)
+-
+- context = Puma::MiniSSL::Context.new
+- context.key = "certs/server.key"
+- context.cert = "certs/server.crt"
+- context.ca = "certs/ca.crt"
+- #context.verify_mode = Puma::MiniSSL::VERIFY_NONE
+- #context.verify_mode = Puma::MiniSSL::VERIFY_PEER
+- context.verify_mode = Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
+-
+- server.add_ssl_listener("127.0.0.1", 4000, context)
+-
+- server.run
+- sleep
+- #server.stop(true)
+-
+-when "g"
+-
+- def issue_cert(dn, key, serial, not_before, not_after, extensions, issuer, issuer_key, digest)
+- cert = OpenSSL::X509::Certificate.new
+- issuer = cert unless issuer
+- issuer_key = key unless issuer_key
+- cert.version = 2
+- cert.serial = serial
+- cert.subject = dn
+- cert.issuer = issuer.subject
+- cert.public_key = key.public_key
+- cert.not_before = not_before
+- cert.not_after = not_after
+- ef = OpenSSL::X509::ExtensionFactory.new
+- ef.subject_certificate = cert
+- ef.issuer_certificate = issuer
+- extensions.each {|oid, value, critical|
+- cert.add_extension(ef.create_extension(oid, value, critical))
+- }
+- cert.sign(issuer_key, digest)
+- cert
+- end
+-
+- @ca_key = OpenSSL::PKey::RSA.generate(2048)
+- @svr_key = OpenSSL::PKey::RSA.generate(2048)
+- @cli_key = OpenSSL::PKey::RSA.generate(2048)
+- @ca = OpenSSL::X509::Name.parse("/DC=net/DC=client-cbhq/CN=CA")
+- @svr = OpenSSL::X509::Name.parse("/DC=net/DC=client-cbhq/CN=localhost")
+- @cli = OpenSSL::X509::Name.parse("/DC=net/DC=client-cbhq/CN=localhost")
+- now = Time.at(Time.now.to_i)
+- ca_exts = [
+- ["basicConstraints","CA:TRUE",true],
+- ["keyUsage","cRLSign,keyCertSign",true],
+- ]
+- ee_exts = [
+- #["keyUsage","keyEncipherment,digitalSignature",true],
+- ["keyUsage","keyEncipherment,dataEncipherment,digitalSignature",true],
+- ]
+- @ca_cert = issue_cert(@ca, @ca_key, 1, now, now+3600_000, ca_exts, nil, nil, OpenSSL::Digest::SHA1.new)
+- @svr_cert = issue_cert(@svr, @svr_key, 2, now, now+1800_000, ee_exts, @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
+- @cli_cert = issue_cert(@cli, @cli_key, 3, now, now+1800_000, ee_exts, @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
+-
+- File.open("ca.crt","wb") {|f| f.print @ca_cert.to_pem }
+- File.open("ca.key","wb") {|f| f.print @ca_key.to_pem }
+- File.open("server.crt","wb") {|f| f.print @svr_cert.to_pem }
+- File.open("server.key","wb") {|f| f.print @svr_key.to_pem }
+- File.open("client1.crt","wb") {|f| f.print @cli_cert.to_pem }
+- File.open("client1.key","wb") {|f| f.print @cli_key.to_pem }
+-end
+diff --git a/examples/puma/client-certs/generate_client_test.rb b/examples/puma/client-certs/generate_client_test.rb
+new file mode 100644
+index 000000000..da1b56a91
+--- /dev/null
++++ b/examples/puma/client-certs/generate_client_test.rb
+@@ -0,0 +1,133 @@
++# frozen_string_literal: false
++
++=begin
++run code to generate all certs
++certs before date will be the first of the current month
++expire in four years
++
++JRuby:
++see https://github.com/puma/puma/commit/4ae0de4f4cc
++after running this Ruby code, delete keystore.jks and server.p12, then
++cd examples/puma/client-certs
++openssl pkcs12 -chain -CAfile ./ca.crt -export -password pass:jruby_puma -inkey server.key -in server.crt -name server -out server.p12
++keytool -importkeystore -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass jruby_puma -destkeystore keystore.jks -deststoretype JKS -storepass jruby_puma
++keytool -importcert -alias ca -noprompt -trustcacerts -file ca.crt -keystore keystore.jks -storepass jruby_puma
++=end
++
++require "openssl"
++
++module Generate
++
++ KEY_LEN = 2048
++ SIGN_ALGORITHM = OpenSSL::Digest::SHA256
++
++ CA_EXTS = [
++ ["basicConstraints","CA:TRUE",true],
++ ["keyUsage","cRLSign,keyCertSign",true],
++ ]
++ EE_EXTS = [
++ #["keyUsage","keyEncipherment,digitalSignature",true],
++ ["keyUsage","keyEncipherment,dataEncipherment,digitalSignature",true],
++ ]
++
++ class << self
++ def run
++ set_dates
++ output_info
++ setup_issue
++ write_files
++ end
++
++ private
++
++ def setup_issue
++ ca = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=CA"
++ ca_u = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=CAU"
++ svr = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=localhost"
++ cli = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=localhost"
++ cli_u = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=localhost"
++
++ [:@ca_key, :@svr_key, :@cli_key, :@ca_key_u, :@cli_key_u].each do |k|
++ instance_variable_set k, OpenSSL::PKey::RSA.generate(KEY_LEN)
++ end
++
++ @ca_cert = issue_cert ca , @ca_key , 3, @before, @after, CA_EXTS, nil , nil , SIGN_ALGORITHM.new
++ @svr_cert = issue_cert svr, @svr_key, 7, @before, @after, EE_EXTS, @ca_cert, @ca_key, SIGN_ALGORITHM.new
++ @cli_cert = issue_cert cli, @cli_key, 11, @before, @after, EE_EXTS, @ca_cert, @ca_key, SIGN_ALGORITHM.new
++
++ # unknown certs
++ @ca_cert_u = issue_cert ca_u , @ca_key_u , 17, @before, @after, CA_EXTS, nil , nil , SIGN_ALGORITHM.new
++ @cli_cert_u = issue_cert cli_u, @cli_key_u, 19, @before, @after, EE_EXTS, @ca_cert_u, @ca_key_u, SIGN_ALGORITHM.new
++
++ # expired cert is identical to client cert with different dates
++ @cli_cert_exp = issue_cert cli, @cli_key, 23, @b_exp, @a_exp, EE_EXTS, @ca_cert, @ca_key, SIGN_ALGORITHM.new
++ end
++
++ def issue_cert(dn, key, serial, not_before, not_after, extensions, issuer, issuer_key, digest)
++ cert = OpenSSL::X509::Certificate.new
++ issuer = cert unless issuer
++ issuer_key = key unless issuer_key
++ cert.version = 2
++ cert.serial = serial
++ cert.subject = dn
++ cert.issuer = issuer.subject
++ cert.public_key = key.public_key
++ cert.not_before = not_before
++ cert.not_after = not_after
++ ef = OpenSSL::X509::ExtensionFactory.new
++ ef.subject_certificate = cert
++ ef.issuer_certificate = issuer
++ extensions.each {|oid, value, critical|
++ cert.add_extension(ef.create_extension(oid, value, critical))
++ }
++ cert.sign(issuer_key, digest)
++ cert
++ end
++
++ def write_files
++ Dir.chdir __dir__ do
++ File.write "ca.crt" , @ca_cert.to_pem , mode: 'wb'
++ File.write "ca.key" , @ca_key.to_pem , mode: 'wb'
++ File.write "server.crt", @svr_cert.to_pem, mode: 'wb'
++ File.write "server.key", @svr_key.to_pem , mode: 'wb'
++ File.write "client.crt", @cli_cert.to_pem, mode: 'wb'
++ File.write "client.key", @cli_key.to_pem , mode: 'wb'
++
++ File.write "unknown_ca.crt", @ca_cert_u.to_pem, mode: 'wb'
++ File.write "unknown_ca.key", @ca_key_u.to_pem , mode: 'wb'
++
++ File.write "client_unknown.crt", @cli_cert_u.to_pem, mode: 'wb'
++ File.write "client_unknown.key", @cli_key_u.to_pem , mode: 'wb'
++
++ File.write "client_expired.crt", @cli_cert_exp.to_pem, mode: 'wb'
++ File.write "client_expired.key", @cli_key.to_pem , mode: 'wb'
++ end
++ end
++
++ def set_dates
++ now = Time.now.utc
++ mo = now.month
++ yr = now.year
++ zone = '+00:00'
++
++ @before = Time.new yr , mo, 1, 0, 0, 0, zone
++ @after = Time.new yr+4, mo, 1, 0, 0, 0, zone
++
++ @b_exp = Time.new yr-1, mo, 1, 0, 0, 0, zone
++ @a_exp = Time.new yr , mo, 1, 0, 0, 0, zone
++ end
++
++ def output_info
++ puts ""
++ puts " Key length: #{KEY_LEN}"
++ puts "sign_algorithm: #{SIGN_ALGORITHM}"
++ puts ""
++ puts "Normal cert dates: #{@before} to #{@after}"
++ puts ""
++ puts "Expired cert dates: #{@b_exp} to #{@a_exp}"
++ puts ""
++ end
++ end
++end
++
++Generate.run
+diff --git a/examples/puma/client-certs/keystore.jks b/examples/puma/client-certs/keystore.jks
+index 6d734fadce1949b3b47e36b62749ca612fbaddf6..17654b4adbdde88929f2476da21ff50ef2899d0d 100644
+GIT binary patch
+literal 3740
+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
+A9RL6T
+
+literal 3743
+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
+E4T{|^s{jB1
+
+diff --git a/examples/puma/client-certs/run_server_with_certs.rb b/examples/puma/client-certs/run_server_with_certs.rb
+new file mode 100644
+index 000000000..6df57b678
+--- /dev/null
++++ b/examples/puma/client-certs/run_server_with_certs.rb
+@@ -0,0 +1,26 @@
++require "bundler/setup"
++require "puma"
++require "puma/detect"
++require "puma/puma_http11"
++require "puma/minissl"
++
++app = proc {|env|
++ p env['puma.peercert']
++ [200, {}, [ env['puma.peercert'] ]]
++}
++events = Puma::Events.new($stdout, $stderr)
++server = Puma::Server.new(app, events)
++
++context = Puma::MiniSSL::Context.new
++context.key = "certs/server.key"
++context.cert = "certs/server.crt"
++context.ca = "certs/ca.crt"
++#context.verify_mode = Puma::MiniSSL::VERIFY_NONE
++#context.verify_mode = Puma::MiniSSL::VERIFY_PEER
++context.verify_mode = Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
++
++server.add_ssl_listener("127.0.0.1", 4000, context)
++
++server.run
++sleep
++#server.stop(true)
+diff --git a/examples/puma/client-certs/server.crt b/examples/puma/client-certs/server.crt
+index 7fb2f9b8f..5c3c334ed 100644
+--- a/examples/puma/client-certs/server.crt
++++ b/examples/puma/client-certs/server.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDBjCCAe6gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwIBcNMTQw
+-MjAyMjAwODI3WhgPMjExNTAxMDkyMDA4MjdaMD8xEzARBgoJkiaJk/IsZAEZFgNu
+-ZXQxFDASBgoJkiaJk/IsZAEZFgRwdW1hMRIwEAYDVQQDDAkxMjcuMC4wLjEwggEi
+-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDK2ioejidqPJzhGgYh9Nc/CD8g
+-n/vFqchULvmG796R01Rx0Xk5v7OgWs4GMhvJ8o4soCxTmACyPStdemDlocdzZf2d
+-yfv1alVVfBBwqSsiekiB7IiSvpyg5t3h8XqWJcKtP00tPEYmAkVuMbVSxQPrsEi5
+-47kxu7zyiV0RavaZbODgxkupSjEr0DHa1h7pkip53ekz/rnoceVcvSnCdOahUVj6
+-ZwMkOQtay/b6746ttbfQh1ygbqTbV/lcV9erldlDkqKG0gQ6gxaBcbIiom1p+ohu
+-CcoTDGZu431KOU6ZygbGxaIEZY9Zbyg9Dp+o6Zyyd7UTY/0JcCWUq7O/XaN5AgMB
+-AAGjEjAQMA4GA1UdDwEB/wQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAIfMqanJJ
+-aVD6XuS3aj0I31L4RiPSfKhkPiuO+lqBGzZhUEKwnEqVWLosFF1SK8Inbu1c1uyP
+-zRb0tB4nSO01L8Oc5kTfuN9lr3nNaWDpGksa/S5e9WndQk95XF3FLt7FJii8wWnM
+-9xGW27lurskbpuZc1M7IkD5W90y2fF19qB8fY8B2RGovPJEsDKSZ7pwSozijGR4Q
+-2iIY4Lk9/vYxEYMRixE2+exYiKTNfaPt+CgxHxXksn0LvbYYQTxUmDgvSxXdrnCc
+-4Kb1BbxOmB8XF17aJuRdUJxDxlnQK5LpoUWGfW7jFPbfX4d3nzpxjPaxvr3peRQV
+-DNtRoD9mFvocbQ==
++MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXOg3gTrGJfVft9cSrfGRnEZezDB
++L93fcLwJAoaXGxbEg1RW/fOrSpSNemuqOvbzczV7m5eYTf1lHPBJsndbYyijIR1+
++Fp4tjFDp76SC3hxCIc3uYXIz0qQwSOAi1z15zobS4xF29jlsXWtfBl9fivjzdj/f
++pbZ+JPYOrlcJAf6Xmr3xh//13rOI0ytBMlWf51z/iAZBLm2wvbt+nR7B6koAdTgM
++Coe+gOtcLWYY5ApJ4qB9knGdxWoF5p7guHHw2aGTM0jyhgBowfVkFRiE2JUmODae
++g+dHsd8ogWbqhGyZTredJF/NRrLKU0h+t7ldKHvXEZy4qyqQlvKoTpODqQIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAI/bcQP4Hu9O
++OtaaIjVxN8+9jXUOrMpSogmZ4bRKImispt9SA+sbxec7iOMM2pG3Py2yi0hWGzii
++hSebWIsM1JuPj7ks9l8nGRxpGeInJwTkJorG4ZLEypoS2wW3fQZGx3o4da5V+U2Z
++HEY0wQTbPBqqnyeZ16ZFNVCzw8y9l7y7CEFjvUO3sq0pne9r7Z+XVgjGyBdBYkJS
++0kcqPBXFCMHrWH5UlacYlM5cqgoVztOp2STGmR3XR7a34oueeA10QSP+jzeYvWA1
++wTYA762uU2ReCdujfNbf8V1tZWAH36KldM3hhDNWeveAGxxj1h2R9T/k2kHl/a7D
++I3VdS59vjJY=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/server.key b/examples/puma/client-certs/server.key
+index c1c031430..75a358ff5 100644
+--- a/examples/puma/client-certs/server.key
++++ b/examples/puma/client-certs/server.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/server.p12 b/examples/puma/client-certs/server.p12
+index 6fb6ba6046db3096a51886b7d7c8d68c4367d0eb..6ac4d590e48c8f282f09ede85d9442789ab97822 100644
+GIT binary patch
+delta 3160
+zcmV-e45#zT8NwMrFoF!e0s#Xsf((QP2`Yw2hW8Bt2LYgh40Qy83~?}m3~exi2L}cT
+zDuzgg_YDCD2B3ll_%MP7^a23@FoFi{kw6`P1kB9hlA2Hz0s;sCfPx0VA>-i@q{rAk
+zI+De=@3JTu*8F>tsgG?-YfOXOPwJKPLqI;4xx3bZ67d}Z1<J?xUJYO)GT_vR2t6Cd
+zNCK*;u0bMAm@x~T0?1qRg<<gcd;b|EC!Lo4Sqa<ZGy>^J%YLKa_t%%CseyY@vs@p4
+zGJX8)6Ov$hV47k^&ZC?7Y*&;Xt=9J<!F	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
+
+delta 3168
+zcmV-m44?DD8Oj+zFoF!m0s#Xsf((oX2`Yw2hW8Bt2LYgh41ENG40$ku40SMq2M-1b
+zDuzgg_YDCD2B3lm05F0E`~m?0FoFj4kw6`Peg;UfOd86m0s;sCfPx0dIXLWfJ@O*Q
+zXOr@cX{7|S&v}-fxF{`82>h~a+opZxf(`vsADK%+>{@O7h+TGwR<jB2zY`f@+T3dL
+z9a80;Vx6xgDik}yrEb#>F4B4+STMBiQu@fIzn>9Aj*YH4xZ=b=MCFDbD7o+FyzPa5
+zRCP?a=A(B`d#dl4!9+LNAV+a%nWm;SA*TQpu$gnlJ<W;-LBzA0+dOdWh0Qy#5Tzw5
+z44AbOusVCWYiT5}IdlK=@G2JIeT&LI$IB^NS<&9FF+Dv?_Fi)^zMy8VRTTyYj1d|_
+zRGg(Ffl=7N?kMgA8s%|s%=f^e3?<%w?c+4Hd5z+P^pACjk#jsrYw1cOF+C=HWWkI>
+zIg&H@r5r#eecv=0IV`Yg1X>?}BxvJv3B7Zg#9;j{AG%kIPAe^mL{yMP$cW@Tr-!+1
+zT6T)Bt^3HC%wbExc=Vi>z;hs}ql03H9k8oRWK@zYKyCEndZxmq_Z{ekxZYoX7QElH
+zx!_MjgoOO*Oh<^vYJYxt%<-UFPBJmDJNYtYLiV6g)d1Jwice2xbXyb^*#ibX-FXL~
+zn~<UO6I3ZR5`Eb^_m==Xs0wo`$O0lPL^tR|MM1)9vfM)~f^tefP8%OJ!6T4vlzTO~
+zSdnqPLOU1n<jJ=0l=zCH&$^#~n>qU?0d`#jQ1FHR1Q2oy1nYN#IqmqB(E%n}I|?=Z
+zwzROB*0hMDL#&n{19JJ2-;L6-N7kCuNu!)2yaiPm4`0FR|E+Sn;Ds6*fBKMXPZ&Ta
+z4^`nC2VX@J`;p}+Al2nSjMIPY<O(h*ykSHEv_2cM(O<oVi>&5)GDn4fSRH0^*RFtI
+z@px8`3p<FLu95F^?4Y&UVO*O}{eI=+1yOfTduK2rb<i`j2r9^m-D%V!<En@#FaWC+
+zK1ajKqWKr#gzg5_`omZ03?^YSj@lCvjq|Cgy}rOjrQH=S3e2n3vOiPMp6|U2y7teS
+zy@Q*VHEf;=c{~elv3AUVJp>O%I$i?h@_r#zlMJE*ML5t+-BBVF=T~+yg9-q%Cv*|1
+zx#egDjJ&kiaSbQJzPo&!)D#0XPq^lw7l5g@bu_mmCADO6nG78D6VqSH8<6o^933n=
+zv#c~jj5)R*;?Kir?(q6}g06RN+jJqS$#2z{znyiY={Hj|cI7dD^i>LS9^#<>caqs?
+zkK-cmwAs1-*c!IWs{8~LappfOOZIV3U?GS(vni9A!QypSbusxTE$f_ew1W72Q>%j>
+z*(%*G=7@E{jU5C2ZJk{Yz4U;ac12_C{<N6k{kov57__WevCu)-POrdi4SDC3w2ia=
+z+Q`olLlC;r@TOjWiEOyNhuS{MVdMrKc1ZyiqBjZ{X_rJDkPNM)0wz|4uo-f@Ao7e;
+zqr|Fx0Ez3BX3kt;5N;p+T?gShE(esA<Y#m_rqpoDvEBP^k!Q~=uAn!ZCk94vs_o%{
+zmd5L=eTWPdhk{hp6egA+cCbaY+z;@HXtHA9o1l<beLeVpgOrNJtxOGLA7<mp_g){U
+zVn0axafCqVjWgcVZTPmIfbjg|=}WiJf~z-oG?JnRwDP`V`&O>Ei53gmkNdh{Nm0s}
+zg$74_1;6f&%B@QQJW66|c>mI(`xm`7#uZJ|LC6mcG+mI2Lx;2*H3!*(Xuo*Sv}B3d
+zczeo2<ZH8kWY_yF2%nQRb^MBO$!Qet51ZDj4S~j`g2y+H&r3+}GF~xGVRj&NWbER*
+z!_fkH@n%8ZmZ_~Vy<%vXhi+`5;R`m|p5&ky=u|@(=3n~0R;=tMk@#U;D1+7m;tS97
+zE=QY9g7G-fYGR7o{nKQ-EXX_=e|6o@BQ3h`02L5_jkd9>#J*dy;#H9hEtNP)FFpHW
+zS6wRdog8FzwtuU}V3%$xaLDAlHPYr``!s&B70yGDh@(+$pjA{6WZ{)D<b%-A7rSd+
+zLW6RFas@3S9XJiL(V-k44F>|+O-AqTtrbut#Otmy|6c$nN6k1X8WhZnJo})9)5=jC
+z&<`SiTfE~mzIg?vv8;0t0|4+IAUlQ3KMX<It9ZmP+tj%<y36$1EffSXaL9Bh`bi4d
+zA6D%4cBgPc5mSa<QwQL*<bGbSD<RD5d-^b~>ukD}_~=i#1M{kVh7h;l?W`7s2svb0
+zfZH<`a44JrGi3TDlas<cY{CNLI%kq%ZO8a!+SCa1?5OEcOIsLnV?mj@&0RX|*2>Db
+zBNYckPoG%qsuL9DNx72;><h{Gp1xP`H%RlV)5u^Ytr9S{8r|bSc>XSTBTM3n+ZA=N
+z_MT%5mRaWW`~=@*8!BXZD@FU+atG;L|C22TMt?zbJq7q2(?J3P2ml0v1jr_owoLE{
+zK_KhViOy*rw%picJs63|UrmgQbZ@jOOQhdE?dQl#!8RGCDJ2T^T`3HG6~SmxWko?c
+zsLqeZ3h~p+5lV2%*<x-BsYNL&m<LLzss>h>ZWhSGpOB)CAVAlHX0<GRWanN2ad=T9
+zAAboSFXPLYw<bJ-Pki<RVgDkg1bDf;#HO|K3UPf4K|(?NM#-fVu{!`f5bri9;2V*-
+zRLEe&c3j+D$#{@GW`<tmsNz!a7x%*i_%)n3G3J0DljL%mQYNM!FhEEai5n%217`zO
+zkgMQ1Rf71i$P4K(1l&nb*BFF5(rdSTZ+{FkHScTN9ii9JvB<hUW{PM1j|pfkdpz};
+zkn)3#&9pFHRFv~Q2pz)MVM$<rP}bMkJ`{egkLw~g&d!@m30GVa3^kqfwMwroBo^zO
+zhBt26PI4udyVX!n(MshnC#!vAl$6Q4B|Zu;YY8!JwfOxm{2SFTCxF-tI2TuI;(vxT
+zm-$}$B7@gdk;iNhD@<0r*2FY@$$d6c&^3vYy(V@FrRr7u=tV|fu;hC;w+bn8%dZhV
+zFDg3e`xBv=6?L}frW_ccaZP8G;vxL*V5`9&)U{6i<IBm~fQo!6vsY~8YH$>#5&+Rn
+z>Co6;Pyj|9S#rp|k17|=m8lrL0e^N?X8si0m@q-b(aRimCDFObJ%iDX7I@r1H&%6+
+zLFQC%<{@nN0^W+!>qTu*ekigE=4L5)>>zZTuF-b%5V531bDEzGD>(8T6vB$6#32`&
+z0la&A>B2=6L{o%`Pbm4NkGKS@%SeQlQ51o!LBC6T!$`Q7C#FmE|DhQGa(`z$$--r^
+z9R?@RDPxKQDy~0IkXb#m+$!jE=4E}mK`$x8!=~id&<5$tU{AFol>h39Jjb0u;ao=G
+zv>02xr_1*0^TPco_9i07w@p*GUXweV&%@E^YsGGNi{=)I(%usO7>F|}R_J^m(#Gw4
+z@|!V)bGa{arDrn!+V{a;HGe1VQ<fNN9%la}uDRfGRbBSpg|&C|fcj)zNDOK%#L=zf
+zjijEk^(8p2tGT~V1lquo4SLtgC!a|V@YSe?bBAQG@{(zvBKf_TkWx|wkCVutax9^;
+z?OIb8chvXaFYad+#oJ$B4K8I4MrdZHA4S1FoR^2$lHf|!@T4D1zkl=$s0oA60g+u>
+zik-R^G}`bIB&n8!nyEBQ=#J@uzB(px;(>ja#JQR1rv4z}MxB_4qsK4T?5Ue(rOs#T
+z&k;U;+LM?xC4s@=VhMZpZqtR(%AE?))8^MW0^dPKw4_`yb9B{=$v#8v%ZZ1aO9tnK
+zrVg?PA=n(L2ZVnQ!ha<pA7Y*9JUX#m-vs`=@#+~OP<(4ubn1-;(2sw0xiPt8?QEf(
+zK)WF<i9F=d6b2>HP_v=RxDirt{5uI7=1orA5PFLjH_8gjivyV5SXnW!D?@B%*o8jK
+zHm9&WLX2g~mr8>xo~2YOKqr{)LmQqZ0x-$Kr6k(GIdjEi#bFK@0t9+1cBKTV9M$CC
+zBZcMGQRk*n4+H^wF1}1&V)oeeKh$0^pOaqOTg7OeAH0a32HUI{1cG$0g`5+Z`x4VC
+zq?E0K&A4t*69i&pX~}lw{2z#`v*PeeA?Y@zLbf53OAIha+G75S1jBWI1{xjO+aeA?
+zJ~BZ2FflM8FbM_)D-Ht!8U+9Z6a|mF_+n%f@{#20<#d@HFN=aNAOr||H;f;$_90UO
+G0tf)|Q2!DD
+
+diff --git a/examples/puma/client-certs/unknown_ca.crt b/examples/puma/client-certs/unknown_ca.crt
+index 43f25188d..419487f83 100644
+--- a/examples/puma/client-certs/unknown_ca.crt
++++ b/examples/puma/client-certs/unknown_ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-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
++LVu0+VBx8eIwdLZplDfQ9sGUjCs=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/unknown_ca.key b/examples/puma/client-certs/unknown_ca.key
+index 50f0b3336..d9e3a6203 100644
+--- a/examples/puma/client-certs/unknown_ca.key
++++ b/examples/puma/client-certs/unknown_ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/generate_server_test.rb b/examples/puma/generate_server_test.rb
+new file mode 100644
+index 000000000..086b5a778
+--- /dev/null
++++ b/examples/puma/generate_server_test.rb
+@@ -0,0 +1,56 @@
++# frozen_string_literal: true
++
++=begin
++regenerates cert_puma.pem and puma_keypair.pem
++dates, key length & sign_algorithm are changed
++
++JRuby:
++after running this file, delete server.p12 and keystore.jks, then (I think)
++cd examples/puma
++openssl pkcs12 -export -password pass:jruby_puma -inkey puma_keypair.pem -in cert_puma.pem -name puma -out server.p12
++keytool -importkeystore -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass jruby_puma -destkeystore keystore.jks -deststoretype JKS -storepass jruby_puma
++=end
++
++require 'openssl'
++
++module Generate
++
++ KEY_LEN = 2048
++ SIGN_ALGORITHM = OpenSSL::Digest::SHA256
++
++ FNC = 'cert_puma.pem'
++ FNK = 'puma_keypair.pem'
++
++ class << self
++
++ def run
++ ca_key = OpenSSL::PKey::RSA.new KEY_LEN
++ key = OpenSSL::PKey::RSA.new KEY_LEN
++
++ raw = File.read File.join(__dir__, FNC), mode: 'rb'
++
++ cert = OpenSSL::X509::Certificate.new raw
++ puts "\nOld:", cert.to_text, ""
++
++ now = Time.now.utc
++ mo = now.month
++ yr = now.year
++ zone = '+00:00'
++
++ cert.not_before = Time.new yr , mo, 1, 0, 0, 0, zone
++ cert.not_after = Time.new yr+4, mo, 1, 0, 0, 0, zone
++ cert.public_key = key.public_key
++ cert.sign ca_key, SIGN_ALGORITHM.new
++ puts "New:", cert.to_text, ""
++
++ Dir.chdir __dir__ do
++ File.write FNC, cert.to_pem, mode: 'wb'
++ File.write FNK, key.to_pem , mode: 'wb'
++ end
++ rescue => e
++ puts "error: #{e.message}"
++ end
++ end
++end
++
++Generate.run
+diff --git a/examples/puma/keystore.jks b/examples/puma/keystore.jks
+index 147ab20421da8299c1c8607e12538e4258986a61..f1909ecdc7dc10cf94055fc90ab7786f6fbff74e 100644
+GIT binary patch
+literal 2253
+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
+SHJ`dDUw{v?KO|H!dig&k>e!tC
+
+literal 2211
+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
+
+diff --git a/examples/puma/puma_keypair.pem b/examples/puma/puma_keypair.pem
+index 94cdcbcba..c8057c8f1 100644
+--- a/examples/puma/puma_keypair.pem
++++ b/examples/puma/puma_keypair.pem
+@@ -1,15 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/server.p12 b/examples/puma/server.p12
+new file mode 100644
+index 0000000000000000000000000000000000000000..f8ffc7fab80e9fcb289d7c2a7d63b552494406c2
+GIT binary patch
+literal 2550
+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
+Dcm}%~
+
+literal 0
+HcmV?d00001
+
+diff --git a/test/helpers/ssl.rb b/test/helpers/ssl.rb
+index cfa5fec4a..860d8db62 100644
+--- a/test/helpers/ssl.rb
++++ b/test/helpers/ssl.rb
+@@ -3,7 +3,7 @@ def ssl_query
+ @ssl_query ||= if Puma.jruby?
+ @keystore = File.expand_path "../../../examples/puma/keystore.jks", __FILE__
+ @ssl_cipher_list = "TLS_DHE_RSA_WITH_DES_CBC_SHA,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"
+- "keystore=#{@keystore}&keystore-pass=pswd&ssl_cipher_list=#{@ssl_cipher_list}"
++ "keystore=#{@keystore}&keystore-pass=jruby_puma&ssl_cipher_list=#{@ssl_cipher_list}"
+ else
+ @cert = File.expand_path "../../../examples/puma/cert_puma.pem", __FILE__
+ @key = File.expand_path "../../../examples/puma/puma_keypair.pem", __FILE__
+
+From 4ab2bc4f72441248e95f7742350b3d18dae9aa54 Mon Sep 17 00:00:00 2001
+From: MSP-Greg <Greg.mpls(a)gmail.com>
+Date: Fri, 7 Aug 2020 16:34:24 -0500
+Subject: [PATCH 3/3] test_puma_server_ssl.rb, ssl.rb - misc updates, fixes for
+ updated certs & JRuby
+
+---
+ test/helpers/ssl.rb | 6 ++--
+ test/test_puma_server_ssl.rb | 54 +++++++++++++++++++-----------------
+ 2 files changed, 32 insertions(+), 28 deletions(-)
+
+diff --git a/test/helpers/ssl.rb b/test/helpers/ssl.rb
+index 860d8db62..9847a7607 100644
+--- a/test/helpers/ssl.rb
++++ b/test/helpers/ssl.rb
+@@ -1,12 +1,12 @@
+ module SSLHelper
+ def ssl_query
+ @ssl_query ||= if Puma.jruby?
+- @keystore = File.expand_path "../../../examples/puma/keystore.jks", __FILE__
++ @keystore = File.expand_path "../../examples/puma/keystore.jks", __dir__
+ @ssl_cipher_list = "TLS_DHE_RSA_WITH_DES_CBC_SHA,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"
+ "keystore=#{@keystore}&keystore-pass=jruby_puma&ssl_cipher_list=#{@ssl_cipher_list}"
+ else
+- @cert = File.expand_path "../../../examples/puma/cert_puma.pem", __FILE__
+- @key = File.expand_path "../../../examples/puma/puma_keypair.pem", __FILE__
++ @cert = File.expand_path "../../examples/puma/cert_puma.pem", __dir__
++ @key = File.expand_path "../../examples/puma/puma_keypair.pem", __dir__
+ "key=#{@key}&cert=#{@cert}"
+ end
+ end
+diff --git a/test/test_puma_server_ssl.rb b/test/test_puma_server_ssl.rb
+index 584ab44f5..ecc3ddcf5 100644
+--- a/test/test_puma_server_ssl.rb
++++ b/test/test_puma_server_ssl.rb
+@@ -53,11 +53,11 @@ def start_server
+ ctx = Puma::MiniSSL::Context.new
+
+ if Puma.jruby?
+- ctx.keystore = File.expand_path "../../examples/puma/keystore.jks", __FILE__
+- ctx.keystore_pass = 'blahblah'
++ ctx.keystore = File.expand_path "../examples/puma/keystore.jks", __dir__
++ ctx.keystore_pass = 'jruby_puma'
+ else
+- ctx.key = File.expand_path "../../examples/puma/puma_keypair.pem", __FILE__
+- ctx.cert = File.expand_path "../../examples/puma/cert_puma.pem", __FILE__
++ ctx.key = File.expand_path "../examples/puma/puma_keypair.pem", __dir__
++ ctx.cert = File.expand_path "../examples/puma/cert_puma.pem", __dir__
+ end
+
+ ctx.verify_mode = Puma::MiniSSL::VERIFY_NONE
+@@ -204,26 +204,30 @@ def test_http_rejection
+ # client-side TLS authentication tests
+ class TestPumaServerSSLClient < Minitest::Test
+ parallelize_me!
++
++ CERT_PATH = File.expand_path "../examples/puma/client-certs", __dir__
++
+ def assert_ssl_client_error_match(error, subject=nil, &blk)
+- host = "127.0.0.1"
++ host = "localhost"
+ port = UniquePort.call
+
+ app = lambda { |env| [200, {}, [env['rack.url_scheme']]] }
+
+ ctx = Puma::MiniSSL::Context.new
+ if Puma.jruby?
+- ctx.keystore = File.expand_path "../../examples/puma/client-certs/keystore.jks", __FILE__
+- ctx.keystore_pass = 'blahblah'
++ ctx.keystore = "#{CERT_PATH}/keystore.jks"
++ ctx.keystore_pass = 'jruby_puma'
+ else
+- ctx.key = File.expand_path "../../examples/puma/client-certs/server.key", __FILE__
+- ctx.cert = File.expand_path "../../examples/puma/client-certs/server.crt", __FILE__
+- ctx.ca = File.expand_path "../../examples/puma/client-certs/ca.crt", __FILE__
++ ctx.key = "#{CERT_PATH}/server.key"
++ ctx.cert = "#{CERT_PATH}/server.crt"
++ ctx.ca = "#{CERT_PATH}/ca.crt"
+ end
+ ctx.verify_mode = Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
+
+ events = SSLEventsHelper.new STDOUT, STDERR
+ server = Puma::Server.new app, events
+ server.add_ssl_listener host, port, ctx
++ host_addrs = server.binder.ios.map { |io| io.to_io.addr[2] }
+ server.run
+
+ http = Net::HTTP.new host, port
+@@ -246,11 +250,11 @@ def assert_ssl_client_error_match(error, subject=nil, &blk)
+
+ sleep 0.1
+ assert_equal !!error, client_error
+- # The JRuby MiniSSL implementation lacks error capturing currently, so we can't inspect the
+- # messages here
++ # The JRuby MiniSSL implementation lacks error capturing currently,
++ # so we can't inspect the messages here
+ unless Puma.jruby?
+ assert_match error, events.error.message if error
+- assert_equal host, events.addr if error
++ assert_includes host_addrs, events.addr if error
+ assert_equal subject, events.cert.subject.to_s if subject
+ end
+ ensure
+@@ -264,32 +268,32 @@ def test_verify_fail_if_no_client_cert
+ end
+
+ def test_verify_fail_if_client_unknown_ca
+- assert_ssl_client_error_match('self signed certificate in certificate chain', '/DC=net/DC=puma/CN=ca-unknown') do |http|
+- key = File.expand_path "../../examples/puma/client-certs/client_unknown.key", __FILE__
+- crt = File.expand_path "../../examples/puma/client-certs/client_unknown.crt", __FILE__
++ assert_ssl_client_error_match('self signed certificate in certificate chain', '/DC=net/DC=puma/CN=CAU') do |http|
++ key = "#{CERT_PATH}/client_unknown.key"
++ crt = "#{CERT_PATH}/client_unknown.crt"
+ http.key = OpenSSL::PKey::RSA.new File.read(key)
+ http.cert = OpenSSL::X509::Certificate.new File.read(crt)
+- http.ca_file = File.expand_path "../../examples/puma/client-certs/unknown_ca.crt", __FILE__
++ http.ca_file = "#{CERT_PATH}/unknown_ca.crt"
+ end
+ end
+
+ def test_verify_fail_if_client_expired_cert
+- assert_ssl_client_error_match('certificate has expired', '/DC=net/DC=puma/CN=client-expired') do |http|
+- key = File.expand_path "../../examples/puma/client-certs/client_expired.key", __FILE__
+- crt = File.expand_path "../../examples/puma/client-certs/client_expired.crt", __FILE__
++ assert_ssl_client_error_match('certificate has expired', '/DC=net/DC=puma/CN=localhost') do |http|
++ key = "#{CERT_PATH}/client_expired.key"
++ crt = "#{CERT_PATH}/client_expired.crt"
+ http.key = OpenSSL::PKey::RSA.new File.read(key)
+ http.cert = OpenSSL::X509::Certificate.new File.read(crt)
+- http.ca_file = File.expand_path "../../examples/puma/client-certs/ca.crt", __FILE__
++ http.ca_file = "#{CERT_PATH}/ca.crt"
+ end
+ end
+
+ def test_verify_client_cert
+ assert_ssl_client_error_match(nil) do |http|
+- key = File.expand_path "../../examples/puma/client-certs/client.key", __FILE__
+- crt = File.expand_path "../../examples/puma/client-certs/client.crt", __FILE__
++ key = "#{CERT_PATH}/client.key"
++ crt = "#{CERT_PATH}/client.crt"
+ http.key = OpenSSL::PKey::RSA.new File.read(key)
+ http.cert = OpenSSL::X509::Certificate.new File.read(crt)
+- http.ca_file = File.expand_path "../../examples/puma/client-certs/ca.crt", __FILE__
++ http.ca_file = "#{CERT_PATH}/ca.crt"
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
+ end
+ end
diff --git a/rubygem-puma.spec b/rubygem-puma.spec
index 2db8989..2c58b6b 100644
--- a/rubygem-puma.spec
+++ b/rubygem-puma.spec
@@ -7,23 +7,31 @@
%bcond_without help2man
Name: rubygem-%{gem_name}
-Version: 4.3.3
-Release: 3%{?dist}
+Version: 4.3.6
+Release: 1%{?dist}
Summary: A simple, fast, threaded, and highly concurrent HTTP 1.1 server
License: BSD
URL: http://puma.io
Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem
# The puma gem doesn't ship with the test suite.
# git clone https://github.com/puma/puma --no-checkout
-# cd puma && git archive -v -o puma-4.3.3-tests.txz v4.3.3 test
+# cd puma && git archive -v -o puma-4.3.6-tests.txz v4.3.6 test
Source1: %{gem_name}-%{version}-tests.txz
# The puma gem doesn't ship with the examples used in test suite.
-# git archive -v -o puma-4.3.3-examples.txz v4.3.3 examples
+# git archive -v -o puma-4.3.6-examples.txz v4.3.6 examples
Source3: %{gem_name}-%{version}-examples.txz
# Set the default cipher list "PROFILE=SYSTEM".
# https://fedoraproject.org/wiki/Packaging:CryptoPolicies
Patch2: rubygem-puma-3.6.0-fedora-crypto-policy-cipher-list.patch
-
+# Don't exit Puma on test failure.
+# https://github.com/puma/puma/pull/2332
+Patch3: rubygem-puma-5.0.0-Report-pumactl-exit.patch
+# Fix SSL certificates.
+# https://github.com/puma/puma/pull/2333
+Patch4: rubygem-puma-5.0.0-Update-test-certs-and-code.patch
+
+# Git is needed just to apply Patch4.
+BuildRequires: %{_bindir}/git
BuildRequires: openssl-devel
BuildRequires: ruby(release)
BuildRequires: rubygems-devel
@@ -42,8 +50,11 @@ BuildRequires: help2man
BuildRequires: gcc
%description
-A simple, fast, threaded, and highly concurrent HTTP 1.1 server for
-Ruby/Rack applications.
+Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
+Ruby/Rack applications. Puma is intended for use in both development and
+production environments. It's great for highly concurrent Ruby implementations
+such as Rubinius and JRuby as well as as providing process worker support to
+support CRuby well.
%package doc
@@ -55,17 +66,32 @@ BuildArch: noarch
Documentation for %{name}.
%prep
-%setup -q -n %{gem_name}-%{version} -b 1 -b 3
+%setup -q -n %{gem_name}-%{version} -b 1 -b 3
%patch2 -p1
+pushd %{_builddir}
+%patch3 -p1
+
+# When removed, remove also the `BR: git` above.
+%global __scm git_am
+%{expand:%__scm_setup_%{__scm}}
+%apply_patch -p1 %{PATCH4}
+popd
+
%if %{with ragel}
+# Test suite on s390x fails on various places with following error:
+# ext/puma_http11/http11_parser.rl:123: puma_parser_execute: Assertion `parser->nread <= len && "nread longer than length"' failed.
+# Keep the upstream generated parser which appears to work.
+# https://github.com/adrian-thurston/ragel/issues/51
+%ifnarch s390x
# Regenarate the parser.
# https://fedoraproject.org/wiki/Packaging:Guidelines#Use_of_pregenerated_code
rm -f ext/puma_http11/http11_parser.c
ragel ext/puma_http11/http11_parser.rl -G2 -I ext/puma_http11 \
-o ext/puma_http11/http11_parser.c
%endif
+%endif
%build
# Create the gem as gem install only works on a gem file
@@ -122,29 +148,26 @@ sed -i '/::Timeout.timeout/ s/60/600/' test/helper.rb
# Skip an unstable test on Koji.
# TestCLI#test_control failing with "pool_capacity": 0
# https://github.com/puma/puma/issues/2212
-%ifarch ppc64le s390x
+%ifarch ppc64le s390x aarch64
sed -i '/^ def test_control$/,/^ end$/ s/^/#/' test/test_cli.rb
%endif
-# Skip a test that needs internet.
-# This test often takes long time on Koji.
+# These test often timeouts on Koji.
sed -i '/^ def test_timeout_in_data_phase$/a\
skip' test/test_puma_server.rb
+sed -i '/^ def test_plugin$/a\
+ skip' test/test_plugin.rb
-# Skip a randomly failed SSL test with openssl-libs-1:1.1.1e-2.fc33.ppc64le.
+# Skip a randomly failed SSL test.
# Errno::ECONNRESET: Connection reset by peer
# /usr/share/ruby/openssl/buffering.rb:182:in `sysread_nonblock'
# /usr/share/ruby/openssl/buffering.rb:182:in `read_nonblock'
-%ifarch ppc64le
sed -i '/^ def test_verify_fail_if_client_unknown_ca$/a\
skip' test/test_puma_server_ssl.rb
-%endif
# Skip unstable tests on Koji.
# test_integration_cluster.rb: not expected replies
# https://github.com/puma/puma/issues/2209
-sed -i '/^ def test_term_closes_listeners_/a\
- skip' test/test_integration_cluster.rb
sed -i '/^ def test_usr1_all_respond_/a\
skip' test/test_integration_cluster.rb
@@ -181,6 +204,13 @@ popd
%endif
%changelog
+* Mon Sep 07 2020 Vít Ondruch <vondruch(a)redhat.com> - 4.3.6-1
+- Update to Puma 4.3.6.
+ Resolves: rhbz#1837148
+ Resolves: rhbz#1863729
+ Resolves: rbhz#1842535
+ Resolves: rbhz#1842540
+
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 4.3.3-3
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
diff --git a/sources b/sources
index 1e4ec9a..2d096ce 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-SHA512 (puma-4.3.3-examples.txz) = b3a3ff564c41a2d9d8793aa1657a6fce77b932a9cf168ea41c3dcf00f72221be36697a8087e0173d425bbbaf1197081d28ddc9ba4a835e13a3bf379c90de1bf7
-SHA512 (puma-4.3.3-tests.txz) = 705ca3e26fc0475558cc6ee0e8004c534f2d2b79f7902aad05c71b6101f206fcf683e0d5d957d84aa3a12f452cd252849cfd2b2a4c59b28a8f8c1f79cc05c0fe
-SHA512 (puma-4.3.3.gem) = 12d6cfd483f6c10f61ab1480e15ad32bbb878f451a9cf1b5e07f54b41608ff265f5963c018c6b73b247dd58fda4c2f47bba1975e8e61df37cb788280fbb4ed0e
+SHA512 (puma-4.3.6-examples.txz) = 1d030f95b84dfaa7b43d8ca26a9eade69ada4b5ba9b06127345a4f2ebaa0b1ffe6f535e5c7d3b4c8bb81fc733d5e269739cde0a8765131e534a0ed7bbb71c7f6
+SHA512 (puma-4.3.6-tests.txz) = cf9a45eb6ebdc02a17032ae6218f21a00dcd822d39d042004b1e50cb30e00b853bf0c0e7b5c2c1b78170bf85f4b072ff2e803741d8d161423c24ebd36dcea8b8
+SHA512 (puma-4.3.6.gem) = 08fbcec8efcd77b4f953550f912ab218d5d31d203f60460422563930419719f3e5cac9fd1f875628008e699139eccb16eac75a4af1c75966c7ba42fadf9df3a6
3 years, 8 months
Architecture specific change in rpms/rubygem-puma.git
by githook-noreply@fedoraproject.org
The package rpms/rubygem-puma.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rubygem-puma.git/commit/?id=61aae....
Change:
-%ifarch ppc64le
Thanks.
Full change:
============
commit 633e44f12e33a1d8ba33f9be88fd6d0325636a64
Author: Vít Ondruch <vondruch(a)redhat.com>
Date: Wed Sep 9 15:57:52 2020 +0200
Fix the man pages generation and move them into the main package.
diff --git a/rubygem-puma.spec b/rubygem-puma.spec
index 2c58b6b..26afc54 100644
--- a/rubygem-puma.spec
+++ b/rubygem-puma.spec
@@ -124,9 +124,9 @@ find %{buildroot}%{gem_instdir}/bin -type f | \
%if %{with help2man}
# Turn `puma --help` into man page.
-export GEM_PATH="%{gem_dir}:%{buildroot}/usr/share/gems/gems"
+export RUBYOPT="-I%{buildroot}%{gem_extdir_mri}:%{buildroot}%{gem_libdir}"
mkdir -p %{buildroot}%{_mandir}/man1
-help2man --no-discard-stderr -N -s1 -o %{buildroot}%{_mandir}/man1/%{name}.1 \
+help2man --no-discard-stderr -N -s1 -o %{buildroot}%{_mandir}/man1/%{gem_name}.1 \
%{buildroot}/usr/share/gems/gems/%{gem_name}-%{version}/bin/%{gem_name}
%endif
@@ -180,6 +180,13 @@ RUBYOPT="-Ilib:$(dirs +1 -l)%{gem_extdir_mri}" CI=1 ruby \
# Integration test
# Make binary exension available in Ruby load path.
RUBYOPT="-I$(dirs +1 -l)%{gem_extdir_mri}" ruby test/shell/run.rb
+
+%if %{with help2man}
+# Check `--help` output, using which man page is created
+export RUBYOPT="-I%{buildroot}%{gem_extdir_mri}:%{buildroot}%{gem_libdir}"
+%{buildroot}/usr/share/gems/gems/%{gem_name}-%{version}/bin/%{gem_name} --help 2> /dev/null \
+ | grep -q '^puma <options> <rackup file>'
+%endif
popd
%files
@@ -192,6 +199,9 @@ popd
%{gem_libdir}
%exclude %{gem_cache}
%{gem_spec}
+%if %{with help2man}
+%{_mandir}/man1/%{gem_name}.1*
+%endif
%files doc
%doc %{gem_docdir}
@@ -199,9 +209,6 @@ popd
%doc %{gem_instdir}/README.md
%doc %{gem_instdir}/docs
%{gem_instdir}/tools
-%if %{with help2man}
-%{_mandir}/man1/%{name}.1*
-%endif
%changelog
* Mon Sep 07 2020 Vít Ondruch <vondruch(a)redhat.com> - 4.3.6-1
@@ -210,6 +217,7 @@ popd
Resolves: rhbz#1863729
Resolves: rbhz#1842535
Resolves: rbhz#1842540
+- Fix the man pages generation and move them into the main package.
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 4.3.3-3
- Second attempt - Rebuilt for
commit 61aaeb89e73a6ccfa676e5fbce6988c2214078ac
Author: Vít Ondruch <vondruch(a)redhat.com>
Date: Wed Sep 9 15:44:42 2020 +0200
Update to Puma 4.3.6.
Resolves: rhbz#1837148
Resolves: rhbz#1863729
Resolves: rbhz#1842535
Resolves: rbhz#1842540
diff --git a/rubygem-puma-5.0.0-Report-pumactl-exit.patch b/rubygem-puma-5.0.0-Report-pumactl-exit.patch
new file mode 100644
index 0000000..f18f2b6
--- /dev/null
+++ b/rubygem-puma-5.0.0-Report-pumactl-exit.patch
@@ -0,0 +1,32 @@
+From aebca2b3d7f7a8cd51b0a7047851c9a2e0af7013 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch(a)redhat.com>
+Date: Fri, 7 Aug 2020 12:52:31 +0200
+Subject: [PATCH] Do not quite when `pumactl` unexpectedly exits.
+
+When `pumactl` encounters issue, it exits [[1]]. That way also the whole
+test suite unexpectedly exits. Rescuing `SystemExit` exception keeps the
+test suite finish.
+
+Fixes #2329
+
+[1]: https://github.com/puma/puma/blob/0f718d516b92cd8bc4120c543b06792b22ac20b...
+---
+ test/test_pumactl.rb | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/test/test_pumactl.rb b/test/test_pumactl.rb
+index 96bafa28e..e5c5ec7e6 100644
+--- a/test/test_pumactl.rb
++++ b/test/test_pumactl.rb
+@@ -178,7 +178,10 @@ def test_control_ssl
+ def assert_command_cli_output(options, expected_out)
+ cmd = Puma::ControlCLI.new(options)
+ out, _ = capture_subprocess_io do
+- cmd.run
++ begin
++ cmd.run
++ rescue SystemExit => e
++ end
+ end
+ assert_match expected_out, out
+ end
diff --git a/rubygem-puma-5.0.0-Update-test-certs-and-code.patch b/rubygem-puma-5.0.0-Update-test-certs-and-code.patch
new file mode 100644
index 0000000..36671a4
--- /dev/null
+++ b/rubygem-puma-5.0.0-Update-test-certs-and-code.patch
@@ -0,0 +1,1583 @@
+From aac47086f1a6e38baf69159a2bc7e64b0495f080 Mon Sep 17 00:00:00 2001
+From: MSP-Greg <Greg.mpls(a)gmail.com>
+Date: Fri, 7 Aug 2020 16:31:36 -0500
+Subject: [PATCH 2/3] Update test certs to work with more secure OpenSSL
+ (Ubuntu 20.04)
+
+Added code for generating/updating
+---
+ examples/puma/cert_puma.pem | 34 ++---
+ examples/puma/client-certs/ca.crt | 34 ++---
+ examples/puma/client-certs/ca.key | 50 +++----
+ examples/puma/client-certs/client.crt | 34 ++---
+ examples/puma/client-certs/client.key | 50 +++----
+ examples/puma/client-certs/client_expired.crt | 34 ++---
+ examples/puma/client-certs/client_expired.key | 50 +++----
+ examples/puma/client-certs/client_unknown.crt | 34 ++---
+ examples/puma/client-certs/client_unknown.key | 50 +++----
+ examples/puma/client-certs/generate.rb | 78 ----------
+ .../puma/client-certs/generate_client_test.rb | 133 ++++++++++++++++++
+ examples/puma/client-certs/keystore.jks | Bin 3743 -> 3740 bytes
+ .../client-certs/run_server_with_certs.rb | 26 ++++
+ examples/puma/client-certs/server.crt | 34 ++---
+ examples/puma/client-certs/server.key | 50 +++----
+ examples/puma/client-certs/server.p12 | Bin 3274 -> 3266 bytes
+ examples/puma/client-certs/unknown_ca.crt | 34 ++---
+ examples/puma/client-certs/unknown_ca.key | 50 +++----
+ examples/puma/generate_server_test.rb | 56 ++++++++
+ examples/puma/keystore.jks | Bin 2211 -> 2253 bytes
+ examples/puma/puma_keypair.pem | 38 +++--
+ examples/puma/server.p12 | Bin 0 -> 2550 bytes
+ test/helpers/ssl.rb | 2 +-
+ 23 files changed, 511 insertions(+), 360 deletions(-)
+ delete mode 100644 examples/puma/client-certs/generate.rb
+ create mode 100644 examples/puma/client-certs/generate_client_test.rb
+ create mode 100644 examples/puma/client-certs/run_server_with_certs.rb
+ create mode 100644 examples/puma/generate_server_test.rb
+ create mode 100644 examples/puma/server.p12
+
+diff --git a/examples/puma/cert_puma.pem b/examples/puma/cert_puma.pem
+index 7e68d622a..a0730990d 100644
+--- a/examples/puma/cert_puma.pem
++++ b/examples/puma/cert_puma.pem
+@@ -1,19 +1,21 @@
+ -----BEGIN CERTIFICATE-----
+-MIIC/jCCAeagAwIBAgIBAjANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJVUzEO
+-MAwGA1UECgwFbG9jYWwxDTALBgNVBAsMBGFlcm8xCzAJBgNVBAMMAkNBMB4XDTEy
+-MDExNDAwMjcyN1oXDTEzMDExMzAwMjcyN1owSDELMAkGA1UEBhMCVVMxDjAMBgNV
++MIIDgjCCAmqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEO
++MAwGA1UECgwFbG9jYWwxDTALBgNVBAsMBGFlcm8xCzAJBgNVBAMMAkNBMB4XDTIw
++MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowSDELMAkGA1UEBhMCVVMxDjAMBgNV
+ BAoMBWxvY2FsMQ0wCwYDVQQLDARhZXJvMQswCQYDVQQLDAJDQTENMAsGA1UEAwwE
+-cHVtYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArxfNMp+g/pKhsDEkB3KR
+-1MAkbfnN/UKMvfXwlnXpz7YX1LHHnMutiI/PqymAp6BPcu+umuW2qMHQyqqtyATm
+-Z9jr3t837nhmxwG1noRaKRtsckn9FD43ZlpPg0Q5QnhS4oOsXwJzilqPjdDFYrKN
+-3TSvIGM2+hVqpVoGYAHDKbMCAwEAAaOBhTCBgjAMBgNVHRMBAf8EAjAAMDEGCWCG
+-SAGG+EIBDQQkFiJSdWJ5L09wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0G
+-A1UdDgQWBBTyDyJlmYBDwfWdRj6lWGvoY43k9DALBgNVHQ8EBAMCBaAwEwYDVR0l
+-BAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQADggEBAIbBVfoVCG8RyVesPW+q
+-5i0wAMbHZ1fwv1RKp17c68DYDs0YYPi0bA0ss8AgpU6thWmskxPiFaE6D5x8iv9f
+-zkcHxgr1Mrbx6RLx9tLUVehSmRv3aiVO4k9Mp6vf+rJK1AYeaGBmvoqTBLwy7Jrt
+-ytKMdqMJj5jKWkWgEGgTnjzbcOClmCQab9isigIzTxMyC/LjeKZe8pPeVX6OM8bY
+-y8XGZp9B7uwdPzqt/g25IzTC0KsQwq8cB0raAtZzIyTNv42zcUjmQNVazAozCTcq
+-MsEtK2z7TYBC3udTsdyS2qVqCpsk7IMOBGrw8vk4SNhO+coiDObW2K/HNvhl0tZC
+-oQI=
++cHVtYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9pa0gvlNdwge/u
++aZNE5hTyBLH3eQzdduGcYjoSy6AVgab8M8s5O7RPMEDORV6xRuGfNgRI40Kkx4E8
++w5icHSp9WumsEi5FrKIcIXttquLdcBkUEq9N/mPVZAlg5Jr5IePzWafM0gTdKlR1
++LN/UHcVaMHWt4/Kz2ja9wlUhaKly7+UG1JdHhQ1yrAVVUTLN9YT8VTkyaB11+K0m
++KpdvHcyFuB4yBcvCd4iGSIqf7wjlEIRp8Pa9C6tR8gAlCi4APlzmngYod3wbXAhE
++psjvSXCWCdeHKD/wAgBz1abA4yNnSIhb4KFFkGMn+F74ZjeCZN287lz/18gQLn06
++3EXVKIECAwEAAaOBhTCBgjAMBgNVHRMBAf8EAjAAMDEGCWCGSAGG+EIBDQQkFiJS
++dWJ5L09wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTyDyJl
++mYBDwfWdRj6lWGvoY43k9DALBgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
++AwEwDQYJKoZIhvcNAQELBQADggEBAH2YCJJY9RFO8a7wW+9LonTVL1QLvpS0bgqC
++1CvW3ANCXriCXHUHc/aLmneRfXhrezCcAgqyqG2+HxJ3fLllec7lbiznnV7DaAmn
++Jhgmlho9fw2FxPA4iZ5DQvCALS0Ho4Vo+kPVExbhH4XKZkVTJosms5TWmDaeyfN0
++PyWDeyKsjqi9oXqqAZKBo9DFWxkJUThzpxXdWo2S9cKt7EWJJlgdlmQGyoo39Xdu
++86MxNGfaS+7ChzcXQVu1B/t0fpFKfkVCEKvNEQ50v/D01Ed0hgQPOaqgFvFMp0eU
++B0b1xpKQ2OshyOK1048ou3Gv+fAw+xtcC840T0DDMte73sysXtg=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/ca.crt b/examples/puma/client-certs/ca.crt
+index 7ca63b0ba..a69ea6fb6 100644
+--- a/examples/puma/client-certs/ca.crt
++++ b/examples/puma/client-certs/ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDEDCCAfigAwIBAgIBATANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwIBcNMTQw
+-MjAyMjAwODI3WhgPMjExNTAxMDkyMDA4MjdaMDgxEzARBgoJkiaJk/IsZAEZFgNu
+-ZXQxFDASBgoJkiaJk/IsZAEZFgRwdW1hMQswCQYDVQQDDAJjYTCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAN0u8/heGbkoFDDsx6uidE6DKPvjIPnZPFzR
+-CMkzrNgIeq/hfAItIJAO0m8YZivkUWeE3ut4ibSL+OVTvLRWDL/L736LILUxrD2f
+-joKHHLSVIUWl3H0VjYDE2RCiVkvxP4sAo7EYecZesTtb7W7DdAjHztFZIl+wT+ri
+-MlxDRmYxwsOPQtL0/wJZF80uTpC29V47NY9ITd/A+1xMblPAuQKO3vqZ4Yq07mO/
+-KKSbepo07v7jMhNOSHf8VBFlTzzG5AHmxZUW0qjCkJBV8N1MiT9cIk81ZuSqOZu3
+-A+aDAlOYPJe2WVpGskCme9HkJaHTeP87tQUsLqRsLgq/AXh5R58CAwEAAaMjMCEw
+-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQAD
+-ggEBAKiGZ57rSAlL9slQ0FklVjpe+YrfZvmaXTRPl+9YhikoVI91u1r/qA9PrXKn
+-cL6u66SU6kJwI5572uT1TpKO7jQLXJZV0LO17WuF3P7y44QnNb53Em2GYi8DD/gq
+-X0Y1u8QzIxo4uomWiE73fnao2I9eErKNi/xCySaX/SLQ/9tcEgUyeLlTtJZ3feVF
+-7K0llR+hSb0Wy/uWnP7qP59YsyCJl1H23j7IEVCTMsOQ4tyIK16+qRA+aVLtE9f5
+-orsrOWWGJOdAn1nCJweKqhG1vd3GKGRW3Rf/iugCbvgJy0NFLfTpeJ4fJosC3A/K
+-6K+pe9hNsi2kBPwC67QeVjnbqd4=
++MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
++DQEBAQUAA4IBDwAwggEKAoIBAQDIHxrFcS2JkRQbXLFosb32unVkVuwHSPSt6Dpl
++2jUQHP/bceAx/d9waHYf8rlbCFAIoduZDOc7XCJUidgcG5NfLJyQpkkWOU8CGWH+
++Ipl4AE8auYCcy/0T7BQqaRC41HPmrJG1CC40rqcY47lUO2haI+vj5TZFHNhAbRat
++rR1iD1veis2gBZtrMzd4IlpvEHGv6ghfnSc20za4exmapjp/uAAIOXpeFX8QHumA
++bty4dd+iHpKjDzUrhG9Qa5v28ii2K1AcbczUQ7FzSp2/GoRSjF+WY6i86N9Z1M97
++2PEgy0IG5l6JHu1P0/rd00hN0h0Owzv3V5ldMLZap7+pVFQTAgMBAAGjIzAhMA8G
++A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
++AQA3GWpy4bYLOHLENDTUBeclF6cDdYiautD6gxd1SDLMWOhAUF7ywwT87OAJdr1I
+++W1TUv5BRG21rNm1QsZfLbStdKA1mpiET/9nYN7m1YauL5hI3yD49TGuO9/sxcE5
++zNW7D3VBVNq+pyT21/TvLAgxCNvjjm7byzyIOcoRUyZx8WhCf8nUT6cEShXqEg4Q
++iUBSLI38tiQoZneuVzDRlXBY0PqoB19l2Kg9yThHjPTVhw5EAQSDKXCCvaxAbVw6
++ZPLNnOdK6DvqEZ3GC5WlaHQdmLxmN4OfV6AEtpgqgGY9u8K1ylTr3ET7xLK7bhcA
++oZsggEVZr1Ifx9BWIazRNwlw
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/ca.key b/examples/puma/client-certs/ca.key
+index e229c7b91..59bc391a2 100644
+--- a/examples/puma/client-certs/ca.key
++++ b/examples/puma/client-certs/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client.crt b/examples/puma/client-certs/client.crt
+index bfb7f668f..9703ebdbd 100644
+--- a/examples/puma/client-certs/client.crt
++++ b/examples/puma/client-certs/client.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDAzCCAeugAwIBAgIBAzANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwIBcNMTQw
+-MjAyMjAwODI3WhgPMjExNTAxMDkyMDA4MjdaMDwxEzARBgoJkiaJk/IsZAEZFgNu
+-ZXQxFDASBgoJkiaJk/IsZAEZFgRwdW1hMQ8wDQYDVQQDDAZjbGllbnQwggEiMA0G
+-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGnFKNrNj9pvHIK+iUf1UoDJ0O7hpj
+-jn7QWd65xnHWN9YF9RfBVRxg7HLcPls6GL4c+e5KQP1W0o4gSzwbUc3a/LyqkTEA
+-dligEjXTkQY6tCn/51CuClynreQ98wdgQrayzobKhWMALG7IRLraprZmiQJpxWOF
+-evd7WkF32AwSklZMEdWcLdI36swTV0UzuR9IDUnIh5GGPbikF/6hQ1E1+rL/sZkh
+-czYNEniJGk2pD3MqJguTvYTF24k1KEOV5koSuAPnyl4E/dX9g3AIHWo8OhqVs/4P
+-hrX6++qmrsVz9LIvPw3+SMAE3QU49J7uAANRQMBlxWhlbIpeFi8zNig7AgMBAAGj
+-EjAQMA4GA1UdDwEB/wQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAtxbX3CfQgMwa
+-CWYTjupyTC+KDajbkLLsNXw49PeTIj0FOjAdKA1zyEZcrxtaU+flJr8QHdI8HyZH
+-hpofnOTSBg5k9y4Qz8gjI1Nsh0H8WU/d7F//2l2fUDOhVAb6JtTAKnMpU4snb0GD
+-bxcO6QxfNh50Qdb7KoJH7baJ3aAnsRrLVGqQ7jH20iMu163j/pYw4dDskFMr65Le
+-bMB3NeQ5pHwtYf2J5EliKCtH+Df/BTIl9u1vviZs84gA0Odai/YaMZWCqFiWqIax
+-lkMHNSDWh2G++qMn9erLjRtYDAbIt3VhMncUpEBx3lBEIaVg7qyfpWQ4EkkkylH6
+-WRv06vukVg==
++MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
++IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
++ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
++E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
++FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
++u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAApaKvnGiRqs
++Vz4B06f/mDLmN7gb0e/evEypB2S06fp9f/oWWHXHCxpx9bKbiHFNNiinoc97/Spb
++GzylHV/n9j8GEtZmJMiSJZubN8vpn1Jg0Usz3ZtAy0fe9ephjBIXPpwrsGF6Oz3u
++U/b2zTpJX3oJ3Eq6Q9hLplYU3bNHfrw6PAbzbB91zVTFsqZUTctKrMRgp68FA4fw
++VWQkb4QwLK1UVJIT/nR3v7nJDktgpR4mfdrtWbWxOGm/ed2oOilpqVhVN99P+bUn
++3cFkQ6PSYK8En9jJhBMe/zQqpSyy09Tfi/Zy6nzZv0ah53bpeCFLZFi+0CU8HwPr
++MuD1XQN72zg=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client.key b/examples/puma/client-certs/client.key
+index a49704121..15820eed7 100644
+--- a/examples/puma/client-certs/client.key
++++ b/examples/puma/client-certs/client.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client_expired.crt b/examples/puma/client-certs/client_expired.crt
+index d0accc885..cd20e0489 100644
+--- a/examples/puma/client-certs/client_expired.crt
++++ b/examples/puma/client-certs/client_expired.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDCTCCAfGgAwIBAgIBBDANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwHhcNMTQw
+-MjAyMjAwODI3WhcNMTQwODA0MDgwODI3WjBEMRMwEQYKCZImiZPyLGQBGRYDbmV0
+-MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEXMBUGA1UEAwwOY2xpZW50LWV4cGlyZWQw
+-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZQSVfI4KNwus/+9gE9Rww
+-+cehxzw80fNi4tmruSApitTIk1u1r1rYVexkBkVTtl6Fg/aNAAdsI4aATanyGj0m
+-yRqEMxYMt8RtzAYHY6ZEJBm4WUAa44W7WNG2ZA/e0bCDq4Sn+hlPJw0e4iQimJqi
+-8+iitgyTdicTKDR+9kTS3W/33PZqSwqqnN55m9n9A5FIKwd8fbPsO8k6xIhFS2sL
+-KZ2TkAYLNXu2vFGJR7b37U8mYcHObB1p7U7WYJ2JCf21WZOC4iI25Xk7MFSUYPqb
+-W/iV+41EcslbHwAZHEjqeNynKNlnZokVrviOFeFrHqXbVKp43027L3RZr/JXfxMl
+-AgMBAAGjEjAQMA4GA1UdDwEB/wQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAdCLR
+-jmHeQDrtl9w0cr8Vls+clhoWSDIEj2NC7PRUbDS5T0kAnF/N64n9RJFPS+4bpZaT
+-c9v3DXzdaTTp7moUrwVc3EKVLV5EJcm+TcuUhbL2ZnRgFHggVaoePShBHkDJGLz9
+-lR30KJnKsyFKEDEyD4rYtYvg98858EtkuxKLsD8efQ/9V8WDLAJJWTsJweEbEpIq
+-GqblQnBeNrLZ7yS32NAM9jnB9wPsMXPZnAAV/o/U6TTwIO9ChApWX+qer1/mIoc7
+-90/XhxEVw6EcXfGPnsLJ85n9FNGbWnLFRxvFAYcD0z6KQYxVHDiUAMSKqAkpENYO
+-k3gVOw5YNxNpPmUrjw==
++MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMTkw
++ODAxMDAwMDAwWhcNMjAwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
++IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
++ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
++E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
++FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
++u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHDfDovSTCmM
++sxDCfTGQUYwnvOohTP0hjUHB6BzNAPVKYoBiq064m/JoDFmOGGtF3CqhWqtE2psl
++eOK8fA/QomyFaIAowhx8qrswMP7T/rRldAG+9QHBYZGkPtbB8evK6XqrMEQTf2Ux
++FlN3p7BZl9rhtuManMb+Wud3HfLYjXn2nTRvkOTi93MP05Vrho8KegZ9Kj4wY1rK
++gOnkbI6bv+1r9yjsZuUKPH/OjFkpmAoOab5hX5R5CmEefGAet2KPCNrApuwfvRHT
++x9jVwtOYBHq3DVcBDBu+O38L+WlKGeXvUK4AzvxQaVUysCG3DA1zrvyI3Y8Jy2Jk
++KfmWZWlvXlM=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client_expired.key b/examples/puma/client-certs/client_expired.key
+index eadc5e8a8..15820eed7 100644
+--- a/examples/puma/client-certs/client_expired.key
++++ b/examples/puma/client-certs/client_expired.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEowIBAAKCAQEA2UElXyOCjcLrP/vYBPUcMPnHocc8PNHzYuLZq7kgKYrUyJNb
+-ta9a2FXsZAZFU7ZehYP2jQAHbCOGgE2p8ho9JskahDMWDLfEbcwGB2OmRCQZuFlA
+-GuOFu1jRtmQP3tGwg6uEp/oZTycNHuIkIpiaovPoorYMk3YnEyg0fvZE0t1v99z2
+-aksKqpzeeZvZ/QORSCsHfH2z7DvJOsSIRUtrCymdk5AGCzV7trxRiUe29+1PJmHB
+-zmwdae1O1mCdiQn9tVmTguIiNuV5OzBUlGD6m1v4lfuNRHLJWx8AGRxI6njcpyjZ
+-Z2aJFa74jhXhax6l21SqeN9Nuy90Wa/yV38TJQIDAQABAoIBAQDOhvSc7aflVZ/H
+-koT3qX8kO78AVuM3uiqSHa7pZTJi63x+ND9hhxJoR75SE/gBrYNLj3ho79cegOMS
+-w0HEShdJ8LFJbTsP2f5cljBBBAUCEAN3UTj0lsgBolyx84t2uYYAlaOk/8bhjPEX
+-I8lQLhwKvq2vSDrKT+6zcmv9KeWhQWoQavq+QAkTVO9gAqmlkdMEjZntT8hau/qC
+-jkgW7MG/U/CkbALcrbhAWBtMSvUDSKHrrva7XPaMq5nDvX0Wj6PZhY9KaaweR8ZR
+-xfrgzbFfRSKdbT5dD7IcwQhjV51hev6+q8pIFgTiFimeNq4TvKgH5MMwixBnVM+3
+-djBTB4+dAoGBAO5BYdbpEuVDlwMfHo//R/BJEGJn9dwc3ZpBmJ6vQGmLGjf/oXBr
+-9tDf/yZKDLwVAgnRdVkllMxpEWrFjD3OpnukbvzTijBi0AQAljRSwNlMTsLwAifi
+-EBXvENFG/7iJKssCQBD6rkeNir3VRlMa5khI9jHahZ0B53RtQCYYDzZ/AoGBAOlv
+-W005wD3g9K2P5BIo+qXB43ZFFsAFOnhu7jUyTciu/95iJ+zw/AGHI/JhNy+jSHnw
+-ZCARLy1c2CImAshadYuWDqR5okR+xHHj3Lgf9ig7lbSf+skn3R4y6fTlxxNdbbU7
+-dbZbiMm5CyUHTR6957BQaS7mfQZJG0OP5G9fl0xbAoGAOSNa+HRbALqN68S5yqTZ
+-Nsn+8OqnrssJZiYXGO9Ejks61XUr3U83GO6vPRqDJVQQchRWhTObFM6Zy7ZmpKf7
+-iylrKJz+xg3cfyk43IGAGFzRgrSWf8QaQXhc2yOgzjuvFJKMlMXZp/VM8avFOsb3
+-tRwyVtBmPLopLOXKfZhFhbcCgYA/etbbU18h9LDVGhItlhNDTEys9vDO2x0hbxk8
+-QifA8UYHla3B027Ug4mU+jblr4OgFW1FAydPMLZd4vRSw7a/dNkahTFJayfEyPBW
+-6eoo2rtFWVP7q+mHstTIkkvmyjtxU3AZXR7/rGCJe0jPmVkOK2/PH0LUmMDfSJwY
+-ZWhhjQKBgDCB823bmF6+7J0mtNFFKvRMz6k0wKz7Qe6+AkwmyR3v9IBpL4UMFgIq
+-xdRR7iGhlRHaWVZyzG3WQ1ZgLmVUsfmk9OrD5PfhKaElKvaRr8e+MHOesQ6AgWW2
+-YXr6vgr6tykVtjG4/v98r05+9q10HH0xOhbuBz+1P7IyLfTCWxbE
++MIIEowIBAAKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkSIBz8ZgyyhSW1lU/tcsNE
++JakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+ycofy+2OOu4un+44qIGX82
++i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MHE4yX547E6XmmJ9lp8z9F
++nBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+VvFbUIndC+UiD0kYPxTwSD
++CpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslSu7CFInqbswq5LnGFRIVS
++g3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQABAoIBAGsjyE2Y8ZWxKw10
++dxyf5qNOAoc5igU8Ax6ex7lVgV2BFdB9FooD63hCpRy/4TYpKKksam4eg7h3Wkx9
++dCagcTvD4vtRiadzZXzUQ0kLjCmsFKFpPk9YOcq2y3k2oDNAgykeCCZOYKCrfJ/M
++TZGtDF47rL8d1M+pSTTqMbF8BvWyZ3hTKkB4dNbF4uNQ5EPD8fgkmPOMR9Ul5R3X
++XvrzDWYJb0+qElbtP4Y570KQTmbBpTj2soFb2fLuPv4NpBTNx3xIja4fs7wYP46M
++k1dI+wQnrC512rpacowOtWKlqx3yBrtKNjg39faPHQQpfPqkJNYZZPVA9rc255SG
++l4B7y4ECgYEA1v+8z4r+lkrX/t0L2WmuHHjE6no+1c3C4RdHkkUYvgUWdE7fjRGH
++fpcfZu/aTcnTj+LAkZpEty8gDZKqb8tpliMbpnkzx7Li4AYQof5QYcWQb9rJYihT
++70fJgLN2QQCAD7VC00AuUam7D8r4o4uImmrOxa5jqZFHztphKXMU4p8CgYEAwkoc
++vZ/LRcbiKm72/CJ8RI9YgkQanFye/6cYwsVyrydmaevxdCq68hcafPSHwJSraEK9
++zo2T6qaZZr1zdwdSFutsBfOw6g7MMPfxtUPtmHJnwoFsEBSjwSwddwi/RLXiZGUK
++I31z1sRO4XoLzhvESZZP9aCURT3MSwqFTWsasJkCgYEApyKpoeHYpfdK0FsAciRA
++cOvFkM41eLn7LEaPofrLEDUeTo5eJOkinttWUwxUdbJXH/zTXJ1Dm/Arh8Gjc0L7
++MvbZ8OE5yp2a1zJ/zZ7I2CjgbsPzV7YoAdSZpc5dOIzuAMgVSeoT1/INdGqCPYkk
++SX6MfYpi+Zfx7bFAZRuMedsCgYA2Qrp6HumHSD8buLfTvNHV1+7RGrIP3zIslf8t
++TjV0Q12v0UwytEhXmio0oZpUJ3Ejghg+Wn3n97U540kfAfVkH0Wg9+j9xTozpttj
++U2BExhbCVKDYcNs29NoZx2CbkOx0O1+0f7HdVh/tisdHPav5HTihkcI3AEZQ4tRN
++xc7DaQKBgFtj7G/nbhU1Rr1d7HJk8to88zHvUPPWI8AaqyQKDKD2nOSAysA0v9h6
++z7FG0SidXeCZF8NnlxRcR6+Zf/oDgx/akKGXGGGifgAIjkq53CQewNyg8iQda0cF
++3wU8z+qAajPnhXEZ7T/OO1pRUUQRvM1obOLVORTzP+ZTD9/RZu4F
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client_unknown.crt b/examples/puma/client-certs/client_unknown.crt
+index 359e33d6c..8cdfc87bb 100644
+--- a/examples/puma/client-certs/client_unknown.crt
++++ b/examples/puma/client-certs/client_unknown.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDEzCCAfugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBAMRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTETMBEGA1UEAwwKY2EtdW5rbm93
+-bjAgFw0xNDAyMDIyMDA4MjdaGA8yMTE1MDEwOTIwMDgyN1owRDETMBEGCgmSJomT
+-8ixkARkWA25ldDEUMBIGCgmSJomT8ixkARkWBHB1bWExFzAVBgNVBAMMDmNsaWVu
+-dC11bmtub3duMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Ewf7nWJ
+-WcHI3NB+gjz5jWnpNwnU47hjIWq+S41iIymN7FsNdssfzeGb3ZElcQAfofvNf75F
+-6mE7YEpbKRU7t/Nptvx+Rd1YGOS2N/PWdj3IcJgvQ2guiU0aYkdB7lC1vlI0QzHT
+-dte9pGK/ZPp/mvRZGwi9WmwlNhBwOzvdyRuLyi63dmZ8vgyZrfbmGhZYdhCZ77Uv
+-i+VYqYv5X30I2gQkV6YQMj/AF5Fmt9a4TNGfIjXb6FKmNhlsDMduovrfQMh2umMK
+-YYQ4A+Vi2yMAZkKeD5cogGLS8wmg76n7miPaKLVU9xTEf55IO+HjIBIqz6VG8qbg
+-iBV4Lr6BkkaKTQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQEF
+-BQADggEBAGGaA7fZLOqxx1wIIay0Ewni3ljzR+RAlpTHAh4x+NilcaQ2ils+JoGH
+-/DCdX2iD5nevGVm1DANBhfAuFxXGGBjoOLqtg/sO7Rk51IV9WjDVB2rGeH3hoTCk
+-Qi6Bazdlcvvs3SyFEKcJm2zXizR7O9I+tDv++F6bbaHSBWB6tB9g93pZuMR+smvR
+-Ll2+/jRGPe1Pif1UFs5DR8QshpvxrIwCmO1vznLhDeA5Pde6CtahGJvi1Y25L1h0
+-9l0LjMxxqgVh8h4A5AR8VufCcDiaT8lzCkz4G4jQYFhrJXmBn8Em6NZfdP/LmM9I
+-0zEB2Y3lp32ng+WMyaqNh6nfpxEfBoY=
++MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTIw
++MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++dDEUMBIGCgmSJomT8ixkARkWBHB1bWExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIw
++DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQo9ve3XI5fiKE5AKI3Qm7aeGwy
++uIR5RBo58Na4saBSfCaKZvNwzuEimKN6S4ShUlV0egKwCs/KvzbhQJpIxVsLQCGs
++AQDxdOGP1FyizQvzDhzL7BC2I/Dp3A5V6uXkxo1qTqoBdTYeJ/mdIVgZ7bgTnUdu
++uY9KErU/ugR8MbqZyQel/04PSmkCTdhzP41w0xvmc7Jgab0vJ0oXU4knXIyKsLeq
++BkL6fevPW4fdaU+ppXBvpsgWfACk/WZs+DyhPndcX7JNrcnYIIAJy75wivqw2RDB
++m59XNhoDwbR21EkcZnlQL59pv4ASA7DrJs+tFoGqsCs7DyEioePNp6ZraSkCAwEA
++AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBMbPmIekCi
++TMLtclXtkhKUefb9hoALhABwRbTbzPjz+MGJX2BMwLt8bAs6AMY8jEazvfm9+G0m
++1liBAGWFojSzAykNIq/zAG2tgDVolQp3x4JcyFDJ0cuR8DIdll2CCnLM2jP8Nek8
++wSyuWDsm1U5kmos/dP/ialCvvCLHULoSCBhsyBFKmH2ViXdW09Wg4jSQ4RIToBBn
++w/VbObeKA8NBUW6/7w6MS1oeFL3PlZJ205zVrZ68nqm/ckYyaBAdlQNTmlThNSQ5
++eL7w2QgfYDM72Sk4/rjZsW0kH+V0ZqmIuyVBE6jo5EulGPLo2eQEfPmhEdbo5rFi
++foV+QKM8z3K0
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client_unknown.key b/examples/puma/client-certs/client_unknown.key
+index 82825f77a..96b41acf9 100644
+--- a/examples/puma/client-certs/client_unknown.key
++++ b/examples/puma/client-certs/client_unknown.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEpAIBAAKCAQEA0Ewf7nWJWcHI3NB+gjz5jWnpNwnU47hjIWq+S41iIymN7FsN
+-dssfzeGb3ZElcQAfofvNf75F6mE7YEpbKRU7t/Nptvx+Rd1YGOS2N/PWdj3IcJgv
+-Q2guiU0aYkdB7lC1vlI0QzHTdte9pGK/ZPp/mvRZGwi9WmwlNhBwOzvdyRuLyi63
+-dmZ8vgyZrfbmGhZYdhCZ77Uvi+VYqYv5X30I2gQkV6YQMj/AF5Fmt9a4TNGfIjXb
+-6FKmNhlsDMduovrfQMh2umMKYYQ4A+Vi2yMAZkKeD5cogGLS8wmg76n7miPaKLVU
+-9xTEf55IO+HjIBIqz6VG8qbgiBV4Lr6BkkaKTQIDAQABAoIBAC41pSPWqWjjJ7ds
+-/ZPRCR/JLjbKlJMMVdmU/7BtJidc0aJstLj06RJYiaaGy8Kc32elH/rF8GbFuVFs
+-TXr4ve3aL0qsCytepmunWZFiI+LJZA0uhdWzaBeHpmHFIyhGeXtGa1e41wvXYrf0
+-PDefpu1uZdIshy1nLn4m+W76ogI6FrcyUQ+XRN6f5x6af70Kfi414qf9NLOvajnl
+-JCx90WpdwBp1jC8totKDp9kvILCymFnGBl93NUl8F3Tz7zLkh2SIhaKxQIHTc9g0
+-LPNkd1Q5tIl/rG3lZ6vw2/UlCVB1NdLsItlJVIJhu6ChIrSXeoDg0GNlJFp7op6W
+-jlJDoRUCgYEA67Nuzrv/lkVljRFDVw97DTiCbLL7SDXDH6Jf43+Bz6prGLqd4Nfd
+-LTO7AdLGd5UTWB1Oj2U94pFXNFkucGv65ck6QAPZ4UrCk9lyjx/dN7d6CxUBDeu2
+-4zPeHy/mAgkVmKSzEy5L2ERwoQqK8A/g6HtuThB87gtKUpnG+QSfz6sCgYEA4jyE
+-kPRudqne0VXWL/Mhnrls2PNo4MDIOxUp+KcFLGY/44RIEoit3WLRDXULAgT3U20Z
+-lY7nQJyU+/CaEH6rIpADp6VRPA0XJo7HCuMGEO7bk8AAXkXTplVs+XbsD0221AKl
+-GRpS0CtcvHllHiwG8iL+zHAJzL4wbNY36L97decCgYB0UuHk9bN2Hlm3/UUWunUo
+-WTNFIjARuzbJbgGU7WDLdHfWhINWbDKkFFu+0p9QdSpO2mfjLTwVjVVUaI8avK/e
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/generate.rb b/examples/puma/client-certs/generate.rb
+deleted file mode 100644
+index 3542057e2..000000000
+--- a/examples/puma/client-certs/generate.rb
++++ /dev/null
+@@ -1,78 +0,0 @@
+-require "bundler/setup"
+-require "puma"
+-require "puma/minissl"
+-
+-case ARGV[0]
+-
+-when "s"
+-
+- app = proc {|env|
+- p env['puma.peercert']
+- [200, {}, [ env['puma.peercert'] ]]
+- }
+- events = Puma::Events.new($stdout, $stderr)
+- server = Puma::Server.new(app, events)
+-
+- context = Puma::MiniSSL::Context.new
+- context.key = "certs/server.key"
+- context.cert = "certs/server.crt"
+- context.ca = "certs/ca.crt"
+- #context.verify_mode = Puma::MiniSSL::VERIFY_NONE
+- #context.verify_mode = Puma::MiniSSL::VERIFY_PEER
+- context.verify_mode = Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
+-
+- server.add_ssl_listener("127.0.0.1", 4000, context)
+-
+- server.run
+- sleep
+- #server.stop(true)
+-
+-when "g"
+-
+- def issue_cert(dn, key, serial, not_before, not_after, extensions, issuer, issuer_key, digest)
+- cert = OpenSSL::X509::Certificate.new
+- issuer = cert unless issuer
+- issuer_key = key unless issuer_key
+- cert.version = 2
+- cert.serial = serial
+- cert.subject = dn
+- cert.issuer = issuer.subject
+- cert.public_key = key.public_key
+- cert.not_before = not_before
+- cert.not_after = not_after
+- ef = OpenSSL::X509::ExtensionFactory.new
+- ef.subject_certificate = cert
+- ef.issuer_certificate = issuer
+- extensions.each {|oid, value, critical|
+- cert.add_extension(ef.create_extension(oid, value, critical))
+- }
+- cert.sign(issuer_key, digest)
+- cert
+- end
+-
+- @ca_key = OpenSSL::PKey::RSA.generate(2048)
+- @svr_key = OpenSSL::PKey::RSA.generate(2048)
+- @cli_key = OpenSSL::PKey::RSA.generate(2048)
+- @ca = OpenSSL::X509::Name.parse("/DC=net/DC=client-cbhq/CN=CA")
+- @svr = OpenSSL::X509::Name.parse("/DC=net/DC=client-cbhq/CN=localhost")
+- @cli = OpenSSL::X509::Name.parse("/DC=net/DC=client-cbhq/CN=localhost")
+- now = Time.at(Time.now.to_i)
+- ca_exts = [
+- ["basicConstraints","CA:TRUE",true],
+- ["keyUsage","cRLSign,keyCertSign",true],
+- ]
+- ee_exts = [
+- #["keyUsage","keyEncipherment,digitalSignature",true],
+- ["keyUsage","keyEncipherment,dataEncipherment,digitalSignature",true],
+- ]
+- @ca_cert = issue_cert(@ca, @ca_key, 1, now, now+3600_000, ca_exts, nil, nil, OpenSSL::Digest::SHA1.new)
+- @svr_cert = issue_cert(@svr, @svr_key, 2, now, now+1800_000, ee_exts, @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
+- @cli_cert = issue_cert(@cli, @cli_key, 3, now, now+1800_000, ee_exts, @ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
+-
+- File.open("ca.crt","wb") {|f| f.print @ca_cert.to_pem }
+- File.open("ca.key","wb") {|f| f.print @ca_key.to_pem }
+- File.open("server.crt","wb") {|f| f.print @svr_cert.to_pem }
+- File.open("server.key","wb") {|f| f.print @svr_key.to_pem }
+- File.open("client1.crt","wb") {|f| f.print @cli_cert.to_pem }
+- File.open("client1.key","wb") {|f| f.print @cli_key.to_pem }
+-end
+diff --git a/examples/puma/client-certs/generate_client_test.rb b/examples/puma/client-certs/generate_client_test.rb
+new file mode 100644
+index 000000000..da1b56a91
+--- /dev/null
++++ b/examples/puma/client-certs/generate_client_test.rb
+@@ -0,0 +1,133 @@
++# frozen_string_literal: false
++
++=begin
++run code to generate all certs
++certs before date will be the first of the current month
++expire in four years
++
++JRuby:
++see https://github.com/puma/puma/commit/4ae0de4f4cc
++after running this Ruby code, delete keystore.jks and server.p12, then
++cd examples/puma/client-certs
++openssl pkcs12 -chain -CAfile ./ca.crt -export -password pass:jruby_puma -inkey server.key -in server.crt -name server -out server.p12
++keytool -importkeystore -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass jruby_puma -destkeystore keystore.jks -deststoretype JKS -storepass jruby_puma
++keytool -importcert -alias ca -noprompt -trustcacerts -file ca.crt -keystore keystore.jks -storepass jruby_puma
++=end
++
++require "openssl"
++
++module Generate
++
++ KEY_LEN = 2048
++ SIGN_ALGORITHM = OpenSSL::Digest::SHA256
++
++ CA_EXTS = [
++ ["basicConstraints","CA:TRUE",true],
++ ["keyUsage","cRLSign,keyCertSign",true],
++ ]
++ EE_EXTS = [
++ #["keyUsage","keyEncipherment,digitalSignature",true],
++ ["keyUsage","keyEncipherment,dataEncipherment,digitalSignature",true],
++ ]
++
++ class << self
++ def run
++ set_dates
++ output_info
++ setup_issue
++ write_files
++ end
++
++ private
++
++ def setup_issue
++ ca = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=CA"
++ ca_u = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=CAU"
++ svr = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=localhost"
++ cli = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=localhost"
++ cli_u = OpenSSL::X509::Name.parse "/DC=net/DC=puma/CN=localhost"
++
++ [:@ca_key, :@svr_key, :@cli_key, :@ca_key_u, :@cli_key_u].each do |k|
++ instance_variable_set k, OpenSSL::PKey::RSA.generate(KEY_LEN)
++ end
++
++ @ca_cert = issue_cert ca , @ca_key , 3, @before, @after, CA_EXTS, nil , nil , SIGN_ALGORITHM.new
++ @svr_cert = issue_cert svr, @svr_key, 7, @before, @after, EE_EXTS, @ca_cert, @ca_key, SIGN_ALGORITHM.new
++ @cli_cert = issue_cert cli, @cli_key, 11, @before, @after, EE_EXTS, @ca_cert, @ca_key, SIGN_ALGORITHM.new
++
++ # unknown certs
++ @ca_cert_u = issue_cert ca_u , @ca_key_u , 17, @before, @after, CA_EXTS, nil , nil , SIGN_ALGORITHM.new
++ @cli_cert_u = issue_cert cli_u, @cli_key_u, 19, @before, @after, EE_EXTS, @ca_cert_u, @ca_key_u, SIGN_ALGORITHM.new
++
++ # expired cert is identical to client cert with different dates
++ @cli_cert_exp = issue_cert cli, @cli_key, 23, @b_exp, @a_exp, EE_EXTS, @ca_cert, @ca_key, SIGN_ALGORITHM.new
++ end
++
++ def issue_cert(dn, key, serial, not_before, not_after, extensions, issuer, issuer_key, digest)
++ cert = OpenSSL::X509::Certificate.new
++ issuer = cert unless issuer
++ issuer_key = key unless issuer_key
++ cert.version = 2
++ cert.serial = serial
++ cert.subject = dn
++ cert.issuer = issuer.subject
++ cert.public_key = key.public_key
++ cert.not_before = not_before
++ cert.not_after = not_after
++ ef = OpenSSL::X509::ExtensionFactory.new
++ ef.subject_certificate = cert
++ ef.issuer_certificate = issuer
++ extensions.each {|oid, value, critical|
++ cert.add_extension(ef.create_extension(oid, value, critical))
++ }
++ cert.sign(issuer_key, digest)
++ cert
++ end
++
++ def write_files
++ Dir.chdir __dir__ do
++ File.write "ca.crt" , @ca_cert.to_pem , mode: 'wb'
++ File.write "ca.key" , @ca_key.to_pem , mode: 'wb'
++ File.write "server.crt", @svr_cert.to_pem, mode: 'wb'
++ File.write "server.key", @svr_key.to_pem , mode: 'wb'
++ File.write "client.crt", @cli_cert.to_pem, mode: 'wb'
++ File.write "client.key", @cli_key.to_pem , mode: 'wb'
++
++ File.write "unknown_ca.crt", @ca_cert_u.to_pem, mode: 'wb'
++ File.write "unknown_ca.key", @ca_key_u.to_pem , mode: 'wb'
++
++ File.write "client_unknown.crt", @cli_cert_u.to_pem, mode: 'wb'
++ File.write "client_unknown.key", @cli_key_u.to_pem , mode: 'wb'
++
++ File.write "client_expired.crt", @cli_cert_exp.to_pem, mode: 'wb'
++ File.write "client_expired.key", @cli_key.to_pem , mode: 'wb'
++ end
++ end
++
++ def set_dates
++ now = Time.now.utc
++ mo = now.month
++ yr = now.year
++ zone = '+00:00'
++
++ @before = Time.new yr , mo, 1, 0, 0, 0, zone
++ @after = Time.new yr+4, mo, 1, 0, 0, 0, zone
++
++ @b_exp = Time.new yr-1, mo, 1, 0, 0, 0, zone
++ @a_exp = Time.new yr , mo, 1, 0, 0, 0, zone
++ end
++
++ def output_info
++ puts ""
++ puts " Key length: #{KEY_LEN}"
++ puts "sign_algorithm: #{SIGN_ALGORITHM}"
++ puts ""
++ puts "Normal cert dates: #{@before} to #{@after}"
++ puts ""
++ puts "Expired cert dates: #{@b_exp} to #{@a_exp}"
++ puts ""
++ end
++ end
++end
++
++Generate.run
+diff --git a/examples/puma/client-certs/keystore.jks b/examples/puma/client-certs/keystore.jks
+index 6d734fadce1949b3b47e36b62749ca612fbaddf6..17654b4adbdde88929f2476da21ff50ef2899d0d 100644
+GIT binary patch
+literal 3740
+zcmeH}cTm&W7RS@*EfA>zqzNp|A4sU81VI9bROwY(0E2|4bPNc%hy|rfN9mzSmz5g2
+zAVrWUp{O9BNHGXf9`3%`+1;7<-n`j=_s-n8bIu=k&i#Jxne#dLbnpoT0zrP?5Eo|<
+z2pr&bHsTeC#!3zasDeOH4uAk<1qfhjE))WWK)_Idg_c1o78AS80tPeDfB+SF1i((q
+z$dDv{>%oSME0~uH>f;t5e+=OGQxfJIh;x=_0vKqamtat4$T>71$jzbv04jhy@awWU
+z3Kjnl{*9XnV39wT38n!-31BwR(K8q!1TYxXdz`NuFMI3$F{E8Jwz`$t9O!DXN{891
+zSW<JFM#1?H$@p3MeTpwO==esHExj>)9yy(PQQc0&{MHmd@`0nwqkB*ExKxcGyv_$A
+z>DNI<d`(f02KEuF$D};rjpP0w%J0|F%PA6zcov$>)v-3BD+}+Hboi$<aa<J@0+-or
+zXMP^arOEU@rF>n)<|-UtxlHevC80E?)ELT}@kA}M5k#*V;=maR7yKCI^QJM7k}sH4
+zz=o2JxoYg4N!^gFmp10d4UV6y_SesP&KF~P+cCwZ_}LQ0dVDx^YF%hRi}r)VEx}Jl
+zW4mw1FovT7texuHmg)9Dy-m^c5_59|1PTU$3q%27fbGZ*0R$L)2%`a@M+d<ABf<6~
+z0Xs6B_Kz|ixqT!f7^KYW<u_N)q~h15s5nluc!IkK8W^9^JhB_j9f(mFv|7?McG&2I
+z?XAu-1hryzaAu|lXl-0w`Rh6@lB4X?ihx{HMp}%~p@-AVhlyC?$utZ_=-XF$qB>=@
+zyIpl~qJ=FGZ9e@=kr;JyYfXk;o}RpL$A>&{I$pJ(-Ao+6j@63n8#gL~>2oe~u)=R?
+zn#v^Z)r(2GUn5!qFOz+(Ms|zo9NnghHTqO^Z*NV+v1)^1(LebTTFW(Yc51F0Lys2q
+zm(-Wpvq((IkFfy)Y0uo1qjM~CVfATJQSKTo9d-TYD{r*Fch$7`aD(zPg`#w<D@~90
+zj93Vlzf@-MJ!%**h}PfDFUZaBw}#Q>1A%Cu00H(xKSpU<FbpgOVFw@mI~W1BqD3Nk
+zz24GuV&}}=4SZZWZ{j3(Z@zXd!G&>E4{4}_-vk+~M~ZfCkvw36CF~1o!y0NHo1P8u
+zj};Kx3FmvEuEJ^{#NgNiQ#;+kMiC7yYQ1INi7*S!H4dq{!;{qP>ASCuv4V!mP=ELC
+zw;-k)C(K?UN*FvA`cQJGVe*k|)D6)(z)(IanGfY;b2#-Lfm|@2cyic$EpK?o7IuFj
+z5n=KiDQE0$LSpiddoQ8HZ^czqo&E4)yL#nZZO8yb00!qSFD}ET8zdCQ$#!AaNd*l4
+zt0I;uG9l^vRSLOyota0Dl>(EzOH#GRV$xy})-E;tF>jW~M@Z%D;=Ti3D&t~%32*dr
+zvyJXee;JsJDX1Xe!yR?bp<iKw>nXQAx!zwZGaiA<cFu+veCF}ljO@kTlhQVr?CY^Z
+zI{}aVjnlsTblwwFdQ0nzcA%;Pu);#jYa2^s4O^<tn=$C=GVl*4-4VEMtqx0OK(MBN
+zqdUhfC(Herqpm6?>mbjlWG<6XY$?rc&$2TcedD-u>52DRZ89vILyRx;nx?mxcLB!O
+zPxc*mQRXx40sfM07n1ih<?jcK#e1?(b(}WqdVI1VuRdclHYi+L9M^^yI@JtbnfJPR
+zg&HCh&aPE6ST$o)_0}Q37cx*_G`_1N!=0cStP}MqB{;rGqJFyk#R-=EDVsBv=1EJH
+zTLU(;6Er=`w=CG6DeHCx=Omd(7%adA+)PGHx}dc^2%vJvLlu4f$c!+pWjA>Mv2
+zMeVKZlLD?RtvWsttd=H#^9?>T$G3StuU#R?#+yj9;qE0*3hWg?c`Fg8ngrU%iHBB&
+zMz>+Urq*q)GwoTVIf#FCdTOS9kBvwFwV;6l83k9(r+H+F(&r}Y)tC>15l>SP@Q;y3
+zbuJ}^(zHZ`M`>|+oMWdv1?h9H_zl*OIdiP`_L&{CFwrHVP=JE1ly81CZ>0IRqPEKF
+zg<k!ZNUX5~dwt62sIZOSXw_u<C`4zE4{DNY$Z}d=VXdVuM8Qv|R<X|hLH|c+?{wRZ
+zB03c`&kiy{V3ioG!P!CX`!J-B4!fpUh>LHU(^T!-S5LJ}C?e<PNfJ_+O>c14Zs)j)
+zHXpdfHEvzLu@=-3cR&2nupw5L*2DpK;lNYD19JEg`NDy<xp&6GL3^Y?{`$iMYZVTr
+zH|2Vt)JC}L`MRQ3V%0EbWW2q#0A5N5^NnXuD#_E8_@apKePpwjoVCvr%7z>Im&FGP
+z=#W}d-H6!lIL+RZZF;I1RbIjx`7(>j?~&Wha@Nufib1k5KK{en@Z7@3D|I@S>T)FX
+zRHET{XH-kn9phm5vR_n@T<ZK9>dr3TnA`=!j^#HW4%dme6IVIT+U2-Q>B~yi7$vf0
+z!x;;*nE3io=PySP$n(zeh<0grDl2j;w=-X#9%2YOhN@+a@M=4_pg9#bdkIW4aTA??
+z5#1)NUZ|i;9U#8##5|Nv<Hg5piSf)Uohnbf6cfLHY&Jb;-S(<&NRXdSMM(<N#q=}2
+z+Faj@LtpMDJu>e$3Im{xaGDLIB?mT0#N{29w{56S?fOFASy8=FS74a>?sIz$CJ`E)
+z0hDq1krtPM4(3Vtp>DX+gK|?!*-asff-6!T-FMhRJPvE4x){P9<+-W7v?XNyvJBbD
+zKy5FC45*0z$`Ze`1N{*@z>bFQ>c826?l05iZ%p|A#SUlxA1dJh;J;A`!<DNp&R4Kk
+z{R57w{_hCU>YqCUTj5Eah@jZ%H;~Tbc|(ErlW!@$&ln)FsYtG_XmgAG%`*Lmi6P#l
+zYSc}CRA^>un&G}1{};WQYql<u1;PRmT-ma>jX$mx5@z_dgoi#m`<)ss1TeEAlN!M<
+zVn-L)gQ%)k?7ban9UXuEwi$Gm^0+=ijLJ&1WB?zeX0)!y9e$mujUSUnD_qK1v^$Ka
+zMa$u;T3aHr1lyPOL4hjFjB&q2t=P%B^Soo!o6ikT!e@1R(R|3BZNz_ho%i4rW+N7a
+zZU5@Z$rCe`EUu!I9lfYqO_99ez8rHU{bECwnB&m-ntn4(L_?FkWauROqsB6+dnp^m
+z7av5I{Du%m%Ke!bU{!zd_*Y`MOU6UL39emKdzB%A!YdEACI+&W_nYQ3q|ZIo7r~Z4
+zp_oEfkll;w@e9n;_Z!a2)+AsokSh5%B{HoNn8!2k-ffbhI!f^Jd-BdpNWk8S|4f=o
+z>gvznAk#F2)1L1MQ3)ho+A&P$Kd;yhBcJ9g&5=l-e4>LguI(IbO?}ovk9KK2*HBaO
+zQ`VaIr<_y^dQvYp`m&bksIJs$&Tjhl6{`sI<RYGjFYHPgIbV#GycQ#+3ry<PH_Rtw
+zUuOwGiyqunPHS~SwJU+vDu`yT4h-aiuve6Idz_mS9VP#9z|dUGDT|QpC?vnjD}no8
+z&%T>RzuzZziU!&n<XpX-@()h`gVX=u^nbu<@#YaA>EWD(oDe(NHm*m<XREyQU$sgd
+A9RL6T
+
+literal 3743
+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
+E4T{|^s{jB1
+
+diff --git a/examples/puma/client-certs/run_server_with_certs.rb b/examples/puma/client-certs/run_server_with_certs.rb
+new file mode 100644
+index 000000000..6df57b678
+--- /dev/null
++++ b/examples/puma/client-certs/run_server_with_certs.rb
+@@ -0,0 +1,26 @@
++require "bundler/setup"
++require "puma"
++require "puma/detect"
++require "puma/puma_http11"
++require "puma/minissl"
++
++app = proc {|env|
++ p env['puma.peercert']
++ [200, {}, [ env['puma.peercert'] ]]
++}
++events = Puma::Events.new($stdout, $stderr)
++server = Puma::Server.new(app, events)
++
++context = Puma::MiniSSL::Context.new
++context.key = "certs/server.key"
++context.cert = "certs/server.crt"
++context.ca = "certs/ca.crt"
++#context.verify_mode = Puma::MiniSSL::VERIFY_NONE
++#context.verify_mode = Puma::MiniSSL::VERIFY_PEER
++context.verify_mode = Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
++
++server.add_ssl_listener("127.0.0.1", 4000, context)
++
++server.run
++sleep
++#server.stop(true)
+diff --git a/examples/puma/client-certs/server.crt b/examples/puma/client-certs/server.crt
+index 7fb2f9b8f..5c3c334ed 100644
+--- a/examples/puma/client-certs/server.crt
++++ b/examples/puma/client-certs/server.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDBjCCAe6gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCY2EwIBcNMTQw
+-MjAyMjAwODI3WhgPMjExNTAxMDkyMDA4MjdaMD8xEzARBgoJkiaJk/IsZAEZFgNu
+-ZXQxFDASBgoJkiaJk/IsZAEZFgRwdW1hMRIwEAYDVQQDDAkxMjcuMC4wLjEwggEi
+-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDK2ioejidqPJzhGgYh9Nc/CD8g
+-n/vFqchULvmG796R01Rx0Xk5v7OgWs4GMhvJ8o4soCxTmACyPStdemDlocdzZf2d
+-yfv1alVVfBBwqSsiekiB7IiSvpyg5t3h8XqWJcKtP00tPEYmAkVuMbVSxQPrsEi5
+-47kxu7zyiV0RavaZbODgxkupSjEr0DHa1h7pkip53ekz/rnoceVcvSnCdOahUVj6
+-ZwMkOQtay/b6746ttbfQh1ygbqTbV/lcV9erldlDkqKG0gQ6gxaBcbIiom1p+ohu
+-CcoTDGZu431KOU6ZygbGxaIEZY9Zbyg9Dp+o6Zyyd7UTY/0JcCWUq7O/XaN5AgMB
+-AAGjEjAQMA4GA1UdDwEB/wQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAIfMqanJJ
+-aVD6XuS3aj0I31L4RiPSfKhkPiuO+lqBGzZhUEKwnEqVWLosFF1SK8Inbu1c1uyP
+-zRb0tB4nSO01L8Oc5kTfuN9lr3nNaWDpGksa/S5e9WndQk95XF3FLt7FJii8wWnM
+-9xGW27lurskbpuZc1M7IkD5W90y2fF19qB8fY8B2RGovPJEsDKSZ7pwSozijGR4Q
+-2iIY4Lk9/vYxEYMRixE2+exYiKTNfaPt+CgxHxXksn0LvbYYQTxUmDgvSxXdrnCc
+-4Kb1BbxOmB8XF17aJuRdUJxDxlnQK5LpoUWGfW7jFPbfX4d3nzpxjPaxvr3peRQV
+-DNtRoD9mFvocbQ==
++MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXOg3gTrGJfVft9cSrfGRnEZezDB
++L93fcLwJAoaXGxbEg1RW/fOrSpSNemuqOvbzczV7m5eYTf1lHPBJsndbYyijIR1+
++Fp4tjFDp76SC3hxCIc3uYXIz0qQwSOAi1z15zobS4xF29jlsXWtfBl9fivjzdj/f
++pbZ+JPYOrlcJAf6Xmr3xh//13rOI0ytBMlWf51z/iAZBLm2wvbt+nR7B6koAdTgM
++Coe+gOtcLWYY5ApJ4qB9knGdxWoF5p7guHHw2aGTM0jyhgBowfVkFRiE2JUmODae
++g+dHsd8ogWbqhGyZTredJF/NRrLKU0h+t7ldKHvXEZy4qyqQlvKoTpODqQIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAI/bcQP4Hu9O
++OtaaIjVxN8+9jXUOrMpSogmZ4bRKImispt9SA+sbxec7iOMM2pG3Py2yi0hWGzii
++hSebWIsM1JuPj7ks9l8nGRxpGeInJwTkJorG4ZLEypoS2wW3fQZGx3o4da5V+U2Z
++HEY0wQTbPBqqnyeZ16ZFNVCzw8y9l7y7CEFjvUO3sq0pne9r7Z+XVgjGyBdBYkJS
++0kcqPBXFCMHrWH5UlacYlM5cqgoVztOp2STGmR3XR7a34oueeA10QSP+jzeYvWA1
++wTYA762uU2ReCdujfNbf8V1tZWAH36KldM3hhDNWeveAGxxj1h2R9T/k2kHl/a7D
++I3VdS59vjJY=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/server.key b/examples/puma/client-certs/server.key
+index c1c031430..75a358ff5 100644
+--- a/examples/puma/client-certs/server.key
++++ b/examples/puma/client-certs/server.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/server.p12 b/examples/puma/client-certs/server.p12
+index 6fb6ba6046db3096a51886b7d7c8d68c4367d0eb..6ac4d590e48c8f282f09ede85d9442789ab97822 100644
+GIT binary patch
+delta 3160
+zcmV-e45#zT8NwMrFoF!e0s#Xsf((QP2`Yw2hW8Bt2LYgh40Qy83~?}m3~exi2L}cT
+zDuzgg_YDCD2B3ll_%MP7^a23@FoFi{kw6`P1kB9hlA2Hz0s;sCfPx0VA>-i@q{rAk
+zI+De=@3JTu*8F>tsgG?-YfOXOPwJKPLqI;4xx3bZ67d}Z1<J?xUJYO)GT_vR2t6Cd
+zNCK*;u0bMAm@x~T0?1qRg<<gcd;b|EC!Lo4Sqa<ZGy>^J%YLKa_t%%CseyY@vs@p4
+zGJX8)6Ov$hV47k^&ZC?7Y*&;Xt=9J<!F	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
+
+delta 3168
+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
+G0tf)|Q2!DD
+
+diff --git a/examples/puma/client-certs/unknown_ca.crt b/examples/puma/client-certs/unknown_ca.crt
+index 43f25188d..419487f83 100644
+--- a/examples/puma/client-certs/unknown_ca.crt
++++ b/examples/puma/client-certs/unknown_ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-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
++LVu0+VBx8eIwdLZplDfQ9sGUjCs=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/unknown_ca.key b/examples/puma/client-certs/unknown_ca.key
+index 50f0b3336..d9e3a6203 100644
+--- a/examples/puma/client-certs/unknown_ca.key
++++ b/examples/puma/client-certs/unknown_ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEpAIBAAKCAQEA5bwjPBdqvbxO3TzIGqOd6tFNzCCYDTDsOHmRg38Wa2xjN8eW
+-cLN/+4854BPARXP2PkYQu90/3TehPWU9o38JUUUlMcfD6tjlDAPT2/H4/EwKCxsA
+-urcSmqsv1KiqoVRo0NxVEt3Fwc0fOTxjfZoSAe9vn7XFs8NCkjW/qWBvLYPtaejW
+-/lJUq40vf2dCjPMyp7XjBu+aobSpwq7Q+kQYqqffHOa/ySfiwDTg2go7VY+UiU1X
+-fzMrIb6zZX2D5TILfv7VPKkpSs8DGh3DeygPqE9G5TqI2lDSTI4KsAiPEHkz9fwx
+-A37yb07cz5Gs/3La5mx80Ly0vC4enylb99nIPQIDAQABAoIBAQCbxT6K30HkFsvO
+-nQj9bxWDg5nhn/QZdaOmA2AULlbwTdTUnIM4Na3Az3OpqRrEvQUpYm60Qyergq3U
+-qFHsCxYxQdYfc9k24wwjYnEDgIWX5KMmto9/CuUVdJ+A7UCNFWPgwpT4ruEJMGFM
+-eNLo9k/heg1Q2HqOEgaQhttHKHkZ/UJaR6XXeucBfJtXSIWf42omeDRNhlwsQ+LY
+-WbTv3XmiFbu1Bhkk67xlpyuGEL1g9Auz9P2z+2Q2LV66kNhfInIFtUYFeNpkjgUJ
+-TtDRU7UBOm+YPMjDfjVUzPbzvCVAtxG4t0ZSJJcQF3N4+HfpoL1c33CCqYwkh1KI
+-xJi1CgjtAoGBAPR3u8OovMmSJ6tdee0WyTahYmK6VOtmSm4IJf1t/wUvf/u6X/Q6
+-U06TxUAiAs8rMwvvtgPeLYxtaEKO0PSD0rHNL1MHnBwYAmLvAFyCc5tuuyb3ZIyg
+-1oAz/hW5bYgAL32nmDrlwq0W+KU478SRWWYZA2raO3Ha08I1YVbgkSHPAoGBAPCS
+-fIexjEPxeyZJe4+iKQcmWW42HA9rWIpu/9FDZxvn+PpWhBwMzlxjTlQS2V3nMSHp
+-Jtzyj+Y2R1SO8OQoqZ6s7G+cv8Ni+FqOidcUPUH6aDc2A0ihb0FANp4FQsrv7riP
+-W12mWfniTxZri+nKAwpXjEjko8yi05go3y0dTjQzAoGAJq+n6/+Q2Ikjc+/X8pfv
+-gZCqZBs+gv3t+1mYwXEdsTFiHHDS7HAqbL3fshVvwl8AtfvaHuSS6q0JmbbGBFu0
+-BOUGfyouHxgBkKxnrzwJlWhBf5oYtFRjfWg85i0w0xvMaCMUaQWg+AkxkdvfvYiO
+-0CRXMRqV25+YcRxHahshfGsCgYEAus9Vql1B6YS8N4f6ThgDOg0ahw23jnWyJJV7
+-SznG+JGS8np6TfnXyUBIE9srNdMQgR+20P3+piriCxSQlOvKg3AOjcEv2/6fklp7
+-SSvrQa+8e5sSw7SwWwANKXo2WrYkLucLcNZ7qiKFfYh39kyrPb2sLvJ1C7QpEVAz
+-tam7D6cCgYBdqh+SlwryiX351eh+tLOlysAPJ1cb3JotnZY1WYKfR9r5PlJsisut
+-dcjOOaz5/Uo/UlVKOjOxxUuB8FIIJGPvx6lo0hq8ornS0CdqhDspUx4aAD0iZ6+y
+-iccYnG0CLW3HpS4B1B7a8ktXW59m+tT9Fl+usOmwdPNIzcdAMqff+A==
++MIIEowIBAAKCAQEAlcFMjuK3PckKQ1GlHcl1qz8crb5YujLdxyS1ofQ5Qc/FIQO1
++40JGXBHTtwRZOGXpAxBE4cQksJU8iMItea7a7AnpKM9vuR5FcluY4dajRlfJzTGc
++si/xqdZcUCUxyie+2lKhiDI1QXBhB2FZO/cj0et2oKt7PvT4NfKreCxOC+LHBQhS
++b7+RazrN8gcK3CIC6wzZeOtz0Br/7klNreux1dRfHKtqSgqvYQPQGuFZGaikz7F/
++tXjZ02nC4Weu2oN+bI8q3Nlu/knzDqirsEYLb4IvsxijV+eidY+TFFkJjOn+q2SG
++i0cfKmelm5CHam47CeKwbKQDytJf+GW0KSXHkQIDAQABAoIBAAHmslIeDrV6F+dC
++4hW+uP+zjWmnQPkcLDSbArNLpm5vdNE2etinvrzsfQOVyowsvwiK7FTxaIXVXy9d
++R7aDwcO9XHhoKcLv33HUN9ymHOyHsMgqGRMqCKdfUUyzLC6k0odzBRn1iTeLda/i
++TH+2Y34GvzrK8oWaFoyYyBR+e38rHOMBF5gmQSkwHZ+8qOsHuI7ajukLioRXLElq
++ivrOdeaiNmTfofXiDakZm5/SKJ2pXbzQkeibqLkTXeU/p3ltjVrg0GbgF1l5SjmK
++OyFUeTRjmA8KAFpPri2WggZ6rW9N58u7iF1+hIxRua42lHQ3UXvza41cLX0IjxkT
++dL0e5QECgYEAxC7kswPej/Omo8T0hZtWHAB6eyas43VzCyypdrDKyfKJGbVWBC61
++YsOI7L2K1biKsx7gyidOVlNdp3ycmgyyBuH4vn8UhEzOpLLnEw1HX9KDfKQL9yjG
++f7GYUiHIOE1ah0X45PMpuk/FI0JvFdQCG3MKe7ypM7h2QV2wSM43n3cCgYEAw2p0
++Dc8AmkEIOP2ZtB4jadD/XTZpxotd6rqZkGt0YWW4fkzdJGjeDhs+W4pT6tG85fFW
++Bmxz80YsbG9ktHiUTZAS89ixxUnmecudsp4xlTGsGaIboQLPwST8S7iA2AXq0fgW
++rZX/OiKM+IVbszBWrVpCNHKGPnfiO6PE3GiU4zcCgYBZXTcGKIQQNJ+6x/POjIS7
+++qfQQzzL2+tMssp662tkdFtpX4XQH+q2E3XiyTBdzFM55p3k1+TCQ/VMXuIC9jd+
++FR82vzJ8VXRn56qEri7OAlmsxBlDO8q3zhEhkIvgwbO0HPaUbAOc/8tAFXn+inVv
++RYcH+Fdm3ObZPbEYaP9DXwKBgF14JqiQMbaWkotH6eP4YnHzsKFyLGf2M2bZ+CfW
++7eTEVdm7hC8tJcFTkKESag8wYQ0PQVlzOIbNMuRu55lW74CmABq4tFcsgNwS44wT
++FJ5LEwlzu4lpIdw9h5vkVWR+eBIUeyxuSZUR/6HDj9gGr/7c5DvX55QrnX9vVvMh
++5s1DAoGBAICs0BjCHmAOcEXIHzt3gTju6oj2sQ/Fob03XsEKcfR6Ci32sBQekdqA
++rpkNiJKzrHjo79nDDcioXGvDD5Duv0fTxFmYME2lTm6nvKS8QF4b+K8C/UKzhpmt
++zAvwVTOtLnMpHNcKvadSPKFMWNl8M12oi8ELGGPouuh24zX4eyAe
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/generate_server_test.rb b/examples/puma/generate_server_test.rb
+new file mode 100644
+index 000000000..086b5a778
+--- /dev/null
++++ b/examples/puma/generate_server_test.rb
+@@ -0,0 +1,56 @@
++# frozen_string_literal: true
++
++=begin
++regenerates cert_puma.pem and puma_keypair.pem
++dates, key length & sign_algorithm are changed
++
++JRuby:
++after running this file, delete server.p12 and keystore.jks, then (I think)
++cd examples/puma
++openssl pkcs12 -export -password pass:jruby_puma -inkey puma_keypair.pem -in cert_puma.pem -name puma -out server.p12
++keytool -importkeystore -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass jruby_puma -destkeystore keystore.jks -deststoretype JKS -storepass jruby_puma
++=end
++
++require 'openssl'
++
++module Generate
++
++ KEY_LEN = 2048
++ SIGN_ALGORITHM = OpenSSL::Digest::SHA256
++
++ FNC = 'cert_puma.pem'
++ FNK = 'puma_keypair.pem'
++
++ class << self
++
++ def run
++ ca_key = OpenSSL::PKey::RSA.new KEY_LEN
++ key = OpenSSL::PKey::RSA.new KEY_LEN
++
++ raw = File.read File.join(__dir__, FNC), mode: 'rb'
++
++ cert = OpenSSL::X509::Certificate.new raw
++ puts "\nOld:", cert.to_text, ""
++
++ now = Time.now.utc
++ mo = now.month
++ yr = now.year
++ zone = '+00:00'
++
++ cert.not_before = Time.new yr , mo, 1, 0, 0, 0, zone
++ cert.not_after = Time.new yr+4, mo, 1, 0, 0, 0, zone
++ cert.public_key = key.public_key
++ cert.sign ca_key, SIGN_ALGORITHM.new
++ puts "New:", cert.to_text, ""
++
++ Dir.chdir __dir__ do
++ File.write FNC, cert.to_pem, mode: 'wb'
++ File.write FNK, key.to_pem , mode: 'wb'
++ end
++ rescue => e
++ puts "error: #{e.message}"
++ end
++ end
++end
++
++Generate.run
+diff --git a/examples/puma/keystore.jks b/examples/puma/keystore.jks
+index 147ab20421da8299c1c8607e12538e4258986a61..f1909ecdc7dc10cf94055fc90ab7786f6fbff74e 100644
+GIT binary patch
+literal 2253
+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
+SHJ`dDUw{v?KO|H!dig&k>e!tC
+
+literal 2211
+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
+
+diff --git a/examples/puma/puma_keypair.pem b/examples/puma/puma_keypair.pem
+index 94cdcbcba..c8057c8f1 100644
+--- a/examples/puma/puma_keypair.pem
++++ b/examples/puma/puma_keypair.pem
+@@ -1,15 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/server.p12 b/examples/puma/server.p12
+new file mode 100644
+index 0000000000000000000000000000000000000000..f8ffc7fab80e9fcb289d7c2a7d63b552494406c2
+GIT binary patch
+literal 2550
+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
+Dcm}%~
+
+literal 0
+HcmV?d00001
+
+diff --git a/test/helpers/ssl.rb b/test/helpers/ssl.rb
+index cfa5fec4a..860d8db62 100644
+--- a/test/helpers/ssl.rb
++++ b/test/helpers/ssl.rb
+@@ -3,7 +3,7 @@ def ssl_query
+ @ssl_query ||= if Puma.jruby?
+ @keystore = File.expand_path "../../../examples/puma/keystore.jks", __FILE__
+ @ssl_cipher_list = "TLS_DHE_RSA_WITH_DES_CBC_SHA,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"
+- "keystore=#{@keystore}&keystore-pass=pswd&ssl_cipher_list=#{@ssl_cipher_list}"
++ "keystore=#{@keystore}&keystore-pass=jruby_puma&ssl_cipher_list=#{@ssl_cipher_list}"
+ else
+ @cert = File.expand_path "../../../examples/puma/cert_puma.pem", __FILE__
+ @key = File.expand_path "../../../examples/puma/puma_keypair.pem", __FILE__
+
+From 4ab2bc4f72441248e95f7742350b3d18dae9aa54 Mon Sep 17 00:00:00 2001
+From: MSP-Greg <Greg.mpls(a)gmail.com>
+Date: Fri, 7 Aug 2020 16:34:24 -0500
+Subject: [PATCH 3/3] test_puma_server_ssl.rb, ssl.rb - misc updates, fixes for
+ updated certs & JRuby
+
+---
+ test/helpers/ssl.rb | 6 ++--
+ test/test_puma_server_ssl.rb | 54 +++++++++++++++++++-----------------
+ 2 files changed, 32 insertions(+), 28 deletions(-)
+
+diff --git a/test/helpers/ssl.rb b/test/helpers/ssl.rb
+index 860d8db62..9847a7607 100644
+--- a/test/helpers/ssl.rb
++++ b/test/helpers/ssl.rb
+@@ -1,12 +1,12 @@
+ module SSLHelper
+ def ssl_query
+ @ssl_query ||= if Puma.jruby?
+- @keystore = File.expand_path "../../../examples/puma/keystore.jks", __FILE__
++ @keystore = File.expand_path "../../examples/puma/keystore.jks", __dir__
+ @ssl_cipher_list = "TLS_DHE_RSA_WITH_DES_CBC_SHA,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"
+ "keystore=#{@keystore}&keystore-pass=jruby_puma&ssl_cipher_list=#{@ssl_cipher_list}"
+ else
+- @cert = File.expand_path "../../../examples/puma/cert_puma.pem", __FILE__
+- @key = File.expand_path "../../../examples/puma/puma_keypair.pem", __FILE__
++ @cert = File.expand_path "../../examples/puma/cert_puma.pem", __dir__
++ @key = File.expand_path "../../examples/puma/puma_keypair.pem", __dir__
+ "key=#{@key}&cert=#{@cert}"
+ end
+ end
+diff --git a/test/test_puma_server_ssl.rb b/test/test_puma_server_ssl.rb
+index 584ab44f5..ecc3ddcf5 100644
+--- a/test/test_puma_server_ssl.rb
++++ b/test/test_puma_server_ssl.rb
+@@ -53,11 +53,11 @@ def start_server
+ ctx = Puma::MiniSSL::Context.new
+
+ if Puma.jruby?
+- ctx.keystore = File.expand_path "../../examples/puma/keystore.jks", __FILE__
+- ctx.keystore_pass = 'blahblah'
++ ctx.keystore = File.expand_path "../examples/puma/keystore.jks", __dir__
++ ctx.keystore_pass = 'jruby_puma'
+ else
+- ctx.key = File.expand_path "../../examples/puma/puma_keypair.pem", __FILE__
+- ctx.cert = File.expand_path "../../examples/puma/cert_puma.pem", __FILE__
++ ctx.key = File.expand_path "../examples/puma/puma_keypair.pem", __dir__
++ ctx.cert = File.expand_path "../examples/puma/cert_puma.pem", __dir__
+ end
+
+ ctx.verify_mode = Puma::MiniSSL::VERIFY_NONE
+@@ -204,26 +204,30 @@ def test_http_rejection
+ # client-side TLS authentication tests
+ class TestPumaServerSSLClient < Minitest::Test
+ parallelize_me!
++
++ CERT_PATH = File.expand_path "../examples/puma/client-certs", __dir__
++
+ def assert_ssl_client_error_match(error, subject=nil, &blk)
+- host = "127.0.0.1"
++ host = "localhost"
+ port = UniquePort.call
+
+ app = lambda { |env| [200, {}, [env['rack.url_scheme']]] }
+
+ ctx = Puma::MiniSSL::Context.new
+ if Puma.jruby?
+- ctx.keystore = File.expand_path "../../examples/puma/client-certs/keystore.jks", __FILE__
+- ctx.keystore_pass = 'blahblah'
++ ctx.keystore = "#{CERT_PATH}/keystore.jks"
++ ctx.keystore_pass = 'jruby_puma'
+ else
+- ctx.key = File.expand_path "../../examples/puma/client-certs/server.key", __FILE__
+- ctx.cert = File.expand_path "../../examples/puma/client-certs/server.crt", __FILE__
+- ctx.ca = File.expand_path "../../examples/puma/client-certs/ca.crt", __FILE__
++ ctx.key = "#{CERT_PATH}/server.key"
++ ctx.cert = "#{CERT_PATH}/server.crt"
++ ctx.ca = "#{CERT_PATH}/ca.crt"
+ end
+ ctx.verify_mode = Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
+
+ events = SSLEventsHelper.new STDOUT, STDERR
+ server = Puma::Server.new app, events
+ server.add_ssl_listener host, port, ctx
++ host_addrs = server.binder.ios.map { |io| io.to_io.addr[2] }
+ server.run
+
+ http = Net::HTTP.new host, port
+@@ -246,11 +250,11 @@ def assert_ssl_client_error_match(error, subject=nil, &blk)
+
+ sleep 0.1
+ assert_equal !!error, client_error
+- # The JRuby MiniSSL implementation lacks error capturing currently, so we can't inspect the
+- # messages here
++ # The JRuby MiniSSL implementation lacks error capturing currently,
++ # so we can't inspect the messages here
+ unless Puma.jruby?
+ assert_match error, events.error.message if error
+- assert_equal host, events.addr if error
++ assert_includes host_addrs, events.addr if error
+ assert_equal subject, events.cert.subject.to_s if subject
+ end
+ ensure
+@@ -264,32 +268,32 @@ def test_verify_fail_if_no_client_cert
+ end
+
+ def test_verify_fail_if_client_unknown_ca
+- assert_ssl_client_error_match('self signed certificate in certificate chain', '/DC=net/DC=puma/CN=ca-unknown') do |http|
+- key = File.expand_path "../../examples/puma/client-certs/client_unknown.key", __FILE__
+- crt = File.expand_path "../../examples/puma/client-certs/client_unknown.crt", __FILE__
++ assert_ssl_client_error_match('self signed certificate in certificate chain', '/DC=net/DC=puma/CN=CAU') do |http|
++ key = "#{CERT_PATH}/client_unknown.key"
++ crt = "#{CERT_PATH}/client_unknown.crt"
+ http.key = OpenSSL::PKey::RSA.new File.read(key)
+ http.cert = OpenSSL::X509::Certificate.new File.read(crt)
+- http.ca_file = File.expand_path "../../examples/puma/client-certs/unknown_ca.crt", __FILE__
++ http.ca_file = "#{CERT_PATH}/unknown_ca.crt"
+ end
+ end
+
+ def test_verify_fail_if_client_expired_cert
+- assert_ssl_client_error_match('certificate has expired', '/DC=net/DC=puma/CN=client-expired') do |http|
+- key = File.expand_path "../../examples/puma/client-certs/client_expired.key", __FILE__
+- crt = File.expand_path "../../examples/puma/client-certs/client_expired.crt", __FILE__
++ assert_ssl_client_error_match('certificate has expired', '/DC=net/DC=puma/CN=localhost') do |http|
++ key = "#{CERT_PATH}/client_expired.key"
++ crt = "#{CERT_PATH}/client_expired.crt"
+ http.key = OpenSSL::PKey::RSA.new File.read(key)
+ http.cert = OpenSSL::X509::Certificate.new File.read(crt)
+- http.ca_file = File.expand_path "../../examples/puma/client-certs/ca.crt", __FILE__
++ http.ca_file = "#{CERT_PATH}/ca.crt"
+ end
+ end
+
+ def test_verify_client_cert
+ assert_ssl_client_error_match(nil) do |http|
+- key = File.expand_path "../../examples/puma/client-certs/client.key", __FILE__
+- crt = File.expand_path "../../examples/puma/client-certs/client.crt", __FILE__
++ key = "#{CERT_PATH}/client.key"
++ crt = "#{CERT_PATH}/client.crt"
+ http.key = OpenSSL::PKey::RSA.new File.read(key)
+ http.cert = OpenSSL::X509::Certificate.new File.read(crt)
+- http.ca_file = File.expand_path "../../examples/puma/client-certs/ca.crt", __FILE__
++ http.ca_file = "#{CERT_PATH}/ca.crt"
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
+ end
+ end
diff --git a/rubygem-puma.spec b/rubygem-puma.spec
index 2db8989..2c58b6b 100644
--- a/rubygem-puma.spec
+++ b/rubygem-puma.spec
@@ -7,23 +7,31 @@
%bcond_without help2man
Name: rubygem-%{gem_name}
-Version: 4.3.3
-Release: 3%{?dist}
+Version: 4.3.6
+Release: 1%{?dist}
Summary: A simple, fast, threaded, and highly concurrent HTTP 1.1 server
License: BSD
URL: http://puma.io
Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem
# The puma gem doesn't ship with the test suite.
# git clone https://github.com/puma/puma --no-checkout
-# cd puma && git archive -v -o puma-4.3.3-tests.txz v4.3.3 test
+# cd puma && git archive -v -o puma-4.3.6-tests.txz v4.3.6 test
Source1: %{gem_name}-%{version}-tests.txz
# The puma gem doesn't ship with the examples used in test suite.
-# git archive -v -o puma-4.3.3-examples.txz v4.3.3 examples
+# git archive -v -o puma-4.3.6-examples.txz v4.3.6 examples
Source3: %{gem_name}-%{version}-examples.txz
# Set the default cipher list "PROFILE=SYSTEM".
# https://fedoraproject.org/wiki/Packaging:CryptoPolicies
Patch2: rubygem-puma-3.6.0-fedora-crypto-policy-cipher-list.patch
-
+# Don't exit Puma on test failure.
+# https://github.com/puma/puma/pull/2332
+Patch3: rubygem-puma-5.0.0-Report-pumactl-exit.patch
+# Fix SSL certificates.
+# https://github.com/puma/puma/pull/2333
+Patch4: rubygem-puma-5.0.0-Update-test-certs-and-code.patch
+
+# Git is needed just to apply Patch4.
+BuildRequires: %{_bindir}/git
BuildRequires: openssl-devel
BuildRequires: ruby(release)
BuildRequires: rubygems-devel
@@ -42,8 +50,11 @@ BuildRequires: help2man
BuildRequires: gcc
%description
-A simple, fast, threaded, and highly concurrent HTTP 1.1 server for
-Ruby/Rack applications.
+Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
+Ruby/Rack applications. Puma is intended for use in both development and
+production environments. It's great for highly concurrent Ruby implementations
+such as Rubinius and JRuby as well as as providing process worker support to
+support CRuby well.
%package doc
@@ -55,17 +66,32 @@ BuildArch: noarch
Documentation for %{name}.
%prep
-%setup -q -n %{gem_name}-%{version} -b 1 -b 3
+%setup -q -n %{gem_name}-%{version} -b 1 -b 3
%patch2 -p1
+pushd %{_builddir}
+%patch3 -p1
+
+# When removed, remove also the `BR: git` above.
+%global __scm git_am
+%{expand:%__scm_setup_%{__scm}}
+%apply_patch -p1 %{PATCH4}
+popd
+
%if %{with ragel}
+# Test suite on s390x fails on various places with following error:
+# ext/puma_http11/http11_parser.rl:123: puma_parser_execute: Assertion `parser->nread <= len && "nread longer than length"' failed.
+# Keep the upstream generated parser which appears to work.
+# https://github.com/adrian-thurston/ragel/issues/51
+%ifnarch s390x
# Regenarate the parser.
# https://fedoraproject.org/wiki/Packaging:Guidelines#Use_of_pregenerated_code
rm -f ext/puma_http11/http11_parser.c
ragel ext/puma_http11/http11_parser.rl -G2 -I ext/puma_http11 \
-o ext/puma_http11/http11_parser.c
%endif
+%endif
%build
# Create the gem as gem install only works on a gem file
@@ -122,29 +148,26 @@ sed -i '/::Timeout.timeout/ s/60/600/' test/helper.rb
# Skip an unstable test on Koji.
# TestCLI#test_control failing with "pool_capacity": 0
# https://github.com/puma/puma/issues/2212
-%ifarch ppc64le s390x
+%ifarch ppc64le s390x aarch64
sed -i '/^ def test_control$/,/^ end$/ s/^/#/' test/test_cli.rb
%endif
-# Skip a test that needs internet.
-# This test often takes long time on Koji.
+# These test often timeouts on Koji.
sed -i '/^ def test_timeout_in_data_phase$/a\
skip' test/test_puma_server.rb
+sed -i '/^ def test_plugin$/a\
+ skip' test/test_plugin.rb
-# Skip a randomly failed SSL test with openssl-libs-1:1.1.1e-2.fc33.ppc64le.
+# Skip a randomly failed SSL test.
# Errno::ECONNRESET: Connection reset by peer
# /usr/share/ruby/openssl/buffering.rb:182:in `sysread_nonblock'
# /usr/share/ruby/openssl/buffering.rb:182:in `read_nonblock'
-%ifarch ppc64le
sed -i '/^ def test_verify_fail_if_client_unknown_ca$/a\
skip' test/test_puma_server_ssl.rb
-%endif
# Skip unstable tests on Koji.
# test_integration_cluster.rb: not expected replies
# https://github.com/puma/puma/issues/2209
-sed -i '/^ def test_term_closes_listeners_/a\
- skip' test/test_integration_cluster.rb
sed -i '/^ def test_usr1_all_respond_/a\
skip' test/test_integration_cluster.rb
@@ -181,6 +204,13 @@ popd
%endif
%changelog
+* Mon Sep 07 2020 Vít Ondruch <vondruch(a)redhat.com> - 4.3.6-1
+- Update to Puma 4.3.6.
+ Resolves: rhbz#1837148
+ Resolves: rhbz#1863729
+ Resolves: rbhz#1842535
+ Resolves: rbhz#1842540
+
* Sat Aug 01 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 4.3.3-3
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
diff --git a/sources b/sources
index 1e4ec9a..2d096ce 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-SHA512 (puma-4.3.3-examples.txz) = b3a3ff564c41a2d9d8793aa1657a6fce77b932a9cf168ea41c3dcf00f72221be36697a8087e0173d425bbbaf1197081d28ddc9ba4a835e13a3bf379c90de1bf7
-SHA512 (puma-4.3.3-tests.txz) = 705ca3e26fc0475558cc6ee0e8004c534f2d2b79f7902aad05c71b6101f206fcf683e0d5d957d84aa3a12f452cd252849cfd2b2a4c59b28a8f8c1f79cc05c0fe
-SHA512 (puma-4.3.3.gem) = 12d6cfd483f6c10f61ab1480e15ad32bbb878f451a9cf1b5e07f54b41608ff265f5963c018c6b73b247dd58fda4c2f47bba1975e8e61df37cb788280fbb4ed0e
+SHA512 (puma-4.3.6-examples.txz) = 1d030f95b84dfaa7b43d8ca26a9eade69ada4b5ba9b06127345a4f2ebaa0b1ffe6f535e5c7d3b4c8bb81fc733d5e269739cde0a8765131e534a0ed7bbb71c7f6
+SHA512 (puma-4.3.6-tests.txz) = cf9a45eb6ebdc02a17032ae6218f21a00dcd822d39d042004b1e50cb30e00b853bf0c0e7b5c2c1b78170bf85f4b072ff2e803741d8d161423c24ebd36dcea8b8
+SHA512 (puma-4.3.6.gem) = 08fbcec8efcd77b4f953550f912ab218d5d31d203f60460422563930419719f3e5cac9fd1f875628008e699139eccb16eac75a4af1c75966c7ba42fadf9df3a6
3 years, 8 months