From 82c5a213c983189154952552bd83befaf570b1cd7352a85e5520d24f514c6b7e Mon Sep 17 00:00:00 2001 From: Thomas Bechtold Date: Mon, 29 Apr 2019 06:10:38 +0000 Subject: [PATCH] - add 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch - add 0002-Fix-for-Python-3.7-506.patch and add 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch Both needed for python 3.7 compatibility OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-eventlet?expand=0&rev=58 --- ...-non-monotonic-time.time-for-timeout.patch | 67 +++++++ 0002-Fix-for-Python-3.7-506.patch | 96 ++++++++++ ...ty-with-Python-3.7-ssl.SSLSocket-531.patch | 165 ++++++++++++++++++ python-eventlet.changes | 8 + python-eventlet.spec | 12 +- 5 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch create mode 100644 0002-Fix-for-Python-3.7-506.patch create mode 100644 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch diff --git a/0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch b/0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch new file mode 100644 index 0000000..d971228 --- /dev/null +++ b/0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch @@ -0,0 +1,67 @@ +From a28a275393d3c3ae3c3a5341cc4764fad21be3e5 Mon Sep 17 00:00:00 2001 +From: Sergey Shepelev +Date: Mon, 27 Aug 2018 00:22:35 +0500 +Subject: [PATCH 1/3] ssl: connect used non-monotonic time.time() for timeout + (#520) + +Origin: https://github.com/eventlet/eventlet/pull/517 + +Related: +https://github.com/eventlet/eventlet/pull/388 +https://github.com/eventlet/eventlet/pull/303 +https://github.com/eventlet/eventlet/issues/270 +https://github.com/eventlet/eventlet/issues/132 +--- + eventlet/green/ssl.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py +index 53ee9a3..577afba 100644 +--- a/eventlet/green/ssl.py ++++ b/eventlet/green/ssl.py +@@ -6,9 +6,8 @@ slurp_properties(__ssl, globals(), srckeys=dir(__ssl)) + import errno + import functools + import sys +-import time + +-from eventlet import greenio ++from eventlet import greenio, hubs + from eventlet.greenio import ( + set_nonblocking, GreenSocket, CONNECT_ERR, CONNECT_SUCCESS, + ) +@@ -264,6 +263,7 @@ class GreenSSLSocket(_original_sslsocket): + if self.act_non_blocking: + return real_connect(self, addr) + else: ++ clock = hubs.get_hub().clock + # *NOTE: gross, copied code from greenio because it's not factored + # well enough to reuse + if self.gettimeout() is None: +@@ -278,7 +278,7 @@ class GreenSSLSocket(_original_sslsocket): + else: + raise + else: +- end = time.time() + self.gettimeout() ++ end = clock() + self.gettimeout() + while True: + try: + real_connect(self, addr) +@@ -286,12 +286,12 @@ class GreenSSLSocket(_original_sslsocket): + if get_errno(exc) in CONNECT_ERR: + trampoline( + self, write=True, +- timeout=end - time.time(), timeout_exc=timeout_exc('timed out')) ++ timeout=end - clock(), timeout_exc=timeout_exc('timed out')) + elif get_errno(exc) in CONNECT_SUCCESS: + return + else: + raise +- if time.time() >= end: ++ if clock() >= end: + raise timeout_exc('timed out') + + def connect(self, addr): +-- +2.21.0 + diff --git a/0002-Fix-for-Python-3.7-506.patch b/0002-Fix-for-Python-3.7-506.patch new file mode 100644 index 0000000..15e9441 --- /dev/null +++ b/0002-Fix-for-Python-3.7-506.patch @@ -0,0 +1,96 @@ +From cf47cb518db3e0dbdd48473fb40cf9f6ecd50e07 Mon Sep 17 00:00:00 2001 +From: Marcel Plch +Date: Fri, 28 Sep 2018 17:08:59 +0200 +Subject: [PATCH 2/3] Fix for Python 3.7 (#506) + +* Fix for Python 3.7 + +* Remove redundant piece of code. + +* Put back do_handshake_on_connect kwarg + +* Use Python 3.7 instead of 3.7-dev + +* Fix buildbot failing permissions with 3.7 + +* tests: env_tpool_zero assert details + +* setup: Python 3.7 classificator +--- + eventlet/green/ssl.py | 46 +++++++++++++++++++++++++++++++++++++------ + 1 file changed, 40 insertions(+), 6 deletions(-) + +diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py +index 577afba..53dff70 100644 +--- a/eventlet/green/ssl.py ++++ b/eventlet/green/ssl.py +@@ -23,6 +23,7 @@ __patched__ = [ + 'create_default_context', '_create_default_https_context'] + + _original_sslsocket = __ssl.SSLSocket ++_original_wrap_socket = __ssl.wrap_socket + + + class GreenSSLSocket(_original_sslsocket): +@@ -56,11 +57,41 @@ class GreenSSLSocket(_original_sslsocket): + # this assignment + self._timeout = sock.gettimeout() + +- # nonblocking socket handshaking on connect got disabled so let's pretend it's disabled +- # even when it's on +- super(GreenSSLSocket, self).__init__( +- sock.fd, keyfile, certfile, server_side, cert_reqs, ssl_version, +- ca_certs, do_handshake_on_connect and six.PY2, *args, **kw) ++ if sys.version_info >= (3, 7): ++ # Monkey-patch the sslsocket so our modified self gets ++ # injected into its _create method. ++ def fake_new(self, cls, *args, **kwargs): ++ return self ++ ++ orig_new = _original_sslsocket.__new__ ++ try: ++ _original_sslsocket.__new__ = fake_new.__get__(self, GreenSSLSocket) ++ ++ self = _original_wrap_socket( ++ sock=sock.fd, ++ keyfile=keyfile, ++ certfile=certfile, ++ server_side=server_side, ++ cert_reqs=cert_reqs, ++ ssl_version=ssl_version, ++ ca_certs=ca_certs, ++ do_handshake_on_connect=False, ++ *args, **kw ++ ) ++ self.keyfile = keyfile ++ self.certfile = certfile ++ self.cert_reqs = cert_reqs ++ self.ssl_version = ssl_version ++ self.ca_certs = ca_certs ++ finally: ++ # Unpatch ++ _original_sslsocket.__new__ = orig_new ++ else: ++ # nonblocking socket handshaking on connect got disabled so let's pretend it's disabled ++ # even when it's on ++ super(GreenSSLSocket, self).__init__( ++ sock.fd, keyfile, certfile, server_side, cert_reqs, ssl_version, ++ ca_certs, do_handshake_on_connect and six.PY2, *args, **kw) + + # the superclass initializer trashes the methods so we remove + # the local-object versions of them and let the actual class +@@ -323,7 +354,10 @@ class GreenSSLSocket(_original_sslsocket): + except NameError: + self._sslobj = sslobj + else: +- self._sslobj = SSLObject(sslobj, owner=self) ++ if sys.version_info < (3, 7): ++ self._sslobj = SSLObject(sslobj, owner=self) ++ else: ++ self._sslobj = sslobj + + if self.do_handshake_on_connect: + self.do_handshake() +-- +2.21.0 + diff --git a/0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch b/0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch new file mode 100644 index 0000000..58e3b53 --- /dev/null +++ b/0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch @@ -0,0 +1,165 @@ +From a915bb642dd6cd4e92c959addff30509977a637c Mon Sep 17 00:00:00 2001 +From: Junyi +Date: Wed, 30 Jan 2019 00:10:31 -0800 +Subject: [PATCH 3/3] Fix compatibility with Python 3.7 ssl.SSLSocket (#531) + +--- + eventlet/green/ssl.py | 86 ++++++++++++++++++++++++------------------- + 1 file changed, 49 insertions(+), 37 deletions(-) + +diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py +index 53dff70..9504aef 100644 +--- a/eventlet/green/ssl.py ++++ b/eventlet/green/ssl.py +@@ -3,10 +3,7 @@ __ssl = __import__('ssl') + from eventlet.patcher import slurp_properties + slurp_properties(__ssl, globals(), srckeys=dir(__ssl)) + +-import errno +-import functools + import sys +- + from eventlet import greenio, hubs + from eventlet.greenio import ( + set_nonblocking, GreenSocket, CONNECT_ERR, CONNECT_SUCCESS, +@@ -14,6 +11,8 @@ from eventlet.greenio import ( + from eventlet.hubs import trampoline, IOClosed + from eventlet.support import get_errno, PY33 + import six ++from contextlib import contextmanager ++ + orig_socket = __import__('socket') + socket = orig_socket.socket + timeout_exc = SSLError +@@ -24,6 +23,21 @@ __patched__ = [ + + _original_sslsocket = __ssl.SSLSocket + _original_wrap_socket = __ssl.wrap_socket ++_original_sslcontext = getattr(__ssl, 'SSLContext', None) ++_is_under_py_3_7 = sys.version_info < (3, 7) ++ ++ ++@contextmanager ++def _original_ssl_context(*args, **kwargs): ++ tmp_sslcontext = _original_wrap_socket.__globals__.get('SSLContext', None) ++ tmp_sslsocket = _original_sslsocket._create.__globals__.get('SSLSocket', None) ++ _original_sslsocket._create.__globals__['SSLSocket'] = _original_sslsocket ++ _original_wrap_socket.__globals__['SSLContext'] = _original_sslcontext ++ try: ++ yield ++ finally: ++ _original_wrap_socket.__globals__['SSLContext'] = tmp_sslcontext ++ _original_sslsocket._create.__globals__['SSLSocket'] = tmp_sslsocket + + + class GreenSSLSocket(_original_sslsocket): +@@ -40,16 +54,43 @@ class GreenSSLSocket(_original_sslsocket): + settimeout(), and to close/reopen the connection when a timeout + occurs at an unexpected juncture in the code. + """ ++ def __new__(cls, sock=None, keyfile=None, certfile=None, ++ server_side=False, cert_reqs=CERT_NONE, ++ ssl_version=PROTOCOL_SSLv23, ca_certs=None, ++ do_handshake_on_connect=True, *args, **kw): ++ if _is_under_py_3_7: ++ return super(GreenSSLSocket, cls).__new__(cls) ++ else: ++ if not isinstance(sock, GreenSocket): ++ sock = GreenSocket(sock) ++ with _original_ssl_context(): ++ ret = _original_wrap_socket( ++ sock=sock.fd, ++ keyfile=keyfile, ++ certfile=certfile, ++ server_side=server_side, ++ cert_reqs=cert_reqs, ++ ssl_version=ssl_version, ++ ca_certs=ca_certs, ++ do_handshake_on_connect=False, ++ *args, **kw ++ ) ++ ret.keyfile = keyfile ++ ret.certfile = certfile ++ ret.cert_reqs = cert_reqs ++ ret.ssl_version = ssl_version ++ ret.ca_certs = ca_certs ++ ret.__class__ = GreenSSLSocket ++ return ret ++ + # we are inheriting from SSLSocket because its constructor calls + # do_handshake whose behavior we wish to override +- + def __init__(self, sock, keyfile=None, certfile=None, + server_side=False, cert_reqs=CERT_NONE, + ssl_version=PROTOCOL_SSLv23, ca_certs=None, + do_handshake_on_connect=True, *args, **kw): + if not isinstance(sock, GreenSocket): + sock = GreenSocket(sock) +- + self.act_non_blocking = sock.act_non_blocking + + if six.PY2: +@@ -57,42 +98,12 @@ class GreenSSLSocket(_original_sslsocket): + # this assignment + self._timeout = sock.gettimeout() + +- if sys.version_info >= (3, 7): +- # Monkey-patch the sslsocket so our modified self gets +- # injected into its _create method. +- def fake_new(self, cls, *args, **kwargs): +- return self +- +- orig_new = _original_sslsocket.__new__ +- try: +- _original_sslsocket.__new__ = fake_new.__get__(self, GreenSSLSocket) +- +- self = _original_wrap_socket( +- sock=sock.fd, +- keyfile=keyfile, +- certfile=certfile, +- server_side=server_side, +- cert_reqs=cert_reqs, +- ssl_version=ssl_version, +- ca_certs=ca_certs, +- do_handshake_on_connect=False, +- *args, **kw +- ) +- self.keyfile = keyfile +- self.certfile = certfile +- self.cert_reqs = cert_reqs +- self.ssl_version = ssl_version +- self.ca_certs = ca_certs +- finally: +- # Unpatch +- _original_sslsocket.__new__ = orig_new +- else: ++ if _is_under_py_3_7: + # nonblocking socket handshaking on connect got disabled so let's pretend it's disabled + # even when it's on + super(GreenSSLSocket, self).__init__( + sock.fd, keyfile, certfile, server_side, cert_reqs, ssl_version, + ca_certs, do_handshake_on_connect and six.PY2, *args, **kw) +- + # the superclass initializer trashes the methods so we remove + # the local-object versions of them and let the actual class + # methods shine through +@@ -354,7 +365,7 @@ class GreenSSLSocket(_original_sslsocket): + except NameError: + self._sslobj = sslobj + else: +- if sys.version_info < (3, 7): ++ if _is_under_py_3_7: + self._sslobj = SSLObject(sslobj, owner=self) + else: + self._sslobj = sslobj +@@ -396,6 +407,7 @@ class GreenSSLSocket(_original_sslsocket): + def dup(self): + raise NotImplementedError("Can't dup an ssl object") + ++ + SSLSocket = GreenSSLSocket + + +-- +2.21.0 + diff --git a/python-eventlet.changes b/python-eventlet.changes index cf69c09..a6dfc51 100644 --- a/python-eventlet.changes +++ b/python-eventlet.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Mon Apr 29 06:00:44 UTC 2019 - Thomas Bechtold + +- add 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch +- add 0002-Fix-for-Python-3.7-506.patch and + add 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch + Both needed for python 3.7 compatibility + ------------------------------------------------------------------- Mon Apr 29 04:30:11 UTC 2019 - Thomas Bechtold diff --git a/python-eventlet.spec b/python-eventlet.spec index e854e63..b925633 100644 --- a/python-eventlet.spec +++ b/python-eventlet.spec @@ -25,8 +25,15 @@ License: MIT Group: Development/Languages/Python URL: http://eventlet.net Source: https://files.pythonhosted.org/packages/source/e/eventlet/eventlet-%{version}.tar.gz -# # PATCH-FIX-UPSTREAM 0001-IMPORTANT-late-import-in-use_hub-thread-race-caused-.patch -- https://github.com/eventlet/eventlet/commit/77bccbe48d4d9a46982b2e0503e76784e76b066a +# PATCH-FIX-UPSTREAM 0001-IMPORTANT-late-import-in-use_hub-thread-race-caused-.patch -- https://github.com/eventlet/eventlet/commit/77bccbe48d4d9a46982b2e0503e76784e76b066a Patch0: 0001-IMPORTANT-late-import-in-use_hub-thread-race-caused-.patch +# PATCH-FIX-UPSTREAM 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch -- https://github.com/eventlet/eventlet/commit/a28a275393d3c3ae3c3a5341cc4764fad21be3e5 +Patch1: 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch +# PATCH-FIX-UPSTREAM 0002-Fix-for-Python-3.7-506.patch -- https://github.com/eventlet/eventlet/commit/cf47cb518db3e0dbdd48473fb40cf9f6ecd50e07 +Patch2: 0002-Fix-for-Python-3.7-506.patch +# PATCH-FIX-UPSTREAM 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch -- https://github.com/eventlet/eventlet/commit/a915bb642dd6cd4e92c959addff30509977a637c +Patch3: 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch + BuildRequires: %{python_module Sphinx} BuildRequires: %{python_module greenlet} BuildRequires: %{python_module setuptools} @@ -66,6 +73,9 @@ for Python that allows changing how code is run. %prep %setup -q -n eventlet-%{version} %patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 sed -i '/enum.compat/d' setup.py # crude way to drop the strange "enum-compat" requirement sed -i "s|^#!.*||" eventlet/support/greendns.py # Fix non-executable script