/*
* 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
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)
// 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);
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;
public:
ModuleDCCAllow()
- : ext("dccallow", ExtensionItem::EXT_USER, this)
+ : ext(this)
, cmd(this, ext)
, blockchat(false)
{
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())
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] == '"')
{
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.");
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");