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
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()
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))
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