Esempio n. 1
0
File: dns.py Progetto: anon1892/WTP
def addNoeudDNS(ipport, ipportNoeud):
    error = 0
    if autresFonctions.verifIPPORT(ipport):
        connexion_avec_serveur = autresFonctions.connectionClient(ipport)
        if str(connexion_avec_serveur) == "=cmd ERROR":
            error += 1
        else:
            logs.addLogs("Connection established with the DNS")
            # =cmd DNS AddDNSExt ipport ******
            request = "=cmd DNS AddDNSExt ipport " + ipportNoeud
            request = request.encode()
            connexion_avec_serveur.send(request)
            message = connexion_avec_serveur.recv(1024)
            connexion_avec_serveur.close()
            if message == "=cmd IPPORTDejaUtilise":
                error = 5
                print(
                    str(c("red")) +
                    "The peer DNS is already known by the receiver." +
                    str(c("")))
            elif message == "=cmd SUCCESS":
                print(
                    str(c("green")) +
                    "The DNS pair has been added to the receiver base." +
                    str(c("")))
            else:
                print(
                    str(c("red")) +
                    "An undetermined error occurred. Please try again later or change DNS peer."
                    + str(c("")))
                error = 1
    else:
        error += 1
    return error
Esempio n. 2
0
def searchNDD(url):
    # Fonction qui vérifie si le nom de file envoyé est plus petit qu'un SHA256
    # Si c'est le cas, il va chercher chez les noeuds de DNS si ils connaissent ce nom de domaine
    # Renvoie un SHA256
    sha = ""
    if len(url) <= 64:
        # Ce n'est pas un nom de file, car il est plus petit qu'un SHA256
        tableau = searchNoeud("DNS", 25)
        for noeud in tableau:
            noeud = str(noeud[0])
            error = 0
            connexion_avec_serveur = autresFonctions.connectionClient(noeud)
            if str(connexion_avec_serveur) == "=cmd ERROR":
                error += 1
            else:
                sendCmd = b""
                sendCmd = "=cmd DNS searchSHA ndd " + url
                sendCmd = sendCmd.encode()
                connexion_avec_serveur.send(sendCmd)
                rcvCmd = connexion_avec_serveur.recv(1024)
                rcvCmd = rcvCmd.decode()
                connexion_avec_serveur.close()
                if rcvCmd != "=cmd NNDInconnu" and rcvCmd != "=cmd ERROR":
                    # On a trouvé !!
                    sha = rcvCmd
                    break
    return sha
Esempio n. 3
0
 def run(self):
     error = 0
     autresFonctions.verifFiles()
     i = 0
     while i < 50:
         i += 1
         self.conn = autresFonctions.connectionClient(self.ip, self.port)
         if self.conn != "=cmd ERROR":
             break
         else:
             time.sleep(0.2)
     if str(self.conn) == "=cmd ERROR":
         error += 1
     else:
         # Vérifier que l'on a le fichier
         try:
             tailleFichier = os.path.getsize("HOSTEDFILES/" + self.file)
             if tailleFichier < 1:
                 error += 1
                 logs.addLogs("ERROR : The file is empty in upFile")
         except Exception:
             logs.addLogs("ERROR : The file doesn't exist")
             error += 1
         if error == 0:
             # On peut continuer
             sendCmd = "=cmd StartTransfer size " + str(tailleFichier)
             self.conn.send(sendCmd.encode())
             #Maintenant, on vérifie si le file peut être envoyé en une seule foie, ou si il faut le "découper"
             pathFichier = "HOSTEDFILES/" + self.file
             if tailleFichier > 1024:
                 #Le file doit être découpé avant d'être envoyé
                 fich = open(pathFichier, "rb")
                 num = 0
                 nbPaquets = math.ceil(tailleFichier / 1024)
                 deplacementFichier = 0
                 while num < nbPaquets:
                     fich.seek(
                         deplacementFichier, 0
                     )  # on se deplace par rapport au numero de caractere (de 1024 a 1024 octets)
                     donnees = fich.read(
                         1024)  # Lecture du file en 1024 octets
                     self.conn.send(
                         donnees)  # Envoi du file par paquet de 1024 octets
                     num = num + 1
                     deplacementFichier = deplacementFichier + 1024
             else:
                 #Le file peut être envoyé en une seule fois
                 fich = open(pathFichier, "rb")
                 donnees = fich.read()  # Lecture du file
                 self.conn.send(donnees)  # Envoi du file
             self.conn.close()
     if error != 0:
         logs.addLogs("ERROR : An error has occured in upFile (" +
                      str(error) + ").")
     f = open(".TEMP/" + str(self.temp), "w")
     f.write(str(error))
     f.close()
