Boire ou coder ... Pourquoi choisir?
Publié le 16 décembre 2009 23:00

Ruby console : demander un mot de passe

J'ai déjà mentionné la récupération d'informations par l'utilisateur en ruby console dans l'article Read Eval Print Loop. Cependant il arrive qu'il soit nécessaire de récupérer des informations sensibles via la console. Un mot de passe par exemple. Celui-ci ne devra pas s'afficher sur l'écran pendant que vous le taperez. La librairie Ruby Password permet de faire cela de manière simple. Cependant cela implique dépendre de cette librairie. Et c'est quelque chose que je ne désire pas, surtout pour quelque chose d'aussi simple.

La solution que je vous propose ici utilise donc simplement les fonctionnalités de toute console linux (pas testé sous windows. Mais qui utilise encore windows de nos jours ? :mrgreen: ).

begin
    print "Username: "
    username = $stdin.gets.chomp</p>

<p>    print "Password: "
    # We hide the entered characters before to ask for the password
    system "stty -echo"
    password = $stdin.gets.chomp
    system "stty echo"
rescue NoMethodError, Interrupt
    # When the process is exited, we display the characters again
    # And we exit
    system "stty echo"
    exit
end

Que fait-on ? Nous commençons par demander un nom d'utilisateur.

print "Username: "
username = $stdin.gets.chomp
Celui-ci n'est pas une donnée sensible et peut donc être affiché sans problème. Rien de particulier à faire.

Ensuite nous demandons un mot de passe. La il faut le masquer.

print "Password: "
system "stty -echo"
password = $stdin.gets.chomp
system "stty echo"

Le "stty -echo" masquera tous les caractères qui devraient être affichés en console par la suite. Le "stty echo" permet d'afficher les caractères qui seront tapés ensuite.

Jusque la, ça fonctionne. Cool ! Mais d'un coup j'ai un utilisateur chiant (oui toi là-bas à côté du radiateur), qui décide au dernier moment de faire Ctrl-C pour quitter le programme et se retrouve dans une console en -echo et ne voit donc plus ce qu'il tape. On vient pas de se faire un ami.

Heureusement on gère l'arrêt du système notre rescue, ou l'on indique que lorsqu'un Ctrl-C est envoyé, on désire quitter l'application. Lorsque c'est le cas, nous n'avons donc plus qu'à également réafficher les caractères et le tour est joué !

begin
    # ...
rescue NoMethodError, Interrupt
    system "stty echo"
    exit
end

Hop ! :) Et le projet qui utilise ceci, c'est glynn :)

Commentaires

Philippe Creux
Philippe Creux dit: 29 décembre 2009 23:00 Site web

Cowl! J'achete!

Enthouan
Enthouan dit: 30 janvier 2010 23:00 Site web

Quand je vois ce qu'on doit faire en C pour enlever le mode Echo (appel ioctl, modification de la structure, ...) et que je vois ce petit bout de code Ruby. Je me dis que je devrais vraiment commencer à apprendre Ruby :).

Postez un commentaire

Markdown activé