]> jfr.im git - irc/atheme/atheme.git/commitdiff
chanserv/set_pubacl: new module
authorWilliam Pitcock <redacted>
Sun, 19 Oct 2014 18:31:30 +0000 (13:31 -0500)
committerWilliam Pitcock <redacted>
Sun, 19 Oct 2014 18:31:30 +0000 (13:31 -0500)
18 files changed:
dist/atheme.conf.example
help/default/cservice/set_pubacl [new file with mode: 0644]
include/account.h
libathemecore/conf.c
modules/botserv/info.c
modules/chanserv/Makefile
modules/chanserv/access.c
modules/chanserv/akick.c
modules/chanserv/clone.c
modules/chanserv/count.c
modules/chanserv/flags.c
modules/chanserv/info.c
modules/chanserv/set_pubacl.c [new file with mode: 0644]
modules/chanserv/taxonomy.c
modules/chanserv/template.c
modules/chanserv/why.c
modules/chanserv/xop.c
modules/memoserv/sendops.c

index 9d80f7f933586bcd7f4f1ad1ccceb590db1bf00f..02a9777f1289db4c45fd16d877e87aaf26233346 100644 (file)
@@ -315,6 +315,7 @@ loadmodule "modules/nickserv/vhost";
  * SET PREFIX command                           modules/chanserv/set_prefix
  * Channel info hiding (SET PRIVATE command)    modules/chanserv/set_private
  * SET PROPERTY command                         modules/chanserv/set_property
+ * SET PUBACL command                           modules/chanserv/set_pubacl
  * SET RESTRICTED command                       modules/chanserv/set_restricted
  * SET SECURE command                           modules/chanserv/set_secure
  * SET TOPICLOCK command                        modules/chanserv/set_topiclock
@@ -382,6 +383,7 @@ loadmodule "modules/chanserv/set_mlock";
 loadmodule "modules/chanserv/set_prefix";
 #loadmodule "modules/chanserv/set_private";
 loadmodule "modules/chanserv/set_property";
+#loadmodule "modules/chanserv/set_pubacl";
 loadmodule "modules/chanserv/set_restricted";
 loadmodule "modules/chanserv/set_secure";
 loadmodule "modules/chanserv/set_topiclock";
@@ -1979,7 +1981,7 @@ general {
        /* (*)cflags
         * The default flags to set for channels upon registration.
         * Valid values are: hold, secure, verbose, verbose_ops, keeptopic,
-        * topiclock, guard, private, nosync, limitflags and none.
+        * topiclock, guard, private, nosync, limitflags, pubacl and none.
         */
        cflags = { verbose; guard; };
 
diff --git a/help/default/cservice/set_pubacl b/help/default/cservice/set_pubacl
new file mode 100644 (file)
index 0000000..eee09d1
--- /dev/null
@@ -0,0 +1,8 @@
+Help for \ 2SET PUBACL\ 2:
+
+SET PUBACL allows the channel access list to be publicly visible.
+
+Syntax: SET <#channel> PUBACL ON|OFF
+
+Example:
+    /msg &nick& SET #foo PUBACL ON
index 60f8cc0bcd9c3c8e5a1e2ef2add1a6f9bfab684e..03b6f7dfb02a4114d99ac9c7fcd5ec7945b437ea 100644 (file)
@@ -186,6 +186,7 @@ struct mychan_
 #define MC_PRIVATE     0x00000400
 #define MC_NOSYNC      0x00000800
 #define MC_ANTIFLOOD   0x00001000
+#define MC_PUBACL      0x00002000
 
 /* The following are temporary state */
 #define MC_INHABIT     0x80000000 /* we're on channel to enforce akick/staffonly/close */
index afcd9b85e33b2ca826c1ad76f31e7ad5277d36ef..8ca588368de2a0f9b1eec4b5955ee40165229934 100644 (file)
@@ -77,6 +77,7 @@ static struct Token cflags[] = {
   { "PRIVATE",     MC_PRIVATE     },
   { "LIMITFLAGS",  MC_LIMITFLAGS  },
   { "ANTIFLOOD",   MC_ANTIFLOOD   },
+  { "PUBACL",      MC_PUBACL      },
   { "NONE",        0              },
   { NULL, 0 }
 };
index bf0b183b0eded6ad0505cbe571f607a09929b2c3..67df68aa6d077e4438184304380ec5c772a12676 100644 (file)
@@ -95,7 +95,7 @@ static void bs_cmd_info(sourceinfo_t *si, int parc, char *parv[])
        }
        else if (mc != NULL)
        {
-               if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW) && !has_priv(si, PRIV_CHAN_AUSPEX))
+               if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW) && !has_priv(si, PRIV_CHAN_AUSPEX))
                {
                        command_fail(si, fault_noprivs, _("You are not authorized to perform this operation."));
                        return;
index 94d110bdafb600b7c35b949fa709de6c2133d35e..9aa0e09d624be96ea12665b87d31871eb3f29dd0 100644 (file)
@@ -56,6 +56,7 @@ SRCS =                        \
        set_prefix.c    \
        set_private.c   \
        set_property.c  \
+       set_pubacl.c    \
        set_restricted.c  \
        set_secure.c    \
        set_topiclock.c \
index 87aef59da7f9ea1fdfdd96a3fb88fc22069648de..934b348f6d99d151a41df25853c2cc4d232e2a4b 100644 (file)
@@ -578,7 +578,7 @@ static void cs_cmd_access_list(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_AUSPEX))
                        operoverride = true;
