dovecot-1.2: deliver: Allow userdb to change the username.
dovecot at dovecot.org
dovecot at dovecot.org
Fri Nov 21 14:35:51 EET 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/ed4d6f6e4da7
changeset: 8458:ed4d6f6e4da7
user: Timo Sirainen <tss at iki.fi>
date: Fri Nov 21 14:35:46 2008 +0200
description:
deliver: Allow userdb to change the username.
diffstat:
5 files changed, 22 insertions(+), 11 deletions(-)
src/deliver/auth-client.c | 7 ++++---
src/deliver/auth-client.h | 2 +-
src/deliver/deliver.c | 19 ++++++++++++++-----
src/lib-auth/auth-master.c | 3 ++-
src/lib-auth/auth-master.h | 2 +-
diffs (112 lines):
diff -r f5554ae61732 -r ed4d6f6e4da7 src/deliver/auth-client.c
--- a/src/deliver/auth-client.c Thu Nov 20 19:32:58 2008 +0200
+++ b/src/deliver/auth-client.c Fri Nov 21 14:35:46 2008 +0200
@@ -125,7 +125,7 @@ static int set_env(struct auth_user_repl
}
int auth_client_lookup_and_restrict(const char *auth_socket,
- const char *user, uid_t euid, pool_t pool,
+ const char **user, uid_t euid, pool_t pool,
ARRAY_TYPE(const_string) *extra_fields_r)
{
struct auth_master_connection *conn;
@@ -134,12 +134,13 @@ int auth_client_lookup_and_restrict(cons
int ret = EX_TEMPFAIL;
conn = auth_master_init(auth_socket, debug);
- switch (auth_master_user_lookup(conn, user, "deliver", pool, &reply)) {
+ switch (auth_master_user_lookup(conn, *user, "deliver", pool, &reply)) {
case 0:
ret = EX_NOUSER;
break;
case 1:
- if (set_env(&reply, user, euid) == 0) {
+ if (set_env(&reply, *user, euid) == 0) {
+ *user = p_strdup(pool, reply.user);
restrict_access_by_env(TRUE);
ret = EX_OK;
}
diff -r f5554ae61732 -r ed4d6f6e4da7 src/deliver/auth-client.h
--- a/src/deliver/auth-client.h Thu Nov 20 19:32:58 2008 +0200
+++ b/src/deliver/auth-client.h Fri Nov 21 14:35:46 2008 +0200
@@ -2,7 +2,7 @@
#define AUTH_CLIENT_H
int auth_client_lookup_and_restrict(const char *auth_socket,
- const char *user, uid_t euid, pool_t pool,
+ const char **user, uid_t euid, pool_t pool,
ARRAY_TYPE(const_string) *extra_fields_r);
#endif
diff -r f5554ae61732 -r ed4d6f6e4da7 src/deliver/deliver.c
--- a/src/deliver/deliver.c Thu Nov 20 19:32:58 2008 +0200
+++ b/src/deliver/deliver.c Fri Nov 21 14:35:46 2008 +0200
@@ -814,7 +814,7 @@ int main(int argc, char *argv[])
const char *config_path = DEFAULT_CONFIG_FILE;
const char *mailbox = "INBOX";
const char *auth_socket;
- const char *home, *destaddr, *user, *value, *errstr, *path;
+ const char *home, *destaddr, *user, *value, *errstr, *path, *orig_user;
ARRAY_TYPE(const_string) extra_fields = ARRAY_INIT;
struct mail_user *mail_user, *raw_mail_user;
struct mail_namespace *raw_ns;
@@ -980,21 +980,30 @@ int main(int argc, char *argv[])
}
userdb_pool = pool_alloconly_create("userdb lookup replys", 512);
+ orig_user = user;
ret = auth_client_lookup_and_restrict(auth_socket,
- user, process_euid,
+ &user, process_euid,
userdb_pool,
&extra_fields);
if (ret != 0)
return ret;
- }
- if (destaddr == NULL)
- destaddr = user;
+
+ if (strcmp(user, orig_user) != 0) {
+ /* auth lookup changed the user. */
+ if (getenv("DEBUG") != NULL)
+ i_info("userdb changed username to %s", user);
+ i_set_failure_prefix(t_strdup_printf("deliver(%s): ",
+ user));
+ }
+ }
expand_envs(user);
if (userdb_pool != NULL) {
putenv_extra_fields(&extra_fields);
pool_unref(&userdb_pool);
}
+ if (destaddr == NULL)
+ destaddr = user;
/* Fix namespaces with empty locations */
for (i = 1;; i++) {
diff -r f5554ae61732 -r ed4d6f6e4da7 src/lib-auth/auth-master.c
--- a/src/lib-auth/auth-master.c Thu Nov 20 19:32:58 2008 +0200
+++ b/src/lib-auth/auth-master.c Fri Nov 21 14:35:46 2008 +0200
@@ -97,7 +97,8 @@ static void auth_parse_input(struct auth
reply->gid = (gid_t)-1;
p_array_init(&reply->extra_fields, conn->pool, 64);
- for (; *args != NULL; args++) {
+ reply->user = p_strdup(conn->pool, *args);
+ for (args++; *args != NULL; args++) {
if (conn->debug)
i_info("auth input: %s", *args);
diff -r f5554ae61732 -r ed4d6f6e4da7 src/lib-auth/auth-master.h
--- a/src/lib-auth/auth-master.h Thu Nov 20 19:32:58 2008 +0200
+++ b/src/lib-auth/auth-master.h Fri Nov 21 14:35:46 2008 +0200
@@ -6,7 +6,7 @@ struct auth_user_reply {
struct auth_user_reply {
uid_t uid;
gid_t gid;
- const char *home, *chroot;
+ const char *user, *home, *chroot;
ARRAY_TYPE(const_string) extra_fields;
};
More information about the dovecot-cvs
mailing list