WIP - Init
WIP, not working
This commit is contained in:
parent
32ae8468a3
commit
b50b0df734
1 changed files with 47 additions and 3 deletions
|
|
@ -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,10 +28,17 @@ 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]
|
||||||
)
|
)
|
||||||
|
|
||||||
await server.serve_forever()
|
await server.serve_forever()
|
||||||
|
|
||||||
# self.clients = {} # task -> (reader, writer)
|
# self.clients = {} # task -> (reader, writer)
|
||||||
|
|
@ -408,13 +419,17 @@ class XMPPAsyncClient:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
# with STARTTLS
|
# with STARTTLS
|
||||||
# await self.send('<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns:tls="http://www.ietf.org/rfc/rfc2595.txt" xmlns="jabber:client" version="1.0" id="1" from="{}">'.format(XMPPServer.server_id))
|
#await self.send('<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns:tls="http://www.ietf.org/rfc/rfc2595.txt" xmlns="jabber:client" version="1.0" id="1" from="{}">'.format(XMPPServer.server_id))
|
||||||
|
|
||||||
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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue