Add STARTTLS #37

Merged
bmartin5692 merged 2 commits from dev_starttls_#35 into master 2019-05-30 02:54:40 +02:00
Showing only changes of commit b50b0df734 - Show all commits

View file

@ -15,6 +15,10 @@ class XMPPServer:
client_id = None client_id = None
clients = [] clients = []
exit_flag = False exit_flag = False
server_cert = "./certs/cert.pem"
server_key = "./certs/key.pem"
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain(server_cert, server_key)
def __init__(self, address): def __init__(self, address):
# Initialize bot server # Initialize bot server
@ -24,6 +28,13 @@ class XMPPServer:
xmppserverlog.info( xmppserverlog.info(
"Starting XMPP Server at {}:{}".format(self.address[0], self.address[1]) "Starting XMPP Server at {}:{}".format(self.address[0], self.address[1])
) )
#if self.usessl:
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain(bumper.server_cert, bumper.server_key)
#server = await asyncio.start_server(
# self.accept_client, self.address[0], self.address[1],ssl=ssl_ctx,
#)
#else:
server = await asyncio.start_server( server = await asyncio.start_server(
self.accept_client, self.address[0], self.address[1] self.accept_client, self.address[0], self.address[1]
) )
@ -413,8 +424,12 @@ class XMPPAsyncClient:
await asyncio.sleep(0.25) await asyncio.sleep(0.25)
#time.sleep(0.25) #time.sleep(0.25)
# send authentication support for iq-auth (fallback) and SASL # send authentication support for iq-auth (fallback) and SASL
#await self.send(
# '<stream:features><auth xmlns="http://jabber.org/features/iq-auth"/><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanisms></stream:features>'
#)
#With STARTTLS #https://xmpp.org/rfcs/rfc3920.html
await self.send( await self.send(
'<stream:features><auth xmlns="http://jabber.org/features/iq-auth"/><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanisms></stream:features>' '<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls><auth xmlns="http://jabber.org/features/iq-auth"/><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanisms></stream:features>'
) )
# await self.send('<stream:features><auth xmlns="http://jabber.org/features/iq-auth"/></stream:features>') # await self.send('<stream:features><auth xmlns="http://jabber.org/features/iq-auth"/></stream:features>')
@ -463,6 +478,32 @@ class XMPPAsyncClient:
except Exception as e: except Exception as e:
xmppserverlog.exception("{}".format(e)) xmppserverlog.exception("{}".format(e))
async def _handle_starttls(self, data):
try:
peer = self.client_writer.get_extra_info("peername")
xmppserverlog.debug("Upgrading connection with STARTTLS for {}:{}".format(peer[0],peer[1]))
await self.send("<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>") #send process to client
# After proceed the connection should be upgraded to TLS
loop = asyncio.get_event_loop()
transport = self.client_writer._transport
protocol = self.client_writer.transport.get_protocol()
new_transport = await loop.start_tls(transport , protocol, XMPPServer.ssl_ctx, server_side=True)
#protocol._stream_reader = asyncio.StreamReader(loop=loop)
#protocol._client_connected_cb = do_after_startls()
# protocol.connection_made(new_transport)
#self.client_reader.set_transport(new_transport)
#self.client_writer = transport#protocol._stream_writer
#await loop.start_tls(self.client_writer.transport, self.client_writer._protocol, XMPPServer.ssl_ctx, server_side=True)
except Exception as e:
xmppserverlog.exception("{}".format(e))
async def _handle_iq_auth(self, data): async def _handle_iq_auth(self, data):
try: try:
xml = ET.fromstring(data.decode("utf-8")) xml = ET.fromstring(data.decode("utf-8"))
@ -775,6 +816,9 @@ class XMPPAsyncClient:
await self._handle_sasl_auth(item) await self._handle_sasl_auth(item)
item.clear() item.clear()
elif "-tls" in item.tag:
await self._handle_starttls(newdata.encode("utf-8"))
elif "presence" in item.tag: elif "presence" in item.tag:
await self._handle_presence(item) await self._handle_presence(item)
item.clear() item.clear()