From: Florian Westphal Date: Sat, 2 Dec 2006 13:10:43 +0000 (+0000) Subject: merge Conf_PredefChannelsOnly Config Option [from HEAD] X-Git-Tag: rel-0-10-1~11 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git;a=commitdiff_plain;h=de9a130bd97dec756bb9b31e67041d77f9562726 merge Conf_PredefChannelsOnly Config Option [from HEAD] --- diff --git a/ChangeLog b/ChangeLog index 9eecd9b1..888228b7 100644 --- a/ChangeLog +++ b/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 $ diff --git a/doc/sample-ngircd.conf b/doc/sample-ngircd.conf index 19c3f43e..87dbe8bd 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.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 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 559861f7..10821292 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.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, 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 ); @@ -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; } diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index f2e903f4..391adef3 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.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;