]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_restrictchans.cpp
Merge m_restrictchans and m_regonlycreate due to converging functionality (#1541).
[user/henk/code/inspircd.git] / src / modules / m_restrictchans.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
6  *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
7  *   Copyright (C) 2005-2006 Craig Edwards <craigedwards@brainbox.cc>
8  *
9  * This file is part of InspIRCd.  InspIRCd is free software: you can
10  * redistribute it and/or modify it under the terms of the GNU General Public
11  * License as published by the Free Software Foundation, version 2.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  */
21
22
23 #include "inspircd.h"
24 #include "modules/account.h"
25
26 typedef insp::flat_set<std::string, irc::insensitive_swo> AllowChans;
27
28 class ModuleRestrictChans : public Module
29 {
30         AllowChans allowchans;
31         bool allowregistered;
32
33         bool CanCreateChannel(LocalUser* user, const std::string& name)
34         {
35                 const AccountExtItem* accountext = GetAccountExtItem();
36                 if (allowregistered && accountext && accountext->get(user))
37                         return true;
38
39                 if (user->HasPrivPermission("channels/restricted-create"))
40                         return true;
41
42                 for (AllowChans::const_iterator it = allowchans.begin(), it_end = allowchans.end(); it != it_end; ++it)
43                 {
44                         if (InspIRCd::Match(name, *it))
45                                 return true;
46                 }
47
48                 return false;
49         }
50
51  public:
52         ModuleRestrictChans()
53                 : allowregistered(false)
54         {
55         }
56
57         void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
58         {
59                 AllowChans newallows;
60                 ConfigTagList tags = ServerInstance->Config->ConfTags("allowchannel");
61                 for (ConfigIter i = tags.first; i != tags.second; ++i)
62                 {
63                         const std::string name = i->second->getString("name");
64                         if (name.empty())
65                                 throw ModuleException("Empty <allowchannel:name> at " + i->second->getTagLocation());
66
67                         newallows.insert(name);
68                 }
69                 allowchans.swap(newallows);
70
71                 // Global config
72                 ConfigTag* tag = ServerInstance->Config->ConfValue("restrictchans");
73                 allowregistered = tag->getBool("allowregistered", false);
74         }
75
76         ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
77         {
78                 // channel does not yet exist (record is null, about to be created IF we were to allow it)
79                 if (!chan && !CanCreateChannel(user, cname))
80                         return MOD_RES_DENY;
81
82                 return MOD_RES_PASSTHRU;
83         }
84
85         Version GetVersion() CXX11_OVERRIDE
86         {
87                 return Version("Allows restricting who can create channels", VF_VENDOR);
88         }
89 };
90
91 MODULE_INIT(ModuleRestrictChans)