]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_dccallow.cpp
Update copyright headers.
[user/henk/code/inspircd.git] / src / modules / m_dccallow.cpp
index e0ea4c7aeed89e7d20ab38cdc05bb0320e4e8ff5..20dfa9db8393c64c089f4b9a2147d7bd6ea8723f 100644 (file)
@@ -1,13 +1,19 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2008 John Brooks <john.brooks@dereferenced.net>
- *   Copyright (C) 2008 Pippijn van Steenhoven <pip88nl@gmail.com>
- *   Copyright (C) 2006-2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
+ *   Copyright (C) 2018 linuxdaemon <linuxdaemon.irc@gmail.com>
+ *   Copyright (C) 2016 Adam <Adam@anope.org>
+ *   Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012, 2014, 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2009 Matt Smith <dz@inspircd.org>
+ *   Copyright (C) 2008, 2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2008 John Brooks <special@inspircd.org>
  *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
- *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2006 Jamie ??? <???@???>
+ *   Copyright (C) 2007-2008 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2006 jamie <jamie@e03df62e-2008-0410-955e-edbf42e46eb7>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -98,14 +104,83 @@ typedef std::vector<DCCAllow> dccallowlist;
 dccallowlist* dl;
 typedef std::vector<BannedFileList> bannedfilelist;
 bannedfilelist bfl;
-typedef SimpleExtItem<dccallowlist> DCCAllowExt;
 
