# HG changeset patch # User Timo Sirainen # Date 1190731271 -10800 # Node ID 79176ff12ad8ea6fb2e150f730ab8567f3e65e8b # Parent 406c9a863f26a735553b9174696c56437803854a Use mail_uid/gid settings if userdb didn't return uid/gid. 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 #include +#include +#include #include #define AUTH_REQUEST_TIMEOUT 60 @@ -50,6 +52,43 @@ 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 @@ } } + 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; }