diff --git a/ChangeLog b/ChangeLog index 41f3a987..2ca750ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,8 @@ ngIRCd HEAD - 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. ngIRCd 0.10.0 (2006-10-01) @@ -668,4 +670,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.308 2006/10/03 10:59:40 alex Exp $ +$Id: ChangeLog,v 1.309 2006/11/05 13:03:46 fw Exp $ diff --git a/doc/sample-ngircd.conf b/doc/sample-ngircd.conf index 19c3f43e..d5b97159 100644 --- a/doc/sample-ngircd.conf +++ b/doc/sample-ngircd.conf @@ -1,4 +1,4 @@ -# $Id: sample-ngircd.conf,v 1.37 2006/04/09 12:27:23 alex Exp $ +# $Id: sample-ngircd.conf,v 1.38 2006/11/05 13:03:47 fw Exp $ # # This is a sample configuration file for the ngIRCd, which must be adepted @@ -93,6 +93,9 @@ # server? (This is a compatibility hack for ircd-irc2 servers) ;OperServerMode = no + # Allow Pre-Defined Channels only (see Section [Channels]) + ;PredefChannelsOnly = no + # Maximum number of simultaneous connection the server is allowed # to accept (<=0: unlimited): ;MaxConnections = -1 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 34292a52..5e9e72be 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.93 2006/10/03 10:59:41 alex Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.94 2006/11/05 13:03:48 fw Exp $"; #include "imp.h" #include @@ -146,7 +146,7 @@ Conf_Rehash( void ) Set_Defaults( false ); Read_Config( ); Validate_Config(false, true); - + /* Update CLIENT structure of local server */ Client_SetInfo(Client_ThisServer(), Conf_ServerInfo); } /* Config_Rehash */ @@ -202,15 +202,16 @@ Conf_Test( void ) printf( " PingTimeout = %d\n", Conf_PingTimeout ); printf( " PongTimeout = %d\n", Conf_PongTimeout ); printf( " ConnectRetry = %d\n", Conf_ConnectRetry ); - printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true? "yes" : "no" ); + printf( " OperCanUseMode = %s\n", Conf_OperCanMode == true ? "yes" : "no" ); printf( " OperServerMode = %s\n", Conf_OperServerMode == true? "yes" : "no" ); + printf( " PredefChannelsOnly = %s\n", Conf_PredefChannelsOnly == true ? "yes" : "no" ); printf( " MaxConnections = %ld\n", Conf_MaxConnections>0 ? Conf_MaxConnections : -1); printf( " MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP>0 ? Conf_MaxConnectionsIP : -1); printf( " MaxJoins = %d\n\n", Conf_MaxJoins>0 ? Conf_MaxJoins : -1); for( i = 0; i < Conf_Oper_Count; i++ ) { if( ! Conf_Oper[i].name[0] ) continue; - + /* Valid "Operator" section */ puts( "[OPERATOR]" ); printf( " Name = %s\n", Conf_Oper[i].name ); @@ -221,7 +222,7 @@ Conf_Test( void ) for( i = 0; i < MAX_SERVERS; i++ ) { if( ! Conf_Server[i].name[0] ) continue; - + /* Valid "Server" section */ puts( "[SERVER]" ); printf( " Name = %s\n", Conf_Server[i].name ); @@ -234,7 +235,7 @@ Conf_Test( void ) for( i = 0; i < Conf_Channel_Count; i++ ) { if( ! Conf_Channel[i].name[0] ) continue; - + /* Valid "Channel" section */ puts( "[CHANNEL]" ); printf( " Name = %s\n", Conf_Channel[i].name ); @@ -243,7 +244,7 @@ Conf_Test( void ) topic = (char*)array_start(&Conf_Channel[i].topic); printf( " Topic = %s\n\n", topic ? topic : ""); } - + return 0; } /* Conf_Test */ @@ -271,14 +272,14 @@ Conf_UnsetServer( CONN_ID Idx ) Init_Server_Struct( &Conf_Server[i] ); } else { /* Set time for next connect attempt */ - t = time(NULL); - if (Conf_Server[i].lasttry < t - Conf_ConnectRetry) { - /* The connection has been "long", so we don't - * require the next attempt to be delayed. */ - Conf_Server[i].lasttry = - t - Conf_ConnectRetry + RECONNECT_DELAY; - } else - Conf_Server[i].lasttry = t; + t = time(NULL); + if (Conf_Server[i].lasttry < t - Conf_ConnectRetry) { + /* The connection has been "long", so we don't + * require the next attempt to be delayed. */ + Conf_Server[i].lasttry = + t - Conf_ConnectRetry + RECONNECT_DELAY; + } else + Conf_Server[i].lasttry = t; } } } /* Conf_UnsetServer */ @@ -300,9 +301,9 @@ GLOBAL int Conf_GetServer( CONN_ID Idx ) { /* Get index of server in configuration structure */ - + int i = 0; - + assert( Idx > NONE ); for( i = 0; i < MAX_SERVERS; i++ ) { @@ -380,7 +381,7 @@ Conf_AddServer( char *Name, UINT16 Port, char *Host, char *MyPwd, char *PeerPwd strlcpy( Conf_Server[i].pwd_in, PeerPwd, sizeof( Conf_Server[i].pwd_in )); Conf_Server[i].port = Port; Conf_Server[i].flags = CONF_SFLAG_ONCE; - + return true; } /* Conf_AddServer */ @@ -412,7 +413,7 @@ Set_Defaults( bool InitServers ) strcpy( Conf_ListenAddress, "" ); Conf_UID = Conf_GID = 0; - + Conf_PingTimeout = 120; Conf_PongTimeout = 20; @@ -422,8 +423,9 @@ Set_Defaults( bool InitServers ) Conf_Channel_Count = 0; Conf_OperCanMode = false; + Conf_PredefChannelsOnly = false; Conf_OperServerMode = false; - + Conf_MaxConnections = -1; Conf_MaxConnectionsIP = 5; Conf_MaxJoins = 10; @@ -753,6 +755,11 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) } return; } + if( strcasecmp( Var, "PredefChannelsOnly" ) == 0 ) { + /* Should we only allow pre-defined-channels? (i.e. users cannot create their own channels) */ + Conf_PredefChannelsOnly = Check_ArgIsTrue( Arg ); + return; + } if( strcasecmp( Var, "OperCanUseMode" ) == 0 ) { /* Are IRC operators allowed to use MODE in channels they aren't Op in? */ Conf_OperCanMode = Check_ArgIsTrue( Arg ); diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index f2e903f4..bb9a00b3 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conf.h,v 1.40 2006/05/10 21:24:01 alex Exp $ + * $Id: conf.h,v 1.41 2006/11/05 13:03:48 fw Exp $ * * Configuration management (header) */ @@ -110,6 +110,8 @@ GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS]; /* Pre-defined channels */ GLOBAL CONF_CHANNEL Conf_Channel[MAX_DEFCHANNELS]; GLOBAL unsigned int Conf_Channel_Count; +/* Pre-defined channels only */ +GLOBAL bool Conf_PredefChannelsOnly; /* Are IRC operators allowed to always use MODE? */ GLOBAL bool Conf_OperCanMode; diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index f30df91a..5a196285 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-channel.c,v 1.37 2006/10/06 21:32:58 fw Exp $"; +static char UNUSED id[] = "$Id: irc-channel.c,v 1.38 2006/11/05 13:03:48 fw Exp $"; #include "imp.h" #include @@ -78,8 +78,17 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) chan = NULL; flags = NULL; /* wird der Channel neu angelegt? */ - if( Channel_Search( channame )) is_new_chan = false; - else is_new_chan = true; + if( Channel_Search( channame )) { + is_new_chan = false; + } else { + if (Conf_PredefChannelsOnly) { /* this server does not allow creation of channels */ + IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame ); + /* Try next name, if any */ + channame = strchr(channame, ','); + continue; + } + is_new_chan = true; + } /* Hat ein Server Channel-User-Modes uebergeben? */ if( Client_Type( Client ) == CLIENT_SERVER )