about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2013-08-04 14:11:12 +0200
committerAlexander Barton <alex@barton.de>2013-08-04 14:11:12 +0200
commit139f5961a078dfd23a469d98c3942f42595854aa (patch)
tree8f12833feadf5fe195200b94b47280134a253b85 /src
parent15dfdaac823c5927b096b2980753a6198a6a7741 (diff)
parent5258fb7f7c3d92a35083f869bae4f05ab988d2da (diff)
downloadngircd-139f5961a078dfd23a469d98c3942f42595854aa.tar.gz
ngircd-139f5961a078dfd23a469d98c3942f42595854aa.zip
Merge branch 'bug152-AllowedChannelTypes'
* bug152-AllowedChannelTypes:
  Implement new configuration option "AllowedChannelTypes"
  Introduce "CHANTYPES" #define
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/conf.c44
-rw-r--r--src/ngircd/conf.h4
-rw-r--r--src/ngircd/defines.h3
-rw-r--r--src/ngircd/irc-channel.c2
-rw-r--r--src/ngircd/irc-info.c2
-rw-r--r--src/ngircd/messages.h4
6 files changed, 50 insertions, 9 deletions
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index d0787842..79376b80 100644
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -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
diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h
index bbf4f36c..93d6785f 100644
--- a/src/ngircd/conf.h
+++ b/src/ngircd/conf.h
@@ -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;
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
index 7784c174..efe31862 100644
--- a/src/ngircd/defines.h
+++ b/src/ngircd/defines.h
@@ -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"
 
diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c
index 5e20deed..07a6e5a5 100644
--- a/src/ngircd/irc-channel.c
+++ b/src/ngircd/irc-channel.c
@@ -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);
diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c
index d05ce24c..6fb2e31c 100644
--- a/src/ngircd/irc-info.c
+++ b/src/ngircd/irc-info.c
@@ -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,
diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h
index 3a91c183..53b96581 100644
--- a/src/ngircd/messages.h
+++ b/src/ngircd/messages.h
@@ -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"