Esempio n. 4
0
File: dns.py Progetto: anon1892/WTP
def majDNS(ipportNoeud=""):
    # Fonction pour noeud DNS qui permet de mettre à jour toute sa base avec un autre noeud
    BDD.verifExistBDD()
    problem = 0
    conn = sqlite3.connect('WTP.db')
    cursor = conn.cursor()
    ipport = ""
    if ipportNoeud == "":
        try:
            cursor.execute(
                """SELECT IP FROM Noeuds WHERE Fonction = 'DNS' ORDER BY RANDOM() LIMIT 1"""
            )
            rows = cursor.fetchall()
            conn.close()
        except Exception as e:
            conn.rollback()
            logs.addLogs(
                "DNS : ERROR : Problem with the database (majDNS()):" + str(e))
            problem += 1
        else:
            for row in rows:
                ipport = row[0]
    else:
        ipport = ipportNoeud
        if ipport != "":
            # Maintenant on va demander au noeud DNS distant d'envoyer toutes ses entrées DNS pour
            # Que l'on puisse ensuite analyser, et ajouter/mettre à jour notre base
            connexion_avec_serveur = autresFonctions.connectionClient(ipport)
            if str(connexion_avec_serveur) != "=cmd ERROR":
                sendCmd = b""
                sendCmd = "=cmd DNS syncBase"
                connexion_avec_serveur.send(sendCmd.encode())
                rcvCmd = connexion_avec_serveur.recv(1024)
                rcvCmd = rcvCmd.decode()
                connexion_avec_serveur.close()
                # Le noeud renvoie le nom du fichier à télécharger
                # Et son IP:PortPrincipal, sinon =cmd ERROR
                if rcvCmd != "=cmd ERROR":
                    # =cmd Filename ****** ipport ******
                    filename = rcvCmd[14:rcvCmd.find(" ipport ")]
                    ipport = rcvCmd[rcvCmd.find(" ipport ") + 8:]
                    ip = ipport[:ipport.find(":")]
                    port = ipport[ipport.find(":") + 1:]
                    error += fctsClient.CmdDemandeFichier(ip, port, filename)
                    if error == 0:
                        echangeListes.filetoTable(filename, "DNS")
                    else:
                        problem += 1
                else:
                    problem += 1
            else:
                problem += 1
        else:
            problem += 1
    return problem
Esempio n. 5
0
def CmdDemandeNoeud(ip, port):
    error = 0
    connNoeud = autresFonctions.connectionClient(ip, port)
    if str(connNoeud) == "=cmd ERROR":
        error += 1
    else:
        logs.addLogs(
            "INFO : Connection with peer etablished on port {}".format(port))
        request = "=cmd DemandeNoeud"
        request = request.encode()
        connNoeud.send(request)
        rcvCmd = connNoeud.recv(1024)
        connNoeud.close()
        error += echangeNoeuds.DemandeNoeuds(str(rcvCmd))
    return error
