[systemd-devel] [PATCH] tty-ask-password-agent: Allow user input to be echoed

David Sommerseth davids at redhat.com
Fri Sep 19 03:09:05 PDT 2014


This is a continuation of the patch "ask-password: Add --do-echo to enable
echoing the user input".

This allows user input going via the ask-password-agent to be echoed
as well, if the --do-echo argument is provided to systemd-ask-password.

Again it was preferred to add a new function, ask_password_agent_echo(),
over modifying the ask_password_agent() API to make the use case clearer
and keep backwards compatibility with applications depending on
ask_password_agent().

Signed-off-by: David Sommerseth <davids at redhat.com>
---
 src/ask-password/ask-password.c                     |  5 ++++-
 src/shared/ask-password-api.c                       | 16 +++++++++++++++-
 src/shared/ask-password-api.h                       |  2 ++
 src/tty-ask-password-agent/tty-ask-password-agent.c |  6 ++++--
 4 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/src/ask-password/ask-password.c b/src/ask-password/ask-password.c
index c77cc66..c6744b9 100644
--- a/src/ask-password/ask-password.c
+++ b/src/ask-password/ask-password.c
@@ -179,7 +179,10 @@ int main(int argc, char *argv[]) {
         } else {
                 char **l;
 
-                if ((r = ask_password_agent(arg_message, arg_icon, arg_id, timeout, arg_accept_cached, &l)) >= 0) {
+                r = arg_do_echo ? ask_password_agent_echo(arg_message, arg_icon, arg_id, timeout, arg_accept_cached, &l)
+                        : ask_password_agent(arg_message, arg_icon, arg_id, timeout, arg_accept_cached, &l);
+
+                if (r >= 0) {
                         char **p;
 
                         STRV_FOREACH(p, l) {
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index 283bfc2..39c122e 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -311,12 +311,13 @@ fail:
         return r;
 }
 
-int ask_password_agent(
+static int __ask_password_agent(
                 const char *message,
                 const char *icon,
                 const char *id,
                 usec_t until,
                 bool accept_cached,
+                bool do_echo,
                 char ***_passphrases) {
 
         enum {
@@ -378,10 +379,12 @@ int ask_password_agent(
                 "PID="PID_FMT"\n"
                 "Socket=%s\n"
                 "AcceptCached=%i\n"
+                "DoEcho=%i\n"
                 "NotAfter="USEC_FMT"\n",
                 getpid(),
                 socket_name,
                 accept_cached ? 1 : 0,
+                do_echo ? 1 : 0,
                 until);
 
         if (message)
@@ -557,6 +560,17 @@ finish:
         return r;
 }
 
+int ask_password_agent(const char *message, const char *icon, const char *id,
+                       usec_t until, bool accept_cached, char ***_passphrases) {
+        return __ask_password_agent(message, icon, id, until, accept_cached, false, _passphrases);
+}
+
+int ask_password_agent_echo(const char *message, const char *icon, const char *id,
+                            usec_t until, bool accept_cached, char ***_passphrases) {
+        return __ask_password_agent(message, icon, id, until, accept_cached, true, _passphrases);
+}
+
+
 int ask_password_auto(const char *message, const char *icon, const char *id,
                       usec_t until, bool accept_cached, char ***_passphrases) {
         assert(message);
diff --git a/src/shared/ask-password-api.h b/src/shared/ask-password-api.h
index c3dde63..d467398 100644
--- a/src/shared/ask-password-api.h
+++ b/src/shared/ask-password-api.h
@@ -28,6 +28,8 @@ int ask_password_tty_echo(const char *message, usec_t until, const char *flag_fi
 
 int ask_password_agent(const char *message, const char *icon, const char *id,
                        usec_t until, bool accept_cached, char ***_passphrases);
+int ask_password_agent_echo(const char *message, const char *icon, const char *id,
+                            usec_t until, bool accept_cached, char ***_passphrases);
 
 int ask_password_auto(const char *message, const char *icon, const char *id,
                       usec_t until, bool accept_cached, char ***_passphrases);
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index 8a02fb0..90bbd1e 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -214,7 +214,7 @@ static int parse_password(const char *filename, char **wall) {
         _cleanup_free_ char *socket_name = NULL, *message = NULL, *packet = NULL;
         uint64_t not_after = 0;
         unsigned pid = 0;
-        bool accept_cached = false;
+        bool accept_cached = false, do_echo = false;
 
         const ConfigTableItem items[] = {
                 { "Ask", "Socket",       config_parse_string,   0, &socket_name   },
@@ -222,6 +222,7 @@ static int parse_password(const char *filename, char **wall) {
                 { "Ask", "Message",      config_parse_string,   0, &message       },
                 { "Ask", "PID",          config_parse_unsigned, 0, &pid           },
                 { "Ask", "AcceptCached", config_parse_bool,     0, &accept_cached },
+                { "Ask", "DoEcho",       config_parse_bool,     0, &do_echo       },
                 {}
         };
 
@@ -314,7 +315,8 @@ static int parse_password(const char *filename, char **wall) {
                                         return tty_fd;
                         }
 
-                        r = ask_password_tty(message, not_after, filename, &password);
+                        r = do_echo ? ask_password_tty_echo(message, not_after, filename, &password)
+                                : ask_password_tty(message, not_after, filename, &password);
 
                         if (arg_console) {
                                 safe_close(tty_fd);
-- 
1.8.3.1



More information about the systemd-devel mailing list