+ 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(text.c_str(), "\1DCC ", 5) == 0)
+ {
+ if (u->GetExt("dccallow_list", dl) && dl->size())
+ {
+ for (dccallowlist::const_iterator iter = dl->begin(); iter != dl->end(); ++iter)
+ if (ServerInstance->MatchText(user->GetFullHost(), iter->hostmask))
+ return 0;
+ }
+
+ // tokenize
+ std::stringstream ss(text);
+ std::string buf;
+ std::vector<std::string> tokens;
+
+ while (ss >> buf)
+ tokens.push_back(buf);
+
+ irc::string type = tokens[1].c_str();
+
+ bool blockchat = Conf->ReadFlag("dccallow", "blockchat", 0);
+
+ if (type == "SEND")
+ {
+ std::string defaultaction = Conf->ReadValue("dccallow", "action", 0);
+ std::string filename = tokens[2];
+
+ if (defaultaction == "allow")
+ return 0;
+
+ for (unsigned int i = 0; i < bfl.size(); i++)
+ {
+ if (ServerInstance->MatchText(filename, bfl[i].filemask))
+ {
+ if (bfl[i].action == "allow")
+ return 0;
+ }
+ else
+ {
+ if (defaultaction == "allow")
+ return 0;
+ }
+ user->WriteServ("NOTICE %s :The user %s is not accepting DCC SENDs from you. Your file %s was not sent.", user->nick, u->nick, filename.c_str());
+ u->WriteServ("NOTICE %s :%s (%s@%s) attempted to send you a file named %s, which was blocked.", u->nick, user->nick, user->ident, user->dhost, filename.c_str());
+ u->WriteServ("NOTICE %s :If you trust %s and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.", u->nick, user->nick);
+ return 1;
+ }
+ }
+ else if ((type == "CHAT") && (blockchat))
+ {
+ user->WriteServ("NOTICE %s :The user %s is not accepting DCC CHAT requests from you.", user->nick, u->nick);
+ u->WriteServ("NOTICE %s :%s (%s@%s) attempted to initiate a DCC CHAT session, which was blocked.", u->nick, user->nick, user->ident, user->dhost);
+ u->WriteServ("NOTICE %s :If you trust %s and were expecting this, you can type /DCCALLOW HELP for information on the DCCALLOW system.", u->nick, user->nick);
+ return 1;
+ }
+ }