]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_noctcp.cpp
Some more text fixes and improvements (#1618).
[user/henk/code/inspircd.git] / src / modules / m_noctcp.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
5  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
6  *   Copyright (C) 2004, 2006 Craig Edwards <craigedwards@brainbox.cc>
7  *
8  * This file is part of InspIRCd.  InspIRCd is free software: you can
9  * redistribute it and/or modify it under the terms of the GNU General Public
10  * License as published by the Free Software Foundation, version 2.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21
22 #include "inspircd.h"
23 #include "modules/exemption.h"
24
25 class NoCTCPUser : public SimpleUserModeHandler
26 {
27 public:
28         NoCTCPUser(Module* Creator)
29                 : SimpleUserModeHandler(Creator, "u_noctcp", 'T')
30         {
31                 if (!ServerInstance->Config->ConfValue("noctcp")->getBool("enableumode"))
32                         DisableAutoRegister();
33         }
34 };
35
36 class ModuleNoCTCP : public Module
37 {
38         CheckExemption::EventProvider exemptionprov;
39         SimpleChannelModeHandler nc;
40         NoCTCPUser ncu;
41
42  public:
43         ModuleNoCTCP()
44                 : exemptionprov(this)
45                 , nc(this, "noctcp", 'C')
46                 , ncu(this)
47         {
48         }
49
50         Version GetVersion() CXX11_OVERRIDE
51         {
52                 return Version("Provides user mode +T and channel mode +C to block CTCPs", VF_VENDOR);
53         }
54
55         ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE
56         {
57                 if (!IS_LOCAL(user))
58                         return MOD_RES_PASSTHRU;
59
60                 std::string ctcpname;
61                 if (!details.IsCTCP(ctcpname) || irc::equals(ctcpname, "ACTION"))
62                         return MOD_RES_PASSTHRU;
63
64                 if (target.type == MessageTarget::TYPE_CHANNEL)
65                 {
66                         if (user->HasPrivPermission("channels/ignore-noctcp"))
67                                 return MOD_RES_PASSTHRU;
68
69                         Channel* c = target.Get<Channel>();
70                         ModResult res = CheckExemption::Call(exemptionprov, user, c, "noctcp");
71                         if (res == MOD_RES_ALLOW)
72                                 return MOD_RES_PASSTHRU;
73
74                         if (!c->GetExtBanStatus(user, 'C').check(!c->IsModeSet(nc)))
75                         {
76                                 user->WriteNumeric(ERR_CANNOTSENDTOCHAN, c->name, "Can't send CTCP to channel (+C is set)");
77                                 return MOD_RES_DENY;
78                         }
79                 }
80                 else if (target.type == MessageTarget::TYPE_USER)
81                 {
82                         if (user->HasPrivPermission("users/ignore-noctcp"))
83                                 return MOD_RES_PASSTHRU;
84
85                         User* u = target.Get<User>();
86                         if (u->IsModeSet(ncu))
87                         {
88                                 user->WriteNumeric(ERR_CANTSENDTOUSER, u->nick, "Can't send CTCP to user (+T is set)");
89                                 return MOD_RES_DENY;
90                         }
91                 }
92                 return MOD_RES_PASSTHRU;
93         }
94
95         void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
96         {
97                 tokens["EXTBAN"].push_back('C');
98         }
99 };
100
101 MODULE_INIT(ModuleNoCTCP)