summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2013-02-11 13:58:30 +0100
committerAlexander Barton <alex@barton.de>2013-02-11 13:58:30 +0100
commitb95dfb3ffd798e00df54b52496963d2a998ccbb0 (patch)
tree180449386a979903a74263eafcb032422ba05e8e
parent628c14d65686c4c848a17381b8ef61c78dbcf405 (diff)
parent4b15f10fbb036da96caaf9ffcffd27cd9f6815d2 (diff)
downloadngircd-b95dfb3ffd798e00df54b52496963d2a998ccbb0.tar.gz
ngircd-b95dfb3ffd798e00df54b52496963d2a998ccbb0.zip
Merge branch 'bug155-allowAtInUser'
* bug155-allowAtInUser:
  Allow "@" character in user names for authentication
-rw-r--r--src/ngircd/irc-login.c10
-rw-r--r--src/ngircd/login.c10
2 files changed, 17 insertions, 3 deletions
diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c
index e7d83eff..52c6e46e 100644
--- a/src/ngircd/irc-login.c
+++ b/src/ngircd/irc-login.c
@@ -444,7 +444,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
 		ptr = Req->argv[0];
 		while (*ptr) {
 			if (!isalnum((int)*ptr) &&
-			    *ptr != '+' && *ptr != '-' &&
+			    *ptr != '+' && *ptr != '-' && *ptr != '@' &&
 			    *ptr != '.' && *ptr != '_') {
 				Conn_Close(Client_Conn(Client), NULL,
 					   "Invalid user name", true);
@@ -453,6 +453,13 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
 			ptr++;
 		}
 
+		/* Save the received username for authentication, and use
+		 * it up to the first '@' as default user name (like ircd2.11,
+		 * bahamut, ircd-seven, ...), prefixed with '~', if needed: */
+		Client_SetOrigUser(Client, Req->argv[0]);
+		ptr = strchr(Req->argv[0], '@');
+		if (ptr)
+			*ptr = '\0';
 #ifdef IDENTAUTH
 		ptr = Client_User(Client);
 		if (!ptr || !*ptr || *ptr == '~')
@@ -460,7 +467,6 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
 #else
 		Client_SetUser(Client, Req->argv[0], false);
 #endif
-		Client_SetOrigUser(Client, Req->argv[0]);
 
 		/* "Real name" or user info text: Don't set it to the empty
 		 * string, the original ircd can't deal with such "real names"
diff --git a/src/ngircd/login.c b/src/ngircd/login.c
index d79344b5..d8c8c40a 100644
--- a/src/ngircd/login.c
+++ b/src/ngircd/login.c
@@ -202,6 +202,7 @@ Login_User_PostAuth(CLIENT *Client)
 static void
 cb_Read_Auth_Result(int r_fd, UNUSED short events)
 {
+	char user[CLIENT_USER_LEN], *ptr;
 	CONN_ID conn;
 	CLIENT *client;
 	int result;
@@ -233,7 +234,14 @@ cb_Read_Auth_Result(int r_fd, UNUSED short events)
 	}
 
 	if (result == true) {
-		Client_SetUser(client, Client_OrigUser(client), true);
+		/* Authentication succeeded, now set the correct user name
+		 * supplied by the client (without prepended '~' for exmaple),
+		 * but cut it at the first '@' character: */
+		strlcpy(user, Client_OrigUser(client), sizeof(user));
+		ptr = strchr(user, '@');
+		if (ptr)
+			*ptr = '\0';
+		Client_SetUser(client, user, true);
 		(void)Login_User_PostAuth(client);
 	} else
 		Client_Reject(client, "Bad password", false);