Esempio n. 6
0
def sayHello():
    # Fonction dont le but est d'avertir des noeuds importants de sa présence
    error = 0
    ipPortMe = autresFonctions.connaitreIP()
    connNoeud = autresFonctions.connectionClient(ipport)
    if str(connNoeud) == "=cmd ERROR":
        error += 1
    else:
        logs.addLogs("INFO : Connection with VPN peer etablished")
        request = "=cmd HELLO " + ipPortMe
        request = request.encode()
        connNoeud.send(request)
        print(connNoeud.recv(1024))
        connNoeud.close()
    return error
Esempio n. 7
0
def CmdDemandeListeNoeuds(ip, port):
    sendCmd = "=cmd DemandeListeNoeuds"
    error = 0
    connNoeud = autresFonctions.connectionClient(ip, port)
    if str(connNoeud) == "=cmd ERROR":
        error += 1
    else:
        logs.addLogs(
            "INFO : Connection with peer etablished on port {}".format(port))
        sendCmd = sendCmd.encode()
        connNoeud.send(sendCmd)
        fileName = connNoeud.recv(1024)
        connNoeud.close()
        error += CmdDemandeFichier(ip, port, fileName.decode())
        echangeListes.filetoTable(fileName.decode(), "Noeuds")
    return error
Esempio n. 8
0
def CmdDemandeStatut(ip, port):
    error = 0
    # On demande le statut du noeud (Simple, Parser, DNS, VPN, Main)
    connNoeud = autresFonctions.connectionClient(ip, port)
    if str(connNoeud) == "=cmd ERROR":
        error += 1
    else:
        logs.addLogs(
            "INFO : Connection with peer etablished on port {}".format(port))
        sendCmd = "=cmd status"
        connNoeud.send(sendCmd.encode())
        statut = connNoeud.recv(1024)
        connNoeud.close()
        if (statut[:5] == "=cmd "):
            statut = statut[5:]  # On enlève "=cmd "
        else:
            error += 1
    if error != 0:
        return error
    return statut
Esempio n. 9
0
File: dns.py Progetto: anon1892/WTP
def supprNDD(ipport, ndd, password):
    error = 0
    if autresFonctions.verifIPPORT(ipport):
        connexion_avec_serveur = autresFonctions.connectionClient(ipport)
        if str(connexion_avec_serveur) == "=cmd ERROR":
            error += 1
        else:
            logs.addLogs("Connection established with the DNS")
            # =cmd DNS supprNDD ndd ****** pass ******
            request = "=cmd DNS supprNDD ndd " + str(ndd) + " pass " + str(
                password)
            request = request.encode()
            connexion_avec_serveur.send(request)
            message = connexion_avec_serveur.recv(1024)
            if message != "=cmd SUCCESS":
                error += 1
            connexion_avec_serveur.close()
    else:
        error += 1
    return error
Esempio n. 10
0
def VPN(demande, ipPortVPN, ipPortExt):
    error = 0
    if autresFonctions.verifIPPORT(ipPortExt) and reg.match(ipPortVPN):
        ip = ipPortVPN[:ipPortVPN.find(":")]
        port = ipPortVPN[ipPortVPN.find(":") + 1:]
        connNoeud = autresFonctions.connectionClient(ip, port)
        if str(connNoeud) == "=cmd ERROR":
            error += 1
        else:
            logs.addLogs(
                "INFO : Connection with VPN peer etablished on port {}".format(
                    port))
            # =cmd VPN noeud 127.0.0.1:5555 request =cmd DemandeFichier
            request = "=cmd VPN noeud " + ipPortExt + " request " + demande
            request = request.encode()
            connNoeud.send(request)
            print(connNoeud.recv(1024))
            connNoeud.close()
            # Maintenant que l'on a demandé au VPN d'executer la demande, il faut recuperer les donnnées
            # Pour cela, il faut analyser la request initiale
            if request[:19] == "=cmd DemandeFichier":
                # =cmd DemandeFichier nom sha256.ext
                error += CmdDemandeFichier(ip, port, request[24:])
            elif request[:17] == "=cmd DemandeNoeud":
                CmdDemandeNoeud(ip, port)
            elif request[:28] == "=cmd DemandeListeFichiersExt":
                CmdDemandeListeFichiers(ip, port, 1)
            elif request[:25] == "=cmd DemandeListeFichiers":
                CmdDemandeListeFichiers(ip, port)
            elif request[:23] == "=cmd DemandeListeNoeuds":
                CmdDemandeListeNoeuds(ip, port)
            elif request[:22] == "=cmd rechercher":
                # =cmd rechercher nom SHA256.ext
                search.rechercheFichierEntiere(sendCmd[20:])
            else:
                logs.addLogs("ERROR : Unknown request (VPN()) : " +
                             str(request))
                error += 1
    else:
        error += 1
    return error
