/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2019 Alexander Barton (alex@barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
{
struct passwd *pwd;
struct group *grp;
- unsigned int i;
+ unsigned int i, j;
bool config_valid;
size_t predef_channel_count;
struct Conf_Channel *predef_chan;
? (const char*) array_start(&Conf_Motd) : "");
}
printf(" Network = %s\n", Conf_Network);
- if (!Conf_PAM)
+ if (!Conf_PAM)
printf(" Password = %s\n", Conf_ServerPwd);
printf(" PidFile = %s\n", Conf_PidFile);
printf(" Ports = ");
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1);
+ printf(" MaxPenaltyTime = %ld\n", Conf_MaxPenaltyTime);
printf(" MaxListSize = %d\n", Conf_MaxListSize);
printf(" PingTimeout = %d\n", Conf_PingTimeout);
printf(" PongTimeout = %d\n", Conf_PongTimeout);
#endif
printf(" IncludeDir = %s\n", Conf_IncludeDir);
printf(" MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
- printf(" NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
+ printf(" NoticeBeforeRegistration = %s\n", yesno_to_str(Conf_NoticeBeforeRegistration));
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));
printf(" PAMIsOptional = %s\n", yesno_to_str(Conf_PAMIsOptional));
+ printf(" PAMServiceName = %s\n", Conf_PAMServiceName);
#endif
#ifndef STRICT_RFC
printf(" RequireAuthPing = %s\n", yesno_to_str(Conf_AuthPing));
/* Valid "Channel" section */
puts( "[CHANNEL]" );
printf(" Name = %s\n", predef_chan->name);
- printf(" Modes = %s\n", predef_chan->modes);
+ for(j = 0; j < predef_chan->modes_num; j++)
+ printf(" Modes = %s\n", predef_chan->modes[j]);
printf(" Key = %s\n", predef_chan->key);
printf(" MaxUsers = %lu\n", predef_chan->maxusers);
printf(" Topic = %s\n", predef_chan->topic);
&& (Conf_Server[i].port > 0)) {
/* BINGO! Enable server */
Conf_Server[i].flags &= ~CONF_SFLAG_DISABLED;
+ Conf_Server[i].lasttry = 0;
return true;
}
}
/**
* 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".
*/
Conf_MaxConnectionsIP = 5;
Conf_MaxJoins = 10;
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
+ Conf_MaxPenaltyTime = -1;
Conf_MaxListSize = 100;
Conf_PingTimeout = 120;
Conf_PongTimeout = 20;
#endif
strcpy(Conf_IncludeDir, "");
Conf_MorePrivacy = false;
- Conf_NoticeAuth = false;
+ Conf_NoticeBeforeRegistration = false;
Conf_OperCanMode = false;
Conf_OperChanPAutoOp = true;
Conf_OperServerMode = false;
Conf_PAM = false;
#endif
Conf_PAMIsOptional = false;
+ strcpy(Conf_PAMServiceName, "ngircd");
Conf_ScrubCTCP = false;
#ifdef SYSLOG
#ifdef LOG_LOCAL5
*
* This function is used to read the MOTD and help text file, for example.
*
- * @param filename Name of the file to read.
+ * @param Filename Name of the file to read.
* @return true, when the file has been read in.
*/
static bool
* Please note that this function uses exit(1) on fatal errors and therefore
* can result in ngIRCd terminating!
*
- * @param ngircd_starting Flag indicating if ngIRCd is starting or not.
- * @returns true when the configuration file has been read
- * successfully; false otherwise.
+ * @param IsStarting Flag indicating if ngIRCd is starting or not.
+ * @returns true when the configuration file has been read
+ * successfully; false otherwise.
*/
static bool
Read_Config(bool TestOnly, bool IsStarting)
FILE *fd;
DIR *dh;
+ Log(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
+
/* Open configuration file */
fd = fopen( NGIRCd_ConfFile, "r" );
if( ! fd ) {
Config_Error_NaN(File, Line, Var);
return;
}
+ if (strcasecmp(Var, "MaxPenaltyTime") == 0) {
+ Conf_MaxPenaltyTime = atol(Arg);
+ if (Conf_MaxPenaltyTime < -1)
+ Conf_MaxPenaltyTime = -1; /* "unlimited" */
+ return;
+ }
if (strcasecmp(Var, "PingTimeout") == 0) {
Conf_PingTimeout = atoi(Arg);
if (Conf_PingTimeout < 5) {
return;
}
if (strcasecmp(Var, "NoticeAuth") == 0) {
- Conf_NoticeAuth = Check_ArgIsTrue(Arg);
+ /*
+ * TODO: This section and support for "NoticeAuth" variable
+ * could be removed starting with ngIRCd release 24 (one
+ * release after marking it "deprecated") ...
+ */
+ Config_Error(LOG_WARNING,
+ "%s, line %d (section \"Options\"): \"%s\" is deprecated, please use \"NoticeBeforeRegistration\"!",
+ File, Line, Var);
+ Conf_NoticeBeforeRegistration = Check_ArgIsTrue(Arg);
+ return;
+ }
+ if (strcasecmp(Var, "NoticeBeforeRegistration") == 0) {
+ Conf_NoticeBeforeRegistration = Check_ArgIsTrue(Arg);
return;
}
if (strcasecmp(Var, "OperCanUseMode") == 0) {
Conf_PAMIsOptional = Check_ArgIsTrue(Arg);
return;
}
+ if (strcasecmp(Var, "PAMServiceName") == 0) {
+ len = strlcpy(Conf_PAMServiceName, Arg, sizeof(Conf_PAMServiceName));
+ if (len >= sizeof(Conf_PAMServiceName))
+ Config_Error_TooLong(File, Line, Var);
+ return;
+ }
if (strcasecmp(Var, "PredefChannelsOnly") == 0) {
/*
* TODO: This section and support for "PredefChannelsOnly"
}
if (strcasecmp(Var, "Modes") == 0) {
/* Initial modes */
- len = strlcpy(chan->modes, Arg, sizeof(chan->modes));
- if (len >= sizeof(chan->modes))
+ if(chan->modes_num >= sizeof(chan->modes)) {
+ Config_Error(LOG_ERR, "Too many Modes, option ignored.");
+ return;
+ }
+ chan->modes[chan->modes_num++] = strndup(Arg, COMMAND_LEN);
+ if(strlen(Arg) >= COMMAND_LEN)
Config_Error_TooLong(File, Line, Var);
return;
}
len = strlcpy(chan->key, Arg, sizeof(chan->key));
if (len >= sizeof(chan->key))
Config_Error_TooLong(File, Line, Var);
+ Config_Error(LOG_WARNING,
+ "%s, line %d (section \"Channel\"): \"%s\" is deprecated here, use \"Modes = +k <key>\"!",
+ File, Line, Var);
return;
}
if( strcasecmp( Var, "MaxUsers" ) == 0 ) {
chan->maxusers = (unsigned long) atol(Arg);
if (!chan->maxusers && strcmp(Arg, "0"))
Config_Error_NaN(File, Line, Var);
+ Config_Error(LOG_WARNING,
+ "%s, line %d (section \"Channel\"): \"%s\" is deprecated here, use \"Modes = +l <limit>\"!",
+ File, Line, Var);
return;
}
if (strcasecmp(Var, "KeyFile") == 0) {
break;
} while (*(++ptr));
- if (!Conf_ServerName[0]) {
+ if (!Conf_ServerName[0] || !strchr(Conf_ServerName, '.'))
+ {
/* No server name configured! */
config_valid = false;
Config_Error(LOG_ALERT,
}
}
- if (Conf_ServerName[0] && !strchr(Conf_ServerName, '.')) {
- /* No dot in server name! */
- config_valid = false;
- Config_Error(LOG_ALERT,
- "Invalid server name configured in \"%s\" (section 'Global': 'Name'): Dot missing!",
- NGIRCd_ConfFile);
- if (!Configtest) {
- Config_Error(LOG_ALERT,
- "%s exiting due to fatal errors!",
- PACKAGE_NAME);
- exit(1);
- }
- }
-
#ifdef STRICT_RFC
if (!Conf_ServerAdminMail[0]) {
/* No administrative contact configured! */
"This server uses PAM, \"Password\" in [Global] section will be ignored!");
#endif
+ if (Conf_MaxPenaltyTime != -1)
+ Config_Error(LOG_WARNING,
+ "Maximum penalty increase ('MaxPenaltyTime') is set to %ld, this is not recommended!",
+ Conf_MaxPenaltyTime);
+
#ifdef DEBUG
servers = servers_once = 0;
for (i = 0; i < MAX_SERVERS; i++) {