-class CommandDccallow : public Command
+class DCCAllowExt : public SimpleExtItem<dccallowlist>
 {
-       DCCAllowExt& ext;
-
  public:
        unsigned int maxentries;
+
+       DCCAllowExt(Module* Creator)
+               : SimpleExtItem<dccallowlist>("dccallow", ExtensionItem::EXT_USER, Creator)
+       {
+       }
+
+       void FromInternal(Extensible* container, const std::string& value) CXX11_OVERRIDE
+       {
+               LocalUser* user = IS_LOCAL(static_cast<User*>(container));
+               if (!user)
+                       return;
+
+               // Remove the old list and create a new one.
+               unset(user);
+               dccallowlist* list = new dccallowlist();
+
+               irc::spacesepstream ts(value);
+               while (!ts.StreamEnd())
+               {
+                       // Check we have space for another entry.
+                       if (list->size() >= maxentries)
+                       {
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Oversized DCC allow list received for %s: %s",
+                                       user->uuid.c_str(), value.c_str());
+                               delete list;
+                               return;
+                       }
+
+                       // Extract the fields.
+                       DCCAllow dccallow;
+                       if (!ts.GetToken(dccallow.nickname) ||
+                               !ts.GetToken(dccallow.hostmask) ||
+                               !ts.GetNumericToken(dccallow.set_on) ||
+                               !ts.GetNumericToken(dccallow.length))
+                       {
+                               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Malformed DCC allow list received for %s: %s",
+                                       user->uuid.c_str(), value.c_str());
+                               delete list;
+                               return;
+                       }
+
+                       // Store the DCC allow entry.
+                       list->push_back(dccallow);
+               }
+
+       }
+
+       std::string ToInternal(const Extensible* container, void* item) const CXX11_OVERRIDE
+       {
+               dccallowlist* list = static_cast<dccallowlist*>(item);
+               std::string buf;
+               for (dccallowlist::const_iterator iter = list->begin(); iter != list->end(); ++iter)
+               {
+                       if (iter != list->begin())
+                               buf.push_back(' ');
+
+                       buf.append(iter->nickname);
+                       buf.push_back(' ');
+                       buf.append(iter->hostmask);
+                       buf.push_back(' ');
+                       buf.append(ConvToStr(iter->set_on));
+                       buf.push_back(' ');
+                       buf.append(ConvToStr(iter->length));
+               }
+               return buf;
+       }
+};
+
+class CommandDccallow : public Command
+{
+ public:
+       DCCAllowExt& ext;
        unsigned long defaultlength;
        CommandDccallow(Module* parent, DCCAllowExt& Ext)
                : Command(parent, "DCCALLOW", 0)
@@ -131,13 +206,13 @@ class CommandDccallow : public Command
                        // if they didn't specify an action, this is probably a command
                        if (action != '+' && action != '-')
                        {
-                               if (!strcasecmp(parameters[0].c_str(), "LIST"))
+                               if (irc::equals(parameters[0], "LIST"))
                                {
                                        // list current DCCALLOW list
                                        DisplayDCCAllowList(user);
                                        return CMD_FAILURE;
                                }
-                               else if (!strcasecmp(parameters[0].c_str(), "HELP"))
+                               else if (irc::equals(parameters[0], "HELP"))
                                {
                                        // display help
                                        DisplayHelp(user);
@@ -191,7 +266,7 @@ class CommandDccallow : public Command
                                                ul.push_back(user);
                                        }
 
-                                       if (dl->size() >= maxentries)
+                                       if (dl->size() >= ext.maxentries)
                                        {
                                                user->WriteNumeric(ERR_DCCALLOWINVALID, user->nick, "Too many nicks on DCCALLOW list");
                                                return CMD_FAILURE;
@@ -301,7 +376,7 @@ class ModuleDCCAllow : public Module
 
  public:
        ModuleDCCAllow()
-               : ext("dccallow", ExtensionItem::EXT_USER, this)
+               : ext(this)
                , cmd(this, ext)
                , blockchat(false)
        {
@@ -338,14 +413,16 @@ class ModuleDCCAllow : public Module
                        if (user == u)
                                return MOD_RES_PASSTHRU;
 
-                       if ((details.text.length()) && (details.text[0] == '\1'))
+                       std::string ctcpname;
+                       std::string ctcpbody;
+                       if (details.IsCTCP(ctcpname, ctcpbody))
                        {
                                Expire();
 
                                // :jamie!jamie@test-D4457903BA652E0F.silverdream.org PRIVMSG eimaj :DCC SEND m_dnsbl.cpp 3232235786 52650 9676
                                // :jamie!jamie@test-D4457903BA652E0F.silverdream.org PRIVMSG eimaj :VERSION
 
-                               if (strncmp(details.text.c_str(), "\1DCC ", 5) == 0)
+                               if (irc::equals(ctcpname, "DCC") && !ctcpbody.empty())
                                {
                                        dl = ext.get(u);
                                        if (dl && dl->size())
@@ -355,18 +432,17 @@ class ModuleDCCAllow : public Module
                                                                return MOD_RES_PASSTHRU;
                                        }
 
-                                       std::string buf = details.text.substr(5);
-                                       size_t s = buf.find(' ');
+                                       size_t s = ctcpbody.find(' ');
                                        if (s == std::string::npos)
                                                return MOD_RES_PASSTHRU;
 
-                                       const std::string type = buf.substr(0, s);
+                                       const std::string type = ctcpbody.substr(0, s);
 
-                                       if (stdalgo::string::equalsci(type, "SEND"))
+                                       if (irc::equals(type, "SEND"))
                                        {
                                                size_t first;
 
-                                               buf = buf.substr(s + 1);
+                                               std::string buf = ctcpbody.substr(s + 1);
 
                                                if (!buf.empty() && buf[0] == '"')
                                                {
@@ -414,7 +490,7 @@ class ModuleDCCAllow : public Module
                                                u->WriteNotice("If you trust " + user->nick + " and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.");
                                                return MOD_RES_DENY;
                                        }
-                                       else if ((blockchat) && (stdalgo::string::equalsci(type, "CHAT")))
+                                       else if (blockchat && irc::equals(type, "CHAT"))
                                        {
                                                user->WriteNotice("The user " + u->nick + " is not accepting DCC CHAT requests from you.");
                                                u->WriteNotice(user->nick + " (" + user->ident + "@" + user->GetDisplayedHost() + ") attempted to initiate a DCC CHAT session, which was blocked.");
@@ -521,7 +597,7 @@ class ModuleDCCAllow : public Module
                bfl.swap(newbfl);
 
                ConfigTag* tag = ServerInstance->Config->ConfValue("dccallow");
-               cmd.maxentries = tag->getUInt("maxentries", 20);
+               cmd.ext.maxentries = tag->getUInt("maxentries", 20);
                cmd.defaultlength = tag->getDuration("length", 0);
                blockchat = tag->getBool("blockchat");
                defaultaction = tag->getString("action");