]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tty-ask-pwd-agent: give the possiblity to skip a password prompt
authorFranck Bui <fbui@suse.com>
Thu, 19 Sep 2019 13:18:18 +0000 (15:18 +0200)
committerFranck Bui <fbui@suse.com>
Sat, 5 Oct 2019 06:08:24 +0000 (08:08 +0200)
If multiple passwords are waiting the agent will prompt for each of them. Give
the possiblity to the user to skip some of them by pressing 'C-d'.

src/shared/ask-password-api.c
src/tty-ask-password-agent/tty-ask-password-agent.c

index c41fa2dea6d8102f908349d416d57066b65d3242..46f06fe99ba697fc92d3787c9c358ba838a21687 100644 (file)
@@ -371,6 +371,13 @@ int ask_password_tty(
                 if (n == 0 || c == '\n' || c == 0)
                         break;
 
+                if (c == 4) { /* C-d also known as EOT */
+                        if (ttyfd >= 0)
+                                (void) loop_write(ttyfd, "(skipped)", 9, false);
+
+                        goto skipped;
+                }
+
                 if (c == 21) { /* C-u */
 
                         if (!(flags & ASK_PASSWORD_SILENT))
@@ -467,6 +474,7 @@ int ask_password_tty(
         if (r < 0)
                 goto finish;
 
+skipped:
         if (keyname)
                 (void) add_to_keyring_and_log(keyname, flags, l);
 
index 72b04e6f0e708d1490c9aece7b6511140cf5d9a3..504ba9162dbae53c80550fc20f3e729a19c92d78 100644 (file)
@@ -417,6 +417,9 @@ static int process_one_password_file(const char *filename) {
                 if (r < 0)
                         return log_error_errno(r, "Failed to query password: %m");
 
+                if (strv_isempty(passwords))
+                        return -ECANCELED;
+
                 r = send_passwords(socket_name, passwords);
                 if (r < 0)
                         return log_error_errno(r, "Failed to send: %m");
@@ -525,11 +528,20 @@ static int process_and_watch_password_files(void) {
         pollfd[FD_SIGNAL].events = POLLIN;
 
         for (;;) {
+                int timeout = -1;
+
                 r = process_password_files();
-                if (r < 0)
-                        log_error_errno(r, "Failed to process password: %m");
+                if (r < 0) {
+                        if (r == -ECANCELED)
+                                /* Disable poll() timeout since at least one password has
+                                 * been skipped and therefore one file remains and is
+                                 * unlikely to trigger any events. */
+                                timeout = 0;
+                        else
+                                log_error_errno(r, "Failed to process password: %m");
+                }
 
-                if (poll(pollfd, _FD_MAX, -1) < 0) {
+                if (poll(pollfd, _FD_MAX, timeout) < 0) {
                         if (errno == EINTR)
                                 continue;