repo: ngircd action: commit revision: path_from: revision_from: 4b15f10fbb036da96caaf9ffcffd27cd9f6815d2: path_to: revision_to:
commit 4b15f10fbb036da96caaf9ffcffd27cd9f6815d2 Author: Alexander BartonDate: Mon Feb 11 13:57:54 2013 +0100 Allow "@" character in user names for authentication The "@" character isn't allowed in IRC usernames, because it is the separator between user name and hostname in IRC masks: ! @ This patch accepts user names including "@" characters, saves the unmodified name for authentication but stores only the part in front of the "@" character as "IRC user name". And the latter is how ircd2.11, Bahamut, and irc-seven behave as well. Closes bug #155. diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c
--- 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
--- 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);
-----END OF PAGE-----