Esempio n. 11
0
def maj(ipport=""):
    # Fonction pour noeud DNS qui permet de mettre à jour toute sa base avec un autre noeud
    BDD.verifExistBDD()
    error = 0
    if ipport == "":
        ipport = str(config.readConfFile("Blacklist"))
    else:
        if ipport != "":
            connexion_avec_serveur = autresFonctions.connectionClient(ipport)
            if str(connexion_avec_serveur) != "=cmd ERROR":
                sendCmd = b""
                sendCmd = "=cmd BlackList sync"
                connexion_avec_serveur.send(sendCmd.encode())
                rcvCmd = connexion_avec_serveur.recv(1024)
                rcvCmd = rcvCmd.decode()
                connexion_avec_serveur.close()
                # Le noeud renvoie le nom du fichier à télécharger
                # Et son IP:PortPrincipal, sinon =cmd ERROR
                if rcvCmd != "=cmd ERROR":
                    # =cmd Filename ****** ipport ******
                    filename = rcvCmd[14:rcvCmd.find(" ipport ")]
                    ipport = rcvCmd[rcvCmd.find(" ipport ") + 8:]
                    ip = ipport[:ipport.find(":")]
                    port = ipport[ipport.find(":") + 1:]
                    error += fctsClient.CmdDemandeFichier(ip, port, filename)
                    if error == 0:
                        echangeListes.filetoTable(filename, "BlackList")
                    else:
                        error += 1
                else:
                    error += 1
            else:
                error += 1
        else:
            error += 1
            logs.addLogs("ERROR : No peer ip was found in Blacklist.maj()")
    return error
Esempio n. 12
0
def searchBlackList(name, Isrank=False):
    rank = 0
    rank = search.chercherInfo("Blacklist", name)
    if rank == 0:
        ipport = str(config.readConfFile("Blacklist"))
        connexion_avec_serveur = autresFonctions.connectionClient(ipport)
        if str(connexion_avec_serveur) != "=cmd ERROR":
            sendCmd = "=cmd BlackList name " + str(name)
            connexion_avec_serveur.send(sendCmd.encode())
            rcvCmd = connexion_avec_serveur.recv(1024)
            rcvCmd = rcvCmd.decode()
            connexion_avec_serveur.close()
            rank = rcvCmd
            # Le noeud renvoie le nom du fichier à télécharger
            # Et son IP:PortPrincipal, sinon =cmd ERROR
        else:
            logs.addLogs("ERROR : Can not check the " + str(name) +
                         " item in the blacklist")
            return 0
    if Isrank:
        return rank
    if rank == 0:
        return 0
    return 1
