changeset 9048:cc484a16bbe4 HEAD

expire-tool: Use mail_uid and mail_gid settings if userdb doesn't return uid/gid.
author Timo Sirainen <tss@iki.fi>
date Sun, 17 May 2009 20:02:37 -0400
parents c5b16d6c39c9
children 6dec24ec8218
files src/plugins/expire/auth-client.c src/plugins/expire/expire-plugin.h src/plugins/expire/expire-tool.c
diffstat 3 files changed, 54 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/expire/auth-client.c	Sun May 17 18:45:23 2009 -0400
+++ b/src/plugins/expire/auth-client.c	Sun May 17 20:02:37 2009 -0400
@@ -5,6 +5,7 @@
 #include "env-util.h"
 #include "restrict-access.h"
 #include "auth-client.h"
+#include "expire-plugin.h"
 #include "auth-master.h"
 
 #include <unistd.h>
@@ -28,8 +29,18 @@
 		i_error("userdb(%s) didn't return a home directory", user);
 		return;
 	}
+	if (reply->uid == (uid_t)-1)
+		reply->uid = global_mail_uid;
 	if (reply->uid == (uid_t)-1) {
-		i_error("userdb(%s) didn't return uid", user);
+		i_error("userdb(%s) didn't return uid and mail_uid not set",
+			user);
+		return;
+	}
+	if (reply->gid == (gid_t)-1)
+		reply->gid = global_mail_gid;
+	if (reply->gid == (gid_t)-1) {
+		i_error("userdb(%s) didn't return gid and mail_gid not set",
+			user);
 		return;
 	}
 
--- a/src/plugins/expire/expire-plugin.h	Sun May 17 18:45:23 2009 -0400
+++ b/src/plugins/expire/expire-plugin.h	Sun May 17 20:02:37 2009 -0400
@@ -1,6 +1,9 @@
 #ifndef EXPIRE_PLUGIN_H
 #define EXPIRE_PLUGIN_H
 
+extern uid_t global_mail_uid;
+extern gid_t global_mail_gid;
+
 void expire_plugin_init(void);
 void expire_plugin_deinit(void);
 
--- a/src/plugins/expire/expire-tool.c	Sun May 17 18:45:23 2009 -0400
+++ b/src/plugins/expire/expire-tool.c	Sun May 17 20:02:37 2009 -0400
@@ -14,8 +14,11 @@
 #include "auth-client.h"
 #include "auth-master.h"
 #include "expire-env.h"
+#include "expire-plugin.h"
 
 #include <stdlib.h>
+#include <pwd.h>
+#include <grp.h>
 
 /* ugly, but automake doesn't like having it built as both static and
    dynamic object.. */
@@ -31,6 +34,9 @@
 	bool testrun;
 };
 
+uid_t global_mail_uid;
+gid_t global_mail_gid;
+
 static int user_init(struct expire_context *ctx, const char *user)
 {
 	int ret;
@@ -179,6 +185,37 @@
 	return ret < 0 ? -1 : 0;
 }
 
+static void expire_get_global_mail_ids(void)
+{
+	const struct passwd *pw;
+	const struct group *gr;
+	const char *str;
+
+	str = getenv("MAIL_UID");
+	if (str == NULL)
+		global_mail_uid = (uid_t)-1;
+	else if (is_numeric(str, '\0'))
+		global_mail_uid = strtoul(str, NULL, 10);
+	else {
+		pw = getpwnam(str);
+		if (pw == NULL)
+			i_fatal("mail_uid: User %s doesn't exist", str);
+		global_mail_uid = pw->pw_uid;
+	}
+
+	str = getenv("MAIL_GID");
+	if (str == NULL)
+		global_mail_gid = (gid_t)-1;
+	else if (is_numeric(str, '\0'))
+		global_mail_gid = strtoul(str, NULL, 10);
+	else {
+		gr = getgrnam(str);
+		if (gr == NULL)
+			i_fatal("mail_gid: Group %s doesn't exist", str);
+		global_mail_gid = gr->gr_gid;
+	}
+}
+
 static void expire_run(bool testrun)
 {
 	struct expire_context ctx;
@@ -203,6 +240,8 @@
 	if (getenv("EXPIRE_DICT") == NULL)
 		i_fatal("expire_dict setting not set");
 
+	expire_get_global_mail_ids();
+
 	auth_socket = getenv("AUTH_SOCKET_PATH");
 	if (auth_socket == NULL)
 		auth_socket = DEFAULT_AUTH_SOCKET_PATH;