summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/conf/modules.conf.example14
-rw-r--r--src/modules/m_hidelist.cpp80
2 files changed, 94 insertions, 0 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example
index ffe35c739..0be7ee437 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -831,6 +831,20 @@
#<hidechans affectsopers="false">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
+# Hide list module: Allows for hiding the list of listmodes from users
+# who do not have sufficient channel rank.
+#<module name="m_hidelist.so">
+#
+# Each <hidelist> tag configures one listmode to hide.
+# mode: Name of the listmode to hide.
+#
+# Hiding the ban list is not recommended because it may break some
+# clients.
+#
+# Hide filter (+g) list:
+#<hidelist mode="filter">
+
+#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Hide oper module: Allows opers to hide their oper status from non-
# opers by setting user mode +H on themselves.
# This module is oper-only.
diff --git a/src/modules/m_hidelist.cpp b/src/modules/m_hidelist.cpp
new file mode 100644
index 000000000..f7a05ed0a
--- /dev/null
+++ b/src/modules/m_hidelist.cpp
@@ -0,0 +1,80 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2014 Attila Molnar <attilamolnar@hush.com>
+ *
+ * This file is part of InspIRCd. InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "inspircd.h"
+
+class ListWatcher : public ModeWatcher
+{
+ public:
+ ListWatcher(Module* mod, const std::string& modename)
+ : ModeWatcher(mod, modename, MODETYPE_CHANNEL)
+ {
+ }
+
+ bool BeforeMode(User* user, User* destuser, Channel* chan, std::string& param, bool adding)
+ {
+ // Only handle listmode list requests
+ if (!param.empty())
+ return true;
+
+ // If the user requesting the list is a member of the channel see if they have the
+ // rank required to view the list
+ Membership* memb = chan->GetUser(user);
+ if ((memb) && (memb->getRank() >= HALFOP_VALUE))
+ return true;
+
+ if (user->HasPrivPermission("channels/auspex"))
+ return true;
+
+ user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s :You do not have access to view the %s list", chan->name.c_str(), GetModeName().c_str());
+ return false;
+ }
+};
+
+class ModuleHideList : public Module
+{
+ std::vector<ListWatcher*> watchers;
+
+ public:
+ void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
+ {
+ stdalgo::delete_all(watchers);
+ watchers.clear();
+
+ ConfigTagList tags = ServerInstance->Config->ConfTags("hidelist");
+ for (ConfigIter i = tags.first; i != tags.second; ++i)
+ {
+ ConfigTag* tag = i->second;
+ std::string modename = tag->getString("mode");
+ watchers.push_back(new ListWatcher(this, modename));
+ }
+ }
+
+ ~ModuleHideList()
+ {
+ stdalgo::delete_all(watchers);
+ }
+
+ Version GetVersion() CXX11_OVERRIDE
+ {
+ return Version("Provides support for hiding the list of listmodes", VF_VENDOR);
+ }
+};
+
+MODULE_INIT(ModuleHideList)