def decode(self, bbuff, proto_comp_state): self.data = {} packet_length = datautils.unpack(MC_VARINT, bbuff) packet_data = bbuff.recv(packet_length) pbuff = BoundBuffer(packet_data) if proto_comp_state == mcdata.PROTO_COMP_ON: body_length = datautils.unpack(MC_VARINT, pbuff) if body_length > 0: body_data = zlib.decompress(pbuff.flush(), zlib.MAX_WBITS) pbuff.write(body_data) pbuff.save() try: # Ident self.__ident[2] = datautils.unpack(MC_VARINT, pbuff) self.ident = tuple(self.__ident) self.str_ident = mcdata.packet_ident2str[self.ident] # Payload for dtype, name in mcdata.hashed_structs[self.ident]: self.data[name] = datautils.unpack(dtype, pbuff) # Extension if self.ident in hashed_extensions: hashed_extensions[self.ident].decode_extra(self, pbuff) if len(pbuff) > 0: raise PacketDecodeFailure(self, pbuff) except BufferUnderflowException: raise PacketDecodeFailure(self, pbuff, True) return self
def decode(self, bbuff, proto_comp_state): self.data = {} packet_length = datautils.unpack(MC_VARINT, bbuff) packet_data = bbuff.recv(packet_length) pbuff = BoundBuffer(packet_data) if proto_comp_state == proto.PROTO_COMP_ON: body_length = datautils.unpack(MC_VARINT, pbuff) if body_length: body_data = zlib.decompress(pbuff.flush(), zlib.MAX_WBITS) pbuff.write(body_data) pbuff.save() try: # Ident self.__ident[2] = datautils.unpack(MC_VARINT, pbuff) self.ident = tuple(self.__ident) self.str_ident = proto.packet_ident2str[self.ident] # Payload for dtype, name in proto.hashed_structs[self.ident]: self.data[name] = datautils.unpack(dtype, pbuff) # Extension if self.ident in hashed_extensions: hashed_extensions[self.ident].decode_extra(self, pbuff) if pbuff: raise PacketDecodeFailure(self, pbuff) except BufferUnderflowException: raise PacketDecodeFailure(self, pbuff, True) return self
class NetCore(object): def __init__(self, sock, event, select): self.sock = sock self.event = event self.select = select self.host = None self.port = None self.connected = False self.encrypted = False self.proto_state = proto.HANDSHAKE_STATE self.comp_state = proto.PROTO_COMP_OFF self.comp_threshold = -1 self.sbuff = b'' self.rbuff = BoundBuffer() def reset(self, sock): self.__init__(sock, self.event, self.select) def connect(self, host='localhost', port=25565): self.host = host self.port = port try: logger.debug('NETCORE: Attempting to connect to host: %s port: %s', host, port) # Set the connect to be a blocking operation self.sock.setblocking(True) self.sock.connect((host, port)) self.sock.setblocking(False) self.connected = True self.event.emit('net_connect', (host, port)) logger.debug('NETCORE: Connected to host: %s port: %s', host, port) except socket.error as error: logger.error('NETCORE: Error on Connect') self.event.emit('SOCKET_ERR', error) def set_proto_state(self, state): self.proto_state = state self.event.emit(proto.state_lookup[state] + '_STATE') def set_comp_state(self, threshold): self.comp_threshold = threshold if threshold >= 0: self.comp_state = proto.PROTO_COMP_ON def push(self, packet): data = packet.encode(self.comp_state, self.comp_threshold) self.sbuff += (self.cipher.encrypt(data) if self.encrypted else data) self.event.emit(packet.ident, packet) self.event.emit(packet.str_ident, packet) self.select.schedule_sending(self.sock) def push_packet(self, ident, data): self.push(mcpacket.Packet(ident, data)) def read_packet(self, data=b''): self.rbuff.append( self.cipher.decrypt(data) if self.encrypted else data) while self.rbuff: self.rbuff.save() try: packet = mcpacket.Packet(ident=( self.proto_state, proto.SERVER_TO_CLIENT )).decode(self.rbuff, self.comp_state) except BufferUnderflowException: self.rbuff.revert() break except mcpacket.PacketDecodeFailure as err: logger.warning('NETCORE: Packet decode failed') logger.warning( 'NETCORE: Failed packet ident is probably: %s', err.packet.str_ident ) self.event.emit('PACKET_ERR', err) break self.event.emit(packet.ident, packet) self.event.emit(packet.str_ident, packet) def enable_crypto(self, secret_key): self.cipher = AESCipher(secret_key) self.encrypted = True def disable_crypto(self): self.cipher = None self.encrypted = False
class NetCore(object): def __init__(self, sock, event): self.sock = sock self.event = event self.host = None self.port = None self.connected = False self.encrypted = False self.proto_state = proto.HANDSHAKE_STATE self.comp_state = proto.PROTO_COMP_OFF self.comp_threshold = -1 self.sbuff = b'' self.rbuff = BoundBuffer() def connect(self, host='localhost', port=25565): self.host = host self.port = port try: logger.debug("NETCORE: Attempting to connect to host: %s port: %s", host, port) # Set the connect to be a blocking operation self.sock.setblocking(True) self.sock.connect((self.host, self.port)) self.sock.setblocking(False) self.connected = True self.event.emit('net_connect', (self.host, self.port)) logger.debug("NETCORE: Connected to host: %s port: %s", host, port) except socket.error as error: logger.error("NETCORE: Error on Connect") self.event.emit('SOCKET_ERR', error) def set_proto_state(self, state): self.proto_state = state self.event.emit(proto.state_lookup[state] + '_STATE') def set_comp_state(self, threshold): self.comp_threshold = threshold if threshold >= 0: self.comp_state = proto.PROTO_COMP_ON def push(self, packet): data = packet.encode(self.comp_state, self.comp_threshold) self.sbuff += (self.cipher.encrypt(data) if self.encrypted else data) self.event.emit(packet.ident, packet) self.event.emit(packet.str_ident, packet) self.sock.sending = True def push_packet(self, ident, data): self.push(mcpacket.Packet(ident, data)) def read_packet(self, data=b''): self.rbuff.append( self.cipher.decrypt(data) if self.encrypted else data) while self.rbuff: self.rbuff.save() try: packet = mcpacket.Packet( ident=(self.proto_state, proto.SERVER_TO_CLIENT)).decode( self.rbuff, self.comp_state) except BufferUnderflowException: self.rbuff.revert() break except mcpacket.PacketDecodeFailure as err: logger.warning('NETCORE: Packet decode failed') logger.warning('NETCORE: Failed packet ident is probably: %s', err.packet.str_ident) self.event.emit('PACKET_ERR', err) break self.event.emit(packet.ident, packet) self.event.emit(packet.str_ident, packet) def enable_crypto(self, secret_key): self.cipher = AESCipher(secret_key) self.encrypted = True def disable_crypto(self): self.cipher = None self.encrypted = False def reset(self, sock): self.__init__(sock, self.event)