From 3be9c3ae44c3ec6edbff4372a73aaafe295fdbb0 Mon Sep 17 00:00:00 2001 From: Justin Tirrell Date: Thu, 2 May 2024 10:04:42 -0400 Subject: [PATCH] Add `force-plaintext-read` --- src/io/sixtant/secrets.clj | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/io/sixtant/secrets.clj b/src/io/sixtant/secrets.clj index daad4cd..a8ff78d 100644 --- a/src/io/sixtant/secrets.clj +++ b/src/io/sixtant/secrets.clj @@ -137,22 +137,33 @@ nil))) +(def ^:dynamic *force-plaintext-read* false) +(defmacro force-plaintext-read + "Force reading via `clojure.core/read-line`." + [& body] + `(binding [*force-plaintext-read* true] + ~@body)) + +(defn read-plaintext [prompt] + (println "[WARN] No secure console available, reading via plaintext.") + (when prompt (print prompt) (flush)) + (read-line)) + (defn read-password "Attempt to read a password via a secure console if possible, falling back to secure input via Swing and finally to reading via plaintext (accompanied by a warning)." ([] (read-password nil)) ([prompt] - (if-let [console (System/console)] - (do - (when prompt (print prompt) (flush)) - (String. (.readPassword console))) - (if-let [pw (try-swing-read-password prompt)] - pw + (if *force-plaintext-read* + (read-plaintext prompt) + (if-let [console (System/console)] (do - (println "[WARN] No secure console available, reading via plaintext.") (when prompt (print prompt) (flush)) - (read-line)))))) + (String. (.readPassword console))) + (if-let [pw (try-swing-read-password prompt)] + pw + (read-plaintext prompt)))))) ;;; Disk (de)serialization