X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-login.c;h=d1b4033b3a54d70ef83bab9e729eeafd5123f177;hp=67a0fbfd803603befe536bc7e61e94eb06ced5a0;hb=17589534d0ccff05463910d1f0ba673d7d1630fd;hpb=08f9d31d60220e8a389a2d24f42625be7749f090 diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 67a0fbfd..d1b4033b 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-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-2013 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 @@ -39,7 +39,6 @@ #include "exp.h" #include "irc-login.h" -static void Kill_Nick PARAMS((char *Nick, char *Reason)); static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick, bool InformClient)); @@ -81,6 +80,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) } else if (Client_Type(Client) == CLIENT_UNKNOWN || Client_Type(Client) == CLIENT_UNKNOWNSERVER) { /* Unregistered connection, but wrong number of arguments: */ + IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); } else { @@ -242,7 +242,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) #ifndef STRICT_RFC if (Conf_AuthPing) { +#ifdef HAVE_ARC4RANDOM + Conn_SetAuthPing(Client_Conn(Client), arc4random()); +#else Conn_SetAuthPing(Client_Conn(Client), rand()); +#endif IRC_WriteStrClient(Client, "PING :%ld", Conn_GetAuthPing(Client_Conn(Client))); LogDebug("Connection %d: sent AUTH PING %ld ...", @@ -270,9 +274,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Server or service introduces new client */ /* Bad number of parameters? */ - if (Req->argc != 2 && Req->argc != 7) + if (Req->argc != 2 && Req->argc != 7) { + IRC_SetPenalty(Client, 2); return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); + } if (Req->argc >= 7) { /* RFC 2813 compatible syntax */ @@ -300,17 +306,21 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) * the new nick is already present on this server: * the new and the old one have to be disconnected now. */ - Log( LOG_ERR, "Server %s introduces already registered nick \"%s\"!", Client_ID( Client ), Req->argv[0] ); - Kill_Nick( Req->argv[0], "Nick collision" ); - return CONNECTED; + Log(LOG_ERR, + "Server %s introduces already registered nick \"%s\"!", + Client_ID(Client), Req->argv[0]); + return IRC_KillClient(Client, NULL, Req->argv[0], + "Nick collision"); } /* Find the Server this client is connected to */ intr_c = Client_GetFromToken(Client, token); if (!intr_c) { - Log( LOG_ERR, "Server %s introduces nick \"%s\" on unknown server!?", Client_ID( Client ), Req->argv[0] ); - Kill_Nick( Req->argv[0], "Unknown server" ); - return CONNECTED; + Log(LOG_ERR, + "Server %s introduces nick \"%s\" on unknown server!?", + Client_ID(Client), Req->argv[0]); + return IRC_KillClient(Client, NULL, Req->argv[0], + "Unknown server"); } c = Client_NewRemoteUser(intr_c, nick, hops, user, hostname, @@ -321,8 +331,8 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) Log(LOG_ALERT, "Can't create client structure! (on connection %d)", Client_Conn(Client)); - Kill_Nick(Req->argv[0], "Server error"); - return CONNECTED; + return IRC_KillClient(Client, NULL, Req->argv[0], + "Server error"); } /* RFC 2813: client is now fully registered, inform all the @@ -533,19 +543,19 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) c = Client_Search(nick); if(c) { /* Nickname collision: disconnect (KILL) both clients! */ - Log(LOG_ERR, "Server %s introduces already registered service \"%s\"!", + Log(LOG_ERR, + "Server %s introduces already registered service \"%s\"!", Client_ID(Client), nick); - Kill_Nick(nick, "Nick collision"); - return CONNECTED; + return IRC_KillClient(Client, NULL, nick, "Nick collision"); } /* Get the server to which the service is connected */ intr_c = Client_GetFromToken(Client, token); if (! intr_c) { - Log(LOG_ERR, "Server %s introduces service \"%s\" on unknown server!?", + Log(LOG_ERR, + "Server %s introduces service \"%s\" on unknown server!?", Client_ID(Client), nick); - Kill_Nick(nick, "Unknown server"); - return CONNECTED; + return IRC_KillClient(Client, NULL, nick, "Unknown server"); } /* Get user and host name */ @@ -574,10 +584,10 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) if (! c) { /* Couldn't create client structure, so KILL the service to * keep network status consistent ... */ - Log(LOG_ALERT, "Can't create client structure! (on connection %d)", + Log(LOG_ALERT, + "Can't create client structure! (on connection %d)", Client_Conn(Client)); - Kill_Nick(nick, "Server error"); - return CONNECTED; + return IRC_KillClient(Client, NULL, nick, "Server error"); } Client_Introduce(Client, c, CLIENT_SERVICE); @@ -852,31 +862,6 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) return CONNECTED; } /* IRC_PONG */ -/** - * Kill all users with a specific nickname in the network. - * - * @param Nick Nickname. - * @param Reason Reason for the KILL. - */ -static void -Kill_Nick(char *Nick, char *Reason) -{ - REQUEST r; - - assert (Nick != NULL); - assert (Reason != NULL); - - r.prefix = NULL; - r.argv[0] = Nick; - r.argv[1] = Reason; - r.argc = 2; - - Log(LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s!", - Nick, Reason); - - IRC_KILL(Client_ThisServer(), &r); -} /* Kill_Nick */ - /** * Change the nickname of a client. *