]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_operchans.cpp
8f600392302803f6be6ee046014bd03376177425
[user/henk/code/inspircd.git] / src / modules / m_operchans.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) 2004, 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
25 enum
26 {
27         // From UnrealIRCd.
28         ERR_CANTJOINOPERSONLY = 520
29 };
30
31 class OperChans : public SimpleChannelModeHandler
32 {
33  public:
34         /* This is an oper-only mode */
35         OperChans(Module* Creator) : SimpleChannelModeHandler(Creator, "operonly", 'O')
36         {
37                 oper = true;
38         }
39 };
40
41 class ModuleOperChans : public Module
42 {
43  private:
44         OperChans oc;
45         std::string space;
46         std::string underscore;
47
48  public:
49         ModuleOperChans()
50                 : oc(this)
51                 , space(" ")
52                 , underscore("_")
53         {
54         }
55
56         ModResult OnUserPreJoin(LocalUser* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven) CXX11_OVERRIDE
57         {
58                 if (chan && chan->IsModeSet(oc) && !user->IsOper())
59                 {
60                         user->WriteNumeric(ERR_CANTJOINOPERSONLY, chan->name, InspIRCd::Format("Only server operators may join %s (+O is set)", chan->name.c_str()));
61                         return MOD_RES_DENY;
62                 }
63                 return MOD_RES_PASSTHRU;
64         }
65
66         ModResult OnCheckBan(User* user, Channel* chan, const std::string& mask) CXX11_OVERRIDE
67         {
68                 // Check whether the entry is an extban.
69                 if (mask.length() <= 2 || mask[0] != 'O' || mask[1] != ':')
70                         return MOD_RES_PASSTHRU;
71
72                 // If the user is not an oper they can't match this.
73                 if (!user->IsOper())
74                         return MOD_RES_PASSTHRU;
75
76                 // Check whether the oper's type matches the ban.
77                 const std::string submask = mask.substr(2);
78                 if (InspIRCd::Match(user->oper->name, submask))
79                         return MOD_RES_DENY;
80
81                 // If the oper's type contains spaces recheck with underscores.
82                 std::string opername(user->oper->name);
83                 stdalgo::string::replace_all(opername, space, underscore);
84                 if (InspIRCd::Match(opername, submask))
85                         return MOD_RES_DENY;
86
87                 return MOD_RES_PASSTHRU;
88         }
89
90         void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
91         {
92                 tokens["EXTBAN"].push_back('O');
93         }
94
95         Version GetVersion() CXX11_OVERRIDE
96         {
97                 return Version("Provides support for oper-only channels via channel mode +O and extban 'O'", VF_VENDOR);
98         }
99 };
100
101 MODULE_INIT(ModuleOperChans)