commit - a64e33b317dc18eab1bf8b84fc3831e385234afa
commit + c9e26562ce7d54ff5862f2cc8be72f5d72b6040c
blob - 888228b7074eba92b090395c8578f8d027432cdb
blob + 3c74c010dc8572ecfb93cb6f42f0933c27969bb1
--- ChangeLog
+++ ChangeLog
- 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.
--
-$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
* (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)
*/
#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
#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 <assert.h>
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;
GLOBAL bool
IRC_Send_LUSERS( CLIENT *Client )
{
- long cnt;
+ unsigned long cnt;
+#ifndef STRICT_RFC
+ unsigned long max;
+#endif
assert( Client != NULL );
#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
#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 <assert.h>
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.
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
* 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;
} 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 */
/* Features supported by this server (005 numeric, ISUPPORT),
* see <http://www.irc.org/tech_docs/005.html> 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
#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 <assert.h>
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
* (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)
*/
#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"
#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 :"