All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ankit Jain <jankit-IBi9RG/b67k@public.gmane.org>
To: linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [PATCH] mount.cifs: Use systemd's mechanism for getting password, if present
Date: Fri, 22 Jun 2012 15:04:23 +0530	[thread overview]
Message-ID: <4FE43C1F.8060605@suse.com> (raw)

If the mount requests are "from" cifstab, then just asking for
"Password:" would be unclear, this asks it as:
  "Password for user@.. :"

  I'm not subscribed to the mailing list.

---
mount.cifs: Use systemd's mechanism for getting password, if present.
    
If systemd is running, then use /bin/systemd-ask-password to get
the password instead of get_pass(..) .

Reference: bug: https://bugzilla.novell.com/show_bug.cgi?id=767894

diff --git a/mount.cifs.c b/mount.cifs.c
index 6f3f382..d721de6 100644
--- a/mount.cifs.c
+++ b/mount.cifs.c
@@ -1687,6 +1687,58 @@ drop_child_privs(void)
 	return 0;
 }
 
+/*
+ * If systemd is present, then try to get password via
+ * /bin/systemd-ask-password, else just use getpass(..)
+ */
+static char*
+get_password(const char *prompt, char *input, int capacity)
+{
+	int is_systemd_running;
+	struct stat a, b;
+
+	/* We simply test whether the systemd cgroup hierarchy is
+	 * mounted */
+	is_systemd_running = (lstat("/sys/fs/cgroup", &a) == 0)
+		&& (lstat("/sys/fs/cgroup/systemd", &b) == 0)
+		&& (a.st_dev != b.st_dev);
+
+	if (is_systemd_running) {
+		/* systemd */
+		char *cmd;
+		FILE *fp = NULL;
+
+		if (asprintf(&cmd, "/bin/systemd-ask-password \"%s\"", prompt) >= 0) {
+			fp = popen (cmd, "re");
+			free (cmd);
+		}
+
+		if (!fp)
+			return NULL;
+
+		if (fgets(input, capacity, fp)) {
+			int len = strlen(input);
+			if (input[len - 1] == '\n')
+				input[len - 1] = '\0';
+		}
+
+		fclose(fp);
+	} else {
+		/* getpass is obsolete, but there's apparently nothing that replaces it */
+		char *tmp_pass = getpass(prompt);
+		if (!tmp_pass)
+			return NULL;
+
+		strncpy(input, tmp_pass, capacity - 1);
+		input[capacity - 1] = '\0';
+
+		/* zero-out the static buffer */
+		memset(tmp_pass, 0, strlen(tmp_pass));
+	}
+
+	return input;
+}
+
 static int
 assemble_mountinfo(struct parsed_mount_info *parsed_info,
 		   const char *thisprogram, const char *mountpoint,
@@ -1768,14 +1820,20 @@ assemble_mountinfo(struct parsed_mount_info *parsed_info,
 	}
 
 	if (!parsed_info->got_password) {
-		/* getpass is obsolete, but there's apparently nothing that replaces it */
-		char *tmp_pass = getpass("Password: ");
-		if (!tmp_pass) {
+		char tmp_pass[MOUNT_PASSWD_SIZE + 1];
+		char *prompt = NULL;
+
+		if(asprintf(&prompt, "Password for %s@%s: ", parsed_info->username, orig_dev) < 0)
+			prompt = NULL;
+
+		if (get_password(prompt ? prompt : "Password: ", tmp_pass, MOUNT_PASSWD_SIZE + 1)) {
+			rc = set_password(parsed_info, tmp_pass);
+		} else {
 			fprintf(stderr, "Error reading password, exiting\n");
 			rc = EX_SYSERR;
-			goto assemble_exit;
 		}
-		rc = set_password(parsed_info, tmp_pass);
+
+		free(prompt);
 		if (rc)
 			goto assemble_exit;
 	}

-- 
Ankit Jain
SUSE Labs

             reply	other threads:[~2012-06-22  9:34 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-22  9:34 Ankit Jain [this message]
     [not found] ` <4FE43C1F.8060605-IBi9RG/b67k@public.gmane.org>
2012-06-25 19:24   ` [PATCH] mount.cifs: Use systemd's mechanism for getting password, if present Jeff Layton
     [not found]     ` <20120625152439.1a68fb6f-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2012-06-26  7:04       ` Ankit Jain
     [not found]         ` <4FE95EFA.4030809-IBi9RG/b67k@public.gmane.org>
2012-06-26 11:28           ` Jeff Layton
     [not found]             ` <20120626042835.0a20e3f3-4QP7MXygkU+dMjc06nkz3ljfA9RmPOcC@public.gmane.org>
2012-07-17 13:58               ` Ankit Jain
     [not found]                 ` <50056F71.9010509-IBi9RG/b67k@public.gmane.org>
2012-07-18 10:45                   ` Jeff Layton
2012-07-20 18:51                   ` Jeff Layton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FE43C1F.8060605@suse.com \
    --to=jankit-ibi9rg/b67k@public.gmane.org \
    --cc=linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.