[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