Beispiel #1
0
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'
Beispiel #3
0
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])
Beispiel #4
0
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])
Beispiel #5
0
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])