예제 #1
0
파일: fctsMntc.py 프로젝트: anon1892/WTP
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)
예제 #2
0
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
예제 #3
0
	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(""))))
예제 #4
0
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"
예제 #5
0
파일: fctsMntc.py 프로젝트: anon1892/WTP
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)
예제 #6
0
파일: thrdLnch.py 프로젝트: anon1892/WTP
 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())
예제 #7
0
 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()
예제 #8
0
파일: launcher.py 프로젝트: anon1892/WTP
     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()
예제 #9
0
파일: cmdLauncher.py 프로젝트: anon1892/WTP
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
예제 #10
0
파일: fctsMntc.py 프로젝트: anon1892/WTP
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))