@@ -655,7 +655,7 @@ static void cs_cmd_access_info(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_AUSPEX))
                        operoverride = true;
index f5f34eda7a7eec486e22a56c5ac8ccab9289c24e..bfb8c5c23f5677407cf8c001c248076c64e1ce69 100644 (file)
@@ -599,7 +599,7 @@ void cs_cmd_akick_list(sourceinfo_t *si, int parc, char *parv[])
 
        int i = 0;
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_AUSPEX))
                        operoverride = true;
index 4884e452cc9aad84755e56222eb1a1394ce2c6df..582e157fc94907370bd1e65cd1ece9d00bf4a467 100644 (file)
@@ -88,7 +88,7 @@ static void cs_cmd_clone(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                command_fail(si, fault_noprivs, "You are not authorized to perform this operation.");
                return;
index c399f6900720a2aa96f5a6711187640ba5d64626..978a79a87b2428caa8eddb4e655da8091b49c2ea 100644 (file)
@@ -57,7 +57,7 @@ static void cs_cmd_count(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_AUSPEX))
                        operoverride = true;
index bfe85366acfec99ebc5003d59f3ce1fb7df05b16..af9869fd77267e526599c5f1a2a39371f63fd1de 100644 (file)
@@ -101,7 +101,7 @@ static void do_list(sourceinfo_t *si, mychan_t *mc, unsigned int flags)
        bool operoverride = false;
        unsigned int i = 1;
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_AUSPEX))
                        operoverride = true;
@@ -280,7 +280,7 @@ static void cs_cmd_flags(sourceinfo_t *si, int parc, char *parv[])
 
                if (!flagstr)
                {
-                       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+                       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
                        {
                                command_fail(si, fault_noprivs, _("You are not authorized to execute this command."));
                                return;
index e48af275df1d2fbf885f6d76ce0137ef9a61a709..cbb69556cca0dbdaa5eeaddf52ddd3b0c442a67f 100644 (file)
@@ -69,7 +69,7 @@ static void cs_cmd_info(sourceinfo_t *si, int parc, char *parv[])
        }
 
        hide_info = use_channel_private && mc->flags & MC_PRIVATE &&
-               !chanacs_source_has_flag(mc, si, CA_ACLVIEW) &&
+               !(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW) &&
                !has_priv(si, PRIV_CHAN_AUSPEX);
 
        tm = *localtime(&mc->registered);
@@ -80,7 +80,7 @@ static void cs_cmd_info(sourceinfo_t *si, int parc, char *parv[])
        if (!hide_info)
                command_success_nodata(si, _("Founder    : %s"), mychan_founder_names(mc));
 
-       if (chanacs_source_has_flag(mc, si, CA_ACLVIEW) ||
+       if ((!(mc->flags & MC_PUBACL) && chanacs_source_has_flag(mc, si, CA_ACLVIEW)) ||
                has_priv(si, PRIV_CHAN_AUSPEX))
        {
                mu = mychan_pick_successor(mc);
diff --git a/modules/chanserv/set_pubacl.c b/modules/chanserv/set_pubacl.c
new file mode 100644 (file)
index 0000000..beaa9ce
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2003-2004 E. Will et al.
+ * Copyright (c) 2006-2010 Atheme Development Group
+ * Rights to this code are documented in doc/LICENSE.
+ *
+ * This file contains routines to handle the CService SET PUBACL command.
+ */
+
+#include "atheme.h"
+
+DECLARE_MODULE_V1
+(
+       "chanserv/set_pubacl", false, _modinit, _moddeinit,
+       PACKAGE_STRING,
+       "Atheme Development Group <http://www.atheme.org>"
+);
+
+static void cs_cmd_set_pubacl(sourceinfo_t *si, int parc, char *parv[]);
+
+command_t cs_set_pubacl = { "PUBACL", N_("Allows the channel ACL to be public."), AC_NONE, 2, cs_cmd_set_verbose, { .path = "cservice/set_pubacl" } };
+
+mowgli_patricia_t **cs_set_cmdtree;
+
+void _modinit(module_t *m)
+{
+       MODULE_TRY_REQUEST_SYMBOL(m, cs_set_cmdtree, "chanserv/set_core", "cs_set_cmdtree");
+
+       command_add(&cs_set_pubacl, *cs_set_cmdtree);
+}
+
+void _moddeinit(module_unload_intent_t intent)
+{
+       command_delete(&cs_set_pubacl, *cs_set_cmdtree);
+}
+
+static void cs_cmd_set_pubacl(sourceinfo_t *si, int parc, char *parv[])
+{
+       mychan_t *mc;
+
+       if (!(mc = mychan_find(parv[0])))
+       {
+               command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), parv[0]);
+               return;
+       }
+
+       if (!parv[1])
+       {
+               command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SET PUBACL");
+               return;
+       }
+
+       if (!chanacs_source_has_flag(mc, si, CA_SET))
+       {
+               command_fail(si, fault_noprivs, _("You are not authorized to perform this command."));
+               return;
+       }
+
+       if (!strcasecmp("ON", parv[1]))
+       {
+               if (MC_PUBACL & mc->flags)
+               {
+                       command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for channel \2%s\2."), "PUBACL", mc->name);
+                       return;
+               }
+
+               logcommand(si, CMDLOG_SET, "SET:PUBACL:ON: \2%s\2", mc->name);
+
+               mc->flags |= MC_PUBACL;
+
+               command_success_nodata(si, _("The \2%s\2 flag has been set for channel \2%s\2."), "PUBACL", mc->name);
+               return;
+       }
+       else if (!strcasecmp("OFF", parv[1]))
+       {
+               if (!(MC_PUBACL & mc->flags))
+               {
+                       command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for channel \2%s\2."), "PUBACL", mc->name);
+                       return;
+               }
+
+               logcommand(si, CMDLOG_SET, "SET:PUBACL:OFF: \2%s\2", mc->name);
+
+               mc->flags &= ~MC_PUBACL;
+
+               command_success_nodata(si, _("The \2%s\2 flag has been removed for channel \2%s\2."), "PUBACL", mc->name);
+               return;
+       }
+       else
+       {
+               command_fail(si, fault_badparams, STR_INVALID_PARAMS, "PUBACL");
+               return;
+       }
+}
+
+/* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
+ * vim:ts=8
+ * vim:sw=8
+ * vim:noexpandtab
+ */
index 7bf0b14b1656b54c8eea0ac95930a3099bde29fb..62ddb7ea78afdb837bd04dae13dd8e26cd40d88b 100644 (file)
@@ -53,7 +53,7 @@ void cs_cmd_taxonomy(sourceinfo_t *si, int parc, char *parv[])
 
        isoper = has_priv(si, PRIV_CHAN_AUSPEX);
 
-       if (use_channel_private && mc->flags & MC_PRIVATE &&
+       if (use_channel_private && mc->flags & MC_PRIVATE && !(mc->flags & MC_PUBACL) &&
                        !chanacs_source_has_flag(mc, si, CA_ACLVIEW) && !isoper)
        {
                command_fail(si, fault_noprivs, _("Channel \2%s\2 is private."),
index aca14f51ecad97481e7c4460cc0524067cec6886..5960982dd10378b5d46f9b71c640b9c666b39c41 100644 (file)
@@ -89,7 +89,7 @@ static void cs_cmd_template(sourceinfo_t *si, int parc, char *parv[])
 
        if (!target)
        {
-               if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+               if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
                {
                        if (has_priv(si, PRIV_CHAN_AUSPEX))
                                operoverride = true;
index 2c76adcee379454820f83c8aa86221e20ccfbf70..b00c8ada364d504f66b230793af56d6257b5e7c0 100644 (file)
@@ -73,7 +73,7 @@ static void cs_cmd_why(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_AUSPEX))
                        operoverride = true;
index 43d496c22a5729444f38e2529a793ec97e06fe22..6a1c4435062ee63c2eb8aae2cbbb7d87ccde4983 100644 (file)
@@ -168,7 +168,7 @@ static void cs_xop(sourceinfo_t *si, int parc, char *parv[], const char *levelde
 
        else if (!strcasecmp("LIST", cmd))
        {
-               if (!chanacs_source_has_flag(mc, si, CA_ACLVIEW))
+               if (!(mc->flags & MC_PUBACL) && !chanacs_source_has_flag(mc, si, CA_ACLVIEW))
                {
                        if (has_priv(si, PRIV_CHAN_AUSPEX))
                                operoverride = true;
index 8f3bd54377b519d0d74c2f2b966b01332efb2f72..455f94c4be5b39ae796faa292b126ace07c43291 100644 (file)
@@ -100,7 +100,7 @@ static void ms_cmd_sendops(sourceinfo_t *si, int parc, char *parv[])
                return;
        }
 
-       if (!chanacs_user_has_flag(mc, si->su, CA_ACLVIEW))
+       if (!(mc->flags & MC_PUBACL) && !chanacs_user_has_flag(mc, si->su, CA_ACLVIEW))
        {
                if (has_priv(si, PRIV_CHAN_ADMIN))
                        operoverride = true;