def connect(self, addr, port, password): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) # try to connect to server try: # Connect to server and send data sock.connect((addr, port)) buf = BufferStruct(opcode=100) # create challenge rand = random.randint(1, 254) m = hashlib.md5() m.update(password.encode('utf-16')) m.update(str(rand).encode('utf-8')) # send login challenge buf.push_null_str8(m.hexdigest()) buf.push_uint8(rand) # add protocol version buf.push_len_str8(PROTOCOL_VERSION) sock.send(buf.buffer) # Receive data from the server msg = sock.recv(1024) if msg is None or len(msg) == 0: msg = str() sid = None buf = BufferStruct(msg) while not buf.empty(): opcode = buf.pop_uint8() if opcode == 200: print("Connected to tagar server: %s:%d" % (addr, port)) sid = buf.pop_len_str8() login_ok = True if opcode == 201: print("[Tagar Server]: %s" % (buf.pop_len_str16(),)) if not sid: print("Connection to team server rejected!") sock.close() return self.session = Session(sid, sock) self.player = Player(self.session) self.force_player_update = True except socket.error: print("Could not connect to tagar server: %s:%d" % (addr, port))
def client_handler(self, sock, addr): try: sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) buf = BufferStruct(sock.recv(1024)) opcode = buf.pop_uint8() if opcode != 100: print("Rejected connection from %s due to wrong opcode %d!" % (addr, opcode)) sock.close() return # get client challenge hash = buf.pop_null_str8() rand = buf.pop_uint8() m = hashlib.md5() m.update(self.password.encode("utf-16")) m.update(str(rand).encode("utf-8")) # check if hashes are matching if m.hexdigest() != hash: msg = str("Rejected connection from %s due to wrong password!" % (addr,)) print(msg) buf = BufferStruct(opcode=201) buf.push_len_str16(msg) sock.send(buf.buffer) sock.close() return client_version = buf.pop_len_str8() if client_version != PROTOCOL_VERSION: msg = str( "Rejected connection from %s due to wrong protocol version (Client: %s, Server: %s)!" % (addr, client_version, str(PROTOCOL_VERSION)) ) print(msg) buf = BufferStruct(opcode=201) buf.push_len_str16(msg) sock.send(buf.buffer) sock.close() return print("Accepted connection from: ", addr) # init session id = uuid.uuid4() # send session id to client buf = BufferStruct(opcode=200) buf.push_len_str8(str(id)) # add welcome message buf.push_uint8(201) buf.push_len_str16("Welcome on Tagar server at %s" % (self.address,)) sock.send(buf.buffer) self.player_list_lock.acquire() self.world_lock.acquire() session = Session(id, sock) self.player_list.append(Player(session)) self.force_player_list_update = True # TODO: Send full map self.player_list_lock.release() self.world_lock.release() except socket.error: sock.close()