X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Flogin.c;h=64cc81251c6594cbd129a56270262fa9fede6c19;hp=bbde6359d70434748779ba96a8868134a8e1aa19;hb=3de972e0bdbb5da7b13db5628e5373e3ec57cf51;hpb=139f5961a078dfd23a469d98c3942f42595854aa diff --git a/src/ngircd/login.c b/src/ngircd/login.c index bbde6359..64cc8125 100644 --- a/src/ngircd/login.c +++ b/src/ngircd/login.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,34 +16,34 @@ * Functions to deal with client logins */ -#include "imp.h" #include #include +#include #include -#include #include -#include "defines.h" #include "conn.h" #include "class.h" -#include "client.h" #include "client-cap.h" #include "channel.h" #include "conf.h" -#include "io.h" #include "parse.h" #include "log.h" #include "messages.h" #include "ngircd.h" -#include "pam.h" #include "irc-info.h" +#include "irc-mode.h" #include "irc-write.h" -#include "exp.h" #include "login.h" #ifdef PAM + +#include "io.h" +#include "pam.h" + static void cb_Read_Auth_Result PARAMS((int r_fd, UNUSED short events)); + #endif /** @@ -89,13 +89,12 @@ Login_User(CLIENT * Client) #ifdef PAM if (!Conf_PAM) { - /* Don't do any PAM authentication at all, instead emulate - * 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(conn)[0] == '\0') + /* Don't do any PAM authentication at all if PAM is not + * enabled, instead emulate the behavior of the daemon + * compiled without PAM support. */ + if (strcmp(Conn_Password(conn), Conf_ServerPwd) == 0) return Login_User_PostAuth(Client); - Client_Reject(Client, "Non-empty password", false); + Client_Reject(Client, "Bad server password", false); return DISCONNECTED; } @@ -109,25 +108,27 @@ Login_User(CLIENT * Client) return Login_User_PostAuth(Client); } - /* Fork child process for PAM authentication; and make sure that the - * process timeout is set higher than the login timeout! */ - pid = Proc_Fork(Conn_GetProcStat(conn), pipefd, - cb_Read_Auth_Result, Conf_PongTimeout + 1); - if (pid > 0) { - LogDebug("Authenticator for connection %d created (PID %d).", - conn, pid); - return CONNECTED; - } else { - /* Sub process */ - Log_Init_Subprocess("Auth"); - Conn_CloseAllSockets(NONE); - result = PAM_Authenticate(Client); - if (write(pipefd[1], &result, sizeof(result)) != sizeof(result)) - Log_Subprocess(LOG_ERR, - "Failed to pipe result to parent!"); - Log_Exit_Subprocess("Auth"); - exit(0); - } + if (Conf_PAM) { + /* Fork child process for PAM authentication; and make sure that the + * process timeout is set higher than the login timeout! */ + pid = Proc_Fork(Conn_GetProcStat(conn), pipefd, + cb_Read_Auth_Result, Conf_PongTimeout + 1); + if (pid > 0) { + LogDebug("Authenticator for connection %d created (PID %d).", + conn, pid); + return CONNECTED; + } else { + /* Sub process */ + Log_Init_Subprocess("Auth"); + Conn_CloseAllSockets(NONE); + result = PAM_Authenticate(Client); + if (write(pipefd[1], &result, sizeof(result)) != sizeof(result)) + Log_Subprocess(LOG_ERR, + "Failed to pipe result to parent!"); + Log_Exit_Subprocess("Auth"); + exit(0); + } + } else return CONNECTED; #else /* Check global server password ... */ if (strcmp(Conn_Password(conn), Conf_ServerPwd) != 0) { @@ -151,6 +152,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) @@ -185,8 +189,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_ID(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; }