Esempio n. 13
0
def CmdDemandeFichier(ip, port, file):
    if blacklist.searchBlackList(file) != 0:
        logs.addLogs("ERROR : This file is part of the Blacklist : " +
                     str(file))
        return 1
    error = 0
    connNoeud = autresFonctions.connectionClient(ip, port)
    if str(connNoeud) == "=cmd ERROR":
        error += 1
    else:
        logs.addLogs(
            "INFO : Connection with peer etablished on port {}".format(port))
        # Il faut trouver un port libre pour que le noeud donneur
        # puisse se connecter à ce noeud sur le bon port
        freePort = autresFonctions.portLibre(
            int(config.readConfFile("miniPort")))
        temp = str(time.time())
        thrdDown = echangeFichiers.downFile(file, int(freePort), temp)
        thrdDown.start()
        newIPPort = str(autresFonctions.connaitreIP()) + ":" + str(freePort)
        sendCmd = "=cmd DemandeFichier  nom " + str(file) + " ipport " + str(
            newIPPort)
        connNoeud.send(sendCmd.encode())
        connNoeud.close()
        thrdDown.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("ERROR : An error occured in CmdDemandeFichier : " +
                         str(e))
    return error
Esempio n. 14
0
File: dns.py Progetto: anon1892/WTP
def modifNDD(ipport, ndd, adress, password):
    error = 0
    if autresFonctions.verifIPPORT(ipport):
        connexion_avec_serveur = autresFonctions.connectionClient(ipport)
        if str(connexion_avec_serveur) == "=cmd ERROR":
            error += 1
        else:
            logs.addLogs("Connection established with the DNS")
            # =cmd DNS modifNDD ndd ****** adress ****** pass ******
            request = "=cmd DNS modifNDD ndd " + str(ndd) + " adress " + str(
                adress) + " pass " + str(password)
            request = request.encode()
            connexion_avec_serveur.send(request)
            message = connexion_avec_serveur.recv(1024)
            connexion_avec_serveur.close()
            error = 0
            if message == "=cmd IPPORTDejaUtilise":
                error = 5
                print(
                    str(c("red")) +
                    "Le noeud DNS est déjà connu par le receveur." +
                    str(c("")))
            elif message == "=cmd SUCCESS":
                print(
                    str(c("green")) +
                    "Le noeud DNS a bien été ajouté à la base du receveur." +
                    str(c("")))
            else:
                print(
                    str(c("red")) +
                    "An undetermined error occurred. Please try again later or change DNS peer."
                    + str(c("")))
                error += 1
    else:
        error += 1
    return error
Esempio n. 15
0
File: dns.py Progetto: anon1892/WTP
def addNDD(ipport, sha, ndd, password):
    error = 0
    if autresFonctions.verifIPPORT(ipport):  # Si ipport est un ip:port
        connexion_avec_serveur = autresFonctions.connectionClient(ipport)
        if str(connexion_avec_serveur) == "=cmd ERROR":
            error += 1
        else:
            logs.addLogs("Connection established with the DNS")
            # =cmd DNS AddDNS sha ******* ndd ******* pass *******
            request = "=cmd DNS AddDNS sha " + str(sha) + " ndd " + str(
                ndd) + " pass " + str(password)
            request = request.encode()
            connexion_avec_serveur.send(request)
            message = connexion_avec_serveur.recv(1024)
            connexion_avec_serveur.close()
            if message == "=cmd NDDDejaUtilise":
                error = 5
                print(
                    str(c("red")) + "The domain name is already used." +
                    str(c("")) +
                    " If it belongs to you, you can modify it provided you know the password."
                )
            elif message == "=cmd SUCCESS":
                print(
                    str(c("green")) +
                    "The domain name and address SHA256 have been associated."
                    + str(c("")))
            else:
                print(
                    str(c("red")) +
                    "An undetermined error occurred. Please try again later or change DNS peer."
                    + str(c("")))
                error = 1
    else:
        error += 1
    return error
