Dans un morceau de code, l'utilisateur doit taper un mot de passe, je ne voudrais pas qu'il s'affiche, pour ce faire, j'emploie ce code :
...
for (i = 0; i < 3; i++) {
printf("Password (ne s'affiche pas): ");
if((password = read_password()) == EOF)return FALSE;
if (strlen(password) == 1) {
printf("Erreur \n");
continue;
}
password[strlen(password) - 1] = '\0';
...
}
return FALSE;
}
/* Return EOF si problème */
char* read_password(){
int sortie;
char * password = (char *) malloc(sizeof(char) * TAILLE_MOT_PASSE);
if((sortie = dup(1)) == -1) return EOF;/*Dupliquer stdout */
if(close(1) == -1) return EOF;/* Fermer stdout */
if (!fgets(password, (TAILLE_MOT_PASSE + 1), stdin)) return EOF;/* Lire le mot de passe */
if(dup2(sortie,1) == -1) return EOF; /* On n'as pas su remettre stdout */
return password;
}
La for du dessus n'est pas de moi, je n'ai écrit que la fonction read_password().
Le problème : ça ne marche pas, il affiche le mot de passe et n'affiche pas :
Password (ne s'affiche pas):
Donc ça fait l'inverse de ce que je voulais.
Pouvez-vous m'aider ?
# curses.h
Posté par Cereal Killer . Évalué à 2.
man noecho ou http://www.delafond.org/traducmanfr/X11/man3/curs_inopts.3x.(...)
Sinon, je sais pas.
[^] # Re: curses.h
Posté par Cereal Killer . Évalué à 2.
# scanf ?
Posté par fabien . Évalué à 2.
j'ai pas tout regardé, mais un simple scanf() ne ferait'il pas l'affaire.
un truc du style
scanf("%s",&str);
j'peux metromper (ca fait des année que j'ai pas fais du C) mais il me semble que scanf n'ecrit pas sur stdout ?..
sinon, autres fonctions a voir aussi : fgets() et fgetc()
[^] # Re: scanf ?
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 1.
# pas la bonne méthode
Posté par left . Évalué à 3.
De plus, printf équivaut à un fprintf sur stdout, celui-ci étant bufferisé. Donc pour être sûr qu'on voit le prompt qui demande le mot de passe, il faut flusher avant de demander le mot de passe.
Enfin la méthode classique pour demander des mots de passe, quand on est sur un terminal, c'est d'utiliser les fonctions déclarées dans le fichier termios.h. Je la fais courte dans un petit programme d'exemple (sans malloc, toussa ...):
[^] # Re: pas la bonne méthode
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 1.
[^] # Re: pas la bonne méthode
Posté par left . Évalué à 3.
plus exactement:
Donc il ne doit pas manquer grand chose. Je serais bien curieux de voir où ca foire, quand même. Si dès fois t'as l'occas de passer un coup de debuggeur ...
Quoi qu'il en soit, man termios.
[^] # Re: pas la bonne méthode
Posté par left . Évalué à 3.
La fonction passwd doit utiliser stdin, et donc:
[^] # Re: pas la bonne méthode
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 2.
[^] # Re: pas la bonne méthode
Posté par Obsidian . Évalué à 2.
Il faut donc demander au terminal de passer dans un mode particulier. En fonction de l'équipement, ça se fait soit avec des ioctl(), soit par l'émission de caractères spéciaux.
Il existe donc l'interface standard de termios pour contrôler les paramètre d'un terminal. C'est ce qui est exploité notamment par la commande stty, depuis le shell ...
[^] # Re: pas la bonne méthode
Posté par halfelin . Évalué à 1.
J'ai galéré pas mal aussi avant de savoir ça...
# man getpass()
Posté par neologix . Évalué à 3.
Sachant que dès que tu as fini de jouer avec ton mot de passe, il faut l'écraser avec des 0 du genre memset(pass, 0, sizeof(pass)), pour éviter qu'il soit (en clair ou non) en mémoire, parce qu'un coredump par exemple c'est vite arrivé...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.