]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_banexception.cpp
Tidy up source files:
[user/henk/code/inspircd.git] / src / modules / m_banexception.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2006-2008 Craig Edwards <craigedwards@brainbox.cc>
6  *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
7  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
8  *   Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
9  *
10  * This file is part of InspIRCd.  InspIRCd is free software: you can
11  * redistribute it and/or modify it under the terms of the GNU General Public
12  * License as published by the Free Software Foundation, version 2.
13  *
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
17  * details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  */
22
23
24 #include "inspircd.h"
25 #include "listmode.h"
26
27 /* $ModDesc: Provides support for the +e channel mode */
28
29 /* Written by Om<om@inspircd.org>, April 2005. */
30 /* Rewritten to use the listmode utility by Om, December 2005 */
31 /* Adapted from m_exception, which was originally based on m_chanprotect and m_silence */
32
33 // The +e channel mode takes a nick!ident@host, glob patterns allowed,
34 // and if a user matches an entry on the +e list then they can join the channel, overriding any (+b) bans set on them
35 // Now supports CIDR and IP addresses -- Brain
36
37
38 /** Handles +e channel mode
39  */
40 class BanException : public ListModeBase
41 {
42  public:
43         BanException(Module* Creator) : ListModeBase(Creator, "banexception", 'e', "End of Channel Exception List", 348, 349, true) { }
44 };
45
46
47 class ModuleBanException : public Module
48 {
49         BanException be;
50
51  public:
52         ModuleBanException() : be(this)
53         {
54         }
55
56         void init()
57         {
58                 ServerInstance->Modules->AddService(be);
59
60                 be.DoImplements(this);
61                 Implementation list[] = { I_OnRehash, I_On005Numeric, I_OnExtBanCheck, I_OnCheckChannelBan };
62                 ServerInstance->Modules->Attach(list, this, sizeof(list)/sizeof(Implementation));
63         }
64
65         void On005Numeric(std::map<std::string, std::string>& tokens)
66         {
67                 tokens["EXCEPTS"] = "e";
68         }
69
70         ModResult OnExtBanCheck(User *user, Channel *chan, char type)
71         {
72                 if (chan != NULL)
73                 {
74                         ListModeBase::ModeList *list = be.GetList(chan);
75
76                         if (!list)
77                                 return MOD_RES_PASSTHRU;
78
79                         for (ListModeBase::ModeList::iterator it = list->begin(); it != list->end(); it++)
80                         {
81                                 if (it->mask[0] != type || it->mask[1] != ':')
82                                         continue;
83
84                                 if (chan->CheckBan(user, it->mask.substr(2)))
85                                 {
86                                         // They match an entry on the list, so let them pass this.
87                                         return MOD_RES_ALLOW;
88                                 }
89                         }
90                 }
91
92                 return MOD_RES_PASSTHRU;
93         }
94
95         ModResult OnCheckChannelBan(User* user, Channel* chan)
96         {
97                 if (chan)
98                 {
99                         ListModeBase::ModeList *list = be.GetList(chan);
100
101                         if (!list)
102                         {
103                                 // No list, proceed normally
104                                 return MOD_RES_PASSTHRU;
105                         }
106
107                         for (ListModeBase::ModeList::iterator it = list->begin(); it != list->end(); it++)
108                         {
109                                 if (chan->CheckBan(user, it->mask))
110                                 {
111                                         // They match an entry on the list, so let them in.
112                                         return MOD_RES_ALLOW;
113                                 }
114                         }
115                 }
116                 return MOD_RES_PASSTHRU;
117         }
118
119         void OnSyncChannel(Channel* chan, Module* proto, void* opaque)
120         {
121                 be.DoSyncChannel(chan, proto, opaque);
122         }
123
124         void OnRehash(User* user)
125         {
126                 be.DoRehash();
127         }
128
129         Version GetVersion()
130         {
131                 return Version("Provides support for the +e channel mode", VF_VENDOR);
132         }
133 };
134
135 MODULE_INIT(ModuleBanException)