]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_override.cpp
Fixed WriteChannelWithServ
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 #include <stdio.h>
18 #include "users.h"
19 #include "channels.h"
20 #include "modules.h"
21
22 /* $ModDesc: Provides support for unreal-style oper-override */
23
24 char dummyvalue[] = "on";
25
26 class ModuleOverride : public Module
27 {
28         Server *Srv;
29         bool NoisyOverride;
30         ConfigReader *Conf;
31         
32  public:
33  
34         ModuleOverride()
35         {
36         
37                 // here we initialise our module. Use new to create new instances of the required
38                 // classes.
39                 
40                 Srv = new Server;
41                 Conf = new ConfigReader;
42                 
43                 // read our config options (main config file)
44                 NoisyOverride = Conf->ReadFlag("override","noisy",0);
45         }
46         
47         virtual void OnRehash()
48         {
49                 // on a rehash we delete our classes for good measure and create them again.
50                 delete Conf;
51                 Conf = new ConfigReader;
52                 // re-read our config options on a rehash
53                 NoisyOverride = Conf->ReadFlag("override","noisy",0);
54         }
55
56         virtual void On005Numeric(std::string &output)
57         {
58                 output = output + std::string(" OVERRIDE");
59         }
60
61         virtual bool CanOverride(userrec* source, char* token)
62         {
63                 // checks to see if the oper's type has <type:override>
64                 for (int j =0; j < Conf->Enumerate("type"); j++)
65                 {
66                         std::string typen = Conf->ReadValue("type","name",j);
67                         if (!strcmp(typen.c_str(),source->oper))
68                         {
69                                 // its defined, return its value as a boolean for if the token is set
70                                 std::string tokenlist = Conf->ReadValue("type","override",j);
71                                 return strstr(tokenlist.c_str(),token);
72                         }
73                 }
74                 // its not defined at all, count as false
75                 return false;
76         }
77         
78         virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type)
79         {
80                 if (strchr(source->modes,'o'))
81                 {
82                         if ((Srv) && (source) && (channel))
83                         {
84                                 // Fix by brain - allow the change if they arent on channel - rely on boolean short-circuit
85                                 // to not check the other items in the statement if they arent on the channel
86                                 if ((!Srv->IsOnChannel(source,channel)) || ((Srv->ChanMode(source,channel) != "%") && (Srv->ChanMode(source,channel) != "@")))
87                                 {
88                                         switch (access_type)
89                                         {
90                                                 case AC_KICK:
91                                                         if (CanOverride(source,"KICK"))
92                                                         {
93                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(dest->nick)+" on "+std::string(channel->name));
94                                                                 return ACR_ALLOW;
95                                                         }
96                                                         else return ACR_DEFAULT;
97                                                 break;
98                                                 case AC_DEOP:
99                                                         if (CanOverride(source,"MODEOP"))
100                                                         {
101                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Deopped "+std::string(dest->nick)+" on "+std::string(channel->name));
102                                                                 return ACR_ALLOW;
103                                                         }
104                                                         else return ACR_DEFAULT;
105                                                 break;
106                                                 case AC_OP:
107                                                         if (CanOverride(source,"MODEDEOP"))
108                                                         {
109                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Opped "+std::string(dest->nick)+" on "+std::string(channel->name));
110                                                                 return ACR_ALLOW;
111                                                         }
112                                                         else return ACR_DEFAULT;
113                                                 break;
114                                                 case AC_VOICE:
115                                                         if (CanOverride(source,"MODEVOICE"))
116                                                         {
117                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Voiced "+std::string(dest->nick)+" on "+std::string(channel->name));
118                                                                 return ACR_ALLOW;
119                                                         }
120                                                         else return ACR_DEFAULT;
121                                                 break;
122                                                 case AC_DEVOICE:
123                                                         if (CanOverride(source,"MODEDEVOICE"))
124                                                         {
125                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Devoiced "+std::string(dest->nick)+" on "+std::string(channel->name));
126                                                                 return ACR_ALLOW;
127                                                         }
128                                                         else return ACR_DEFAULT;
129                                                 break;
130                                                 case AC_HALFOP:
131                                                         if (CanOverride(source,"MODEHALFOP"))
132                                                         {
133                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Halfopped "+std::string(dest->nick)+" on "+std::string(channel->name));
134                                                                 return ACR_ALLOW;
135                                                         }
136                                                         else return ACR_DEFAULT;
137                                                 break;
138                                                 case AC_DEHALFOP:
139                                                         if (CanOverride(source,"MODEDEHALFOP"))
140                                                         {
141                                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Dehalfopped "+std::string(dest->nick)+" on "+std::string(channel->name));
142                                                                 return ACR_ALLOW;
143                                                         }
144                                                         else return ACR_DEFAULT;
145                                                 break;
146                                         }
147                                 }
148                         }
149                         if (CanOverride(source,"OTHERMODE"))
150                         {
151                                 return ACR_ALLOW;
152                         }
153                         else
154                         {
155                                 return ACR_DEFAULT;
156                         }
157                 }
158
159                 return ACR_DEFAULT;
160         }
161         
162         virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname)
163         {
164                 if (strchr(user->modes,'o'))
165                 {
166                         if (chan)
167                         {
168                                 if ((chan->inviteonly) && (CanOverride(user,"INVITE")))
169                                 {
170                                         if (NoisyOverride)
171                                         {
172                                                 if (!user->IsInvited(chan->name))
173                                                 {
174                                                         WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s invited himself into the channel",cname,user->nick);
175                                                 }
176                                         }
177                                         Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +i on "+std::string(cname));
178                                         return -1;
179                                 }
180                                 if ((chan->key[0]) && (CanOverride(user,"KEY")))
181                                 {
182                                         if (NoisyOverride)
183                                                 WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s bypassed the channel key",cname,user->nick);
184                                         Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +k on "+std::string(cname));
185                                         return -1;
186                                 }
187                                 if ((chan->limit >= Srv->CountUsers(chan)) && (CanOverride(user,"LIMIT")))
188                                 {
189                                         if (NoisyOverride)
190                                                 WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,"NOTICE %s :%s passed through your channel limit",cname,user->nick);
191                                         Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +l on "+std::string(cname));
192                                         return -1;
193                                 }
194
195                                 if (CanOverride(user,"BANWALK"))
196                                 {
197                                         // other join
198                                         return -1;
199                                 }
200                         }
201                 }
202                 return 0;
203         }
204         
205         virtual ~ModuleOverride()
206         {
207                 delete Conf;
208                 delete Srv;
209         }
210         
211         virtual Version GetVersion()
212         {
213                 return Version(1,0,0,1,VF_VENDOR);
214         }
215 };
216
217
218 class ModuleOverrideFactory : public ModuleFactory
219 {
220  public:
221         ModuleOverrideFactory()
222         {
223         }
224         
225         ~ModuleOverrideFactory()
226         {
227         }
228         
229         virtual Module * CreateModule()
230         {
231                 return new ModuleOverride;
232         }
233         
234 };
235
236
237 extern "C" void * init_module( void )
238 {
239         return new ModuleOverrideFactory;
240 }
241