1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-10-27 12:07:39 +00:00

Implement new configuration option "AllowedChannelTypes"

The new configuration variable "AllowedChannelTypes" lists all allowed
channel types (channel prefixes) for newly created channels on the local
server. By default, all supported channel types are allowed.

If set to the empty string, local clients can't create new channels at
all, which equals the old "PredefChannelsOnly = yes" setting.

This patch deprecates the "PredefChannelsOnly" variable, too, but it is
still supported and translated to the apropriate "AllowedChannelTypes"
setting. When "PredefChannelsOnly" is processed, a warning message is
logged.

Closes bug #152.
This commit is contained in:
Alexander Barton
2013-08-04 03:06:53 +02:00
parent 5e775a3fae
commit 5258fb7f7c
5 changed files with 56 additions and 15 deletions

View File

@@ -391,6 +391,7 @@ Conf_Test( void )
puts("");
puts("[OPTIONS]");
printf(" AllowedChannelTypes = %s\n", Conf_AllowedChannelTypes);
printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper));
printf(" ChrootDir = %s\n", Conf_Chroot);
printf(" CloakHost = %s\n", Conf_CloakHost);
@@ -415,7 +416,6 @@ Conf_Test( void )
printf(" PAM = %s\n", yesno_to_str(Conf_PAM));
printf(" PAMIsOptional = %s\n", yesno_to_str(Conf_PAMIsOptional));
#endif
printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
#ifndef STRICT_RFC
printf(" RequireAuthPing = %s\n", yesno_to_str(Conf_AuthPing));
#endif
@@ -758,6 +758,8 @@ Set_Defaults(bool InitServers)
Conf_PongTimeout = 20;
/* Options */
strlcpy(Conf_AllowedChannelTypes, CHANTYPES,
sizeof(Conf_AllowedChannelTypes));
Conf_AllowRemoteOper = false;
#ifndef STRICT_RFC
Conf_AuthPing = false;
@@ -792,7 +794,6 @@ Set_Defaults(bool InitServers)
Conf_PAM = false;
#endif
Conf_PAMIsOptional = false;
Conf_PredefChannelsOnly = false;
#ifdef SYSLOG
Conf_ScrubCTCP = false;
#ifdef LOG_LOCAL5
@@ -1633,12 +1634,37 @@ static void
Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
{
size_t len;
char *p;
assert(File != NULL);
assert(Line > 0);
assert(Var != NULL);
assert(Arg != NULL);
if (strcasecmp(Var, "AllowedChannelTypes") == 0) {
p = Arg;
Conf_AllowedChannelTypes[0] = '\0';
while (*p) {
if (strchr(Conf_AllowedChannelTypes, *p)) {
/* Prefix is already included; ignore it */
p++;
continue;
}
if (strchr(CHANTYPES, *p)) {
len = strlen(Conf_AllowedChannelTypes) + 1;
assert(len < sizeof(Conf_AllowedChannelTypes));
Conf_AllowedChannelTypes[len - 1] = *p;
Conf_AllowedChannelTypes[len] = '\0';
} else {
Config_Error(LOG_WARNING,
"%s, line %d: Unknown channel prefix \"%c\" in \"AllowedChannelTypes\"!",
File, Line, *p);
}
p++;
}
return;
}
if (strcasecmp(Var, "AllowRemoteOper") == 0) {
Conf_AllowRemoteOper = Check_ArgIsTrue(Arg);
return;
@@ -1731,7 +1757,19 @@ Handle_OPTIONS(const char *File, int Line, char *Var, char *Arg)
return;
}
if (strcasecmp(Var, "PredefChannelsOnly") == 0) {
Conf_PredefChannelsOnly = Check_ArgIsTrue(Arg);
/*
* TODO: This section and support for "PredefChannelsOnly"
* could be removed starting with ngIRCd release 22 (one
* release after marking it "deprecated") ...
*/
Config_Error(LOG_WARNING,
"%s, line %d (section \"Options\"): \"%s\" is deprecated, please use \"AllowedChannelTypes\"!",
File, Line, Var);
if (Check_ArgIsTrue(Arg))
Conf_AllowedChannelTypes[0] = '\0';
else
strlcpy(Conf_AllowedChannelTypes, CHANTYPES,
sizeof(Conf_AllowedChannelTypes));
return;
}
#ifndef STRICT_RFC

View File

@@ -148,8 +148,8 @@ GLOBAL CONF_SERVER Conf_Server[MAX_SERVERS];
/** Array of pre-defined channels */
GLOBAL array Conf_Channels;
/** Flag indicating if only pre-defined channels are allowed (true) or not */
GLOBAL bool Conf_PredefChannelsOnly;
/** String containing all locally allowed channel prefixes for new channels */
GLOBAL char Conf_AllowedChannelTypes[8];
/** Flag indicating if IRC operators are allowed to always use MODE (true) */
GLOBAL bool Conf_OperCanMode;

View File

@@ -344,7 +344,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
}
chan = Channel_Search(channame);
if (!chan && Conf_PredefChannelsOnly) {
if (!chan && !strchr(Conf_AllowedChannelTypes, channame[0])) {
/* channel must be created, but forbidden by config */
IRC_WriteStrClient(Client, ERR_NOSUCHCHANNEL_MSG,
Client_ID(Client), channame);