dovecot-2.2: *-login: Added %{orig_user}, %{orig_username} and %...

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 22 01:40:42 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/a32eea97afc1
changeset: 16802:a32eea97afc1
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 22 01:40:11 2013 +0300
description:
*-login: Added %{orig_user}, %{orig_username} and %{orig_domain} variables.
The original username is what the client sent to server before any
translations.

diffstat:

 src/auth/auth-request-handler.c  |   5 +++++
 src/login-common/client-common.c |  18 ++++++++++++++++++
 src/login-common/client-common.h |   2 +-
 src/login-common/sasl-server.c   |   9 +++++++++
 4 files changed, 33 insertions(+), 1 deletions(-)

diffs (105 lines):

diff -r 56be613e8ece -r a32eea97afc1 src/auth/auth-request-handler.c
--- a/src/auth/auth-request-handler.c	Sun Sep 22 01:09:32 2013 +0300
+++ b/src/auth/auth-request-handler.c	Sun Sep 22 01:40:11 2013 +0300
@@ -173,6 +173,11 @@
 	auth_fields_append(request->extra_fields, dest,
 			   AUTH_FIELD_FLAG_HIDDEN, 0);
 
+	if (strcmp(request->original_username, request->user) != 0) {
+		auth_str_add_keyvalue(dest, "original_user",
+				      request->original_username);
+	}
+
 	if (!request->auth_only &&
 	    auth_fields_exists(request->extra_fields, "proxy")) {
 		/* we're proxying */
diff -r 56be613e8ece -r a32eea97afc1 src/login-common/client-common.c
--- a/src/login-common/client-common.c	Sun Sep 22 01:09:32 2013 +0300
+++ b/src/login-common/client-common.c	Sun Sep 22 01:40:11 2013 +0300
@@ -272,6 +272,7 @@
 	i_free(client->proxy_user);
 	i_free(client->proxy_master_user);
 	i_free(client->virtual_user);
+	i_free(client->virtual_user_orig);
 	i_free(client->auth_mech_name);
 	i_free(client->master_data_prefix);
 	pool_unref(&client->pool);
@@ -453,6 +454,7 @@
 	{ 'u', NULL, "user" },
 	{ 'n', NULL, "username" },
 	{ 'd', NULL, "domain" },
+
 	{ 's', NULL, "service" },
 	{ 'h', NULL, "home" },
 	{ 'l', NULL, "lip" },
@@ -469,6 +471,9 @@
 	{ '\0', NULL, "real_rip" },
 	{ '\0', NULL, "real_lport" },
 	{ '\0', NULL, "real_rport" },
+	{ '\0', NULL, "orig_user" },
+	{ '\0', NULL, "orig_username" },
+	{ '\0', NULL, "orig_domain" },
 	{ '\0', NULL, NULL }
 };
 
@@ -522,6 +527,19 @@
 	tab[16].value = net_ip2addr(&client->real_remote_ip);
 	tab[17].value = dec2str(client->real_local_port);
 	tab[18].value = dec2str(client->real_remote_port);
+	if (client->virtual_user_orig == NULL) {
+		tab[19].value = tab[0].value;
+		tab[20].value = tab[1].value;
+		tab[21].value = tab[2].value;
+	} else {
+		tab[19].value = client->virtual_user_orig;
+		tab[20].value = t_strcut(client->virtual_user_orig, '@');
+		tab[21].value = strchr(client->virtual_user_orig, '@');
+		if (tab[21].value != NULL) tab[21].value++;
+
+		for (i = 0; i < 3; i++)
+			tab[i].value = str_sanitize(tab[i].value, 80);
+	}
 	return tab;
 }
 
diff -r 56be613e8ece -r a32eea97afc1 src/login-common/client-common.h
--- a/src/login-common/client-common.h	Sun Sep 22 01:09:32 2013 +0300
+++ b/src/login-common/client-common.h	Sun Sep 22 01:40:11 2013 +0300
@@ -141,7 +141,7 @@
 	unsigned int auth_attempts, auth_successes;
 	pid_t mail_pid;
 
-	char *virtual_user;
+	char *virtual_user, *virtual_user_orig;
 	unsigned int destroyed:1;
 	unsigned int input_blocked:1;
 	unsigned int login_success:1;
diff -r 56be613e8ece -r a32eea97afc1 src/login-common/sasl-server.c
--- a/src/login-common/sasl-server.c	Sun Sep 22 01:09:32 2013 +0300
+++ b/src/login-common/sasl-server.c	Sun Sep 22 01:40:11 2013 +0300
@@ -239,7 +239,11 @@
 		for (i = 0; args[i] != NULL; i++) {
 			if (strncmp(args[i], "user=", 5) == 0) {
 				i_free(client->virtual_user);
+				i_free_and_null(client->virtual_user_orig);
 				client->virtual_user = i_strdup(args[i] + 5);
+			} else if (strncmp(args[i], "original_user=", 14) == 0) {
+				i_free(client->virtual_user_orig);
+				client->virtual_user_orig = i_strdup(args[i] + 14);
 			} else if (strcmp(args[i], "nologin") == 0 ||
 				   strcmp(args[i], "proxy") == 0) {
 				/* user can't login */
@@ -271,8 +275,13 @@
 			for (i = 0; args[i] != NULL; i++) {
 				if (strncmp(args[i], "user=", 5) == 0) {
 					i_free(client->virtual_user);
+					i_free_and_null(client->virtual_user_orig);
 					client->virtual_user =
 						i_strdup(args[i] + 5);
+				} else if (strncmp(args[i], "original_user=", 14) == 0) {
+					i_free(client->virtual_user_orig);
+					client->virtual_user_orig =
+						i_strdup(args[i] + 14);
 				}
 			}
 		}


More information about the dovecot-cvs mailing list