X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=5819ef17eda92869fcadecefb627face7d64a374;hp=5619a6c78e9f6c0840300bb3daba6c67a8ffd404;hb=1964bda252ceb499f4a1f76f3e06d996acc2c821;hpb=355828e64f6fa07eb96bc6b27eef964b529d8778 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 5619a6c7..5819ef17 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -49,7 +49,7 @@ #include "conf.h" -static bool Use_Log = true; +static bool Use_Log = true, Using_MotdFile = true; static CONF_SERVER New_Server; static int New_Server_Idx; @@ -62,6 +62,7 @@ static bool Read_Config PARAMS(( bool ngircd_starting )); static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash )); static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg )); +static void Handle_FEATURES PARAMS(( int Line, char *Var, char *Arg )); static void Handle_OPERATOR PARAMS(( int Line, char *Var, char *Arg )); static void Handle_SERVER PARAMS(( int Line, char *Var, char *Arg )); static void Handle_CHANNEL PARAMS(( int Line, char *Var, char *Arg )); @@ -232,7 +233,7 @@ opers_free(void) { struct Conf_Oper *op; size_t len; - + len = array_length(&Conf_Opers, sizeof(*op)); op = array_start(&Conf_Opers); while (len--) { @@ -247,7 +248,7 @@ opers_puts(void) { struct Conf_Oper *op; size_t len; - + len = array_length(&Conf_Opers, sizeof(*op)); op = array_start(&Conf_Opers); while (len--) { @@ -300,8 +301,14 @@ Conf_Test( void ) printf(" AdminInfo1 = %s\n", Conf_ServerAdmin1); printf(" AdminInfo2 = %s\n", Conf_ServerAdmin2); printf(" AdminEMail = %s\n", Conf_ServerAdminMail); - printf(" MotdFile = %s\n", Conf_MotdFile); - printf(" MotdPhrase = %.32s\n", array_bytes(&Conf_Motd) ? (const char*) array_start(&Conf_Motd) : ""); + if (Using_MotdFile) { + printf(" MotdFile = %s\n", Conf_MotdFile); + printf(" MotdPhrase =\n"); + } else { + printf(" MotdFile = \n"); + printf(" MotdPhrase = %s\n", array_bytes(&Conf_Motd) + ? (const char*) array_start(&Conf_Motd) : ""); + } printf(" ChrootDir = %s\n", Conf_Chroot); printf(" PidFile = %s\n", Conf_PidFile); printf(" Listen = %s\n", Conf_ListenAddress); @@ -324,6 +331,10 @@ Conf_Test( void ) printf(" ServerGID = %s\n", grp->gr_name); else printf(" ServerGID = %ld\n", (long)Conf_GID); +#ifdef SYSLOG + printf(" SyslogFacility = %s\n", + ngt_SyslogFacilityName(Conf_SyslogFacility)); +#endif printf(" PingTimeout = %d\n", Conf_PingTimeout); printf(" PongTimeout = %d\n", Conf_PongTimeout); printf(" ConnectRetry = %d\n", Conf_ConnectRetry); @@ -331,10 +342,6 @@ Conf_Test( void ) printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode)); printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper)); printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly)); - printf(" NoDNS = %s\n", yesno_to_str(Conf_NoDNS)); - printf(" NoIdent = %s\n", yesno_to_str(Conf_NoIdent)); - printf(" NoPAM = %s\n", yesno_to_str(Conf_NoPAM)); - #ifdef WANT_IPV6 printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6)); printf(" ConnectIPv6 = %s\n", yesno_to_str(Conf_ConnectIPv4)); @@ -344,6 +351,13 @@ Conf_Test( void ) printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1); printf(" MaxNickLength = %u\n\n", Conf_MaxNickLength - 1); + puts("[FEATURES]"); + printf(" DNS = %s\n", yesno_to_str(Conf_DNS)); + printf(" Ident = %s\n", yesno_to_str(Conf_Ident)); + printf(" PAM = %s\n", yesno_to_str(Conf_PAM)); + printf(" ZeroConf = %s\n", yesno_to_str(Conf_ZeroConf)); + puts(""); + opers_puts(); for( i = 0; i < MAX_SERVERS; i++ ) { @@ -550,6 +564,27 @@ Conf_IsService(int ConfServer, const char *Nick) } /* Conf_IsService */ +static void +Set_Defaults_Optional(void) +{ +#ifdef IDENTAUTH + Conf_Ident = true; +#else + Conf_Ident = false; +#endif +#ifdef PAM + Conf_PAM = true; +#else + Conf_PAM = false; +#endif +#ifdef ZEROCONF + Conf_ZeroConf = true; +#else + Conf_ZeroConf = false; +#endif +} + + /** * Initialize configuration settings with their default values. */ @@ -580,9 +615,7 @@ Set_Defaults(bool InitServers) Conf_PingTimeout = 120; Conf_PongTimeout = 20; Conf_ConnectRetry = 60; - Conf_NoDNS = false; - Conf_NoIdent = false; - Conf_NoPAM = false; + Conf_DNS = true; Conf_Oper_Count = 0; Conf_Channel_Count = 0; @@ -600,6 +633,15 @@ Set_Defaults(bool InitServers) Conf_MaxJoins = 10; Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT; +#ifdef SYSLOG +#ifdef LOG_LOCAL5 + Conf_SyslogFacility = LOG_LOCAL5; +#else + Conf_SyslogFacility = 0; +#endif +#endif + Set_Defaults_Optional(); + /* Initialize server configuration structures */ if (InitServers) { for (i = 0; i < MAX_SERVERS; @@ -635,6 +677,7 @@ Read_Motd(const char *filename) } array_free(&Conf_Motd); + Using_MotdFile = true; while (fgets(line, (int)sizeof line, fp)) { ngt_TrimLastChr( line, '\n'); @@ -778,6 +821,7 @@ Read_Config( bool ngircd_starting ) arg = ptr + 1; ngt_TrimStr( arg ); if( strcasecmp( section, "[GLOBAL]" ) == 0 ) Handle_GLOBAL( line, var, arg ); + else if( strcasecmp( section, "[FEATURES]" ) == 0 ) Handle_FEATURES( line, var, arg ); else if( strcasecmp( section, "[OPERATOR]" ) == 0 ) Handle_OPERATOR( line, var, arg ); else if( strcasecmp( section, "[SERVER]" ) == 0 ) Handle_SERVER( line, var, arg ); else if( strcasecmp( section, "[CHANNEL]" ) == 0 ) Handle_CHANNEL( line, var, arg ); @@ -830,7 +874,8 @@ Check_ArgIsTrue( const char *Arg ) } /* Check_ArgIsTrue */ -static unsigned int Handle_MaxNickLength(int Line, const char *Arg) +static unsigned int +Handle_MaxNickLength(int Line, const char *Arg) { unsigned new; @@ -851,6 +896,65 @@ static unsigned int Handle_MaxNickLength(int Line, const char *Arg) } /* Handle_MaxNickLength */ +static void +WarnIdent(int UNUSED Line) +{ +#ifndef IDENTAUTH + if (Conf_Ident) { + /* user has enabled ident lookups explicitly, but ... */ + Config_Error(LOG_WARNING, + "%s: line %d: %s=True, but ngircd was built without support", + NGIRCd_ConfFile, Line, "Ident"); + } +#endif +} + +static void +WarnPAM(int UNUSED Line) +{ +#ifndef PAM + if (Conf_PAM) { + Config_Error(LOG_WARNING, + "%s: line %d: %s=True, but ngircd was built without support", + NGIRCd_ConfFile, Line, "PAM"); + } +#endif +} + +static bool +CheckLegacyNoOption(const char *Var, const char *Arg) +{ + if( strcasecmp( Var, "NoDNS" ) == 0 ) { + Conf_DNS = !Check_ArgIsTrue( Arg ); + return true; + } + if (strcasecmp(Var, "NoIdent") == 0) { + Conf_Ident = !Check_ArgIsTrue(Arg); + return true; + } + if(strcasecmp(Var, "NoPAM") == 0) { + Conf_PAM = !Check_ArgIsTrue(Arg); + return true; + } + if(strcasecmp(Var, "NoZeroConf") == 0) { + Conf_ZeroConf = !Check_ArgIsTrue(Arg); + return true; + } + return false; +} + +static const char * +NoNo(const char *str) +{ + assert(strncasecmp("no", str, 2) == 0 && str[2]); + return str + 2; +} + +static const char * +InvertArg(const char *arg) +{ + return yesno_to_str(!Check_ArgIsTrue(arg)); +} static void Handle_GLOBAL( int Line, char *Var, char *Arg ) @@ -936,6 +1040,7 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) if (!array_copyb(&Conf_Motd, Arg, len + 1)) Config_Error(LOG_WARNING, "%s, line %d: Could not append MotdPhrase: %s", NGIRCd_ConfFile, Line, strerror(errno)); + Using_MotdFile = false; return; } if( strcasecmp( Var, "ChrootDir" ) == 0 ) { @@ -1013,27 +1118,15 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) Conf_PredefChannelsOnly = Check_ArgIsTrue( Arg ); return; } - if( strcasecmp( Var, "NoDNS" ) == 0 ) { - /* don't do reverse dns lookups when clients connect? */ - Conf_NoDNS = Check_ArgIsTrue( Arg ); - return; - } - if (strcasecmp(Var, "NoIdent") == 0) { - /* don't do IDENT lookups when clients connect? */ - Conf_NoIdent = Check_ArgIsTrue(Arg); -#ifndef IDENTAUTH - if (!Conf_NoIdent) { - /* user has enabled ident lookups explicitly, but ... */ - Config_Error(LOG_WARNING, - "%s: line %d: NoIdent=False, but ngircd was built without IDENT support", - NGIRCd_ConfFile, Line); - } -#endif - return; - } - if(strcasecmp(Var, "NoPAM") == 0) { - /* don't use PAM library to authenticate users */ - Conf_NoPAM = Check_ArgIsTrue(Arg); + + if (CheckLegacyNoOption(Var, Arg)) { + Config_Error(LOG_WARNING, "%s, line %d: \"No\"-Prefix has been removed, use " + "\"%s = %s\" in [FEATURES] section instead", + NGIRCd_ConfFile, Line, NoNo(Var), InvertArg(Arg)); + if (strcasecmp(Var, "NoIdent") == 0) + WarnIdent(Line); + else if (strcasecmp(Var, "NoPam") == 0) + WarnPAM(Line); return; } #ifdef WANT_IPV6 @@ -1147,12 +1240,50 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) Conf_SSLOptions.DHFile = strdup_warn( Arg ); return; } +#endif +#ifdef SYSLOG + if (strcasecmp(Var, "SyslogFacility") == 0) { + Conf_SyslogFacility = ngt_SyslogFacilityID(Arg, + Conf_SyslogFacility); + return; + } #endif Config_Error(LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var); } /* Handle_GLOBAL */ +static void +Handle_FEATURES(int Line, char *Var, char *Arg) +{ + assert( Line > 0 ); + assert( Var != NULL ); + assert( Arg != NULL ); + + if( strcasecmp( Var, "DNS" ) == 0 ) { + /* do reverse dns lookups when clients connect? */ + Conf_DNS = Check_ArgIsTrue( Arg ); + return; + } + if (strcasecmp(Var, "Ident") == 0) { + /* do IDENT lookups when clients connect? */ + Conf_Ident = Check_ArgIsTrue(Arg); + WarnIdent(Line); + return; + } + if(strcasecmp(Var, "PAM") == 0) { + /* use PAM library to authenticate users */ + Conf_PAM = Check_ArgIsTrue(Arg); + WarnPAM(Line); + return; + } + if(strcasecmp(Var, "ZeroConf") == 0) { + /* register services using ZeroConf */ + Conf_ZeroConf = Check_ArgIsTrue(Arg); + return; + } +} + static void Handle_OPERATOR( int Line, char *Var, char *Arg ) {