def check_heartbeat_time(heartbeat, log_in_list, key_iv): while(True): time.sleep(300) now = time.time() for ident in heartbeat: if now - heartbeat[ident][1] > 2000: # 2000s logout_user = heartbeat[ident][0] print ("%s will expired because of lost of heartbeat" %(logout_name)) for name1 in log_in_list: # check name in list ident1 = log_in_list[name1][0] if name1 == logout_user: continue cha2 = random.randint(1,10001) logout_request.C2 = cha2 flag = 0 while flag == 0: key1 = key_iv[ident1][0] iv1 = key_iv[ident1][1] send_message = util.aes_en(key1, iv1, logout_request.SerializeToString()) socket.send_multipart([ident1, send_message]) logout_res = socket.recv_multipart() logout_res_de = util.rsa_de(logout_res[1]) logout_response = protobuf_pb2.MyProtocol() logout_response.ParseFromString(logout_res_de) if logout_response.TypeNumber == 101: if logout_response.C2 == cha2 + 1: flag = 1 del log_in_list[logout_user] print ("%s have logged off" %(data.Sender_name))
def list_server(socket, ident, data, reply, key_iv, log_in_list): try: print("%s wants to list" %(data.Sender_name)) key = key_iv[ident][0] iv = key_iv[ident][1] listname = "Logged in: " for name in log_in_list: # print log in list listname = listname + name + " " reply.TypeNumber = 32 reply.Note = listname cha2 = random.randint(1,10001) reply.C2 = cha2 s_msg = util.aes_en(key, iv, reply.SerializeToString()) socket.send_multipart([ident, s_msg]) except: # Error key = key_iv[ident][0] iv = key_iv[ident][1] reply.TypeNumber = 0 reply.Note = "List Error happen" reply.Key = "0" reply.Error = "List Error happen" s_msg = util.aes_en(key, iv, reply.SerializeToString()) socket.send_multipart([ident, s_msg]) else: # confirm receive list_rq3 = socket.recv_multipart() list_rq3_de = util.rsa_de(list_rq3[1]) list_request3 = protobuf_pb2.MyProtocol() list_request3.ParseFromString(list_rq3_de) if list_request3.C2 == cha2: print 'List complete'
def sign_up_server(socket, ident, data, reply, key_iv): try: print("%s wants to sign up" % (data.UserName)) key = key_iv[ident][0] iv = key_iv[ident][1] write_in_pw = util.bcrypt_hash(str( data.Password)) # get hashed password repeat = features.check_repeat_in_sign_up( "sign_up.txt", data.UserName) # check repeat if repeat == 0: with open("sign_up.txt", 'a+') as f: f.write(data.UserName + " " + write_in_pw + " \n") reply.TypeNumber = 11 reply.UserName = data.UserName reply.Note = "Congratulation, you have signed up successfully" reply.C1 = data.C1 cha2 = random.randint(1, 10001) reply.C2 = cha2 s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature]) message = socket.recv_multipart() message_de = util.rsa_de(message[1]) sign_up_3 = protobuf_pb2.MyProtocol() sign_up_3.ParseFromString(message_de) if sign_up_3.C2 == cha2: # check challenge print("%s have signed up" % (sign_up_3.UserName)) else: features.delete_from_file("sign_up.txt", data.UserName) # delete the sign up information else: reply.TypeNumber = 999 # repeat reply.Note = "0" reply.Key = "0" reply.Error = "You have registered before, please log in" s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature]) except: key = key_iv[ident][0] iv = key_iv[ident][1] reply.TypeNumber = 0 reply.Note = "0" reply.Key = "0" reply.Error = "Sign up Error happen" s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature])
def log_out_server(socket, ident, data, key_iv, log_in_list): try: print("%s wants to log out" % (data.Sender_name)) key = key_iv[ident][0] iv = key_iv[ident][1] cha1 = data.C1 logout_user = data.Sender_name logout_request = protobuf_pb2.MyProtocol() logout_request.TypeNumber = 100 logout_request.Type = "Log out request from server" logout_request.Sender_name = logout_user for name1 in log_in_list: # check name in list ident1 = log_in_list[name1][0] if name1 == logout_user: continue cha2 = random.randint(1, 10001) logout_request.C2 = cha2 flag = 0 while flag == 0: key1 = key_iv[ident1][0] iv1 = key_iv[ident1][1] send_message = util.aes_en(key1, iv1, logout_request.SerializeToString()) socket.send_multipart([ident1, send_message]) logout_res = socket.recv_multipart() logout_res_de = util.rsa_de(logout_res[1]) logout_response = protobuf_pb2.MyProtocol() logout_response.ParseFromString(logout_res_de) if logout_response.TypeNumber == 101: if logout_response.C2 == cha2 + 1: flag = 1 msg_logout_rp = protobuf_pb2.MyProtocol() msg_logout_rp.TypeNumber = 102 msg_logout_rp.C1 = cha1 + 1 cha2 = random.randint(1, 10001) msg_logout_rp.C2 = cha2 socket.send_multipart( [ident, util.aes_en(key, iv, msg_logout_rp.SerializeToString())]) msg_logout_con = socket.recv_multipart() msg_logout_con_de = util.rsa_de(msg_logout_con[1]) msg_logout_confirm = protobuf_pb2.MyProtocol() msg_logout_confirm.ParseFromString(msg_logout_con_de) if msg_logout_confirm.TypeNumber == 103: if msg_logout_confirm.C2 == cha2 + 1: del log_in_list[data.Sender_name] print("%s have logged off" % (data.Sender_name)) except: # Error key = key_iv[ident][0] iv = key_iv[ident][1] msg_logout_rp = protobuf_pb2.MyProtocol() msg_logout_rp.TypeNumber = 0 msg_logout_rp.Error = "Log out Error happen" s_msg = util.aes_en(key, iv, msg_logout_rp.SerializeToString()) socket.send_multipart([ident, s_msg])
server_port = "9090" socket.bind("tcp://*:%s" %(server_port)) key_iv = {} # ident:[key, iv, time] log_in_list = {} # name:[ident, port_number] black_list = [] message_attempt = {} # ident:message_received heartbeat = {} # ident:[name, time] # receive message and decrypt try: while(True): message = socket.recv_multipart() ident = message[0] #features.check_in_black_list(ident, black_list) = 1 or 0 message_de = util.rsa_de(message[1]) reply = protobuf_pb2.MyProtocol() data = protobuf_pb2.MyProtocol() data.ParseFromString(message_de) if data.TypeNumber == 1 or data.TypeNumber == 2: key_iv[ident] = [data.Key_client.decode('base-64'), data.Iv_client.decode('base-64')] print '*****************************************' if data.TypeNumber == 1: # sign up Request sign_up.sign_up_server(socket, ident, data, reply, key_iv) if data.TypeNumber == 2: # Log in Request log_in.log_in_server(socket, ident, data, reply, key_iv, log_in_list) if data.TypeNumber == 3: # List request list1.list_server(socket, ident, data, reply, key_iv, log_in_list)
def log_in_server(socket, ident, data, reply, key_iv, log_in_list): try: flag = 0 print ("%s wants to log in" %(data.UserName)) key = key_iv[ident][0] iv = key_iv[ident][1] if data.UserName in log_in_list: print ("%s have already logged in" %(data.UserName)) reply.TypeNumber = 25 reply.Note = "You have already logged in, please do not try again" reply.C1 = data.C1 reply.C2 = random.randint(1,10001) s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature]) return with open("sign_up.txt", 'r') as f: for line in f: log = line.split(" ") name = log[0] Hash_password = log[1] if name == data.UserName: # check username if util.bcrypt_verify(str(data.Password), Hash_password) == True: # check password log_in_list[data.UserName] = [ident, data.Port] reply.TypeNumber = 21 reply.UserName = data.UserName reply.Note = "Welcome to chat, you have already Logged in" reply.C1 = data.C1 cha2 = random.randint(1,10001) reply.C2 = cha2 s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature]) message = socket.recv_multipart() message_de = util.rsa_de(message[1]) log_in_3 = protobuf_pb2.MyProtocol() log_in_3.ParseFromString(message_de) if log_in_3.C2 == cha2: print ("%s have logged in"%(log_in_3.UserName)) flag = 1 else: print 'logout the user' flag = 1 else: # wrong password reply.TypeNumber = 22 reply.Note = "Wrong password, please try again" reply.C1 = data.C1 reply.C2 = random.randint(1,10001) s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature]) flag = 1 if flag == 0: # not signed up yet reply.TypeNumber = 25 reply.Note = "You have not signed up, please sign up first" reply.C1 = data.C1 reply.C2 = random.randint(1,10001) s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature]) except: # Error key = key_iv[ident][0] iv = key_iv[ident][1] reply.TypeNumber = 0 reply.Error = "Log in Error happen" s_msg = util.aes_en(key, iv, reply.SerializeToString()) s_msg_signature = util.rsa_sign(s_msg) socket.send_multipart([ident, s_msg, s_msg_signature])