commit c9e26562ce7d54ff5862f2cc8be72f5d72b6040c from: Florian Westphal date: Sat Dec 02 14:26:52 2006 UTC Changed Numerics 265 and 266 to follow ircd 2.11.x "standards". [from HEAD] Allow PASS syntax defined in RFC 1459 for server links, too. [from HEAD] Enhanced ISUPPORT message (005 numeric). [from HEAD] commit - a64e33b317dc18eab1bf8b84fc3831e385234afa commit + c9e26562ce7d54ff5862f2cc8be72f5d72b6040c blob - 888228b7074eba92b090395c8578f8d027432cdb blob + 3c74c010dc8572ecfb93cb6f42f0933c27969bb1 --- ChangeLog +++ ChangeLog @@ -14,6 +14,9 @@ ngIRCd 0.10.x - Fixed validation of server names containing digits. - Update info text of local server after re-reading configuration. + - Changed Numerics 265 and 266 to follow ircd 2.11.x "standards". + - Allow PASS syntax defined in RFC 1459 for server links, too. + - Enhanced ISUPPORT message (005 numeric). - New configuration option "PredefChannelsOnly": if set, clients can only join predefined channels. @@ -668,4 +671,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.302.2.7 2006/12/02 13:10:44 fw Exp $ +$Id: ChangeLog,v 1.302.2.8 2006/12/02 14:26:52 fw Exp $ blob - 63c3bf899ab3465bdf34e1169f320708b6f5d484 blob + 3e81a01faf7ae02a790c2ff9ece2626ba02d1f4d --- src/ngircd/client.h +++ src/ngircd/client.h @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: client.h,v 1.42.2.1 2006/12/02 14:00:00 fw Exp $ + * $Id: client.h,v 1.42.2.2 2006/12/02 14:26:53 fw Exp $ * * Client management (header) */ @@ -23,10 +23,9 @@ #define CLIENT_GOTNICK 4 /* client did send NICK */ #define CLIENT_GOTUSER 8 /* client did send USER */ #define CLIENT_USER 16 /* client is an IRC user */ -#define CLIENT_UNKNOWNSERVER 32 /* unregistered server connection */ -#define CLIENT_GOTPASSSERVER 64 /* client did send PASS in "server style" */ -#define CLIENT_SERVER 128 /* client is a server */ -#define CLIENT_SERVICE 256 /* client is a service */ +#define CLIENT_SERVER 32 /* client is a server */ +#define CLIENT_SERVICE 64 /* client is a service */ +#define CLIENT_UNKNOWNSERVER 128 /* unregistered server connection */ #define CLIENT_TYPE int blob - b43ab3bfcd101482dc0d83114364de30030a7c60 blob + d0c368bb5b6f3cb7f9c3e04c9fb5da7e313ce6e0 --- src/ngircd/irc-info.c +++ src/ngircd/irc-info.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-info.c,v 1.33.2.1 2006/09/16 13:49:15 alex Exp $"; +static char UNUSED id[] = "$Id: irc-info.c,v 1.33.2.2 2006/12/02 14:26:53 fw Exp $"; #include "imp.h" #include @@ -542,7 +542,8 @@ GLOBAL bool IRC_WHO( CLIENT *Client, REQUEST *Req ) { bool ok, only_ops; - char flags[8], *ptr; + char flags[8]; + const char *ptr; CL2CHAN *cl2chan; CHANNEL *chan, *cn; CLIENT *c; @@ -832,7 +833,10 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) GLOBAL bool IRC_Send_LUSERS( CLIENT *Client ) { - long cnt; + unsigned long cnt; +#ifndef STRICT_RFC + unsigned long max; +#endif assert( Client != NULL ); @@ -861,9 +865,17 @@ IRC_Send_LUSERS( CLIENT *Client ) #ifndef STRICT_RFC /* Maximum number of local users */ - if( ! IRC_WriteStrClient( Client, RPL_LOCALUSERS_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyMaxUserCount( ))) return DISCONNECTED; + cnt = Client_MyUserCount(); + max = Client_MyMaxUserCount(); + if (! IRC_WriteStrClient(Client, RPL_LOCALUSERS_MSG, Client_ID(Client), + cnt, max, cnt, max)) + return DISCONNECTED; /* Maximum number of users in the network */ - if( ! IRC_WriteStrClient( Client, RPL_NETUSERS_MSG, Client_ID( Client ), Client_UserCount( ), Client_MaxUserCount( ))) return DISCONNECTED; + cnt = Client_UserCount(); + max = Client_MaxUserCount(); + if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client), + cnt, max, cnt, max)) + return DISCONNECTED; #endif return CONNECTED; blob - 2e1bf8502601ab36c4ff61b6d1e67121813520e0 blob + 16e5551d510eab2969cb592db2c0b6bbb6ded55b --- src/ngircd/irc-login.c +++ src/ngircd/irc-login.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.1 2006/12/02 13:54:10 fw Exp $"; +static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.2 2006/12/02 14:26:53 fw Exp $"; #include "imp.h" #include @@ -44,6 +44,7 @@ static char UNUSED id[] = "$Id: irc-login.c,v 1.49.2.1 static bool Hello_User PARAMS(( CLIENT *Client )); static void Kill_Nick PARAMS(( char *Nick, char *Reason )); + /** * Handler for the IRC command "PASS". * See RFC 2813 section 4.1.1, and RFC 2812 section 3.1.1. @@ -51,13 +52,16 @@ static void Kill_Nick PARAMS(( char *Nick, char *Reaso GLOBAL bool IRC_PASS( CLIENT *Client, REQUEST *Req ) { + char *type, *orig_flags; + int protohigh, protolow; + assert( Client != NULL ); assert( Req != NULL ); /* Return an error if this is not a local client */ if (Client_Conn(Client) <= NONE) return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, - Client_ID(Client), Req->command); + Client_ID(Client), Req->command); if (Client_Type(Client) == CLIENT_UNKNOWN && Req->argc == 1) { /* Not yet registered "unknown" connection, PASS with one @@ -65,54 +69,67 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) * using the old RFC 1459 section 4.1.1 syntax. */ LogDebug("Connection %d: got PASS command ...", Client_Conn(Client)); - - Client_SetPassword( Client, Req->argv[0] ); - - Client_SetType( Client, CLIENT_GOTPASS ); - return CONNECTED; + } else if ((Client_Type(Client) == CLIENT_UNKNOWN || + Client_Type(Client) == CLIENT_UNKNOWNSERVER) && + (Req->argc == 3 || Req->argc == 4)) { + /* Not yet registered "unknown" connection or outgoing server + * link, PASS with three or four argument: server using the + * RFC 2813 section 4.1.1 syntax. */ + LogDebug("Connection %d: got PASS command (new server link) ...", + Client_Conn(Client)); + } 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, + Client_ID(Client), Req->command); + } else { + /* Registered connection, PASS command is not allowed! */ + return IRC_WriteStrClient(Client, ERR_ALREADYREGISTRED_MSG, + Client_ID(Client)); } - else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 ))) - { - char c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags; - int protohigh, protolow; - /* noch nicht registrierte Server-Verbindung */ - Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client )); + Client_SetPassword(Client, Req->argv[0]); + Client_SetType(Client, CLIENT_GOTPASS); - /* Passwort speichern */ - Client_SetPassword( Client, Req->argv[0] ); + /* Protocol version */ + if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) { + int c2, c4; - /* Protokollversion ermitteln */ - if( strlen( Req->argv[1] ) >= 4 ) - { - c2 = Req->argv[1][2]; - c4 = Req->argv[1][4]; + c2 = Req->argv[1][2]; + c4 = Req->argv[1][4]; - Req->argv[1][4] = '\0'; - protolow = atoi( &Req->argv[1][2] ); - Req->argv[1][2] = '\0'; - protohigh = atoi( Req->argv[1] ); - - Req->argv[1][2] = c2; - Req->argv[1][4] = c4; - } - else protohigh = protolow = 0; + Req->argv[1][4] = '\0'; + protolow = atoi(&Req->argv[1][2]); + Req->argv[1][2] = '\0'; + protohigh = atoi(Req->argv[1]); + + Req->argv[1][2] = c2; + Req->argv[1][4] = c4; + } else + protohigh = protolow = 0; - /* Protokoll-Typ */ - if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4]; - else type = NULL; + /* Protocol type, see doc/Protocol.txt */ + if (Req->argc >= 2 && strlen(Req->argv[1]) > 4) + type = &Req->argv[1][4]; + else + type = NULL; + + /* Protocol flags/options */ + if (Req->argc >= 4) + orig_flags = Req->argv[3]; + else + orig_flags = ""; - /* IRC-Flags (nach RFC 2813) */ - if( Req->argc >= 4 ) ircflags = Req->argv[3]; - else ircflags = ""; + /* Implementation, version and IRC+ flags */ + if (Req->argc >= 3) { + char *impl, *ptr, *serverver, *flags; - /* Implementation, Version und ngIRCd-Flags */ impl = Req->argv[2]; ptr = strchr(impl, '|'); if (ptr) *ptr = '\0'; - if (type && (strcmp( type, PROTOIRCPLUS ) == 0)) { + if (type && strcmp(type, PROTOIRCPLUS) == 0) { /* The peer seems to be a server which supports the * IRC+ protocol (see doc/Protocol.txt). */ serverver = ptr + 1; @@ -123,30 +140,24 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) } else flags = ""; Log(LOG_INFO, - "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", impl, serverver, protohigh, protolow, flags ); + "Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", + impl, serverver, protohigh, protolow, flags); } else { /* The peer seems to be a server supporting the * "original" IRC protocol (RFC 2813). */ serverver = ""; - if (strchr(ircflags, 'Z' )) + if (strchr(orig_flags, 'Z')) flags = "Z"; else flags = ""; Log(LOG_INFO, - "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", impl, protohigh, protolow, flags ); + "Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", + impl, protohigh, protolow, flags); } - - Client_SetType( Client, CLIENT_GOTPASSSERVER ); - Client_SetFlags( Client, flags ); - - return CONNECTED; + Client_SetFlags(Client, flags); } - else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) - { - /* Falsche Anzahl Parameter? */ - return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - } - else return IRC_WriteStrClient( Client, ERR_ALREADYREGISTRED_MSG, Client_ID( Client )); + + return CONNECTED; } /* IRC_PASS */ @@ -607,8 +618,13 @@ Hello_User( CLIENT *Client ) /* Features supported by this server (005 numeric, ISUPPORT), * see for details. */ - if( ! IRC_WriteStrClient( Client, RPL_ISUPPORT_MSG, Client_ID( Client ), CLIENT_NICK_LEN - 1, - COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1, Conf_MaxJoins )) return DISCONNECTED; + if (! IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client), + Conf_MaxJoins)) + return DISCONNECTED; + if (! IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client), + CHANNEL_NAME_LEN-1, CLIENT_NICK_LEN-1, COMMAND_LEN-23, + CLIENT_AWAY_LEN-1, COMMAND_LEN-113)) + return DISCONNECTED; Client_SetType( Client, CLIENT_USER ); blob - 1da5c2cc55c6fd39a4b4273efe1e515d34037e96 blob + 948abc32b789d0adcf51409a3db3d312fd499ce4 --- src/ngircd/irc-server.c +++ src/ngircd/irc-server.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-server.c,v 1.39.2.1 2006/12/02 14:21:26 fw Exp $"; +static char UNUSED id[] = "$Id: irc-server.c,v 1.39.2.2 2006/12/02 14:26:53 fw Exp $"; #include "imp.h" #include @@ -64,7 +64,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req ) return IRC_WriteStrClient(Client, ERR_UNKNOWNCOMMAND_MSG, Client_ID(Client), Req->command); - if (Client_Type(Client) == CLIENT_GOTPASSSERVER) { + if (Client_Type(Client) == CLIENT_GOTPASS) { /* We got a PASS command from the peer, and now a SERVER * command: the peer tries to register itself as a server. */ LogDebug("Connection %d: got SERVER command (new server link) ...", blob - 1d8288d895c189ad6b41ad1adabfc5a862178ae6 blob + 7db74978139dbdd4a216dcd3f70e5fc61205d6e1 --- src/ngircd/messages.h +++ src/ngircd/messages.h @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: messages.h,v 1.67.2.1 2006/12/02 14:21:26 fw Exp $ + * $Id: messages.h,v 1.67.2.2 2006/12/02 14:26:53 fw Exp $ * * IRC numerics (Header) */ @@ -22,7 +22,8 @@ #define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)" #define RPL_CREATED_MSG "003 %s :This server has been started %s" #define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s" -#define RPL_ISUPPORT_MSG "005 %s NICKLEN=%d TOPICLEN=%d AWAYLEN=%d MAXCHANNELS=%d :are supported on this server" +#define RPL_ISUPPORT1_MSG "005 %s RFC2812 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=# CHANMODES=bI,k,l,imnPst CHANLIMIT=#:%d :are supported on this server" +#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server" #define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d" #define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s" @@ -41,8 +42,8 @@ #define RPL_ADMINLOC2_MSG "258 %s :%s" #define RPL_ADMINEMAIL_MSG "259 %s :%s" #define RPL_TRACEEND_MSG "262 %s %s %s-%s.%s :End of TRACE" -#define RPL_LOCALUSERS_MSG "265 %s :Current local users: %lu, Max: %lu" -#define RPL_NETUSERS_MSG "266 %s :Current global users: %lu, Max: %lu" +#define RPL_LOCALUSERS_MSG "265 %s %lu %lu :Current local users: %lu, Max: %lu" +#define RPL_NETUSERS_MSG "266 %s %lu %lu :Current global users: %lu, Max: %lu" #define RPL_AWAY_MSG "301 %s %s :%s" #define RPL_USERHOST_MSG "302 %s :"