dovecot-2.0: auth: Support "username" and "domain" extra fields ...

dovecot at dovecot.org dovecot at dovecot.org
Mon Aug 2 15:24:59 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/63124518977a
changeset: 11913:63124518977a
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Aug 02 13:24:55 2010 +0100
description:
auth: Support "username" and "domain" extra fields also for userdb.

diffstat:

 src/auth/auth-request.c |  151 ++++++++++++++++++++++++-------------------------
 1 files changed, 74 insertions(+), 77 deletions(-)

diffs (193 lines):

diff -r 85f3420afb7c -r 63124518977a src/auth/auth-request.c
--- a/src/auth/auth-request.c	Sat Jul 31 19:44:24 2010 +0100
+++ b/src/auth/auth-request.c	Mon Aug 02 13:24:55 2010 +0100
@@ -31,7 +31,6 @@
 
 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)
@@ -1042,12 +1041,80 @@
 	auth_stream_reply_add(request->extra_fields, name, value);
 }
 
+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));
+
+	/* reset the reply and add the new username */
+	auth_stream_reply_reset(request->userdb_reply);
+	auth_stream_reply_add(request->userdb_reply, NULL, request->user);
+
+	/* add the rest */
+	p = strchr(str, '\t');
+	if (p != NULL)
+		auth_stream_reply_import(request->userdb_reply, p + 1);
+}
+
+static const char *
+get_updated_username(const char *old_username,
+		     const char *name, const char *value)
+{
+	const char *p;
+
+	if (strcmp(name, "user") == 0) {
+		/* replace the whole username */
+		return value;
+	}
+
+	p = strchr(old_username, '@');
+	if (strcmp(name, "username") == 0) {
+		if (strchr(value, '@') != NULL)
+			return value;
+
+		/* preserve the current @domain */
+		return t_strconcat(value, p, NULL);
+	}
+
+	if (strcmp(name, "domain") == 0) {
+		if (p == NULL) {
+			/* add the domain */
+			return t_strconcat(old_username, "@", value, NULL);
+		} else {
+			/* replace the existing domain */
+			p = t_strdup_until(old_username, p + 1);
+			return t_strconcat(p, value, NULL);
+		}
+	}
+	return NULL;
+}
+
+static bool
+auth_request_try_update_username(struct auth_request *request,
+				 const char *name, const char *value)
+{
+	const char *new_value;
+
+	new_value = get_updated_username(request->user, name, value);
+	if (new_value == NULL)
+		return FALSE;
+
+	if (strcmp(request->user, new_value) != 0) {
+		auth_request_log_debug(request, "auth",
+				       "username changed %s -> %s",
+				       request->user, new_value);
+		request->user = p_strdup(request->pool, new_value);
+		if (request->userdb_reply != NULL)
+			auth_request_userdb_reply_update_user(request);
+	}
+	return TRUE;
+}
+
 void auth_request_set_field(struct auth_request *request,
 			    const char *name, const char *value,
 			    const char *default_scheme)
 {
-	const char *p, *orig_value;
-
 	i_assert(*name != '\0');
 	i_assert(value != NULL);
 
@@ -1061,41 +1128,9 @@
 		return;
 	}
 
-	if (strcmp(name, "user") == 0 ||
-	    strcmp(name, "username") == 0 || strcmp(name, "domain") == 0) {
-		/* update username */
-		orig_value = value;
-		if (strcmp(name, "username") == 0 &&
-		    strchr(value, '@') == NULL &&
-		    (p = strchr(request->user, '@')) != NULL) {
-			/* preserve the current @domain */
-			value = t_strconcat(value, p, NULL);
-		} else if (strcmp(name, "domain") == 0) {
-			p = strchr(request->user, '@');
-			if (p == NULL) {
-				/* add the domain */
-				value = t_strconcat(request->user, "@",
-						    value, NULL);
-			} else {
-				/* replace the existing domain */
-				p = t_strdup_until(request->user, p + 1);
-				value = t_strconcat(p, value, NULL);
-			}
-		}
-
-		if (strcmp(request->user, value) != 0) {
-			auth_request_log_debug(request, "auth",
-				"username changed %s -> %s",
-				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;
+	if (auth_request_try_update_username(request, name, value)) {
+		/* don't change the original value so it gets saved correctly
+		   to cache. */
 	} else if (strcmp(name, "nodelay") == 0) {
 		/* don't delay replying to client of the failure */
 		request->no_failure_delay = TRUE;
@@ -1169,43 +1204,6 @@
 	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)
-{
-	const char *str;
-
-	/* replace the username in userdb_reply if it changed */
-	if (strcmp(user, request->user) == 0)
-		return;
-
-	str = t_strdup(auth_stream_reply_export(request->userdb_reply));
-
-	/* reset the reply and add the new username */
-	auth_request_set_field(request, "user", user, NULL);
-	auth_stream_reply_reset(request->userdb_reply);
-	auth_stream_reply_add(request->userdb_reply,
-			      NULL, request->user);
-
-	/* add the rest */
-	str = strchr(str, '\t');
-	if (str != NULL)
-		auth_stream_reply_import(request->userdb_reply, str + 1);
-}
-
 static void auth_request_set_uidgid_file(struct auth_request *request,
 					 const char *path_template)
 {
@@ -1249,8 +1247,7 @@
 	} else if (strcmp(name, "tempfail") == 0) {
 		request->userdb_lookup_failed = TRUE;
 		return;
-	} else if (strcmp(name, "user") == 0) {
-		auth_request_change_userdb_user(request, value);
+	} else if (auth_request_try_update_username(request, name, value)) {
 		return;
 	} else if (strcmp(name, "uidgid_file") == 0) {
 		auth_request_set_uidgid_file(request, value);


More information about the dovecot-cvs mailing list