summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinuxdaemon <linuxdaemon@users.noreply.github.com>2019-01-04 14:31:08 -0600
committerPeter Powell <petpow@saberuk.com>2019-01-04 20:31:08 +0000
commit9aadc251e9910998fbbe5438b461958a261eae1d (patch)
tree34c9d5e2156b5c3ae3c24fe1241febdd29f66dc7
parentcefa51ba8eeb306d4f83e9298588df73e2033e3c (diff)
Merge m_restrictchans and m_regonlycreate due to converging functionality (#1541).
-rw-r--r--docs/conf/modules.conf.example18
-rw-r--r--src/modules/m_regonlycreate.cpp62
-rw-r--r--src/modules/m_restrictchans.cpp45
3 files changed, 43 insertions, 82 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example
index 829f99683..285670243 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -1671,14 +1671,6 @@
#<module name="regex_tre">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
-# Registered users only channel creation module. If enabled, only
-# registered users and opers can create new channels.
-#
-# You probably *DO NOT* want to load this module on a public network.
-#
-#<module name="regonlycreate">
-
-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Remove module: Adds the /REMOVE command which is a peaceful
# alternative to /KICK.
#<module name="remove">
@@ -1710,12 +1702,20 @@
#<module name="repeat">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
-# Restricted channels module: Allows only opers to create channels.
+# Restricted channels module: Allows only opers or registered users to
+# create channels.
#
# You probably *DO NOT* want to load this module on a public network.
#
#<module name="restrictchans">
+# Configure the restrictchans module
+# allowregistered: should registered users be allowed to bypass the restrictions?
+#<restrictchans allowregistered="no">
+
+# Allow any channel matching #user-* to be created, bypassing restrictchans checks
+#<allowchannel name="#user-*">
+
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Restrict message module: Allows users to only message opers.
#
diff --git a/src/modules/m_regonlycreate.cpp b/src/modules/m_regonlycreate.cpp
deleted file mode 100644
index 78b20ef6b..000000000
--- a/src/modules/m_regonlycreate.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * InspIRCd -- Internet Relay Chat Daemon
- *
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
- * Copyright (C) 2007 Craig Edwards <craigedwards@brainbox.cc>
- *
- * 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"
-#include "modules/account.h"
-
-class ModuleRegOnlyCreate : public Module
-{
- UserModeReference regusermode;
-
- public:
- ModuleRegOnlyCreate()
- : regusermode(this, "u_registered")
- {
- }
-
- ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
- {
- if (chan)
- return MOD_RES_PASSTHRU;
-
- if (user->IsOper())
- return MOD_RES_PASSTHRU;
-
- if (user->IsModeSet(regusermode))
- return MOD_RES_PASSTHRU;
-
- const AccountExtItem* ext = GetAccountExtItem();
- if (ext && ext->get(user))
- return MOD_RES_PASSTHRU;
-
- // XXX. there may be a better numeric for this..
- user->WriteNumeric(ERR_CHANOPRIVSNEEDED, cname, "You must have a registered nickname to create a new channel");
- return MOD_RES_DENY;
- }
-
- Version GetVersion() CXX11_OVERRIDE
- {
- return Version("Prevents users whose nicks are not registered from creating new channels", VF_VENDOR);
- }
-};
-
-MODULE_INIT(ModuleRegOnlyCreate)
diff --git a/src/modules/m_restrictchans.cpp b/src/modules/m_restrictchans.cpp
index 348beed2c..853b6b75c 100644
--- a/src/modules/m_restrictchans.cpp
+++ b/src/modules/m_restrictchans.cpp
@@ -21,19 +21,44 @@
#include "inspircd.h"
+#include "modules/account.h"
typedef insp::flat_set<std::string, irc::insensitive_swo> AllowChans;
class ModuleRestrictChans : public Module
{
AllowChans allowchans;
+ bool allowregistered;
+
+ bool CanCreateChannel(LocalUser* user, const std::string& name)
+ {
+ const AccountExtItem* accountext = GetAccountExtItem();
+ if (allowregistered && accountext && accountext->get(user))
+ return true;
+
+ if (user->HasPrivPermission("channels/restricted-create"))
+ return true;
+
+ for (AllowChans::const_iterator it = allowchans.begin(), it_end = allowchans.end(); it != it_end; ++it)
+ {
+ if (InspIRCd::Match(name, *it))
+ return true;
+ }
+
+ return false;
+ }
public:
+ ModuleRestrictChans()
+ : allowregistered(false)
+ {
+ }
+
void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
AllowChans newallows;
ConfigTagList tags = ServerInstance->Config->ConfTags("allowchannel");
- for(ConfigIter i = tags.first; i != tags.second; ++i)
+ for (ConfigIter i = tags.first; i != tags.second; ++i)
{
const std::string name = i->second->getString("name");
if (name.empty())
@@ -42,26 +67,24 @@ class ModuleRestrictChans : public Module
newallows.insert(name);
}
allowchans.swap(newallows);
+
+ // Global config
+ ConfigTag* tag = ServerInstance->Config->ConfValue("restrictchans");
+ allowregistered = tag->getBool("allowregistered", false);
}
ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
{
// channel does not yet exist (record is null, about to be created IF we were to allow it)
- if (!chan)
- {
- // user is not an oper and its not in the allow list
- if ((!user->IsOper()) && (allowchans.find(cname) == allowchans.end()))
- {
- user->WriteNumeric(ERR_BANNEDFROMCHAN, cname, "Only IRC operators may create new channels");
- return MOD_RES_DENY;
- }
- }
+ if (!chan && !CanCreateChannel(user, cname))
+ return MOD_RES_DENY;
+
return MOD_RES_PASSTHRU;
}
Version GetVersion() CXX11_OVERRIDE
{
- return Version("Only opers may create new channels if this module is loaded",VF_VENDOR);
+ return Version("Allows restricting who can create channels", VF_VENDOR);
}
};