Exemplo n.º 1
0
def register(usr, passwd, mail):
    """
	Cette fonction permet de créer un compte sur le serveur de messagerie.
	La fonction prend 3 paramètres : 

		- usr : le nom d'utilisateur souhaité
		- passwd : le mot de passe du compte
		- mail : l'adresse mail de l'utilisateur
	"""

    sha = hashlib.sha512((usr + " : " + passwd).encode()).hexdigest()
    key = RSA.generate(2048)
    public_key = key.publickey()
    key_to_send = crpt.crypt_message(key.exportKey(format='PEM'), passwd)
    acces = connection_server.ask_for_ticket()
    connection_server.requests[acces] = "REGISTER\\" + "\\".join([
        usr, sha, mail, key_to_send, "\\".join(
            public_key.exportKey().split("\n"))
    ])
    connection_server.ask_for_send(acces)
    msg_from_server = attendre_reponse(acces)
    if msg_from_server == "REGISTER\\OK":
        # --- Avertir l'utilisateur et lui proposer de se connecter ---
        pass
    elif msg_from_server == "REGISTER\\ERROR":
        # --- Avertir l'utilisateur et quitter l'application ---
        pass
    elif msg_from_server == "REGISTER\\USERNAME_ALREADY_EXISTS":
        # --- Avertir l'utilisateur que ce nom d'utilisateur est deja pris et lui proposer de recommencer avec les autres cases préremplies ---
        pass
    elif msg_from_server == "REGISTER\\EMAIL_ALREADY_USED":
        # --- Avertir l'utilisateur que ce mail est deja utilise et lui proposer de recommencer avec les autres cases préremplies ---
        pass
Exemplo n.º 2
0
def register():
    username = raw_input("Nom d'utilisateur : ")
    while not username:
        print "Le nom d'utilisateur ne doit pas etre vide... Veuillez réessayer !"
        username = raw_input("Nom d'utilisateur : ")
    passwd = ""
    passwd_conf = "a"
    while not passwd == passwd_conf:
        passwd = getpass.getpass("Mot de passe : ")
        while not passwd:
            print "Le mot de passe ne doit pas etre vide... Veuillez réessayer !"
            passwd = getpass.getpass("Mot de passe : ")
        passwd_conf = getpass.getpass("Confirmation du mot de passe : ")
        while not passwd_conf:
            print "Le mot de passe ne doit pas etre vide... Veuillez réessayer !"
            passwd_conf = getpass.getpass("Confirmation du mot de passe : ")
        if not passwd == passwd_conf:
            print "Les mots de passe ne correspondent pas... Veuillez réessayer !"
    email = raw_input("Email : ")
    while not email:
        print "L'email ne doit pas etre vide... Veuillez réessayer !"
        email = raw_input("Email : ")
    sha = hashlib.sha512((username + " : " + passwd).encode()).hexdigest()
    print "Creation de vos cles privees/publiques en cours (peut prendre quelques instants)"
    key = RSA.generate(4096)
    public_key = key.publickey()
    key_to_send = crpt.crypt_message(key.exportKey(format='PEM'), passwd)
    """print "len(public_key) = "+str(len(public_key.exportKey()))
	print "len(private) = "+str(len(key.exportKey()))
	print "len crypted = "+str(len(key_to_send))
	print 'len both = '+str(len(public_key.exportKey())+len(key_to_send))
	print 'len esle = '+str(len("REGISTER\\"+"\\".join([username, sha, email])))
	print "len soustract = "+str(len("REGISTER\\"+"\\".join([username, sha, email, key_to_send, "\\".join(public_key.exportKey().split("\n"))])) - len("REGISTER\\"+"\\".join([username, sha, email])) - 2*len("\\"))
	msg_to_send = "REGISTER\\"+"\\".join([username, sha, email, key_to_send, "\\".join(public_key.exportKey().split("\n"))])
	print "Envoye : "+msg_to_send
	print "len envoye : "+str(len(msg_to_send.split("\\")))"""
    connection_server.send(("REGISTER\\" + "\\".join([
        username, sha, email, key_to_send, "\\".join(
            public_key.exportKey().split("\n"))
    ]) + chr(23)))
    msg_recu = attendre_reponse()
    if msg_recu == "REGISTER\\OK":
        print "Enregistement reussi !"
    elif msg_recu == "REGISTER\\ERROR":
        print "Something went wrong... Please try again !"
        sys.exit()
    elif msg_recu == "REGISTER\\USERNAME_ALREADY_EXISTS":
        print "Ce nom d'utilisateur est déja pris... Veuillez réessayer !"
        register()
    elif msg_recu == "REGISTER\\EMAIL_ALREADY_USED":
        print "Cette adresse mail à deja été utilisée... Veuillez réessayer !"
        register()
