Thank you! I'll try it that way. sorry it took me so long to notice, I thought I'd be notified or maybe I missed it.
On Thursday, April 13, 2017 at 3:08:16 AM UTC+2, Denis Fuenzalida wrote: > > I had a look and the problem with approach #2 is that the signature of > readLine expects 2 args: a format string and an array of objects to be used > in the prompt. And it returns an array of chars, so you need something like: > > (let [console (System/console) > chars (.readPassword console "%s" (into-array [prompt]))] > (apply str chars)) > > I read in https://groups.google.com/forum/#!topic/clojure/ymDZj7T35x4 > that you can check also the contents of the *ns* var to determine if you > are running in a REPL or not. > > I created a dummy Leiningen project with the following functions: > > (defn read-password [prompt] > ;; Based on https://groups.google.com/forum/#!topic/clojure/ymDZj7T35x4 > (if (= "user" (str (.getName *ns*))) > (do > (print (format "%s [will be echoed to the screen]" prompt)) > (flush) > (read-line)) > (let [console (System/console) > chars (.readPassword console "%s" (into-array [prompt]))] > (apply str chars)))) > > (defn -main [& args] > (let [password (read-password "Enter your password:")] > (println (format "Your pasword is '%s'" password)))) > > When running with `lein run` it echoes to the screen as expected. When ran > as `java -jar target/uberjar/readpass-0.1.0-SNAPSHOT-standalone.jar` it > uses the version that doesn't echo. > > -- Denis > > El martes, 11 de abril de 2017, 15:10:08 (UTC-7), Guillermo Vayá Pérez > escribió: >> >> Hi, >> I'm currently trying to get a password from the user in case it wasn't >> supplied by other means, but it seems to be a bit more difficult than I >> expected. I've already searched both the web and this mail list finding >> only partial solutions to the problem. I must say I'm not completely fluent >> in Clojure, so I'm sure there is a lot of room for improvement both in my >> solution and also the way I write it. Help on both is appreciated. >> >> Up to now what I've got so far are a couple of solutions that I'm not >> happy with, I'll put some comments on each one to clarify any problems: >> >> >> (defn- get-passkey1 >> [] >> ;; - not a good method, it can be copied back selecting where >> ;; text appears to be (cursor moves although nothing is printed) >> ;; - code is ugly as hell >> ;; - ansi control codes are not portable >> (print (str "password: \033[8m")) >> (flush) >> (let [pass (read-line)] >> (print (str "\033[K\033[0m")) ;; k should kill the line, but since >> read-line expects a newline, >> ;; I don't get to really kill it, so >> the pass is exposed >> (flush) >> pass)) >> >> (defn- get-passkey2 >> [] >> ;; - doesn't work as it initially fails due to a null pointer both with >> repl and lein run >> ;; - improves a little if run with lein trampoline run (not ideal), but >> ;; complains that there is no readPassword method that matches. >> (let [console (System/console)] >> (.readPassword console "Password: %s"))) >> >> ;; this one needs (:import [jline.console ConsoleReader]) >> (defn- get-passkey3 >> [] >> ;; - in a repl this freezes the interpreter >> ;; - seems to work fine with lein run, but getting the whole >> ;; library for two lines of code seems expensive to me. >> ;; - still I'd go this route if this was the way to go (no freezing at >> least) >> (print "Enter password") >> (flush) >> (let [cr (ConsoleReader.)] >> (.readLine cr "password?" \*))) >> >> The best solution I've worked up to now is a mix between 1 and 3, >> detecting if I'm in a repl (via another ugly hack to see if there are >> command line parameters) and choose between them to sort each one's >> shortcommings. >> >> I'm wondering if there is a better way (and hoping there is) or if I can >> fix the issues with any of the implementations so I don't have to apply >> patch of code over patch of code. >> >> Thanks for any help given, >> >> Guillermo Vayá >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.