dovecot: Use mail_uid/gid settings if userdb didn't return uid/gid.

dovecot at dovecot.org dovecot at dovecot.org
Tue Sep 25 17:41:15 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/79176ff12ad8
changeset: 6497:79176ff12ad8
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Sep 25 17:41:11 2007 +0300
description:
Use mail_uid/gid settings if userdb didn't return uid/gid.

diffstat:

1 file changed, 55 insertions(+), 2 deletions(-)
src/deliver/auth-client.c |   57 +++++++++++++++++++++++++++++++++++++++++++--

diffs (86 lines):

diff -r 406c9a863f26 -r 79176ff12ad8 src/deliver/auth-client.c
--- a/src/deliver/auth-client.c	Tue Sep 25 12:56:10 2007 +0300
+++ b/src/deliver/auth-client.c	Tue Sep 25 17:41:11 2007 +0300
@@ -12,6 +12,8 @@
 
 #include <stdlib.h>
 #include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
 #include <sysexits.h>
 
 #define AUTH_REQUEST_TIMEOUT 60
@@ -50,6 +52,43 @@ static void auth_connection_destroy(stru
 	i_free(conn);
 }
 
+static bool parse_uid(const char *str, uid_t *uid_r)
+{
+	struct passwd *pw;
+	char *p;
+
+	if (*str >= '0' && *str <= '9') {
+		*uid_r = (uid_t)strtoul(str, &p, 10);
+		if (*p == '\0')
+			return TRUE;
+	}
+
+	pw = getpwnam(str);
+	if (pw == NULL)
+		return FALSE;
+
+	*uid_r = pw->pw_uid;
+	return TRUE;
+}
+
+static bool parse_gid(const char *str, gid_t *gid_r)
+{
+	struct group *gr;
+	char *p;
+
+	if (*str >= '0' && *str <= '9') {
+		*gid_r = (gid_t)strtoul(str, &p, 10);
+		if (*p == '\0')
+			return TRUE;
+	}
+
+	gr = getgrnam(str);
+	if (gr == NULL)
+		return FALSE;
+
+	*gid_r = gr->gr_gid;
+	return TRUE;
+}
 static void auth_parse_input(struct auth_connection *conn, const char *args)
 {
 	const char *const *tmp, *extra_groups;
@@ -99,13 +138,27 @@ static void auth_parse_input(struct auth
 		}
 	}
 
+	if (uid == 0 && getenv("MAIL_UID")) {
+		if (!parse_uid(getenv("MAIL_UID"), &uid) || uid == 0) {
+			i_error("mail_uid setting is invalid");
+			return_value = EX_TEMPFAIL;
+			return;
+		}
+	}
 	if (uid == 0) {
-		i_error("userdb(%s) didn't return uid", conn->user);
+		i_error("User %s is missing UID (set mail_uid)", conn->user);
 		return_value = EX_TEMPFAIL;
 		return;
 	}
+	if (gid == 0 && getenv("MAIL_GID")) {
+		if (!parse_gid(getenv("MAIL_GID"), &gid) || gid == 0) {
+			i_error("mail_gid setting is invalid");
+			return_value = EX_TEMPFAIL;
+			return;
+		}
+	}
 	if (gid == 0) {
-		i_error("userdb(%s) didn't return gid", conn->user);
+		i_error("User %s is missing GID (set mail_gid)", conn->user);
 		return_value = EX_TEMPFAIL;
 		return;
 	}


More information about the dovecot-cvs mailing list