Fix compatibility with python 3.5 and 3.6

which do not have loop.start_tls and require the old ssl implementation.
This commit is contained in:
mathieui 2018-08-08 23:35:33 +02:00
parent 62661ee04f
commit 490f15b8fc
No known key found for this signature in database
GPG key ID: C59F84CEEFD616E3
2 changed files with 19 additions and 2 deletions

View file

@ -9,6 +9,10 @@
import logging import logging
logging.getLogger(__name__).addHandler(logging.NullHandler()) logging.getLogger(__name__).addHandler(logging.NullHandler())
import asyncio
# Required for python < 3.7 to use the old ssl implementation
# and manage to do starttls as an unintended side effect
asyncio.sslproto._is_sslproto_available = lambda: False
from slixmpp.stanza import Message, Presence, Iq from slixmpp.stanza import Message, Presence, Iq
from slixmpp.jid import JID, InvalidJID from slixmpp.jid import JID, InvalidJID

View file

@ -539,7 +539,17 @@ class XMLStream(asyncio.BaseProtocol):
self.event_when_connected = "tls_success" self.event_when_connected = "tls_success"
ssl_context = self.get_ssl_context() ssl_context = self.get_ssl_context()
try: try:
transp = await self.loop.start_tls(self.transport, self, ssl_context) if hasattr(self.loop, 'start_tls'):
transp = await self.loop.start_tls(self.transport,
self, ssl_context)
# Python < 3.7
else:
transp, _ = await self.loop.create_connection(
lambda: self,
ssl=self.ssl_context,
sock=self.socket,
server_hostname=self.default_domain
)
except ssl.SSLError as e: except ssl.SSLError as e:
log.debug('SSL: Unable to connect', exc_info=True) log.debug('SSL: Unable to connect', exc_info=True)
log.error('CERT: Invalid certificate trust chain.') log.error('CERT: Invalid certificate trust chain.')
@ -551,7 +561,10 @@ class XMLStream(asyncio.BaseProtocol):
der_cert = transp.get_extra_info("ssl_object").getpeercert(True) der_cert = transp.get_extra_info("ssl_object").getpeercert(True)
pem_cert = ssl.DER_cert_to_PEM_cert(der_cert) pem_cert = ssl.DER_cert_to_PEM_cert(der_cert)
self.event('ssl_cert', pem_cert) self.event('ssl_cert', pem_cert)
self.connection_made(transp) # If we use the builtin start_tls, the connection_made() protocol
# method is not called automatically
if hasattr(self.loop, 'start_tls'):
self.connection_made(transp)
return True return True
def _start_keepalive(self, event): def _start_keepalive(self, event):