]> jfr.im git - solanum.git/commitdiff
supported: add chantypes_update()
authorWilliam Pitcock <redacted>
Fri, 16 Sep 2016 18:49:02 +0000 (13:49 -0500)
committerWilliam Pitcock <redacted>
Fri, 16 Sep 2016 18:49:02 +0000 (13:49 -0500)
include/supported.h
ircd/s_conf.c
ircd/supported.c
modules/core/m_join.c

index 506955a701674d95def2bdf5f901c8bcfc2f5244..27d8e07afa27696fb4653e049fc9902075d48ba2 100644 (file)
@@ -38,6 +38,7 @@ extern const void *change_isupport(const char *, const char *(*)(const void *),
 extern void delete_isupport(const char *);
 extern void show_isupport(struct Client *);
 extern void init_isupport(void);
+extern void chantypes_update(void);
 
 extern const char *isupport_intptr(const void *);
 extern const char *isupport_boolean(const void *);
index 74df1cfa1b4285eb2ef3409a569f841d2af5ba3a..f2685bcb1d62f90189ed0d75f755cde2796474d9 100644 (file)
@@ -52,6 +52,7 @@
 #include "hook.h"
 #include "s_assert.h"
 #include "authproc.h"
+#include "supported.h"
 
 struct config_server_hide ConfigServerHide;
 
@@ -918,6 +919,12 @@ validate_conf(void)
                splitmode = 0;
                splitchecking = 0;
        }
+
+       CharAttrs['&'] |= CHANPFX_C;
+       if (ConfigChannel.disable_local_channels)
+               CharAttrs['&'] &= ~CHANPFX_C;
+
+       chantypes_update();
 }
 
 /* add_temp_kline()
index c28ed9d03ba5bfa6e93d68a4c1275c7b0a215c17..0b4505d22a2dc9f1240f512bbb66a2aee69e7293 100644 (file)
@@ -80,6 +80,7 @@
 #include "chmode.h"
 #include "send.h"
 
+static char allowed_chantypes[BUFSIZE];
 rb_dlink_list isupportlist;
 
 struct isupportitem
@@ -245,19 +246,12 @@ isupport_chanmodes(const void *ptr)
        return result;
 }
 
-static const char *
-isupport_chantypes(const void *ptr)
-{
-       return ConfigChannel.disable_local_channels ? "#" : "&#";
-}
-
 static const char *
 isupport_chanlimit(const void *ptr)
 {
        static char result[30];
 
-       snprintf(result, sizeof result, "%s:%i",
-               ConfigChannel.disable_local_channels ? "#" : "&#", ConfigChannel.max_chans_per_user);
+       snprintf(result, sizeof result, "%s:%i", allowed_chantypes, ConfigChannel.max_chans_per_user);
        return result;
 }
 
@@ -314,7 +308,7 @@ init_isupport(void)
        static int topiclen = TOPICLEN;
        static int maxnicklen = NICKLEN - 1;
 
-       add_isupport("CHANTYPES", isupport_chantypes, NULL);
+       add_isupport("CHANTYPES", isupport_stringptr, &allowed_chantypes);
        add_isupport("EXCEPTS", isupport_boolean, &ConfigChannel.use_except);
        add_isupport("INVEX", isupport_boolean, &ConfigChannel.use_invex);
        add_isupport("CHANMODES", isupport_chanmodes, NULL);
@@ -335,3 +329,18 @@ init_isupport(void)
        add_isupport("EXTBAN", isupport_extban, NULL);
        add_isupport("CLIENTVER", isupport_string, "3.0");
 }
+
+void
+chantypes_update(void)
+{
+       unsigned char *p;
+       memset(allowed_chantypes, '\0', sizeof allowed_chantypes);
+
+       p = (unsigned char *) allowed_chantypes;
+
+       for (unsigned int i = 0; i < 256; i++)
+       {
+               if (IsChanPrefix(i))
+                       *p++ = (unsigned char) i;
+       }
+}
index f74d7dd5b69b92392ea4d7d66884258cd6aaa9d8..2eb9d7b7f9f63edf06dd39bb20eca3affbde5bc2 100644 (file)
@@ -183,9 +183,8 @@ m_join(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
                        continue;
                }
 
-               /* check it begins with # or &, and local chans are disabled */
-               else if(!IsChannelName(name) ||
-                       ( ConfigChannel.disable_local_channels && name[0] == '&'))
+               /* check it begins with a valid channel prefix per policy. */
+               else if (!IsChannelName(name))
                {
                        sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
                                           form_str(ERR_NOSUCHCHANNEL), name);