Automatiser une création de compte sur un programme

Résolu
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

Résumé de la discussion

Le fil explore comment automatiser la création et la gestion de comptes utilisateur dans un programme en ligne de commande Python, avec une connexion initiale, un enregistrement après vérification et une fermeture du programme. Plusieurs réponses portent sur la manipulation de fichiers texte pour les identifiants et mots de passe, la suppression ou l'inactivation d'utilisateurs et des améliorations de flux avec readlines, split et writelines. En pratique, des conseils soulignent qu'un administrateur ne doit pas connaître les mots de passe et recommandent des approches comme l'inactivation du compte ou l'utilisation d'une base externe plutôt qu'un retrait direct.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour, je pense que c'est possible.
    0
    1. 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
      1. D'accord, merci mais comment dois-je faire pour que mon programme accède à ce dit fichié et comment configurer celui-ci ?
        0
        1. 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
          1. D'accord, et comment dois-je faire pour que les informations présentes dans ce fichier soient utilisées ?
            0
            1. Contributeur
              peut-être commencer avec des exercices plus simples?
              0
            2. @yg_betu sais comment je peux définir les informations du fichier texte en tant que identifiants et mdp ?
              0
          2. je ne débute pas, je suis justement e n train d'apprendre a utiliser des fichiers textes dans un programme
            0
            1. 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
              1. ç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. 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
                2. @trifouMince, je croyais que tu allais comprendre le sarcasme, mais bon.
                  0
              2. Tu m'a quand-même bien aidé merci !
                0
                1. 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. 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
                  2. @trifouMerci ! C'est plus pratique maintenant !
                    0
                2. 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. 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
                  2. @trifouAh ! Donc je dois présenter comme ça pour rendre un compte inactif ?
                    user:mdp:0
                    0
                3. 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. 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
                4. 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. d'après IDLE du moins
                    0
                  2. Contributeur
                    peut-être en faisant quelques exercices avec indentation?
                    0
                5. 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. 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
                6.             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. 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
                  2. @trifouvoila !
                    0
                7. 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