Exemplo n.º 3
0
def envoyer_message(type=str(), dest=str(), message=str()):
    """
	Cette fonction permet d'envoyer un message. Elle doit terminer d'être codée.
	Elle prend 3 paramètres :

		- type : Deux valeurs possibles, à savoir 'single' ou 'group', correspondant respectivement à une conversation avec une seule personne
		et à une conversation de groupe.
		- dest : le destinataire dans le cas d'une conversation avec une seule personne, le nom du groupe dans le cas d'un groupe.
		- message : le message à envoyer.
	"""
    if type == "single":

        key_file = open(os.path.join(username, "keys", dest + "key"), "r")
        key = key_file.read()
        key_file.close()

        msg = "[" + datetime.datetime.isoformat(datetime.datetime.now(
        )) + "\\" + username + "]" + crpt.crypt_message(message, key)

        acces = connection_server.ask_for_ticket()
        connection_server.requests[acces] = "SEND\\" + dest + "\\" + msg
        connection_server.ask_for_send(acces)
        msg_from_server = attendre_reponse(acces)

        if msg_from_server == "SEND\\OK":
            # --- LE MESSAGE À ÉTÉ ENVOYÉ, INFORMER L'UTILISATEUR (VIA UN PETIT SIGNE SUR LE MESSAGE, CF WHATSAPP PAR EXEMPLE)
            conv_file = open(os.path.join(username, "messages", dest), "a")
            conv_file.write(
                "[" + datetime.datetime.isoformat(datetime.datetime.now()) +
                "\\" + username + "]" + message + "\n")
            conv_file.close()

            trier_conv(os.path.join(username, "messages", dest))

        else:
            # --- LE MESSAGE N'A PAS ETE REMIS. AVERTIR L'UTILISATEUR ---
            pass

    elif type == "group":

        config_file = open(
            os.path.join(username, "groups", "infos", dest + ".info"), "r")
        config = config_file.read()
        config_file.close()

        group_key = config.split("\n")[0].split("=")[1]
        group_members = config.split("\n")[1].split("=")[1].split(", ")
        group_id = config.split('\n')[2].split('=')[1]

        msg = "[" + datetime.datetime.isoformat(datetime.datetime.now(
        )) + "\\" + username + "]" + crpt.crypt_message(message, group_key)

        acces = connection_server.ask_for_ticket()
        connection_server.requests[acces] = "SEND_GROUP\\" + ", ".join(
            group_members) + "\\" + group_id + "\\" + msg
        connection_server.ask_for_send(acces)
        msg_from_server = attendre_reponse(acces)

        if msg_from_server == "SEND\\OK":
            # --- LE MESSAGE À ÉTÉ ENVOYÉ, INFORMER L'UTILISATEUR (VIA UN PETIT SIGNE SUR LE MESSAGE, CF WHATSAPP PAR EXEMPLE)
            pass
        else:
            # --- LE MESSAGE N'A PAS ETE REMIS. AVERTIR L'UTILISATEUR ---
            pass

        pass
    else:
        raise ValueError("Expected 'single' or 'group', {} found".format(type))