Esempio n. 16
0
def searchFile(fileName):
    # Fonction qui a pour but de chercher sur le réseau un file
    # Il faut d'abord chercher dans la BDD, et si il n'y est pas on cherche plus spécifiquement
    # IPpeerPort est la variable qui contient l'IP Port du noeud qui possède le file
    BDD.verifExistBDD()
    IPpeerPort = ""
    conn = sqlite3.connect('WTP.db')
    cursor = conn.cursor()
    # On va chercher dans les files hébergés
    try:
        cursor.execute("""SELECT id FROM Fichiers WHERE Nom = ?""",
                       (fileName, ))
    except Exception as e:
        logs.addLogs("ERROR : Problem with database (searchFile()):" + str(e))
    rows = cursor.fetchall()
    for row in rows:
        boucle += 1
        # Le file est hébergé par le noeud qui le cherche
        ipPortIci = "127.0.0.1:" + str(config.readConfFile("defaultPort"))
        IPpeerPort = ipPortIci
    # Si le file n'a pas été trouvé
    # Il faut chercher dans les files connus externes
    try:
        cursor.execute("""SELECT IP FROM FichiersExt WHERE Nom = ?""",
                       (fileName, ))
    except Exception as e:
        logs.addLogs("ERROR : Problem with database (searchFile()):" + str(e))
    else:
        rows = cursor.fetchall()
        for row in rows:
            # Le file est hébergé par un noeud connu
            IPpeerPort = str(row)
    if IPpeerPort == "":
        # Il faut demander aux noeuds que l'on connait
        tblNoeuds = BDD.aleatoire("Noeuds", "IP", 10)
        # On a 10 noeuds dans le tableau
        # Maintenant, il faut vérifier que au moins la moitiée des noeuds choisis aléatoirement
        # sont des noeuds "simple", puis mettre les noeuds "simple" au début du tableau
        tableauNoeudsSimple = []
        tableauSuperNoeuds = []
        for noeud in tblNoeuds:
            # On verifie chaque noeud
            fonctionNoeud = chercherInfo("Noeuds", noeud)
            if fonctionNoeud == "simple":
                tableauNoeudsSimple.append(noeud)
            if fonctionNoeud == "supernoeud" or fonctionNoeud == "DNS":
                tableauSuperNoeuds.append(noeud)
        if len(tableauNoeudsSimple) < 6:
            # Il n'y a pas assez de noeuds simples dans la liste,
            # Il faut aller en rechercher
            logs.addLogs("WARNING : Not enough simple peers")
        # On ajoute les super noeuds après les noeuds simples
        tblNoeuds = tableauNoeudsSimple + tableauSuperNoeuds
        for noeudActuel in tblNoeuds:
            # À chaque noeud on demande si il a le file ou s'il connait un noeud qui l'a
            # Maintenant on se connecte au noeud
            error = 0
            connexion_avec_serveur = autresFonctions.connectionClient(
                noeudActuel)
            if str(connexion_avec_serveur) == "=cmd ERROR":
                error += 1
            else:
                sendCmd = b""
                sendCmd = "=cmd rechercherFichier nom " + fileName
                sendCmd = sendCmd.encode()
                connexion_avec_serveur.send(sendCmd)
                rcvCmd = connexion_avec_serveur.recv(1024)
                rcvCmd = rcvCmd.decode()
                connexion_avec_serveur.close()
                if rcvCmd != "0":
                    IPpeerPort = rcvCmd
                    break
    return IPpeerPort  # Peut retourner "" si il ne trouve pas d'hébergeur
Esempio n. 17
0
     # Le noeud est un DNS, on lance la fonction.
     ThrdDNS = ServDNS()
     ThrdDNS.start()
 if (str(config.readConfFile("VPN")) == "True"):
     # Le noeud est un VPN, on lance la fonction.
     ThrdVPN = ServVPN()
     ThrdVPN.start()
 #ThrdBrd = Bridge()
 #ThrdBrd.start()
 # On indique notre présence à quelques parseurs
 tableau = BDD.aleatoire("Noeuds", "IP", 15, "Parser")
 if isinstance(tableau, list) and tableau:
     # On envoi la request à chaque noeud sélectionné
     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
Esempio n. 18
0
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
Esempio n. 19
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))