def data_received(self, data): """ Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ # try to decode as utf-8, ignore any erroneous characters self.buffer += data.decode('utf-8', 'ignore') if len(self.buffer) > 8192: self.client.disconnect() for msg in self.get_messages(): if len(msg) < 2: self.client.disconnect() return # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] spl = msg.split('#', 1) msg = '#'.join([fanta_decrypt(spl[0])] + spl[1:]) logger.log_debug('[INC][RAW]{}'.format(msg), self.client) try: cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) except KeyError: return
def data_received(self, data): """ Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ buf = data if buf is None: buf = b'' # try to decode as utf-8, ignore any erroneous characters self.buffer += buf.decode('utf-8', 'ignore') self.buffer = self.buffer.translate({ord(c): None for c in '\0'}) if len(self.buffer) > 8192: msg = self.buffer if len( self.buffer) < 512 else self.buffer[:512] + '...' logger.log_server( 'Terminated {} (packet too long): sent {} ({} bytes)'.format( self.client.get_ipreal(), msg, len(self.buffer))) self.client.disconnect() return found_message = False for msg in self.get_messages(): found_message = True if len(msg) < 2: # This immediatelly kills any client that does not even try to follow the proper # client protocol msg = self.buffer if len( self.buffer) < 512 else self.buffer[:512] + '...' logger.log_server( 'Terminated {} (packet too short): sent {} ({} bytes)'. format(self.client.get_ipreal(), msg, len(self.buffer))) self.client.disconnect() return # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] spl = msg.split('#', 1) msg = '#'.join([fanta_decrypt(spl[0])] + spl[1:]) logger.log_debug('[INC][RAW]{}'.format(msg), self.client) try: # print(f'> {self.client.id}: {msg}') cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) except Exception as ex: self.server.send_error_report(self.client, cmd, args, ex) if not found_message: # This immediatelly kills any client that does not even try to follow the proper # client protocol msg = self.buffer if len( self.buffer) < 512 else self.buffer[:512] + '...' logger.log_server( 'Terminated {} (packet syntax unrecognized): sent {} ({} bytes)' .format(self.client.get_ipreal(), msg, len(self.buffer))) self.client.disconnect()
def data_received(self, data): """Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ buf = data ipid = self.client.ipid if buf is None: buf = b'' if not isinstance(buf, str): # try to decode as utf-8, ignore any erroneous characters self.buffer += buf.decode('utf-8', 'ignore') else: self.buffer = buf self.buffer = self.buffer.translate({ord(c): None for c in '\0'}) if len(self.buffer) > 8192: self.client.disconnect() try: for msg in self.get_messages(): if len(msg) < 2: continue # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] spl = msg.split('#', 1) msg = '#'.join([fanta_decrypt(spl[0])] + spl[1:]) try: cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) if cmd != 'CH': self.client.last_pkt_time = time() except KeyError: logger_debug.debug( f'Unknown incoming message from {ipid}: {msg}') if not self.client.is_checked: raise ProtocolError except ProtocolError: self.client.disconnect()
def data_received(self, data): """ Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ buf = data if not self.client.is_checked and self.server.ban_manager.is_banned( self.client.ipid): self.client.transport.close() else: self.client.is_checked = True if buf is None: buf = b'' if not isinstance(buf, str): # try to decode as utf-8, ignore any erroneous characters self.buffer += buf.decode('utf-8', 'ignore') else: self.buffer = buf if len(self.buffer) > 8192: self.client.disconnect() for msg in self.get_messages(): if len(msg) < 2: continue # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] spl = msg.split('#', 1) msg = '#'.join([fanta_decrypt(spl[0])] + spl[1:]) logger.log_debug('[INC][RAW]{}'.format(msg), self.client) try: cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) except KeyError: logger.log_debug('[INC][UNK]{}'.format(msg), self.client)
def data_received(self, data): """ Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ buf = data if buf is None: buf = b'' # try to decode as utf-8, ignore any erroneous characters self.buffer += buf.decode('utf-8', 'ignore') self.buffer = self.buffer.translate({ord(c): None for c in '\0'}) if len(self.buffer) > 8192: self.client.disconnect() found_message = False for msg in self.get_messages(): found_message = True if len(msg) < 2: self.client.disconnect() return # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] spl = msg.split('#', 1) msg = '#'.join([fanta_decrypt(spl[0])] + spl[1:]) logger.log_debug('[INC][RAW]{}'.format(msg), self.client) try: cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) except Exception as ex: self.server.send_error_report(self.client, cmd, args, ex) if not found_message: # This immediatelly kills webAO or any client that does not even try to follow the # standalone client protocol self.client.disconnect()
def data_received(self, data): """ Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ buf = data if buf is None: buf = b'' # try to decode as utf-8, ignore any erroneous characters self.buffer += buf.decode('utf-8', 'ignore') self.buffer = self.buffer.translate({ord(c): None for c in '\0'}) if len(self.buffer) > 8192: msg = self.buffer if len(self.buffer) < 512 else self.buffer[:512] + '...' logger.log_server('Terminated {} (packet too long): sent {} ({} bytes)' .format(self.client.get_ipreal(), msg, len(self.buffer))) self.client.disconnect() return found_message = False for msg in self.get_messages(): found_message = True if len(msg) < 2: # This immediatelly kills any client that does not even try to follow the proper # client protocol msg = self.buffer if len(self.buffer) < 512 else self.buffer[:512] + '...' logger.log_server('Terminated {} (packet too short): sent {} ({} bytes)' .format(self.client.get_ipreal(), msg, len(self.buffer))) self.client.disconnect() return # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] raw_parameters = msg.split('#') raw_parameters[0] = fanta_decrypt(raw_parameters[0]) msg = '#'.join(raw_parameters) logger.log_debug('[INC][RAW]{}'.format(msg), self.client) try: if self.server.print_packets: print(f'> {self.client.id}: {msg}') self.server.log_packet(self.client, msg, True) # Decode AO clients' encoding cmd, *args = Constants.decode_ao_packet(msg.split('#')) try: dispatched = self.net_cmd_dispatcher[cmd] except KeyError: logger.log_pserver(f'Client {self.client.id} sent abnormal packet {msg} ' f'(client version: {self.client.version}).') else: dispatched(self, args) except AOProtocolError.InvalidInboundPacketArguments: pass except Exception as ex: self.server.send_error_report(self.client, cmd, args, ex) if not found_message: # This immediatelly kills any client that does not even try to follow the proper # client protocol msg = self.buffer if len(self.buffer) < 512 else self.buffer[:512] + '...' logger.log_server('Terminated {} (packet syntax unrecognized): sent {} ({} bytes)' .format(self.client.get_ipreal(), msg, len(self.buffer))) self.client.disconnect()
def data_received(self, data): """ Handles any data received from the network. Receives data, parses them into a command and passes it to the command handler. :param data: bytes of data """ # try to decode as utf-8, ignore any erroneous characters self.buffer += data.decode('utf-8', 'ignore') if len(self.buffer) > 8192: self.client.disconnect() for msg in self.get_messages(): if len(msg) < 2: self.client.disconnect() return # general netcode structure is not great if msg[0] in ('#', '3', '4'): if msg[0] == '#': msg = msg[1:] spl = msg.split('#', 1) msg = '#'.join([fanta_decrypt(spl[0])] + spl[1:]) logger.log_debug('[INC][RAW]{}'.format(msg), self.client) try: cmd, *args = msg.split('#') self.net_cmd_dispatcher[cmd](self, args) except Exception as ex: # Send basic logging information to user info = '=========\nThe server ran into a Python issue. Please contact the server owner and send them the following logging information:' etype, evalue, etraceback = sys.exc_info() tb = traceback.extract_tb(tb=etraceback) current_time = asctime(localtime(time())) file, line_num, module, func = tb[-1] file = file[file.rfind('\\') + 1:] # Remove unnecessary directories info += '\r\n*Server time: {}'.format(current_time) info += '\r\n*Packet details: {} {}'.format(cmd, args) info += '\r\n*Client status: {}, {}, {}'.format( self.client.id, self.client.get_char_name(), self.client.is_staff()) info += '\r\n*Area status: {}, {}'.format( self.client.area.id, len(self.client.area.clients)) info += '\r\n*File: {}'.format(file) info += '\r\n*Line number: {}'.format(line_num) info += '\r\n*Module: {}'.format(module) info += '\r\n*Function: {}'.format(func) info += '\r\n*Error: {}: {}'.format(type(ex).__name__, ex) info += '\r\nYour help would be much appreciated.' info += '\r\n=========' self.client.send_host_message(info) # Print complete traceback to console info = 'TSUSERVER HAS ENCOUNTERED AN ERROR HANDLING A CLIENT PACKET' info += '\r\n*Server time: {}'.format(current_time) info += '\r\n*Packet details: {} {}'.format(cmd, args) info += '\r\n*Client status: {}, {}, {}'.format( self.client.id, self.client.get_char_name(), self.client.is_staff()) info += '\r\n*Area status: {}, {}'.format( self.client.area.id, len(self.client.area.clients)) logger.log_print(info) traceback.print_exception(etype, evalue, etraceback)
def test_fanta_decrypt(): assert fanta_decrypt("4D90") == "MS"