Exemplo n.º 4
0
def envoyer_message(dest=None, conv_type=None):

    if not dest:
        connection_server.send(("GET\\friends" + chr(23)))
        msg_from_server = attendre_reponse()
        if msg_from_server == "GET\\friends\\REFUSED":
            print "Erreur lors de la récuperation de vos amis. Cela est probablement dut à une erreur dans votre connection. Solution proposee : rédemarer l'application et se reconnecter."
        else:
            msg_from_server = msg_from_server.split(", ")
            for x in msg_from_server:
                if x == " " or x == "":
                    msg_from_server.remove(x)
            menu_text = ""
            menu_text += "\nVoici la liste de vos amis. Tapez leur numéro pour leur envoyer un message.\n" + colours[
                "yellow"] + colours[
                    "reverse"] + "[ 0 ] Retour au menu principal\n" + colours[
                        "default"]
            rep_available = ["0", "G"]
            for x in range(len(msg_from_server)):
                menu_text += "[ " + str(x +
                                        1) + " ] " + msg_from_server[x] + "\n"
                rep_available.append(str(x + 1))
            if len(rep_available) == 2:
                menu_text += "Si tu n'as pas d'amis, prend un curly ;)\n"
            menu_text += colours[
                "green"] + "[ + ]" + " Ajouter un ami.\n" + colours["default"]
            rep_available.append("+")
            if len(rep_available) > 3:
                menu_text += colours[
                    "red"] + "[ - ]" + " Supprimer un ami.\n" + colours[
                        "default"]
                rep_available.append("-")
            menu_text += colours[
                "blue"] + "[ G ] Créer un nouveau groupe.\n" + colours[
                    "default"]
            menu_text += "\n"
            rep = verif_answer(menu_text, rep_available,
                               "Non pris en charge... Réessayer.")
            if rep == "+":
                friend_to_add = raw_input(
                    "Quel est le nom d'utilisateur de votre nouvel ami ? \nLaisser vide pour retourner au menu précédent. \n>>"
                )
                if not len(friend_to_add) == 0:
                    connection_server.send(
                        ("ADD\\friend\\" + friend_to_add + chr(23)))
                    msg_from_server = attendre_reponse()
                    if msg_from_server == "ADD\\friend\\OK":
                        print "Ami ajoute avec succes !"
                    elif msg_from_server == "ADD\\friend\\404":
                        print "Cet ami n'existe pas !"
                    elif msg_from_server == "ADD\\friend\\REFUSED":
                        print "Acces refuse !"
                    elif msg_from_server == "ADD\\FRIEND\\REFUSED\\ADDING_OWN_USERNAME":
                        print "Il est interdit de s'ajouter soi-meme en ami ;)"
                elif len(friend_to_add) == 0:
                    envoyer_message()
                    return 0
            elif rep == "-":
                rep_available = []
                menu_text = ""
                menu_text += "Tapez le numéro de l'ami qui n'en est plus un : \n" + colours[
                    "yellow"] + colours[
                        "reverse"] + "[ 0 ] Retour en arriere\n" + colours[
                            "default"]
                for x in range(len(msg_from_server)):
                    menu_text += "[ " + str(
                        x + 1) + " ] " + msg_from_server[x] + "\n"
                    rep_available.append(str(x + 1))
                rep_available.append("0")
                rep = verif_answer(
                    menu_text, rep_available,
                    "Valeur non prise en charge... Réessayez !")
                if rep == "0":
                    envoyer_message()
                    return 0
                connection_server.send(
                    ("REMOVE\\friend\\" + msg_from_server[int(rep) - 1] +
                     chr(23)))
                msg_from_server = attendre_reponse()
                if msg_from_server == "REMOVE\\friend\\OK":
                    print "Ami supprimé avec succès"
                elif msg_from_server == "REMOVE\\friend\\404":
                    print "Cet ami ne fait pas parti des votres !"
                elif msg_from_server == "REMOVE\\friend\\REFUSED":
                    print "Acces refuse !"
            elif rep == "0":
                afficher_menu()
                return 0
            elif rep == "G":
                nom = raw_input(
                    "Donnez un nom à ce nouveau groupe.\nLaissez vide pour annuler et revenir en arriere.\n>>"
                )
                if len(nom) == 0:
                    envoyer_message()
                    return 0
                else:
                    friends_to_add = []
                    while True:
                        menu_text = "Entrez le numéro de l'ami à ajouter au groupe.\n" + colours[
                            "yellow"] + colours[
                                "reverse"] + "[ 0 ] Annuler la création du groupe et retourner au menu précédent.\n" + colours[
                                    "default"]
                        rep_available = ["0"]
                        if not len(friends_to_add) == 0:
                            menu_text += colours[
                                "red"] + "[ - ] Retirer des amis déjà ajouté.\n" + colours[
                                    "default"]
                            rep_available.append("-")
                        for x in range(len(msg_from_server)):
                            if not msg_from_server[x] in friends_to_add:
                                menu_text += "[ " + str(
                                    x + 1) + " ] " + msg_from_server[x] + "\n"
                                rep_available.append(str(x + 1))
                            else:
                                menu_text += colours[
                                    "green"] + "[ + ] " + msg_from_server[
                                        x] + "\n" + colours["default"]
                        if len(friends_to_add) > 1:
                            menu_text += "[ " + str(
                                len(msg_from_server) +
                                1) + " ] Valider et créer le groupe.\n"
                            rep_available.append(str(len(msg_from_server) + 1))
                        rep = verif_answer(
                            menu_text, rep_available,
                            "Valeur non pris en charge... Réessayer.")
                        if rep == "0":
                            envoyer_message()
                            return 0
                        elif rep == "-":
                            menu_text = "Entrez le numéro de l'ami qui ne doit pas être ajouté au groupe.\n" + colours[
                                "yellow"] + colours[
                                    "reverse"] + "[ 0 ] Annuler et retourner au menu précédent.\n" + colours[
                                        "default"]
                            rep_available = ["0"]
                            for x in range(len(friends_to_add)):
                                menu_text += "[ " + str(
                                    x + 1) + " ] " + friends_to_add[x] + "\n"
                                rep_available.append(str(x + 1))
                            rep = verif_answer(
                                menu_text, rep_available,
                                "Non pris en charge... Réessayer.")
                            friends_to_add.pop(int(rep) - 1)
                        elif rep == str(len(msg_from_server) + 1):
                            key = r_pass.generate(256)
                            friends_to_add.append(username)
                            connection_server.send("START\\group\\" + nom +
                                                   "\\" + key + "\\" +
                                                   str(len(friends_to_add)) +
                                                   "\\" +
                                                   "\\".join(friends_to_add) +
                                                   chr(23))
                            msg_from_server = attendre_reponse()
                            if msg_from_server.split("\\")[:2] == [
                                    "GROUP", "CREATED"
                            ]:
                                print "Groupe créé avec succès."
                                try:
                                    os.mkdir(username + os.sep + "groups")
                                except:
                                    pass
                                try:
                                    os.mkdir(username + os.sep + "groups" +
                                             os.sep + "infos")
                                except:
                                    pass
                                f = open(
                                    username + os.sep + "groups" + os.sep +
                                    "infos" + os.sep + nom + ".info", "w")
                                f.write("Key=" + key + "\nMembers=" +
                                        ", ".join(friends_to_add) +
                                        "\nGroup id=" +
                                        msg_from_server.split("\\")[2])
                                f.close()
                                break

                        else:
                            friends_to_add.append(msg_from_server[int(rep) -
                                                                  1])
            else:
                print msg_from_server[int(rep) - 1], "selectionne."
                if not os.path.exists(username + os.sep + "messages" + os.sep +
                                      msg_from_server[int(rep) - 1]):
                    key = r_pass.generate(256)
                    destinataire = msg_from_server[int(rep) - 1]
                    try:
                        os.mkdir(username + os.sep + "keys")
                    except:
                        pass
                    f = open(
                        username + os.sep + "keys" + os.sep + destinataire +
                        "key", "w")
                    f.write(key)
                    f.close()
                    connection_server.send("START\\s_conv\\" +
                                           msg_from_server[int(rep) - 1] +
                                           "\\" + key + chr(23))
                    msg_from_server = attendre_reponse()
                    if msg_from_server == "S_CONV\\CREATED":
                        print "Les messages de cette conversation seront chiffrés avec une clé unique."
                    elif msg_from_server == "S_CONV\\REFUSED":
                        print "ACCES REFUSE. Vous allez etre déconnecte."
                        return 1
                else:
                    destinataire = msg_from_server[int(rep) - 1]
                    f = open(
                        username + os.sep + "keys" + os.sep + destinataire +
                        "key", "r")
                    key = f.read()
                    f.close()
                print "Tapez votre message ci dessous et appuyez sur entrée pour l'envoyer.\nLaissez le champ vide pour retrourner en arriere."
                message = raw_input(">>")
                if not len(message) == 0:
                    msg_crypted = crpt.crypt_message(message, key)
                    print "Envoye : {}".format(
                        "SEND\\" + destinataire + "\\" + "[" +
                        datetime.datetime.isoformat(datetime.datetime.now()) +
                        "\\" + username + "]" + msg_crypted)
                    connection_server.send(
                        ("SEND\\" + destinataire + "\\" + "[" +
                         datetime.datetime.isoformat(datetime.datetime.now()) +
                         "\\" + username + "]" + msg_crypted + chr(23)))
                    msg_from_server = attendre_reponse()
                    if msg_from_server == "SEND\\OK":
                        prev_conv = ""
                        print "Message envoyé !\n\n"
                        try:
                            f = open(
                                username + os.sep + "messages" + os.sep +
                                destinataire, "r")
                            prev_conv = f.read()
                            f.close()
                        except:
                            pass
                        finally:
                            verif_path(os.path.join(username, "messages"),
                                       folder=True)
                            f = open(
                                username + os.sep + "messages" + os.sep +
                                destinataire, "w")
                            f.write(prev_conv)
                            f.write("[" + datetime.datetime.isoformat(
                                datetime.datetime.now()) + "\\" + username +
                                    "]" + message + "\n")
                            f.close()
                            trier_conv(username + os.sep + "messages" +
                                       os.sep + destinataire)
                elif len(message) == 0:
                    envoyer_message()
                    return 0

                else:
                    print "Le message n'a pas été remis.\n\n"
        afficher_menu()
    else:
        if conv_type == "single":
            f = open(username + os.sep + "keys" + os.sep + dest + "key", "r")
            key = f.read()
        else:
            f = open(username + os.sep + "groups" + os.sep + "infos" + os.sep +
                     dest + ".info")
            datas = f.read().split("\n")
            key = "=".join(datas[0].split("=")[1:])
            members = datas[1].split("=")[1].split(", ")
            id = datas[2].split("=")[1]

        f.close()
        print "Tapez votre message ci dessous et appuyez sur entré pour l'envoyer. Laissez le champ vide pour annuler et retourner à la conversation."
        message = raw_input(">>")
        if not len(message) == 0:
            msg_crypted = "[" + datetime.datetime.isoformat(
                datetime.datetime.now(
                )) + "\\" + username + "]" + crpt.crypt_message(message, key)
            if conv_type == "single":
                print "Message envoye : {}".format("SEND\\" + dest + "\\" +
                                                   msg_crypted)
                connection_server.send(
                    ("SEND\\" + dest + "\\" + msg_crypted + chr(23)))
            else:
                connection_server.send(
                    ("SEND_GROUP\\" + ", ".join(members) + "\\" + id + "\\" +
                     msg_crypted + chr(23)))
            msg_from_server = attendre_reponse()
            if msg_from_server == "SEND\\OK":
                prev_conv = ""
                print "Message envoyé !\n\n"
                try:
                    if conv_type == "single":
                        f = open(
                            username + os.sep + "messages" + os.sep + dest,
                            "r")
                        prev_conv = f.read()
                        f.close()
                except:
                    pass
                finally:
                    if conv_type == "single":
                        f = open(
                            username + os.sep + "messages" + os.sep + dest,
                            "w")
                        f.write(prev_conv)
                        f.write("[" + datetime.datetime.isoformat(
                            datetime.datetime.now()) + "\\" + username + "]" +
                                message + "\n")
                        f.close()
                    if conv_type == "single":
                        trier_conv(username + os.sep + "messages" + os.sep +
                                   dest)

            else:
                print "Le message n'a pas été remis.\n\n"
        else:
            return 0