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

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Thu Oct 2 05:14:03 PDT 2014


On Tue, Sep 30, 2014 at 04:24:49PM +0200, Tom Gundersen wrote:
> Hi David,
> 
> Just a quick follow up on these two patches (sorry for the delay).
> 
> On the one hand, we want this interface to be very basic and should
> probably not something we should extend to cover all sorts of things.
> On the other hand, this usecase (and similar ones where you have a
> real password, but maybe it is a one-time password, so you don't care
> about hiding it) seems very natural, and the patches are simple.
> 
> I'll leave it up to Lennart to decide.

Yes, the patch looks OK, but like with the other one, please
rename do_echo to echo, and add an extra argument to the function instead
of adding a second function.

Zbyszek

> A couple of inline nitpicks:
> 
> On Fri, Sep 19, 2014 at 12:09 PM, David Sommerseth <davids at redhat.com> wrote:
> > 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>
> 
> No need for s-o-b in systemd.
> 
> > ---
> >  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"
> 
> I would probably rename this to just "Echo"
> 
> >                  "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);


More information about the systemd-devel mailing list