1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-10-31 05:52:59 +00:00

Merge branch 'bug152-AllowedChannelTypes'

* bug152-AllowedChannelTypes:
  Implement new configuration option "AllowedChannelTypes"
  Introduce "CHANTYPES" #define
This commit is contained in:
Alexander Barton
2013-08-04 14:11:12 +02:00
8 changed files with 62 additions and 18 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

@@ -178,6 +178,9 @@
/** Supported channel modes. */
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
/** Supported channel types. */
#define CHANTYPES "#&+"
/** Away message for users connected to linked servers. */
#define DEFAULT_AWAY_MSG "Away"

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);

View File

@@ -1580,7 +1580,7 @@ GLOBAL bool
IRC_Send_ISUPPORT(CLIENT * Client)
{
if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
Conf_MaxJoins))
CHANTYPES, CHANTYPES, Conf_MaxJoins))
return DISCONNECTED;
return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,

View File

@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
* Copyright (c)2001-2013 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
@@ -21,7 +21,7 @@
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=#&+:%d :are supported on this server"
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=%s CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=%s:%d :are supported on this server"
#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server"
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"