]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ask-password-api: move tty_fd into AskPasswordRequest structure, too
authorLennart Poettering <lennart@poettering.net>
Thu, 7 Nov 2024 09:30:34 +0000 (10:30 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 2 Jan 2025 15:38:12 +0000 (16:38 +0100)
21 files changed:
src/ask-password/ask-password.c
src/bootctl/bootctl-install.c
src/cryptenroll/cryptenroll-password.c
src/cryptenroll/cryptenroll-tpm2.c
src/cryptsetup/cryptsetup.c
src/firstboot/firstboot.c
src/home/homectl.c
src/keyutil/keyutil.c
src/measure/measure.c
src/pcrlock/pcrlock.c
src/repart/repart.c
src/sbsign/sbsign.c
src/shared/ask-password-api.c
src/shared/ask-password-api.h
src/shared/cryptsetup-fido2.c
src/shared/cryptsetup-tpm2.c
src/shared/dissect-image.c
src/shared/libfido2-util.c
src/shared/pkcs11-util.c
src/test/test-ask-password-api.c
src/tty-ask-password-agent/tty-ask-password-agent.c

index 59eb7acdddb3c43ce9702581f9bece931f325086..17e5fa4dc1a893d34b3f051ed80e982b4e2ee0db 100644 (file)
@@ -252,6 +252,7 @@ static int run(int argc, char *argv[]) {
         timeout = arg_timeout > 0 ? usec_add(now(CLOCK_MONOTONIC), arg_timeout) : 0;
 
         AskPasswordRequest req = {
+                .tty_fd = -EBADF,
                 .message = arg_message,
                 .icon = arg_icon,
                 .id = arg_id,
index 7ad264d8821144e72d8517fbf1bba22314b82fe9..0a5b59a503086c95b954791ee34780fe78dbfe3d 100644 (file)
@@ -984,6 +984,7 @@ int verb_install(int argc, char *argv[], void *userdata) {
                                 arg_private_key_source,
                                 arg_private_key,
                                 &(AskPasswordRequest) {
+                                        .tty_fd = -EBADF,
                                         .id = "bootctl-private-key-pin",
                                         .keyring = arg_private_key,
                                         .credential = "bootctl.private-key-pin",
index f6b53d4a76b3b792a75e0cc07c924a086a50d3fc..0560eddb6642c40d17cb7ad85128fce701442de2 100644 (file)
@@ -55,6 +55,7 @@ int load_volume_key_password(
                         return log_oom();
 
                 AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = question,
                         .icon = "drive-harddisk",
                         .id = id,
@@ -130,6 +131,7 @@ int enroll_password(
                         return log_oom();
 
                 AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .icon = "drive-harddisk",
                         .id = id,
                         .keyring = "cryptenroll",
index ca163ef3c2f8b901e02734add3eb8d83a2ccb223..a5750427dc78b6fb5037b34eea025a5e336faa86 100644 (file)
@@ -119,6 +119,7 @@ static int get_pin(char **ret_pin_str, TPM2Flags *ret_flags) {
                                                 SYNTHETIC_ERRNO(ENOKEY), "Too many attempts, giving up.");
 
                         AskPasswordRequest req = {
+                                .tty_fd = -EBADF,
                                 .message = "Please enter TPM2 PIN:",
                                 .icon = "drive-harddisk",
                                 .keyring = "tpm2-pin",
index 1da9e21d8e22f161cb86a54ceb324bfddd36a4ee..97acb03baf734904279310bd4e44f4bf13fbd24e 100644 (file)
@@ -906,6 +906,7 @@ static int get_password(
                 return log_oom();
 
         AskPasswordRequest req = {
+                .tty_fd = -EBADF,
                 .message = text,
                 .icon = "drive-harddisk",
                 .id = id,
@@ -1422,6 +1423,7 @@ static int crypt_activate_by_token_pin_ask_password(
                 pins = strv_free_erase(pins);
 
                 AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = message,
                         .icon = "drive-harddisk",
                         .keyring = keyring,
index bf9b840a23c66d90e383a13fae348d3a833ae916..08c80f539a9538f650443a80fe676525ec3d5245 100644 (file)
@@ -735,10 +735,11 @@ static int prompt_root_password(int rfd) {
                 _cleanup_free_ char *error = NULL;
 
                 AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = msg1,
                 };
 
-                r = ask_password_tty(-EBADF, &req, /* until= */ 0, /* flags= */ 0, &a);
+                r = ask_password_tty(&req, /* until= */ 0, /* flags= */ 0, &a);
                 if (r < 0)
                         return log_error_errno(r, "Failed to query root password: %m");
                 if (strv_length(a) != 1)
@@ -760,7 +761,7 @@ static int prompt_root_password(int rfd) {
 
                 req.message = msg2;
 
-                r = ask_password_tty(-EBADF, &req, /* until= */ 0, /* flags= */ 0, &b);
+                r = ask_password_tty(&req, /* until= */ 0, /* flags= */ 0, &b);
                 if (r < 0)
                         return log_error_errno(r, "Failed to query root password: %m");
                 if (strv_length(b) != 1)
index b3aacbcbcf9e356c0566f52fbb35d2541c811172..fbb38b64cf281b4a46785b3fd2717a8ee5973652 100644 (file)
@@ -263,6 +263,7 @@ static int acquire_existing_password(
                 return log_oom();
 
         AskPasswordRequest req = {
+                .tty_fd = -EBADF,
                 .message = question,
                 .icon = "user-home",
                 .keyring = "home-password",
@@ -321,6 +322,7 @@ static int acquire_recovery_key(
                 return log_oom();
 
         AskPasswordRequest req = {
+                .tty_fd = -EBADF,
                 .message = question,
                 .icon = "user-home",
                 .keyring = "home-recovery-key",
@@ -375,6 +377,7 @@ static int acquire_token_pin(
                 return log_oom();
 
         AskPasswordRequest req = {
+                .tty_fd = -EBADF,
                 .message = question,
                 .icon = "user-home",
                 .keyring = "token-pin",
@@ -1229,6 +1232,7 @@ static int acquire_new_password(
                         return log_oom();
 
                 AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = question,
                         .icon = "user-home",
                         .keyring = "home-password",
index 70176c76c732110758f684fa0063c729f3993622..b034c1c40fef8fedc6c86b9bbc8bc8c65a9bd444 100644 (file)
@@ -182,6 +182,7 @@ static int verb_validate(int argc, char *argv[], void *userdata) {
                         arg_private_key_source,
                         arg_private_key,
                         &(AskPasswordRequest) {
+                                .tty_fd = -EBADF,
                                 .id = "keyutil-private-key-pin",
                                 .keyring = arg_private_key,
                                 .credential = "keyutil.private-key-pin",
@@ -238,6 +239,7 @@ static int verb_public(int argc, char *argv[], void *userdata) {
                                 arg_private_key_source,
                                 arg_private_key,
                                 &(AskPasswordRequest) {
+                                        .tty_fd = -EBADF,
                                         .id = "keyutil-private-key-pin",
                                         .keyring = arg_private_key,
                                         .credential = "keyutil.private-key-pin",
index 22dd18312537adde8611641f1e41916cf05b8562..c4ca9dc8da6508ab2d227391fe0bc46c17557f54 100644 (file)
@@ -888,6 +888,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
                                 arg_private_key_source,
                                 arg_private_key,
                                 &(AskPasswordRequest) {
+                                        .tty_fd = -EBADF,
                                         .id = "measure-private-key-pin",
                                         .keyring = arg_private_key,
                                         .credential = "measure.private-key-pin",
index 9562bf2a892be8c9c2fcf9dcf4063e4272088e69..bbf2ae856c921d29822b13db7f3f53c87fca68c8 100644 (file)
@@ -4551,6 +4551,7 @@ static int make_policy(bool force, RecoveryPinMode recovery_pin_mode) {
                         _cleanup_(strv_free_erasep) char **l = NULL;
 
                         AskPasswordRequest req = {
+                                .tty_fd = -EBADF,
                                 .message = "Recovery PIN",
                                 .id = "pcrlock-recovery-pin",
                                 .credential = "pcrlock.recovery-pin",
index 1a88185c475585277d28d776164293c22f699880..a89810fbf57ece0b7922bdaf577eb2d9656b2d68 100644 (file)
@@ -8572,6 +8572,7 @@ static int parse_argv(int argc, char *argv[], X509 **ret_certificate, EVP_PKEY *
                                 arg_private_key_source,
                                 arg_private_key,
                                 &(AskPasswordRequest) {
+                                        .tty_fd = -EBADF,
                                         .id = "repart-private-key-pin",
                                         .keyring = arg_private_key,
                                         .credential = "repart.private-key-pin",
index d17fdfea5eddb00f9aca0bd9de7f9090ff2d8150..538c2ebe63e82d2515683e583bf4c380cdd2e249 100644 (file)
@@ -203,6 +203,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
                         arg_private_key_source,
                         arg_private_key,
                         &(AskPasswordRequest) {
+                                .tty_fd = -EBADF,
                                 .id = "sbsign-private-key-pin",
                                 .keyring = arg_private_key,
                                 .credential = "sbsign.private-key-pin",
index e8ba9a2c36161ee873636f5b4f910cfa551649c2..f1e2b06c3dc4edac587edc6efcd3dcdfe6c2d847 100644 (file)
@@ -463,7 +463,6 @@ int ask_password_plymouth(
 #define SKIPPED "(skipped)"
 
 int ask_password_tty(
-                int ttyfd,
                 const AskPasswordRequest *req,
                 usec_t until,
                 AskPasswordFlags flags,
@@ -526,8 +525,11 @@ int ask_password_tty(
         CLEANUP_ERASE(passphrase);
 
         /* If the caller didn't specify a TTY, then use the controlling tty, if we can. */
-        if (ttyfd < 0)
+        int ttyfd;
+        if (req->tty_fd < 0)
                 ttyfd = cttyfd = open("/dev/tty", O_RDWR|O_NOCTTY|O_CLOEXEC);
+        else
+                ttyfd = req->tty_fd;
 
         if (ttyfd >= 0) {
                 if (tcgetattr(ttyfd, &old_termios) < 0)
@@ -1128,7 +1130,7 @@ int ask_password_auto(
         }
 
         if (!FLAGS_SET(flags, ASK_PASSWORD_NO_TTY) && isatty_safe(STDIN_FILENO))
-                return ask_password_tty(-EBADF, req, until, flags, ret);
+                return ask_password_tty(req, until, flags, ret);
 
         if (!FLAGS_SET(flags, ASK_PASSWORD_NO_AGENT))
                 return ask_password_agent(req, until, flags, ret);
index c8763700c8c794d63f4b7051b8ab3f87e6046201..1abaad2134f63aeb830dbd7ee1d7517ee9effdfb 100644 (file)
@@ -27,9 +27,10 @@ typedef struct AskPasswordRequest {
         const char *id;              /* some identifier used for this prompt for the "ask-password" protocol */
         const char *credential;      /* $CREDENTIALS_DIRECTORY credential name */
         const char *flag_file;       /* Once this flag file disappears abort the query */
+        int tty_fd;                  /* If querying on a TTY, the TTY to query on (or -EBADF) */
 } AskPasswordRequest;
 
-int ask_password_tty(int tty_fd, const AskPasswordRequest *req, usec_t until, AskPasswordFlags flags, char ***ret);
+int ask_password_tty(const AskPasswordRequest *req, usec_t until, AskPasswordFlags flags, char ***ret);
 int ask_password_plymouth(const AskPasswordRequest *req, usec_t until, AskPasswordFlags flags, char ***ret);
 int ask_password_agent(const AskPasswordRequest *req, usec_t until, AskPasswordFlags flag, char ***ret);
 int ask_password_auto(const AskPasswordRequest *req, usec_t until, AskPasswordFlags flag, char ***ret);
index 1e1ef6dec02caf95bfaffbdb116e02d189662165..6e4b120ae6a9b26ee8d4cd7ba130fa2a87a1f619 100644 (file)
@@ -112,6 +112,7 @@ int acquire_fido2_key(
                         return log_error_errno(SYNTHETIC_ERRNO(ENOPKG), "PIN querying disabled via 'headless' option. Use the '$PIN' environment variable.");
 
                 static const AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = "Please enter security token PIN:",
                         .icon = "drive-harddisk",
                         .keyring = "fido2-pin",
index bc4fb100bb156aec619650e9720210ec2e3896e1..05f0fa2bfa703bcf6c8d09721c58585f4c691273 100644 (file)
@@ -35,6 +35,7 @@ static int get_pin(
                                         "Use the '$PIN' environment variable.");
 
                 AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = "Please enter TPM2 PIN:",
                         .icon = "drive-harddisk",
                         .keyring = "tpm2-pin",
index 39c5c8a21a2648903c2f5a73189d9032b6807682..5a65f55fca9977e0703b93cac945f67237b4c6e6 100644 (file)
@@ -3077,6 +3077,7 @@ int dissected_image_decrypt_interactively(
                 z = strv_free_erase(z);
 
                 static const AskPasswordRequest req = {
+                        .tty_fd = -EBADF,
                         .message = "Please enter image passphrase:",
                         .id = "dissect",
                         .keyring = "dissect",
index b518dec7fa8e20c749d2d6d18f4a36a7959d93b9..8e981f4c846fff007fbed86ba7b5c40320623719 100644 (file)
@@ -857,6 +857,7 @@ int fido2_generate_hmac_hash(
                 for (;;) {
                         _cleanup_strv_free_erase_ char **pin = NULL;
                         AskPasswordRequest req = {
+                                .tty_fd = -EBADF,
                                 .message = "Please enter security token PIN:",
                                 .icon = askpw_icon,
                                 .keyring = "fido2-pin",
index c7fa3eccb27831d0b79f513a87705df3bac351a6..caec1606ed0255f04f3f76e4f30cfa83146ae601 100644 (file)
@@ -380,6 +380,7 @@ int pkcs11_token_login(
                                 return log_oom();
 
                         AskPasswordRequest req = {
+                                .tty_fd = -EBADF,
                                 .message = text,
                                 .icon = askpw_icon,
                                 .id = id,
index efd19696c89dd82642fc68c9c057a53d9e5d23c2..ccf3cee9f386f329e74f00d91280414de7ceaec9 100644 (file)
@@ -9,11 +9,12 @@ TEST(ask_password) {
         int r;
 
         static const AskPasswordRequest req = {
+                .tty_fd = -EBADF,
                 .message = "hello?",
                 .keyring = "da key",
         };
 
-        r = ask_password_tty(-EBADF, &req, /* until= */ 0, /* flags= */ ASK_PASSWORD_CONSOLE_COLOR, &ret);
+        r = ask_password_tty(&req, /* until= */ 0, /* flags= */ ASK_PASSWORD_CONSOLE_COLOR, &ret);
         if (r == -ECANCELED)
                 ASSERT_NULL(ret);
         else {
index 3c38fbbd41ece50c761164fcd6b8140421e5a1e0..fdc819754bcd5be566c4bceeb8a2a872bd92f3b4 100644 (file)
@@ -148,11 +148,12 @@ static int agent_ask_password_tty(
         }
 
         AskPasswordRequest req = {
+                .tty_fd = tty_fd,
                 .message = message,
                 .flag_file = flag_file,
         };
 
-        r = ask_password_tty(tty_fd, &req, until, flags, ret);
+        r = ask_password_tty(&req, until, flags, ret);
 
         if (arg_console) {
                 assert(tty_fd >= 0);
@@ -254,6 +255,7 @@ static int process_one_password_file(const char *filename, FILE *f) {
                 } else {
                         if (arg_plymouth) {
                                 AskPasswordRequest req = {
+                                        .tty_fd = -EBADF,
                                         .message = message,
                                         .flag_file = filename,
                                 };