* [Caml-list] How to read a password without displaying it? @ 2004-02-07 12:53 David MENTRE 2004-02-07 13:17 ` Basile STARYNKEVITCH 2004-02-07 14:50 ` Alain.Frisch 0 siblings, 2 replies; 9+ messages in thread From: David MENTRE @ 2004-02-07 12:53 UTC (permalink / raw) To: caml-list Hello, In my textual OCaml program, I would like to read a password. Currently, I'm using read_line which is not very satisfying as the password is display on screen. let passwd = read_line () in Any idea how I might read the password without displaying it? I tried the following function, using input_char, but the password is still displayed on screen: let read_password () = let password_chars = ref [] in let loop = ref true in while !loop do let c = input_char stdin in if c <> '\n' then ( password_chars := c :: !password_chars ) else ( loop := false ) done; let password = String.create (List.length !password_chars) in let _, res = List.fold_right (fun c (i, s) -> s.[i] <- c; (i+1, s)) !password_chars (0, password) in res Many thanks in advance for any help, Yours, d. -- David Mentré <dmentre@linux-france.org> ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 12:53 [Caml-list] How to read a password without displaying it? David MENTRE @ 2004-02-07 13:17 ` Basile STARYNKEVITCH 2004-02-07 13:42 ` Maxence Guesdon 2004-02-07 14:45 ` David MENTRE 2004-02-07 14:50 ` Alain.Frisch 1 sibling, 2 replies; 9+ messages in thread From: Basile STARYNKEVITCH @ 2004-02-07 13:17 UTC (permalink / raw) To: David MENTRE, caml-list [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain; charset=unknown-8bit, Size: 2759 bytes --] On Sat, Feb 07, 2004 at 01:53:20PM +0100, David MENTRÉ wrote: > > In my textual OCaml program, I would like to read a password. Currently, > I'm using read_line which is not very satisfying as the password is > display on screen. > > let passwd = read_line () in > > Any idea how I might read the password without displaying it? I have a few ideas, but I'm sure you already know them. First, I assume you have (and target only) a Unix-like system. All tricks below are probably non portable to Windows (an OS I never coded for, which I don't know). The first trick would be to call the C function getpass (which, according to its man page, is obsolete). You could also use the [in]famous GNU readline C library. You could also use the ncurses library. If you have an X11 server (but you apparently want a textual only interface), you might use (shameless plug) my GUIS gtk "server" program from http://starynkevitch.net/Basile/guisdoc.html You'll just have to code a few lines of Python or Ruby code creating a simple GUI interface. The ocaml application communicates with it using textual protocols. Of course, you could also run some tiny command which ask for your password. You might also issue the ioctl (that you need to code in C and call from Ocaml) which supress the echo and make the keyboard working in raw (non cooked) mode. I forgot the ugly details. You have to reset your tty to its previous state before exiting (or just after having got the password) > > I tried the following function, using input_char, but the password is > still displayed on screen: > > let read_password () = > let password_chars = ref [] in > let loop = ref true in > while !loop do > let c = input_char stdin in > if c <> '\n' then ( > password_chars := c :: !password_chars > ) else ( > loop := false > ) > done; > let password = String.create (List.length !password_chars) in > let _, res = List.fold_right (fun c (i, s) -> s.[i] <- c; (i+1, s)) > !password_chars (0, password) in > res I belive this should work if it where boxed by appriate ioctl removing the echo. I believe that you cannot do anything without a little C code (because ioctl or fcntl are not available to Ocaml, mostly because typing it is a nightmare) Regards. -- Basile STARYNKEVITCH http://starynkevitch.net/Basile/ email: basile<at>starynkevitch<dot>net aliases: basile<at>tunes<dot>org = bstarynk<at>nerim<dot>net 8, rue de la Faïencerie, 92340 Bourg La Reine, France ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 13:17 ` Basile STARYNKEVITCH @ 2004-02-07 13:42 ` Maxence Guesdon 2004-02-07 14:45 ` David MENTRE 1 sibling, 0 replies; 9+ messages in thread From: Maxence Guesdon @ 2004-02-07 13:42 UTC (permalink / raw) To: caml-list Hello, In Cash (http://pauillac.inria.fr/cash/), you can turn the echo of the tty on and off. It may be what you need. Hope this helps, -- Maxence Guesdon ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 13:17 ` Basile STARYNKEVITCH 2004-02-07 13:42 ` Maxence Guesdon @ 2004-02-07 14:45 ` David MENTRE 2004-02-07 14:54 ` David MENTRE 2004-02-07 14:59 ` Remi Vanicat 1 sibling, 2 replies; 9+ messages in thread From: David MENTRE @ 2004-02-07 14:45 UTC (permalink / raw) To: Basile STARYNKEVITCH; +Cc: caml-list Thank you Basile and Maxence for your replies, In fact, I wanted to do that in caml only, to be portable on Windows and I'm relunctant to bind to C code. However, from what you said, it seems impossible. I tried following trick, using '\b' on output. Strangely enough, the output_char have no effect, even if I do a flush. The '*' are printed *after* I do a <RETURN> on my terminal. I don't understand this behavior. The flush should send the caracters to the terminal. let read_password () = let password_chars = ref [] in let loop = ref true in while !loop do let c = input_char stdin in if c <> '\n' then ( password_chars := c :: !password_chars; output_char stdout '\b'; output_char stdout '*'; flush_all (); ) else ( loop := false ) done; let password = String.create (List.length !password_chars) in let _, res = List.fold_right (fun c (i, s) -> s.[i] <- c; (i+1, s)) !password_chars (0, password) in res Yours, d. -- David Mentré <dmentre@linux-france.org> ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 14:45 ` David MENTRE @ 2004-02-07 14:54 ` David MENTRE 2004-02-07 14:59 ` Remi Vanicat 1 sibling, 0 replies; 9+ messages in thread From: David MENTRE @ 2004-02-07 14:54 UTC (permalink / raw) To: Basile STARYNKEVITCH; +Cc: caml-list David MENTRE <dmentre@linux-france.org> writes: > I tried following trick, using '\b' on output. Strangely enough, the > output_char have no effect, even if I do a flush. The '*' are printed > *after* I do a <RETURN> on my terminal. I don't understand this > behavior. The flush should send the caracters to the terminal. Oops, I remembered my old unix programming. The shell (or whatever in front of the caml program) sends the whole line after <CR>. So my output is done on the following line. (sight) Yours, d. -- david.mentre@wanadoo.fr ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 14:45 ` David MENTRE 2004-02-07 14:54 ` David MENTRE @ 2004-02-07 14:59 ` Remi Vanicat 1 sibling, 0 replies; 9+ messages in thread From: Remi Vanicat @ 2004-02-07 14:59 UTC (permalink / raw) To: caml-list David MENTRE <dmentre@linux-france.org> writes: > Thank you Basile and Maxence for your replies, > > In fact, I wanted to do that in caml only, to be portable on Windows > and I'm relunctant to bind to C code. However, from what you said, > it seems impossible. Well, I would try to use the Terminal interface of the Unix library : open Unix let read_pass () = let attr = tcgetattr stdin in tcsetattr stdin TCSAFLUSH { attr with c_echo = false }; let line = read_line () in tcsetattr stdin TCSAFLUSH attr; line It work. Of course you could do something to print * when the user type something, but this is a first solution. By the way i don't know if this work on windows. -- Rémi Vanicat ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 12:53 [Caml-list] How to read a password without displaying it? David MENTRE 2004-02-07 13:17 ` Basile STARYNKEVITCH @ 2004-02-07 14:50 ` Alain.Frisch 2004-02-07 15:12 ` David MENTRE 1 sibling, 1 reply; 9+ messages in thread From: Alain.Frisch @ 2004-02-07 14:50 UTC (permalink / raw) To: David MENTRE; +Cc: caml-list On Sat, 7 Feb 2004, David MENTRE wrote: > Any idea how I might read the password without displaying it? The field c_echo in the record type Unix.terminal_io might be the solution. -- Alain ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 14:50 ` Alain.Frisch @ 2004-02-07 15:12 ` David MENTRE 2004-02-07 16:31 ` David Brown 0 siblings, 1 reply; 9+ messages in thread From: David MENTRE @ 2004-02-07 15:12 UTC (permalink / raw) To: Alain.Frisch; +Cc: caml-list Hello Alain, Alain.Frisch@ens.fr writes: > The field c_echo in the record type Unix.terminal_io might be the > solution. Thanks a lot Alain, you found the right solution. Here is the working code: open Unix [...] let read_password () = let term_init = tcgetattr stdin in let term_no_echo = { term_init with c_echo = false; } in tcsetattr stdin TCSANOW term_no_echo; let password = read_line () in tcsetattr stdin TCSAFLUSH term_init; password Many thanks, d. -- David Mentré <dmentre@linux-france.org> ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] How to read a password without displaying it? 2004-02-07 15:12 ` David MENTRE @ 2004-02-07 16:31 ` David Brown 0 siblings, 0 replies; 9+ messages in thread From: David Brown @ 2004-02-07 16:31 UTC (permalink / raw) To: David MENTRE; +Cc: Alain.Frisch, caml-list On Sat, Feb 07, 2004 at 04:12:01PM +0100, David MENTRE wrote: > open Unix > [...] > let read_password () = > let term_init = tcgetattr stdin in > let term_no_echo = { term_init with c_echo = false; } in > tcsetattr stdin TCSANOW term_no_echo; > let password = read_line () in > tcsetattr stdin TCSAFLUSH term_init; > password The only suggestion would be to put the read_line in a try clause, and restore the terminal settings if an exception is raised. Otherwise, pressing ^C leaves the terminal with echo off. Dave ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2004-02-07 16:31 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2004-02-07 12:53 [Caml-list] How to read a password without displaying it? David MENTRE 2004-02-07 13:17 ` Basile STARYNKEVITCH 2004-02-07 13:42 ` Maxence Guesdon 2004-02-07 14:45 ` David MENTRE 2004-02-07 14:54 ` David MENTRE 2004-02-07 14:59 ` Remi Vanicat 2004-02-07 14:50 ` Alain.Frisch 2004-02-07 15:12 ` David MENTRE 2004-02-07 16:31 ` David Brown
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox