* 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
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";
/* (*)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; };
--- /dev/null
+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
#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 */
{ "PRIVATE", MC_PRIVATE },
{ "LIMITFLAGS", MC_LIMITFLAGS },
{ "ANTIFLOOD", MC_ANTIFLOOD },
+ { "PUBACL", MC_PUBACL },
{ "NONE", 0 },
{ NULL, 0 }
};
}
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;
set_prefix.c \
set_private.c \
set_property.c \
+ set_pubacl.c \
set_restricted.c \
set_secure.c \
set_topiclock.c \
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;
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;
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;
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;
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;
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;
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;
}
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);
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);
--- /dev/null
+/*
+ * 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
+ */
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."),
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;
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;
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;
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;