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=88804ef2b8b7dd1f95b71522ebc2ff3b84496827;hp=6969fa338c22018643c5b08aa976bb0b2257fb7c;hb=4102e8fdfea33a5d8c398c98db90914c5dc29610;hpb=221365d8efcdc8930ad462756fa2851879f51f7e diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 6969fa33..88804ef2 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -33,6 +33,7 @@ #include "parse.h" #include "irc.h" #include "irc-info.h" +#include "irc-macros.h" #include "irc-write.h" #include "exp.h" @@ -42,15 +43,12 @@ static void Kill_Nick PARAMS((char *Nick, char *Reason)); static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick, bool InformClient)); - /** * Handler for the IRC "PASS" command. * - * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1. - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_PASS( CLIENT *Client, REQUEST *Req ) @@ -63,7 +61,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) /* Return an error if this is not a local client */ if (Client_Conn(Client) <= NONE) - return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, + return IRC_WriteErrClient(Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID(Client), Req->command); if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) { @@ -83,11 +81,11 @@ 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: */ - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); } else { /* Registered connection, PASS command is not allowed! */ - return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, + return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG, Client_ID(Client)); } @@ -167,19 +165,12 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) return CONNECTED; } /* IRC_PASS */ - /** * Handler for the IRC "NICK" command. * - * See RFC 2812, 3.1.2 "Nick message", and RFC 2813, 4.1.3 "Nick". - * - * This function implements the IRC command "NICK" which is used to register - * with the server, to change already registered nicknames and to introduce - * new users which are connected to other servers. - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_NICK( CLIENT *Client, REQUEST *Req ) @@ -204,31 +195,22 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) || (Client_Type(Client) == CLIENT_SERVER && Req->argc == 1)) { /* User registration or change of nickname */ - - /* Wrong number of arguments? */ - if( Req->argc != 1 ) - return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID( Client ), - Req->command ); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 1) /* Search "target" client */ - if( Client_Type( Client ) == CLIENT_SERVER ) - { - target = Client_Search( Req->prefix ); - if( ! target ) - return IRC_WriteStrClient( Client, - ERR_NOSUCHNICK_MSG, - Client_ID( Client ), - Req->argv[0] ); - } - else - { + if (Client_Type(Client) == CLIENT_SERVER) { + target = Client_Search(Req->prefix); + if (!target) + return IRC_WriteErrClient(Client, + ERR_NOSUCHNICK_MSG, + Client_ID(Client), + Req->argv[0]); + } else { /* Is this a restricted client? */ - if( Client_HasMode( Client, 'r' )) - return IRC_WriteStrClient( Client, - ERR_RESTRICTED_MSG, - Client_ID( Client )); - + if (Client_HasMode(Client, 'r')) + return IRC_WriteErrClient(Client, + ERR_RESTRICTED_MSG, + Client_ID(Client)); target = Client; } @@ -237,15 +219,14 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) * do anything. This is how the original ircd behaves and some * clients (for example Snak) expect it to be like this. * But I doubt that this is "really the right thing" ... */ - if( strcmp( Client_ID( target ), Req->argv[0] ) == 0 ) + if (strcmp(Client_ID(target), Req->argv[0]) == 0) return CONNECTED; #endif /* Check that the new nickname is available. Special case: * the client only changes from/to upper to lower case. */ - if( strcasecmp( Client_ID( target ), Req->argv[0] ) != 0 ) - { - if( ! Client_CheckNick( target, Req->argv[0] )) + if (strcasecmp(Client_ID(target), Req->argv[0]) != 0) { + if (!Client_CheckNick(target, Req->argv[0])) return CONNECTED; } @@ -290,7 +271,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Bad number of parameters? */ if (Req->argc != 2 && Req->argc != 7) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); if (Req->argc >= 7) { @@ -326,8 +307,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Find the Server this client is connected to */ intr_c = Client_GetFromToken(Client, token); - if( ! intr_c ) - { + 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; @@ -335,11 +315,13 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) c = Client_NewRemoteUser(intr_c, nick, hops, user, hostname, token, modes, info, true); - if( ! c ) - { - /* out of memory, need to disconnect client to keep network state consistent */ - Log( LOG_ALERT, "Can't create client structure! (on connection %d)", Client_Conn( Client )); - Kill_Nick( Req->argv[0], "Server error" ); + if (!c) { + /* Out of memory, we need to disconnect client to keep + * network state consistent! */ + Log(LOG_ALERT, + "Can't create client structure! (on connection %d)", + Client_Conn(Client)); + Kill_Nick(Req->argv[0], "Server error"); return CONNECTED; } @@ -356,10 +338,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) return CONNECTED; } - else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client )); + else + return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG, + Client_ID(Client)); } /* IRC_NICK */ - /** * Handler for the IRC "SVSNICK" command. * @@ -375,9 +358,7 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); - if (Req->argc != 2) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2) /* Search the originator */ from = Client_Search(Req->prefix); @@ -387,7 +368,7 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) /* Search the target */ target = Client_Search(Req->argv[0]); if (!target || Client_Type(target) != CLIENT_USER) { - return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->argv[0]); } @@ -411,11 +392,9 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) /** * Handler for the IRC "USER" command. * - * See RFC 2812, 3.1.3 "User message". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_USER(CLIENT * Client, REQUEST * Req) @@ -433,11 +412,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req) Client_Type(Client) == CLIENT_GOTPASS) { /* New connection */ - if (Req->argc != 4) - return IRC_WriteStrClient(Client, - ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), - Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) /* User name: only alphanumeric characters and limited punctuation is allowed.*/ @@ -487,14 +462,11 @@ IRC_USER(CLIENT * Client, REQUEST * Req) } else if (Client_Type(Client) == CLIENT_SERVER || Client_Type(Client) == CLIENT_SERVICE) { /* Server/service updating an user */ - if (Req->argc != 4) - return IRC_WriteStrClient(Client, - ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), - Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) + c = Client_Search(Req->prefix); if (!c) - return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix); @@ -514,29 +486,25 @@ IRC_USER(CLIENT * Client, REQUEST * Req) return CONNECTED; } else if (Client_Type(Client) == CLIENT_USER) { /* Already registered connection */ - return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, + return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG, Client_ID(Client)); } else { /* Unexpected/invalid connection state? */ - return IRC_WriteStrClient(Client, ERR_NOTREGISTERED_MSG, + return IRC_WriteErrClient(Client, ERR_NOTREGISTERED_MSG, Client_ID(Client)); } } /* IRC_USER */ - /** * Handler for the IRC "SERVICE" command. * - * This function implements IRC Services registration using the SERVICE command - * defined in RFC 2812 3.1.6 and RFC 2813 4.1.4. - * * At the moment ngIRCd doesn't support directly linked services, so this * function returns ERR_ERRONEUSNICKNAME when the SERVICE command has not been * received from a peer server. * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED.. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_SERVICE(CLIENT *Client, REQUEST *Req) @@ -550,22 +518,15 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) if (Client_Type(Client) != CLIENT_GOTPASS && Client_Type(Client) != CLIENT_SERVER) - return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, + return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG, Client_ID(Client)); - if (Req->argc != 6) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 6) if (Client_Type(Client) != CLIENT_SERVER) - return IRC_WriteStrClient(Client, ERR_ERRONEUSNICKNAME_MSG, + return IRC_WriteErrClient(Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID(Client), Req->argv[0]); - /* Bad number of parameters? */ - if (Req->argc != 6) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); - nick = Req->argv[0]; user = NULL; host = NULL; token = atoi(Req->argv[1]); @@ -575,7 +536,7 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) /* Validate service name ("nickname") */ c = Client_Search(nick); if(c) { - /* Nickname collission: disconnect (KILL) both clients! */ + /* Nickname collision: disconnect (KILL) both clients! */ Log(LOG_ERR, "Server %s introduces already registered service \"%s\"!", Client_ID(Client), nick); Kill_Nick(nick, "Nick collision"); @@ -627,27 +588,20 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) return CONNECTED; } /* IRC_SERVICE */ - /** * Handler for the IRC "WEBIRC" command. * - * See doc/Protocol.txt, section II.4: - * "Update webchat/proxy client information". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_WEBIRC(CLIENT *Client, REQUEST *Req) { - /* Exactly 4 parameters are requited */ - if (Req->argc != 4) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0) - return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG, + return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG, Client_ID(Client)); LogDebug("Connection %d: got valid WEBIRC command: user=%s, host=%s, ip=%s", @@ -656,18 +610,17 @@ IRC_WEBIRC(CLIENT *Client, REQUEST *Req) Client_SetUser(Client, Req->argv[1], true); Client_SetOrigUser(Client, Req->argv[1]); Client_SetHostname(Client, Req->argv[2]); + Client_SetIPAText(Client, Req->argv[3]); + return CONNECTED; } /* IRC_WEBIRC */ - /** * Handler for the IRC "QUIT" command. * - * See RFC 2812, 3.1.7 "Quit", and RFC 2813, 4.1.5 "Quit". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_QUIT( CLIENT *Client, REQUEST *Req ) @@ -678,10 +631,7 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) assert(Client != NULL); assert(Req != NULL); - /* Wrong number of arguments? */ - if (Req->argc > 1) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1) if (Req->argc == 1) strlcpy(quitmsg, Req->argv[0], sizeof quitmsg); @@ -721,7 +671,6 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) } } /* IRC_QUIT */ - #ifndef STRICT_RFC /** @@ -730,9 +679,9 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) * We handle these commands here to avoid the quite long timeout when * some user tries to access this IRC daemon using an web browser ... * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) @@ -744,15 +693,12 @@ IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) #endif - /** * Handler for the IRC "PING" command. * - * See RFC 2812, 3.7.2 "Ping message". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_PING(CLIENT *Client, REQUEST *Req) @@ -763,13 +709,11 @@ IRC_PING(CLIENT *Client, REQUEST *Req) assert(Req != NULL); if (Req->argc < 1) - return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG, + return IRC_WriteErrClient(Client, ERR_NOORIGIN_MSG, Client_ID(Client)); #ifdef STRICT_RFC /* Don't ignore additional arguments when in "strict" mode */ - if (Req->argc > 2) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) #endif if (Req->argc > 1) { @@ -777,7 +721,7 @@ IRC_PING(CLIENT *Client, REQUEST *Req) target = Client_Search(Req->argv[1]); if (!target || Client_Type(target) != CLIENT_SERVER) - return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG, + return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, Client_ID(Client), Req->argv[1]); if (target != Client_ThisServer()) { @@ -787,7 +731,7 @@ IRC_PING(CLIENT *Client, REQUEST *Req) else from = Client; if (!from) - return IRC_WriteStrClient(Client, + return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, Client_ID(Client), Req->prefix); @@ -805,7 +749,7 @@ IRC_PING(CLIENT *Client, REQUEST *Req) } else from = Client_ThisServer(); if (!from) - return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG, + return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, Client_ID(Client), Req->prefix); Log(LOG_DEBUG, "Connection %d: got PING, sending PONG ...", @@ -822,15 +766,12 @@ IRC_PING(CLIENT *Client, REQUEST *Req) #endif } /* IRC_PING */ - /** * Handler for the IRC "PONG" command. * - * See RFC 2812, 3.7.3 "Pong message". - * - * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @returns CONNECTED or DISCONNECTED. + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. */ GLOBAL bool IRC_PONG(CLIENT *Client, REQUEST *Req) @@ -848,26 +789,20 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) /* Wrong number of arguments? */ if (Req->argc < 1) { if (Client_Type(Client) == CLIENT_USER) - return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG, + return IRC_WriteErrClient(Client, ERR_NOORIGIN_MSG, Client_ID(Client)); else return CONNECTED; } - if (Req->argc > 2) { - if (Client_Type(Client) == CLIENT_USER) - return IRC_WriteStrClient(Client, - ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), - Req->command); - else - return CONNECTED; + if (Client_Type(Client) == CLIENT_USER) { + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) } /* Forward? */ if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) { target = Client_Search(Req->argv[0]); if (!target) - return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG, + return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, Client_ID(Client), Req->argv[0]); from = Client_Search(Req->prefix); @@ -875,7 +810,7 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) if (target != Client_ThisServer() && target != from) { /* Ok, we have to forward the message. */ if (!from) - return IRC_WriteStrClient(Client, + return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, Client_ID(Client), Req->prefix); @@ -925,12 +860,11 @@ 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. + * @param Nick Nickname. + * @param Reason Reason for the KILL. */ static void Kill_Nick(char *Nick, char *Reason) @@ -951,7 +885,6 @@ Kill_Nick(char *Nick, char *Reason) IRC_KILL(Client_ThisServer(), &r); } /* Kill_Nick */ - /** * Change the nickname of a client. * @@ -991,5 +924,4 @@ Change_Nick(CLIENT *Origin, CLIENT *Target, char *NewNick, bool InformClient) Client_SetID(Target, NewNick); } - /* -eof- */