X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconf.c;h=da7ff844b50c14d1a17a21c9687aae9534d4a185;hp=36eff905ecce8b04b4cfd9e20371c78c72c52b4b;hb=48326e061aacd954e24f76c53ded10448cbc28eb;hpb=49385a98b2878ae6f19dd0925e0dc90fcc3d6372 diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 36eff905..da7ff844 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -18,6 +18,7 @@ #include "imp.h" #include +#include #include #ifdef PROTOTYPES # include @@ -34,9 +35,6 @@ #include #include -#ifdef HAVE_CTYPE_H -# include -#endif #include "array.h" #include "ngircd.h" @@ -106,6 +104,8 @@ ConfSSL_Init(void) free(Conf_SSLOptions.DHFile); Conf_SSLOptions.DHFile = NULL; array_free_wipe(&Conf_SSLOptions.KeyFilePassword); + + array_free(&Conf_SSLOptions.ListenPorts); } /** @@ -346,10 +346,11 @@ Conf_Test( void ) puts("[LIMITS]"); printf(" ConnectRetry = %d\n", Conf_ConnectRetry); - printf(" MaxConnections = %ld\n", Conf_MaxConnections); + printf(" MaxConnections = %d\n", Conf_MaxConnections); printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP); printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1); printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1); + printf(" MaxListSize = %d\n", Conf_MaxListSize); printf(" PingTimeout = %d\n", Conf_PingTimeout); printf(" PongTimeout = %d\n", Conf_PongTimeout); puts(""); @@ -359,7 +360,7 @@ Conf_Test( void ) printf(" ChrootDir = %s\n", Conf_Chroot); printf(" CloakHost = %s\n", Conf_CloakHost); printf(" CloakHostModeX = %s\n", Conf_CloakHostModeX); - printf(" CloakHostModeXSalt = %s\n", Conf_CloakHostModeXSalt); + printf(" CloakHostSalt = %s\n", Conf_CloakHostSalt); printf(" CloakUserToNick = %s\n", yesno_to_str(Conf_CloakUserToNick)); #ifdef WANT_IPV6 printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6)); @@ -372,6 +373,7 @@ Conf_Test( void ) printf(" MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy)); printf(" NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth)); printf(" OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode)); + printf(" OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp)); printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode)); #ifdef PAM printf(" PAM = %s\n", yesno_to_str(Conf_PAM)); @@ -479,8 +481,12 @@ Conf_UnsetServer( CONN_ID Idx ) * require the next attempt to be delayed. */ Conf_Server[i].lasttry = t - Conf_ConnectRetry + RECONNECT_DELAY; - } else - Conf_Server[i].lasttry = t; + } else { + /* "Short" connection, enforce "ConnectRetry" + * but randomize it a little bit: 15 seconds. */ + Conf_Server[i].lasttry = + t + rand() / (RAND_MAX / 15); + } } } } @@ -488,7 +494,7 @@ Conf_UnsetServer( CONN_ID Idx ) /** * Set connection information for specified configured server. */ -GLOBAL void +GLOBAL bool Conf_SetServer( int ConfServer, CONN_ID Idx ) { assert( ConfServer > NONE ); @@ -496,13 +502,15 @@ Conf_SetServer( int ConfServer, CONN_ID Idx ) if (Conf_Server[ConfServer].conn_id > NONE && Conf_Server[ConfServer].conn_id != Idx) { - Log(LOG_ALERT, - "Trying to update connection index for already registered server \"%s\": %d/%d - ignored.", - Conf_Server[ConfServer].name, - Conf_Server[ConfServer].conn_id, Idx); - return; + Log(LOG_ERR, + "Connection %d: Server configuration of \"%s\" already in use by connection %d!", + Idx, Conf_Server[ConfServer].name, + Conf_Server[ConfServer].conn_id); + Conn_Close(Idx, NULL, "Server configuration already in use", true); + return false; } Conf_Server[ConfServer].conn_id = Idx; + return true; } /** @@ -636,14 +644,41 @@ Conf_AddServer(const char *Name, UINT16 Port, const char *Host, } /** - * Check if the given nick name is an service. + * Check if the given nickname is reserved for services on a particular server. * - * @returns true if the given nick name belongs to an "IRC service". + * @param ConfServer The server index to check. + * @param Nick The nickname to check. + * @returns true if the given nickname belongs to an "IRC service". */ GLOBAL bool -Conf_IsService(int ConfServer, const char *Nick) +Conf_NickIsService(int ConfServer, const char *Nick) { - return MatchCaseInsensitive(Conf_Server[ConfServer].svs_mask, Nick); + assert (ConfServer >= 0); + assert (ConfServer < MAX_SERVERS); + + return MatchCaseInsensitiveList(Conf_Server[ConfServer].svs_mask, + Nick, ","); +} + +/** + * Check if the given nickname is blocked for "normal client" use. + * + * @param ConfServer The server index or NONE to check all configured servers. + * @param Nick The nickname to check. + * @returns true if the given nickname belongs to an "IRC service". + */ +GLOBAL bool +Conf_NickIsBlocked(const char *Nick) +{ + int i; + + for(i = 0; i < MAX_SERVERS; i++) { + if (!Conf_Server[i].name[0]) + continue; + if (Conf_NickIsService(i, Nick)) + return true; + } + return false; } /** @@ -653,7 +688,7 @@ static void Set_Defaults(bool InitServers) { int i; - char random[RANDOM_SALT_LEN]; + char random[RANDOM_SALT_LEN + 1]; /* Global */ strcpy(Conf_ServerName, ""); @@ -664,6 +699,7 @@ Set_Defaults(bool InitServers) PACKAGE_NAME, PACKAGE_VERSION); free(Conf_ListenAddress); Conf_ListenAddress = NULL; + array_free(&Conf_ListenPorts); array_free(&Conf_Motd); strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile)); strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile)); @@ -677,6 +713,7 @@ Set_Defaults(bool InitServers) Conf_MaxConnectionsIP = 5; Conf_MaxJoins = 10; Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT; + Conf_MaxListSize = 100; Conf_PingTimeout = 120; Conf_PongTimeout = 20; @@ -688,7 +725,7 @@ Set_Defaults(bool InitServers) strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot)); strcpy(Conf_CloakHost, ""); strcpy(Conf_CloakHostModeX, ""); - strcpy(Conf_CloakHostModeXSalt,ngt_RandomStr(random,RANDOM_SALT_LEN)); + strcpy(Conf_CloakHostSalt, ngt_RandomStr(random, RANDOM_SALT_LEN)); Conf_CloakUserToNick = false; Conf_ConnectIPv4 = true; #ifdef WANT_IPV6 @@ -705,6 +742,7 @@ Set_Defaults(bool InitServers) Conf_MorePrivacy = false; Conf_NoticeAuth = false; Conf_OperCanMode = false; + Conf_OperChanPAutoOp = true; Conf_OperServerMode = false; #ifdef PAM Conf_PAM = true; @@ -1036,7 +1074,7 @@ Check_ArgIsTrue(const char *Arg) * * @param Line Line number in configuration file. * @raram Arg Input string. - * @returns New configured maximum nick name length. + * @returns New configured maximum nickname length. */ static unsigned int Handle_MaxNickLength(int Line, const char *Arg) @@ -1153,6 +1191,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg) || strcasecmp(Var, "ConnectIPv4") == 0 || strcasecmp(Var, "ConnectIPv6") == 0 || strcasecmp(Var, "OperCanUseMode") == 0 + || strcasecmp(Var, "OperChanPAutoOp") == 0 || strcasecmp(Var, "OperServerMode") == 0 || strcasecmp(Var, "PredefChannelsOnly") == 0 || strcasecmp(Var, "SyslogFacility") == 0 @@ -1405,7 +1444,7 @@ Handle_LIMITS(int Line, char *Var, char *Arg) return; } if (strcasecmp(Var, "MaxConnections") == 0) { - Conf_MaxConnections = atol(Arg); + Conf_MaxConnections = atoi(Arg); if (!Conf_MaxConnections && strcmp(Arg, "0")) Config_Error_NaN(Line, Var); return; @@ -1426,6 +1465,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg) Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg); return; } + if (strcasecmp(Var, "MaxListSize") == 0) { + Conf_MaxListSize = atoi(Arg); + if (!Conf_MaxListSize && strcmp(Arg, "0")) + Config_Error_NaN(Line, Var); + return; + } if (strcasecmp(Var, "PingTimeout") == 0) { Conf_PingTimeout = atoi(Arg); if (Conf_PingTimeout < 5) { @@ -1488,9 +1533,9 @@ Handle_OPTIONS(int Line, char *Var, char *Arg) Config_Error_TooLong(Line, Var); return; } - if (strcasecmp(Var, "CloakHostModeXSalt") == 0) { - len = strlcpy(Conf_CloakHostModeXSalt, Arg, sizeof(Conf_CloakHostModeXSalt)); - if (len >= sizeof(Conf_CloakHostModeX)) + if (strcasecmp(Var, "CloakHostSalt") == 0) { + len = strlcpy(Conf_CloakHostSalt, Arg, sizeof(Conf_CloakHostSalt)); + if (len >= sizeof(Conf_CloakHostSalt)) Config_Error_TooLong(Line, Var); return; } @@ -1528,6 +1573,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg) Conf_OperCanMode = Check_ArgIsTrue(Arg); return; } + if (strcasecmp(Var, "OperChanPAutoOp") == 0) { + Conf_OperChanPAutoOp = Check_ArgIsTrue(Arg); + return; + } if (strcasecmp(Var, "OperServerMode") == 0) { Conf_OperServerMode = Check_ArgIsTrue(Arg); return; @@ -1884,6 +1933,13 @@ Validate_Config(bool Configtest, bool Rehash) bool config_valid = true; char *ptr; + /* Emit a warning when the config file is not a full path name */ + if (NGIRCd_ConfFile[0] && NGIRCd_ConfFile[0] != '/') { + Config_Error(LOG_WARNING, + "Not specifying a full path name to \"%s\" can cause problems when rehashing the server!", + NGIRCd_ConfFile); + } + /* Validate configured server name, see RFC 2812 section 2.3.1 */ ptr = Conf_ServerName; do {