Automatiser une création de compte sur un programme

Résolu
Frizti Messages postés 132 Statut Membre -  
Frizti Messages postés 132 Statut Membre -
Bonjour, je travail sur un programme de terminal ou il faudrait se connecter avec un compte qu'on aura créé au préalable pour y accéder, je me demandais si il était possible sur le code si-dessous d'ajouter une fonction qui pourrait automatiser cette création de compte (tu met ton pseudo et ton mdp et sa s'enregistre tout seul même après fermeture du programme)
le code :
#coding:utf-8
import sys
progLaunch = True
i_d = "Frizti"
m_d_p = "jamesbond33"
id2 = ""

print("connexion au terminal...")
print("La connection s'initialise...")
print("chargement...")
print("28%")
print("43%")
print("72%")
print("88%")
print("100%. Chargement terminé !")

user_id = input("Entrez votre identifiant (si vous n'avez pas de  compte, entrez '?') : ")
user_password = input("Entrez votre mot de passe (si vous n'avez pas de  compte, entrez '?') : ")

if user_id == i_d and user_password == m_d_p:
    print("Vous etes connecté, bienvenue", i_d)
elif user_id == "?" and user_password == "?":
    id2 = input("Veuillez entrer un pseudonyme : ")
    mdp2 = input("Veuillez entrer un mot de passe : ")
    input("Veuillez maintenant contacter un administrateur afin qu'il vous enregistre \nune fois cela fait, appuyez sur 'entrée' : ")
    print("Bienvenue dans le terminal {}, vous etes maintenant enregistré !".format(id2))
else:
    print("Mot de passe ou nom d'utilisateur incorrect, veuillez réessayer ultèrieurement")
    input("Appuyez sur 'entrée' pour quitter ")
    sys.exit(0)
       

print("Dévérouillage terminé")

print("")
terLaunch = True
while terLaunch:
    choixMenu = input("> ")

    if choixMenu == "again":
        continue
    elif choixMenu == "quit":
        progLaunch = False
        terLaunch = False
    elif choixMenu == "hello":
        print("Bonjour :) !")
        continue
    elif choixMenu == "test":
        print("Analyse de 147 éléments en cours... Analyse terminée ! Aucun problème détecté .")
        continue
    elif choixMenu == "add-on":
        print("n/a aucun add-on installé pour l'instant")
        continue
    elif choixMenu == "help":
        print("Liste des commandes : \nagain : ne rien faire et recommencer \nquit : quitter \nhello : faire dire bonjour au programme \ntest : analyser le programme \nadd-on : consulter les add-ons installés et opérationels \nhelp : afficher ceci \ncalcul : utiliser la calculatrice")
    elif choixMenu == "calcul":
        chiffre1 = input("Entrez le premier chiffre a calculer : ")
        chiffre1 = int(chiffre1)
        chiffre2 = input("Entrez le second chiffre : ")
        chiffre2 = int(chiffre2)
        calcul1 = input("Comment voulez vous utiliser ces nombres ? (+ additionner, - soustraire, x multiplier, / diviser, % le reste d'une division) : ")
        print("Résultat :")
        if calcul1 == ("+"):
            chiffre1 = chiffre1 + chiffre2
        elif calcul1 == ("-"):
            chiffre1 = chiffre1 - chiffre2
        elif calcul1 == ("x"):
            chiffre1 = chiffre1 * chiffre2
        elif calcul1 == ("/"):
            chiffre1 = chiffre1 / chiffre2
        elif calcul1 == ("%"):
            chiffre1 = chiffre1 % chiffre2
        print(chiffre1)
    else:
        print("Commande introuvable")


input("Aurevoir...(appuyez sur entrée)")

16 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, je pense que c'est possible.
    0
  2. trifou
     
    Enregistrer des données permanentes se fait sur le disque dur (ou autre support physique).

    Donc, il t’incombe d'enregistrer login et mot de passe dans un fichier ou éventuellement une base de données, comme tu débutes le choix d'un simple fichier semble le plus simple.
    Et ensuite lorsqu'un utilisateur voudra se connecter, il suffira de vérifier que le couple login, password est présent dans ton fichier, et si tu ne veux pas que l'on puisse lire directement les valeurs de ton fichier, tu pourrais également utiliser des fonctions de hash.

    Attention, avant d'enregistrer un nouvel utilisateur, il faudra vérifier que le pseudo choisi n'existe pas déjà dans ton fichier.
    0
  3. Frizti Messages postés 132 Statut Membre 18
     
    D'accord, merci mais comment dois-je faire pour que mon programme accède à ce dit fichié et comment configurer celui-ci ?
    0
  4. trifou
     
    Ce fichier, c'est toi qui dois le créer, ouvrir un fichier se fait avec open en python.
    Et dedans tu auras juste des lignes, avec un séparateur nom, séparateur, mdp, un fichier csv en gros.

    riri,mdp_de_riri
    fifi,mdp_de_fifi


    Il y a d'autres format de fichier que tu pourrais aussi utiliser, json, xml (plus compliqué).
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Frizti Messages postés 132 Statut Membre 18
     
    D'accord, et comment dois-je faire pour que les informations présentes dans ce fichier soient utilisées ?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peut-être commencer avec des exercices plus simples?
      0
      1. Frizti Messages postés 132 Statut Membre 18 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        tu sais comment je peux définir les informations du fichier texte en tant que identifiants et mdp ?
        0
  7. Frizti Messages postés 132 Statut Membre 18
     
    je ne débute pas, je suis justement e n train d'apprendre a utiliser des fichiers textes dans un programme
    0
  8. trifou
     
    Un programme, c'est aussi faire des fonctions.

    Admettons, un fichier users.txt
    Avec dedans 2 enregistrements.
    toto:123456
    lulu:roxor


    On écrit ensuite quelques fonctions permettant de travailler.

    USERS_FILE = 'users.txt'
    
    
    def user_save(user_name, user_password):
        with open(USERS_FILE, 'a') as f:
            f.write('{}:{}\n'.format(user_name, user_password))
    
    
    def users_load():
        users = []
        with open(USERS_FILE) as f:
            for line in f:
                users.append(line.rstrip().split(':'))
        return users
    
    
    def user_exists(user_name):
        users = users_load()
        for name, _ in users:
            if name == user_name:
                return True
        return False
    
    
    def user_connect(user_name, user_password):
        users = users_load()
        for name, password in users:
            if name == user_name:
                if password == user_password:
                    return True
                break
        return False


    Puis on effectue quelques tests pour voir si tout fonctionne comme on veut.

    print(user_connect('toto', '1234'))
    print(user_connect('toto', '123456'))
    print(user_exists('lulu'))
    print(user_connect('lulu', 'roxor'))
    
    name = 'loulou'
    password = '42çarox'
    if not user_exists(name):
        user_save(name, password)
        print(name, 'saved')
    else:
        print('username', name, 'exists')
    
    print(user_connect(name, '123456'))
    print(user_connect(name, password))


    Et voilà, tu vois quelque chose de compliqué là-dedans ?

    Tu peux aussi mettre d'autres parties de ton programme dans des fonction, le message de connexion au terminal, le menu, etc.

    En faisant ça, ton script sera beaucoup plus limpide.
    0
  9. Frizti Messages postés 132 Statut Membre 18
     
    ça marche pas pour moi, a moins que je fasse la mauvaise technique ou le mauvais placement, j'ai tout mis dans un seul et même programme (a part les utilisateurs bien sur)
    0
    1. trifou
       
      Tu plaisantes ?

      Le script que je t'ai mis n'est pas à placer comme ça dans ton fichier, il est à lire, comprendre, cela fait tu pourras intégrer cela à ton script.

      De toute façon, je crois qu'il faut que tu repasses par la case tuto, là tu es ivre et en excès de vitesse, tu perds le contrôle de ton véhicule, tu vas bientôt te crasher dans le pilier de pont un peu plus loin.
      0
      1. Frizti Messages postés 132 Statut Membre 18 > trifou
         
        Mince, je croyais que tu allais comprendre le sarcasme, mais bon.
        0
  10. Frizti Messages postés 132 Statut Membre 18
     
    Tu m'a quand-même bien aidé merci !
    0
  11. Frizti Messages postés 132 Statut Membre 18
     
    OwO j'ai un nouveau problème : je n'arrive pas a supprimer un utilisateur, quelle commande dois-je utiliser ? (désolé mais j'ai un piètre niveau en utilisation de fichiers externes au programme)
    0
    1. trifou
       
      Ton problème se situe de savoir comment supprimer un élément d'une liste, puis aplatir cette liste pour l'enregistrer dans le fichier.

      On peut supprimer un élément d'une liste avec list.pop, ou encore en utilisant les slices.
      0
      1. Frizti Messages postés 132 Statut Membre 18 > trifou
         
        Merci ! C'est plus pratique maintenant !
        0
  12. Frizti Messages postés 132 Statut Membre 18
     
    Ah ! non en fait, je croyais que ça marchait comme il n'y avait pas de message d'erreur mais ça ne marche pas.
    je cherche a faire ça avec cette commande:
    u = input("Entrez ceci : '<pseudo>:<mdp>' : ")
                users_file.remove("{}".format(u))
                if u not in users_file:
                    print("Suppression effectuée avec succès !")
                else:
                    print("Echec de la supression.")

    mais ça ne marche pas, pouvez-vous m'aider ?
    0
    1. trifou
       
      Bonjour,

      Lorsqu'on cherche à supprimer un utilisateur, donc une opération d'administration, on se fiche du mot de passe, d'ailleurs un administrateur n'a pas à connaître les mots de passes des utilisateurs. La seule chose dont on dispose est (ici) le pseudo.

      Donc on charge le fichier dans une liste (avec readlines), on parcourt cette liste, on scinde la ligne par le séparateur de valeurs, on regarde si le premier élément vaut le pseudo à supprimer et on supprime la ligne dans ce cas.
      Cette opération effectuée, on écrit la liste modifiée dans le fichier (avec writelines).

      Mais généralement, on ne supprime pas vraiment un utilisateur, on rend plutôt un compte inactif, par exemple ajouter un 3ème élément dans ton fichier users avec pour valeur 0 ou 1, 0 signifiera que le compte est inactif.
      0
      1. Frizti Messages postés 132 Statut Membre 18 > trifou
         
        Ah ! Donc je dois présenter comme ça pour rendre un compte inactif ?
        user:mdp:0
        0
  13. Frizti Messages postés 132 Statut Membre 18
     
    euh la commande ne marche pas à moins que je me trompe
    (je pense que je me trompe)
    le code:
            	fic = open("105 12.46.13.txt", "r")
            	print("Liste des utilisateurs :")
            	content = fic.read()
            	print(content)
            	u=input("Quel utilisateur souhaitez vous supprimer (entrez son pseudonyme) : ")
            	fic.readlines()
            	if u in fic:
            		fic.writelines("")
            		print("Suppression efféctuée avec succès !")
            		fic.close()
            	else:
            		print("Echec de la suppression.")
            		fic.close()
    0
    1. trifou
       
      Ce n'est pas que tu te trompes, mais c'est que tu fais n'importe quoi.

      fic.read() lit l'intégralité du fichier et retourne le contenu entier du fichier dans une chaine.
      fic.readlines() lit l'intégralité du fichier et retourne une liste des lignes du fichier.
      https://docs.python.org/3/library/io.html#io.IOBase.readlines

      user_to_del = 'titi'
      with open('users.txt') as f:
          users = f.readlines()
          for user in users:
              # En cas de ligne vide éventuelle dans le fichier
              if not user.strip():
                  continue
              # Séparation en 2
              name, _ = user.split(':', 1)
              if name == user_to_del:
                  users.remove(user)
                  print('user', user_to_del, 'deleted')
                  break
          else:
              raise ValueError('user {} not found'.format(user_to_del))
      with open('users.txt', 'w') as f:
          f.writelines(users)


      A tester sur un fichier users.txt avec par ex. des valeurs comme.
      toto:123456
      lulu:roxor
      titi:mdp
      lily:plip


      Et viens pas encore me dire que ça ne fonctionne pas :D
      0
  14. Frizti Messages postés 132 Statut Membre 18
     
    je pense que c'est sensé fonctionner mais idle me dit que là :
    user_to_del = ''
                user_to_del = input("Veuillez entrer un pseudonyme : ")
                with open('users.txt') as f:
                	users = f.readlines()
                	for user in users:
                        if not user.strip():
                            continue
                	    name, _ = user.split(':', 1)#ici
                	    if name == user_to_del:
                            users.remove(user)
                            print('user', user_to_del, 'deleted')
                            break
                        else:
                    	raise ValueError('user {} not found'.format(user_to_del))
                        with open('users.txt', 'w') as f:
                            f.writelines(users)

    il y a un problème d'indentation
    0
    1. Frizti Messages postés 132 Statut Membre 18
       
      d'après IDLE du moins
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peut-être en faisant quelques exercices avec indentation?
      0
  15. Frizti Messages postés 132 Statut Membre 18
     
    CCM écorche mon code voici le bon:
    user_to_del = ''
    user_to_del = input("Veuillez entrer un pseudonyme : ")
    with open('users.txt') as f:
    users = f.readlines()
    for user in users:
    if not user.strip():
    continue
    name, _ = user.split(':', 1)
    if name == user_to_del:
    users.remove(user)
    print('user', user_to_del, 'deleted')
    break
    else:
    raise ValueError('user {} not found'.format(user_to_del))
    with open('users.txt', 'w') as f:
    f.writelines(users)
    0
    1. trifou
       
      Regarde bien mon code, le else n'est pas lié au if, mais au for (même niveau d'indentation).
      Eh oui en python on peut faire un for ... else.
      0
  16. Frizti Messages postés 132 Statut Membre 18
     
                user_to_del = ""
                user_to_del = input("Veuillez entrer un pseudonyme : ")
                with open('users.txt') as f:
                 users = f.readlines()
                 for user in users:
                        if not user.strip():
                            continue
                     name, _ = user.split(':', 1)
                     if name == user_to_del:
                            users.remove(user)
                            print('user', user_to_del, 'deleted')
                            break
                    else:
                        raise ValueError('user {} not found'.format(user_to_del))
                with open('users.txt', 'w') as f:
                    f.writelines(users)
    0
    1. trifou
       
      On va quand même pas jouer aux devinettes !
      Edite ton précédent message et mets en forme correctement ton code.

      On ne mélange pas indentation avec espaces et indentation avec tabulations, et j'ai même pas du à tester ton code, le fait de prendre ton code en sélection, en partant du début et en avançant, on voit qu'il y a une tabulation avant le raise...
      0
      1. Frizti Messages postés 132 Statut Membre 18 > trifou
         
        voila !
        0
  17. Frizti Messages postés 132 Statut Membre 18
     
    Attend ! je trolles pas mais je crois qu'il y a un problème avec mon éditeur de texte parce-que quand je fais un copier-coller ça me donne ça :
    0