]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Fixed prefetch userdb interaction with passdb changing username.
authorTimo Sirainen <tss@iki.fi>
Mon, 7 Jun 2010 17:53:42 +0000 (18:53 +0100)
committerTimo Sirainen <tss@iki.fi>
Mon, 7 Jun 2010 17:53:42 +0000 (18:53 +0100)
If userdb_* fields were set before user was changed, prefetch returned
the unchanged username.

--HG--
branch : HEAD

src/auth/auth-request.c

index 4fc5a0ea66fdbc2a7a3ccf5662b1fc6eb10c0a49..67ff3b8070869fcd6dea2ee1a576c796866aac90 100644 (file)
@@ -31,6 +31,7 @@ unsigned int auth_request_state_count[AUTH_REQUEST_STATE_MAX];
 
 static void get_log_prefix(string_t *str, struct auth_request *auth_request,
                           const char *subsystem);
+static void auth_request_userdb_reply_update_user(struct auth_request *request);
 
 struct auth_request *
 auth_request_new(const struct mech_module *mech,
@@ -1096,6 +1097,10 @@ void auth_request_set_field(struct auth_request *request,
                                request->user, value);
                        request->user = p_strdup(request->pool, value);
                }
+
+               if (request->userdb_reply != NULL)
+                       auth_request_userdb_reply_update_user(request);
+
                /* restore the original value so it gets saved correctly to
                   cache. */
                value = orig_value;
@@ -1172,6 +1177,20 @@ void auth_request_init_userdb_reply(struct auth_request *request)
        auth_stream_reply_add(request->userdb_reply, NULL, request->user);
 }
 
+static void auth_request_userdb_reply_update_user(struct auth_request *request)
+{
+       const char *str, *p;
+
+       str = t_strdup(auth_stream_reply_export(request->userdb_reply));
+
+       auth_stream_reply_reset(request->userdb_reply);
+       auth_stream_reply_add(request->userdb_reply, NULL, request->user);
+
+       p = strchr(str, '\t');
+       if (p != NULL)
+               auth_stream_reply_import(request->userdb_reply, p + 1);
+}
+
 static void
 auth_request_change_userdb_user(struct auth_request *request, const char *user)
 {