14
0

- 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
This commit is contained in:
Thomas Bechtold
2019-04-29 06:10:38 +00:00
committed by Git OBS Bridge
parent 9b7862e481
commit 82c5a213c9
5 changed files with 347 additions and 1 deletions

View File

@@ -0,0 +1,67 @@
From a28a275393d3c3ae3c3a5341cc4764fad21be3e5 Mon Sep 17 00:00:00 2001
From: Sergey Shepelev <temotor@gmail.com>
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

View File

@@ -0,0 +1,96 @@
From cf47cb518db3e0dbdd48473fb40cf9f6ecd50e07 Mon Sep 17 00:00:00 2001
From: Marcel Plch <mplch@redhat.com>
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

View File

@@ -0,0 +1,165 @@
From a915bb642dd6cd4e92c959addff30509977a637c Mon Sep 17 00:00:00 2001
From: Junyi <xmaswillyou@gmail.com>
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

View File

@@ -1,3 +1,11 @@
-------------------------------------------------------------------
Mon Apr 29 06:00:44 UTC 2019 - Thomas Bechtold <tbechtold@suse.com>
- 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 <tbechtold@suse.com>

View File

@@ -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