X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Flogin.c;h=4011b8bcadd3216672b2ddfeb67a254eb3dff463;hp=e1959d6662adefe11ef91ba351698203bbfcde63;hb=0fc822d8c44be42a62d3c26bbab99d5d0bc88346;hpb=0d5de60584f094ef3b7c27806d6cd7f79e861d7b diff --git a/src/ngircd/login.c b/src/ngircd/login.c index e1959d66..4011b8bc 100644 --- a/src/ngircd/login.c +++ b/src/ngircd/login.c @@ -19,6 +19,7 @@ #include "imp.h" #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include "ngircd.h" #include "pam.h" #include "irc-info.h" +#include "irc-mode.h" #include "irc-write.h" #include "exp.h" @@ -90,17 +92,17 @@ Login_User(CLIENT * Client) #ifdef PAM if (!Conf_PAM) { /* Don't do any PAM authentication at all, instead emulate - * the beahiour of the daemon compiled without PAM support: + * the behavior of the daemon compiled without PAM support: * because there can't be any "server password", all * passwords supplied are classified as "wrong". */ - if(Conn_Password(Client_Conn(Client))[0] == '\0') + if(Conn_Password(conn)[0] == '\0') return Login_User_PostAuth(Client); Client_Reject(Client, "Non-empty password", false); return DISCONNECTED; } if (Conf_PAMIsOptional && - strcmp(Conn_Password(Client_Conn(Client)), "") == 0) { + strcmp(Conn_Password(conn), "") == 0) { /* Clients are not required to send a password and to be PAM- * authenticated at all. If not, they won't become "identified" * and keep the "~" in their supplied user name. @@ -130,7 +132,7 @@ Login_User(CLIENT * Client) } #else /* Check global server password ... */ - if (strcmp(Conn_Password(Client_Conn(Client)), Conf_ServerPwd) != 0) { + if (strcmp(Conn_Password(conn), Conf_ServerPwd) != 0) { /* Bad password! */ Client_Reject(Client, "Bad server password", false); return DISCONNECTED; @@ -151,6 +153,9 @@ Login_User(CLIENT * Client) GLOBAL bool Login_User_PostAuth(CLIENT *Client) { + REQUEST Req; + char modes[CLIENT_MODE_LEN + 1]; + assert(Client != NULL); if (Class_HandleServerBans(Client) != CONNECTED) @@ -163,8 +168,8 @@ Login_User_PostAuth(CLIENT *Client) return false; if (!IRC_WriteStrClient (Client, RPL_YOURHOST_MSG, Client_ID(Client), - Client_ID(Client_ThisServer()), PACKAGE_VERSION, TARGET_CPU, - TARGET_VENDOR, TARGET_OS)) + Client_ID(Client_ThisServer()), PACKAGE_VERSION, HOST_CPU, + HOST_VENDOR, HOST_OS)) return false; if (!IRC_WriteStrClient (Client, RPL_CREATED_MSG, Client_ID(Client), NGIRCd_StartStr)) @@ -185,8 +190,17 @@ Login_User_PostAuth(CLIENT *Client) if (!IRC_Show_MOTD(Client)) return DISCONNECTED; - /* Suspend the client for a second ... */ - IRC_SetPenalty(Client, 1); + /* Set default user modes */ + if (Conf_DefaultUserModes[0]) { + snprintf(modes, sizeof(modes), "+%s", Conf_DefaultUserModes); + Req.prefix = Client_ThisServer(); + Req.command = "MODE"; + Req.argc = 2; + Req.argv[0] = Client_ID(Client); + Req.argv[1] = modes; + IRC_MODE(Client, &Req); + } else + IRC_SetPenalty(Client, 1); return CONNECTED; } @@ -194,7 +208,7 @@ Login_User_PostAuth(CLIENT *Client) #ifdef PAM /** - * Read result of the authenticatior sub-process from pipe + * Read result of the authenticator sub-process from pipe * * @param r_fd File descriptor of the pipe. * @param events (ignored IO specification) @@ -202,6 +216,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 +248,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);