mirror of
https://github.com/osmarks/ngircd.git
synced 2025-01-19 12:02:52 +00:00
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: <nickname>!<username>@<hostname> 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.
This commit is contained in:
parent
1e8b775a7a
commit
4b15f10fbb
@ -444,7 +444,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
ptr = Req->argv[0];
|
ptr = Req->argv[0];
|
||||||
while (*ptr) {
|
while (*ptr) {
|
||||||
if (!isalnum((int)*ptr) &&
|
if (!isalnum((int)*ptr) &&
|
||||||
*ptr != '+' && *ptr != '-' &&
|
*ptr != '+' && *ptr != '-' && *ptr != '@' &&
|
||||||
*ptr != '.' && *ptr != '_') {
|
*ptr != '.' && *ptr != '_') {
|
||||||
Conn_Close(Client_Conn(Client), NULL,
|
Conn_Close(Client_Conn(Client), NULL,
|
||||||
"Invalid user name", true);
|
"Invalid user name", true);
|
||||||
@ -453,6 +453,13 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
ptr++;
|
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
|
#ifdef IDENTAUTH
|
||||||
ptr = Client_User(Client);
|
ptr = Client_User(Client);
|
||||||
if (!ptr || !*ptr || *ptr == '~')
|
if (!ptr || !*ptr || *ptr == '~')
|
||||||
@ -460,7 +467,6 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
#else
|
#else
|
||||||
Client_SetUser(Client, Req->argv[0], false);
|
Client_SetUser(Client, Req->argv[0], false);
|
||||||
#endif
|
#endif
|
||||||
Client_SetOrigUser(Client, Req->argv[0]);
|
|
||||||
|
|
||||||
/* "Real name" or user info text: Don't set it to the empty
|
/* "Real name" or user info text: Don't set it to the empty
|
||||||
* string, the original ircd can't deal with such "real names"
|
* string, the original ircd can't deal with such "real names"
|
||||||
|
@ -202,6 +202,7 @@ Login_User_PostAuth(CLIENT *Client)
|
|||||||
static void
|
static void
|
||||||
cb_Read_Auth_Result(int r_fd, UNUSED short events)
|
cb_Read_Auth_Result(int r_fd, UNUSED short events)
|
||||||
{
|
{
|
||||||
|
char user[CLIENT_USER_LEN], *ptr;
|
||||||
CONN_ID conn;
|
CONN_ID conn;
|
||||||
CLIENT *client;
|
CLIENT *client;
|
||||||
int result;
|
int result;
|
||||||
@ -233,7 +234,14 @@ cb_Read_Auth_Result(int r_fd, UNUSED short events)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result == true) {
|
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);
|
(void)Login_User_PostAuth(client);
|
||||||
} else
|
} else
|
||||||
Client_Reject(client, "Bad password", false);
|
Client_Reject(client, "Bad password", false);
|
||||||
|
Loading…
Reference in New Issue
Block a user