def verifNoeudHS(): BDD.verifExistBDD() conn = sqlite3.connect('WTP.db') cursor = conn.cursor() cursor.execute("""SELECT IP FROM NoeudsHorsCo WHERE 1""") rows = cursor.fetchall() for row in rows: # Prend un à un chaque noeud de la liste, et lui envoie une request. # Si le noeud répond, on le laisse tranquille, sinon on le met dans une autre table. IppeerPort = row[0] #Départager l'IP et le port pos1 = IppeerPort.find(':') pos1 = pos1 + 1 pos2 = len(IppeerPort) peerPort = int(IppeerPort[pos1:pos2]) pos1 = pos1 - 1 peerIP = IppeerPort[0:pos1] # Liaison tcp/ip c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connection au receveur try: c.connect((peerIP, peerPort)) except Exception: logs.addLogs( "ERROR : Connection to the peer out of service impossible. (verifNoeudHS())" ) # Le noeud n'est pas connecté au réseau # On incrémente son nombre de vérifs et on le supprime si besoin BDD.incrNbVerifsHS(IppeerPort) BDD.verifNbVerifsHS(IppeerPort) else: sendCmd = b"" sendCmd = "=cmd DemandePresence" sendCmd = sendCmd.encode() # On envoie le message c.send(sendCmd) rcvData = c.recv(1024) rcvData = rcvData.decode() if rcvData == '=cmd Present': # C'est bon, le noeud est connecté au reseau, # on l'ajoute à la table normale et on le supprime de la table des noeuds HS BDD.ajouterEntree("Noeuds", IppeerPort) BDD.supprEntree("NoeudsHorsCo", IppeerPort) else: # Le noeud n'est pas connecté au réseau, on incrémente de 1 son nombre de vérifications. BDD.incrNbVerifsHS(IppeerPort) # On vérifie si le noeud a un nombre de vérifications inférieur à 10. # Si ce n'est pas le cas, il est supprimé définitivement. BDD.verifNbVerifsHS(IppeerPort)
def DemandeNoeuds(IppeerPort): #Le paramètre à donner est l'ip suivie du port du Noeud à contacter sous la forme 000.000.000.000:00000 #Départager l'IP et le port error = 0 if autresFonctions.verifIPPORT(IppeerPort): connexion_avec_serveur = autresFonctions.connectionClient(ipport) if str(connexion_avec_serveur) == "=cmd ERROR": error += 1 else: logs.addLogs( "INFO : Connection with peer etablished (DemandeNoeuds())") sendCmd = b"" sendCmd = "=cmd DonListeNoeuds 48" sendCmd = sendCmd.encode() # On envoie le message ConnectionDemande.send(sendCmd) ListeNoeudsEnc = ConnectionDemande.recv(1024) ListeNoeuds = ListeNoeudsEnc.decode() ConnectionDemande.close() #Les 48 IP+port sont sous la forme 000.000.000.000:00000 et sont séparés par une virgule #Départager les IP et les ports et envoi à la BDD par l'intermédiaire # de la fonction spécifique for loop in range(ListeNoeuds.count(',') + 1): lsteTemp = ListeNoeuds[:ListeNoeuds.find(',')] ListeNoeuds = ListeNoeuds[ListeNoeuds.find(',') + 1:] if autresFonctions.verifIPPORT(lsteTemp): if blacklist.searchBlackList(lsteTemp) == 0: BDD.ajouterEntree("Noeuds", lsteTemp) else: logs.addLogs( "ERROR : This peer is part of the Blacklist : " + str(lsteTemp)) else: logs.addLogs( "ERROR : The variable isn't a IP:PORT in DemandeNoeuds() : " + str(lsteTemp)) logs.addLogs("INFO : Connection closed. (DemandeNoeuds())") else: error += 1 return error
def run(self): print("Welcome in the Blacklist center !\nWhat do you want to do ?") action = autresFonctions.ask("1 : Add something in the BlackList\n2 : Delete something in the BlackList\n3 : Update the Blacklist with an other peer\n4 : Change the BlackList default peer") try: action = int(action) except ValueError as e: print(str(c("red")+"Your input isn't correct (between 1 and 4)\nError : "+str(e)+""+str(c("")))) if action == 1: entree = autresFonctions.ask("What do you want to add in your BlackList ?") while 1: rank = autresFonctions.ask("What is the rank of this new entry ?") try: if int(rank) > 0 and int(rank) <= 5: break except ValueError as e: print(str(c("red")+"Your input isn't correct. (between 1 and 5)\nError : "+str(e)+""+str(c("")))) error = BDD.ajouterEntree("BlackList", entree, rank) if error == 0: print(str(c("yellow")+""+str(entree) + " has been added in the BlackList with the rank " + str(rank)+""+str(c("")))) else: print(str(c("red")+"An error occured. Look at the logs for more informations. ("+str(error)+")"+str(c("")))) elif action == 2: entree = autresFonctions.ask("What do you want to delete in your BlackList ?") error = BDD.supprEntree("BlackList", entree) if error == 0: print(str(c("yellow")+""+str(entree) + " has been deleted in the BlackList"+str(c("")))) else: print(str(c("red")+"An error occured. Look at the logs for more informations. ("+str(error)+")"+str(c("")))) elif action == 3: ipport = str(autresFonctions.ask("With which peer do you want to update? (Press ENTER to update with the default peer : "+str(config.readConfFile("BlackList"))+")")) if ipport == "": status = loader("Work in progress") status.start() blacklist.maj() status.stop() status.join() elif autresFonctions.verifIPPORT(IppeerPort): # Si ipport est un ip:port status = loader("Work in progress") status.start() blacklist.maj(ipport) status.stop() status.join() else: print(str(c("red")+"This is not a IP:PORT"+str(c("")))) elif action == 4: value = str(autresFonctions.ask("Which peer do you want to choose to be your default blacklist peer ? (The actual peer is "+str(config.readConfFile("Blacklist")))) if autresFonctions.verifIPPORT(value): config.modifConfigFile("Blacklist", value) else: print(str(c("red")+"Your input isn't a IP:PORT"+str(c("")))) else: print(str(c("red")+"Your input isn't correct."+str(c(""))))
def connectionClient(ip, port="", verify=1): if port == "": port = ip[ip.find(":") + 1:] ip = ip[:ip.find(":")] if verifIPPORT(str(ip) + ":" + str(port)): try: conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) conn.settimeout(15) #conn = ssl.wrap_socket(conn, ssl_version=ssl.PROTOCOL_TLSv1, ciphers="ADH-AES256-SHA") conn.connect((ip, int(port))) except Exception as e: logs.addLogs("INFO : Unable to connect to " + str(ip) + ":" + str(port) + " Reason : " + str(e)) else: return conn if verify == 1: # On ajoute le noeud dans la liste des noeuds Hors Connection s'il n'y est pas déjà # (Mais on ne l'incrémente pas s'il l'est déjà) IppeerPort = ip + ":" + str(port) BDD.ajouterEntree("NoeudsHorsCo", IppeerPort) BDD.supprEntree("Noeuds", IppeerPort) return "=cmd ERROR"
def verifNoeud(): BDD.verifExistBDD() conn = sqlite3.connect('WTP.db') cursor = conn.cursor() cursor.execute("""SELECT IP FROM Noeuds WHERE 1""") rows = cursor.fetchall() for row in rows: # Prend un à un chaque noeud de la liste, et lui envoie une request. # Si le noeud répond, on le laisse tranquille, sinon on le met dans une autre table. IppeerPort = row[0] #Départager l'IP et le port pos1 = IppeerPort.find(":") pos1 = pos1 + 1 pos2 = len(IppeerPort) peerPort = int(IppeerPort[pos1:pos2]) pos1 = pos1 - 1 peerIP = IppeerPort[0:pos1] # Liaison tcp/ip c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connection au receveur try: c.connect((peerIP, peerPort)) except Exception as erreur: # Le noeud est injoignable, on le déplace dans une autre table. BDD.ajouterEntree("NoeudsHorsCo", IppeerPort) BDD.supprEntree("Noeuds", IppeerPort) logs.addLogs("INFO : Connection to the peer impossible : '" + str(erreur) + "' (verifNoeud())") else: sendCmd = "=cmd DemandePresence" sendCmd = sendCmd.encode() # On envoie le message c.send(sendCmd) rcvData = c.recv(1024) rcvData = rcvData.decode() if rcvData != '=cmd Present': # Le noeud n'est pas connecté au réseau, on le déplace dans une autre table. BDD.ajouterEntree("NoeudsHorsCo", IppeerPort) BDD.supprEntree("Noeuds", IppeerPort)
def run(self): rcvCmd = self.clientsocket.recv(1024) rcvCmd = rcvCmd.decode() # Maintenant, vérifions la demande du client. if rcvCmd != '': if rcvCmd[:19] == "=cmd DemandeFichier": # =cmd DemandeFichier nom sha256.ext ipport IP:PORT # Dirriger vers la fonction UploadFichier() # Le noeud distant demande le file, donc on lui envoi, Up ! # On va chercher les deux informations qu'il nous faut : # Le nom du file (sous forme sha256.ext) # L'IP et le port du noeud qui a fait la demande (sous forme IP:PORT) fileName = rcvCmd[rcvCmd.find(" nom ") + 5:rcvCmd.find(" ipport ")] IppeerPort = rcvCmd[rcvCmd.find(" ipport ") + 8:] if BDD.verifFichier(fileName): error = 0 # Le file est présent dans la BDD, on peut l'envoyer temp = str(time.time()) thrdUp = echangeFichiers.upFile(IppeerPort, fileName, temp) thrdUp.start() thrdUp.join() # Lire le fichier temporaire pour savoir si il y a eut des erreurs try: f = open(".TEMP/" + temp, "r") error += int(f.read()) f.close() os.remove(".TEMP/" + temp) except Exception as e: error += 1 logs.addLogs( c("red") + "ERROR : An error occured in CmdDemandeFichier : " + str(e) + c("")) os.remove(".TEMP/" + temp) if error != 0: stats.modifStats("NbEnvsFichiers") else: logs.addLogs( c("red") + "ERROR : An error occured for upload " + str(fileName) + " in thrdLnch.py (" + str(error) + ")" + c("")) else: print( c("red") + "This file isn't on this computer : '" + str(fileName) + "'" + c("")) elif rcvCmd[:17] == "=cmd DemandeNoeud": # Fonction Serveur # Dirriger vers la fonction EnvoiNoeuds() # Le noeud distant a demandé les noeuds, on lui envoi ! # On trouve le premier port qui peut être attribué IppeerPort = "127.0.0.1:" + str( autresFonctions.portLibre( int(config.readConfFile("miniPort")))) sendCmd = IppeerPort # On envoie au demandeur l'adresse à contacter self.clientsocket.send(sendCmd.encode()) echangeNoeuds.EnvoiNoeuds(IppeerPort) stats.modifStats("NbEnvsLstNoeuds") elif rcvCmd[:25] == "=cmd DemandeListeFichiers": # On va récuperer le nom du file qui contient la liste # Ensuite, on la transmet au noeud distant pour qu'il puisse # faire la demande de réception du file pour qu'il puisse l'analyser if rcvCmd[:28] == "=cmd DemandeListeFichiersExt": file = autresFonctions.lsteFichiers(1) stats.modifStats("NbEnvsLstFichiers") else: file = autresFonctions.lsteFichiers() stats.modifStats("NbEnvsLstFichiersExt") self.clientsocket.send(file.encode()) elif rcvCmd[:23] == "=cmd DemandeListeNoeuds": # On va récuperer le nom du file qui contient la liste # Ensuite, on la transmet au noeud distant pour qu'il puisse # faire la demande de réception du file pour qu'il puisse l'analyser file = autresFonctions.lsteNoeuds() self.clientsocket.send(file.encode()) stats.modifStats("NbEnvsLstNoeuds") elif rcvCmd[:20] == "=cmd DemandePresence": # C'est tout bête, pas besoin de fonction # Il suffit de renvoyer la request informant que l'on est connecté au réseau. sendCmd = "=cmd Present" self.clientsocket.send(sendCmd.encode()) stats.modifStats("NbPresence") elif rcvCmd[:15] == "=cmd rechercher": # =cmd rechercher nom SHA256.ext # Renvoie le retour de la fonction, qui elle même retourne une IP+Port ou 0 # Chercher le nom du file donnee = rcvCmd[20:] sendCmd = str(search.rechercheFichierEntiere(donnee)) self.clientsocket.send(sendCmd.encode()) elif rcvCmd[:11] == "=cmd status": # On demande le statut du noeud (Simple, Parser, DNS, VPN, Main) if (config.readConfFile("Parser") == "Oui"): sendCmd = "=cmd Parser" self.clientsocket.send(sendCmd.encode()) else: sendCmd = "=cmd Simple" self.clientsocket.send(sendCmd.encode()) elif rcvCmd[:25] == "=cmd newFileNetwork name ": # =cmd newFileNetwork name ****** ip ****** # Un nouveau file est envoyé sur le réseau fileName = rcvCmd[25:] ipport = rcvCmd[rcvCmd.find(" ip ") + 4:] if (config.readConfFile("Parser") == "Oui"): # On prend en charge l'import de files, # On l'ajoute à la base de données et on le télécharge BDD.ajouterEntree("FichiersExt", fileName, ipport) sendCmd = "=cmd fileAdded" self.clientsocket.send(sendCmd.encode()) ip = ipport[:ipport.find(":")] port = ipport[ipport.find(":") + 1:] fctsClient.CmdDemandeFichier(ip, port, fileName) else: # On ne prend pas en charge l'import de files, # Mais on l'ajoute quand même à la base de données BDD.ajouterEntree("FichiersExt", fileName, ipport) sendCmd = "=cmd noParser" self.clientsocket.send(sendCmd.encode()) elif rcvCmd[:23] == "=cmd newPeerNetwork ip ": # =cmd newPeerNetwork ip ****** # Un nouveau peer est envoyé sur le réseau ipport = rcvCmd[23:] if (config.readConfFile("Parser") == "True"): # On prend en charge l'ajout de peers # On l'ajoute à la base de données BDD.ajouterEntree("Noeuds", ipport) sendCmd = "=cmd peerAdded" self.clientsocket.send(sendCmd.encode()) else: # On ne prend pas en charge l'import de files, # Mais on l'ajoute quand même à la base de données BDD.ajouterEntree("FichiersExt", fileName, ipport) sendCmd = "=cmd noParser" self.clientsocket.send(sendCmd.encode()) elif rcvCmd[10:] == "BlackList ": # Les fonctionnalitées de la BlackList rcvCmd = rcvCmd[10:] if rcvCmd[:4] == "name": # Le peer veut savoir si cet élément fait partie de la BlackList, # et si oui quel est son rang (de 0 à 5) rank = search.chercherInfo("BlackList", rcvCmd[4:]) self.clientsocket.send(rank.encode()) if rcvCmd[4:] == "sync": # Le peer veut recevoir l'intégralité de cette base # On va donc la mettre dans un fichier filename = echangeListes.tableToFile("BlackList") try: filename = int(filename) except ValueError: # Si c'est un chiffre, c'est un code d'erreur sendCmd = "=cmd Filename " + str( filename) + "ipport " + config.readConfFile( "MyIP") + ":" + config.readConfFile( "defaultPort") else: sendCmd = "=cmd ERROR" self.clientsocket.send(sendCmd.encode()) else: # Oups... Demande non-reconnue... logs.addLogs("ERROR : Unknown request : " + str(rcvCmd)) self.clientsocket.send("=cmd UNKNOW".encode())
def run(self): error = 0 autresFonctions.verifFiles() # Lancement du serveur tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcpsock.bind(("127.0.0.1", self.port)) tcpsock.listen(10) tcpsock.settimeout(10) try: (self.conn, (self.ipExt, self.portExt)) = tcpsock.accept() except socket.timeout: logs.addLogs("ERROR : Timeout in downFile. No peer has connected") error += 1 except socket.error: logs.addLogs("ERROR : The port is already used in downFile") else: # GO ! cmdRecu = self.conn.recv(1024) cmdRecu = cmdRecu.decode() if cmdRecu[:24] == '=cmd StartTransfer size ': self.size = int(cmdRecu[24:]) # Le noeud est OK #On vide le file (on ne sait jamais) f = open("HOSTEDFILES/" + self.file, "w") f.write("") f.close() # On ouvre le file vide en mode append et binaire # (donc les données n'ont pas besoin d'êtres converties et elles seront ajoutées à la fin du file) f = open("HOSTEDFILES/" + self.file, "ab") if self.size > 1024: # Le file va arriver en morceaux nbPaquetsCalcule = math.ceil(self.size / 1024) nbPaquetsRecu = 0 while nbPaquetsCalcule > nbPaquetsRecu: recu = "" recu = self.conn.recv(1024) if not recu: logs.addLogs( "ERROR : An error occured during the transfer in downFile" ) break f.write(recu) nbPaquetsRecu = nbPaquetsRecu + 1 else: # Le file va arriver d'un seul coup recu = "" recu = self.conn.recv(1024) f.write(recu) f.close() self.conn.close() # Maintenant, il faut vérifier que le ficher a le meme SHA256 file = open("HOSTEDFILES/" + self.file, "rb") contenu = file.read() file.close() hashFichier = hashlib.sha256( str(contenu).encode('utf-8')).hexdigest() if hashFichier == self.file[:self.file.find('.')] or self.file[ 12:16] == "TEMP": # Le transfert s'est bien passé # Ajouter le file à la BDD BDD.ajouterEntree("Fichiers", self.file) else: # Ah, il y a un problème, on suppr logs.addLogs( "ERROR: The Hash of the file is different in downFile") os.remove("HOSTEDFILES/" + self.file) error += 1 else: logs.addLogs( "ERROR : The peer refused the transfert in downFile") error += 1 if error != 0: logs.addLogs("ERROR : An error has occured in downFile (" + str(error) + ").") tcpsock.close() f = open(".TEMP/" + str(self.temp), "w") f.write(str(error)) f.close()
for peerIP in tableau: peerIP = peerIP[0] connNoeud = autresFonctions.connectionClient(peerIP) if str(connNoeud) != "=cmd ERROR": logs.addLogs("INFO : Connection with peer etablished") request = "=cmd newPeerNetwork ip " + str( config.readConfFile("MyIP")) + str( config.readConfFile("defaultPort")) request = request.encode() connNoeud.send(request) rcvCmd = connNoeud.recv(1024) connNoeud.close() if rcvCmd == "=cmd noParser": # Il faut changer le paramètre du noeud, il n'est pas parseur mais simple BDD.supprEntree("Noeuds", peerIP) BDD.ajouterEntree("Noeuds", peerIP) elif rcvCmd != "=cmd peerAdded": # Une erreur s'est produite logs.addLogs( "ERROR : The request was not recognized in launcher.py : " + str(rcvCmd)) else: logs.addLogs( "INFO : Unable to connect to the peer in launcher.py : " + str(connNoeud)) else: # Une erreur s'est produite logs.addLogs("ERROR : There is not enough IP in launcher.py : " + str(tableau)) status.stop() status.join()
def cmdLauncher(userCmd): error = 0 if userCmd == "help": # Afficher toutes les options documentation.mini() elif userCmd == "update": # Vérifier les MAJ status = loader("Work in progress") status.start() #maj.verifMAJ() #maj.verifSources() status.stop() status.join() print(c("green") + "Done." + c("")) elif userCmd == "stats": # Affiche les statistiques print("Number of peers in the database : " + str(stats.compterStats("NbNoeuds"))) print("Number of special peers in the database : " + str(stats.compterStats("NbSN"))) print("Number of external files in the database : " + str(stats.compterStats("NbFichiersExt"))) print("Number of files on this hard drive : " + str(stats.compterStats("NbFichiers"))) print("Size of all files : " + str(stats.compterStats("PoidsFichiers"))) print("Number of peers lists sent : " + str(stats.compterStats("NbEnvsLstNoeuds"))) print("Number of file lists sent : " + str(stats.compterStats("NbEnvsLstFichiers"))) print("Number of external file lists sent : " + str(stats.compterStats("NbEnvsLstFichiersExt"))) print("Number of files sent : " + str(stats.compterStats("NbEnvsFichiers"))) print("Number of presence requests received : " + str(stats.compterStats("NbPresence"))) print("Number of files received : " + str(stats.compterStats("NbReceptFichiers"))) elif userCmd == "config": # Modifier le fichier de configuration config.modifConfig() elif userCmd == "dns": # Entrer dans le programme de configuration du DNS thrdDNS = DNSConfig() thrdDNS.start() thrdDNS.join() elif userCmd == "exit": # On arrète WTP print( "Pro tip : You can also stop WTP at any time by pressing Ctrl + C." ) return -1 elif userCmd == "doc": # On affiche la documentation documentation.maxi() elif userCmd == "checkFiles": # On vérifie immédiatement dans ADDFILES, HOSTEDFILES et .TEMP status = loader("Work in progress") status.start() fctsMntc.checkIntruders() fctsMntc.creerFichier() fctsMntc.supprTemp() status.stop() status.join() print(c("green") + "Done." + c("")) elif userCmd == "delAll": print( "Are you sure you want to delete everything ?\nAll configuration, database, hosted files will be lost." ) print("You will not be able to go back.") if str(input("If you are sure, enter DeleteAll\n>> ")) == "DeleteAll": print( "We are sorry to see you go.\nWe hope to see you very soon !\nIf you have comments to send to you, please contact us via our website :\nhttps://myrasp.fr/WTP" ) status = loader("Work in progress") status.start() shutil.rmtree(str(os.getcwd()) + "/HOSTEDFILES") shutil.rmtree(str(os.getcwd()) + "/ADDFILES") os.remove(str(os.getcwd()) + "/.extinctionWTP") os.remove(str(os.getcwd()) + "/.TempMaintenance24H") os.remove(str(os.getcwd()) + "/.TempMaintenance5M") logs.rapportErreur() os.remove(str(os.getcwd()) + "/logs.txt") os.remove(str(os.getcwd()) + "/wtp.conf") status.stop() status.join() return -1 print( "You scared us!\nFortunately, you have not passed the dark side of the force!" ) elif userCmd == "majDNS": print( "You want to update the DNS database.\nIf you are crazy, you can enter crazy to update with a random peer." ) ipport = str( input("With which DNS do you want to update ? (IP:Port)\n>> ")) # Vérifier le noeud if autresFonctions.verifIPPORT(ipport): # C'est un IPPort co = autresFonctions.connectionClient(ipport) if co != "=cmd ERROR": sendCmd = "=cmd status" co.send(sendCmd.encode()) rcvCmd = co.recv(1024).decode() co.close() if rcvCmd == "=cmd DNS": e = dns.majDNS(ipport) if int(e) > 0: print(c("red") + "An error occured." + c("")) else: print(c("green") + "Done." + c("")) else: print(c("red") + "This peer isn't DNS." + c("")) print(c("red") + "Unable to connect to this peer." + c("")) elif ipport == "crazy": print( "DISCLAMER : Some peers can be controlled by malicious people who can perform phishing attacks" ) rep = str(input("Are you sure ? (y/N)\n>>")) if rep == "y" or rep == "Y": e = dns.majDNS() if int(e) > 0: print(c("red") + "An error occured." + c("")) else: print(c("green") + "Done." + c("")) else: print( "You scared us!\nFortunately, you have not passed the dark side of the force!" ) else: print(c("red") + "It's not an ip:port" + c("")) elif userCmd == "client": # Possibilité de faire des demandes en console error = 0 sendCmd = "" print( "You can now write requests and send them to the peers you want.") print("Exit this wizard and enter doc for more information.") while sendCmd != "exit": sendCmd = str( input( "What is your request ? (exit for quit this wizard)\n>> ")) if sendCmd == "doc": documentation.maxi() elif sendCmd != "exit": host = str( input( "What is the IP of the peer that you want to contact ? > " )) try: port = int( input( "What is the Port of the peer that you want to contact ? > " )) except ValueError: print( c("red") + "It isn't a port (between 1024 and 65535)" + c("")) else: if sendCmd == "=cmd DemandeNoeud": error += fctsClient.CmdDemandeNoeud(host, port) elif sendCmd[:19] == "=cmd DemandeFichier": # =cmd DemandeFichier nom sha256.ext error += fctsClient.CmdDemandeFichier( host, port, sendCmd[24:]) elif sendCmd == "=cmd DemandeListeNoeuds": error += fctsClient.CmdDemandeListeNoeuds(host, port) elif sendCmd == "=cmd DemandeListeFichiers": error += fctsClient.CmdDemandeListeFichiers(host, port) elif sendCmd[:19] == "=cmd rechercher nom": # =cmd rechercher nom SHA256.ext sortie = search.rechercheFichierEntiere(sendCmd[20:]) ipport = sortie[:sortie.find(";")] sha = sortie[sortie.find(";") + 1:] if autresFonctions.verifIPPORT(ipport): # C'est un IPPort # On envoi vers la fonction qui télécharge le file ip = ipport[:ipport.find(":")] port = int(ipport[ipport.find(":") + 1:]) error += fctsClient.CmdDemandeFichier( ip, int(port), sha) else: # C'est une erreur print(sortie) error += 1 else: error = 0 connexion_avec_serveur = autresFonctions.connectionClient( host, port) if str(connexion_avec_serveur) == "=cmd ERROR": error += 1 else: connexion_avec_serveur.send(sendCmd.encode()) rcvCmd = connexion_avec_serveur.recv(1024).decode() connexion_avec_serveur.close() print(rcvCmd) if int(error) == 0: print(c("green") + "Done." + c("")) else: print( c("red") + "An error occured. (" + str(error) + ")" + c("")) else: break elif userCmd == "add": # L'utilisateur veut ajouter quelque chose categorie = str(input("What do you want to add ?\n>>> ")) if categorie == "peer": ipport = str(input("What is the IP:Port of the peer ?\n>>> ")) error = BDD.ajouterEntree("Noeud", ipport) if error == 0: print(c("green") + "Done." + c("")) else: print(c("red") + "An error occured (" + str(error) + ").") else: print(c("red") + "Your input is unknown." + c("")) print( c("cian") + "You can enter help for more information." + c("")) elif userCmd == "blacklist": blckLst = clientBlacklist.configBlckLst() blckLst.start() blckLst.join() else: print(c("red") + "Unknown request." + c("")) return 0
def creerFichier(): # Fonction qui va s'executer via la maintenance assez régulièrement # Elle regarde dans le dossier ADDFILES si il y a des files # Si oui, elle les copie dans le dossier HOSTEDFILES, les renomme de type SHA256.extention # Elle envoie vers la fonction contenue dans BDD.py qui va ajouter les files à la base de données # Et pour finir, elle supprime les files ajoutés de façon à ce que le dossier ADDFILES soit vide. repertoire = "ADDFILES" # Vérifier si le dossier ADDFILES existe, sinon le créer try: os.makedirs("ADDFILES") except OSError: if not os.path.isdir("ADDFILES"): raise # Vérifier si le dossier HOSTEDFILES existe, sinon le créer try: os.makedirs("HOSTEDFILES") except OSError: if not os.path.isdir("HOSTEDFILES"): raise dirs = os.listdir(repertoire) # This would print all the files and directories for file in dirs: file = repertoire + "/" + file if os.path.isfile(file): # L'élément est un file, c'est bon (et pas un dossier) try: with open(file, "rb") as fluxLecture: contenu = fluxLecture.read() fluxLecture.close() except UnicodeDecodeError: logs.addLogs("ERROR : The file is not supported : " + str(file)) os.remove(file) else: shaFichier = hashlib.sha256(str(contenu).encode()).hexdigest() osef, extention = os.path.splitext(file) filename = shaFichier + extention fileDir = "HOSTEDFILES/" + filename fluxEcriture = open(fileDir, "wb") fluxEcriture.write(contenu) fluxEcriture.close() os.remove(file) # L'ajouter à la BDD BDD.ajouterEntree("Fichiers", filename) logs.addLogs( "INFO : A new hosted file has been added successfully : " + filename) # On transmet à quelques noeuds l'information tableau = BDD.aleatoire("Noeuds", "IP", 15, "Parser") if isinstance(tableau, list) and len(tableau) == 15: # On envoi la request à chaque noeud sélectionné for peerIP in tableau: connNoeud = autresFonctions.connectionClient(peerIP) if str(connNoeud) != "=cmd ERROR": logs.addLogs( "INFO : Connection with peer etablished") request = "=cmd newFileNetwork name " + filename + " ip " + str( config.readConfFile("MyIP")) + str( config.readConfFile("defaultPort")) request = request.encode() connNoeud.send(request) rcvCmd = connNoeud.recv(1024) connNoeud.close() if rcvCmd == "=cmd noParser": # Il faut changer le paramètre du noeud, il n'est pas parseur mais simple BDD.supprEntree("Noeuds", peerIP) BDD.ajouterEntree("Noeuds", peerIP) elif rcvCmd != "=cmd fileAdded": # Une erreur s'est produite logs.addLogs( "ERROR : The request was not recognized in creerFichier() : " + str(rcvCmd)) else: logs.addLogs( "ERROR : An error occured in creerFichier() : " + str(connNoeud)) else: # Une erreur s'est produite logs.addLogs( "ERROR : There is not enough IP in creerFichier() : " + str(tableau))