diff --git a/bumper/xmppserver.py b/bumper/xmppserver.py index 02471c4..5ad8e22 100644 --- a/bumper/xmppserver.py +++ b/bumper/xmppserver.py @@ -41,8 +41,8 @@ class XMPPServer: def client_done(task): del self.aclients[task] - client_writer.close() - xmppserverlog.info("End Connection") + xmppserverlog.info("End Connection for {}".format(client_writer.get_extra_info("peername"))) + client_writer.close() clientaddr = client_writer.get_extra_info("peername") xmppserverlog.info("New Connection from {}".format(clientaddr)) @@ -197,24 +197,29 @@ class XMPPAsyncClient: self.devclass = "" self.bumper_jid = "" self.uid = "" - self.log_sent_message = False # Set to true to log sends + self.log_sent_message = True # Set to true to log sends self.log_incoming_data = True # Set to true to log sends xmppserverlog.debug("new client with ip {}".format(self.address)) async def handle_async_client(self): - # xmppserverlog.info('client connected - {}'.format(self.address)) + # xmppserverlog.info('client connected - {}'.format(self.address)) + #await self._set_state("READY") await self._set_state("CONNECT") - pingtask = asyncio.Task(self.send_ping(30)) - while not self.state == self.DISCONNECT: - data = await self.client_reader.read(4096) - # data = await asyncio.wait_for(client_reader.readline(), timeout=10.0) - if data is None: - xmppserverlog.warning("Received no data") - # exit loop and disconnect - return + #asyncio.Task(self.send_ping(30)) + while True: + await asyncio.sleep(0.1) + if not self.state == self.DISCONNECT: + data = await self.client_reader.read(4096) + # data = await asyncio.wait_for(client_reader.readline(), timeout=10.0) + if data is None: + xmppserverlog.warning("Received no data") + # exit loop and disconnect + return - await self._parse_data(data) + await self._parse_data(data) + else: + break # exit loop and disconnect return @@ -302,6 +307,24 @@ class XMPPAsyncClient: ) ) return + + if "disco#items" in data: + # Return not-implemented for disco#items + await self.send( + ''.format( + xml.get("id") + )) + return + + if "disco#info" in data: + # Return not-implemented for disco#info + await self.send( + ''.format( + xml.get("id") + ) + ) + return + if xml.get("type") == "set": if ( @@ -316,7 +339,7 @@ class XMPPAsyncClient: ) ) - if xml[0][0]: + if len(xml[0]) > 0: ctl = xml[0][0] if ctl.get("admin") and self.type == self.BOT: xmppserverlog.debug( @@ -580,6 +603,7 @@ class XMPPAsyncClient: xmlauth = xml[0].getchildren() # uid = "" password = "" + authcode = "" resource = "" for aitem in xmlauth: if "username" in aitem.tag: @@ -655,6 +679,7 @@ class XMPPAsyncClient: saslauth = base64.b64decode(xml.text).decode("utf-8").split("/") username = saslauth[0] username = saslauth[0].split("\x00")[1] + authcode = "" self.uid = username if len(saslauth) > 1: resource = saslauth[1] @@ -761,8 +786,10 @@ class XMPPAsyncClient: async def _handle_session(self, xml): try: res = ''.format(xml.get("id")) - await self._set_state("READY") + await self._set_state("READY") await self.send(res) + asyncio.Task(self.send_ping(30)) + except Exception as e: xmppserverlog.exception("{}".format(e)) @@ -780,6 +807,8 @@ class XMPPAsyncClient: await self.send( ' dummy '.format(self.bumper_jid) ) + + # If it is a BOT, send extras if self.type == self.BOT: @@ -790,11 +819,13 @@ class XMPPAsyncClient: ) ) + + else: xmppserverlog.debug( "client presence - {} ".format(ET.tostring(xml, encoding="utf-8")) ) - + if xml.get("type") == "available": xmppserverlog.debug( "client presence available - {} ".format(