commit de9a130bd97dec756bb9b31e67041d77f9562726 from: Florian Westphal date: Sat Dec 02 13:10:43 2006 UTC merge Conf_PredefChannelsOnly Config Option [from HEAD] commit - a0e0da74f852fc96bcd728c6954df8da6d35b6fc commit + de9a130bd97dec756bb9b31e67041d77f9562726 blob - 9eecd9b16d25319762d64809b48a33b1e3c1e495 blob + 888228b7074eba92b090395c8578f8d027432cdb --- ChangeLog +++ ChangeLog @@ -14,6 +14,8 @@ ngIRCd 0.10.x - Fixed validation of server names containing digits. - Update info text of local server after re-reading configuration. + - New configuration option "PredefChannelsOnly": if set, clients can + only join predefined channels. ngIRCd 0.10.0 (2006-10-01) @@ -666,4 +668,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.302.2.6 2006/11/10 10:06:14 alex Exp $ +$Id: ChangeLog,v 1.302.2.7 2006/12/02 13:10:44 fw Exp $ blob - 19c3f43e0c8f6f83dca6c819ffb62e98074b1ede blob + 87dbe8bdae302ca7e52b44aedc5779d988113d09 --- doc/sample-ngircd.conf +++ 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.37.2.1 2006/12/02 13:10:43 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 blob - 559861f7bbb170a06727b25fb9a0a3d0d17f16b3 blob + 10821292fd78f6d17bffd3151bb2079d6f240c35 --- src/ngircd/conf.c +++ src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.92.2.2 2006/11/10 10:06:14 alex Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.92.2.3 2006/12/02 13:10:43 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, c 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 ); @@ -915,6 +922,21 @@ Handle_SERVER( int Line, char *Var, char *Arg ) } /* Handle_SERVER */ +static bool +Handle_Channelname(size_t chancount, const char *name) +{ + size_t size = sizeof( Conf_Channel[chancount].name ); + char *dest = Conf_Channel[chancount].name; + + if (*name && *name != '#') { + *dest = '#'; + --size; + ++dest; + } + return size > strlcpy(dest, name, size); +} + + static void Handle_CHANNEL( int Line, char *Var, char *Arg ) { @@ -928,9 +950,7 @@ Handle_CHANNEL( int Line, char *Var, char *Arg ) chancount = Conf_Channel_Count - 1; if( strcasecmp( Var, "Name" ) == 0 ) { - /* Name of the channel */ - len = strlcpy( Conf_Channel[chancount].name, Arg, sizeof( Conf_Channel[chancount].name )); - if (len >= sizeof( Conf_Channel[chancount].name )) + if (!Handle_Channelname(chancount, Arg)) Config_Error_TooLong( Line, Var ); return; } blob - f2e903f4b3311daba2e0090fad7b13827f55d480 blob + 391adef3f70652a63f5c6d7ee4e13614830766ae --- src/ngircd/conf.h +++ 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.40.2.1 2006/12/02 13:10:43 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;