- public:
- ModuleDCCAllow(InspIRCd* Me)
- : Module::Module(Me)
- {
- Conf = new ConfigReader(ServerInstance);
- mycommand = new cmd_dccallow(ServerInstance);
- ServerInstance->AddCommand(mycommand);
- ReadFileConf();
- }
-
- void Implements(char* List)
- {
- List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = List[I_OnUserQuit] = List[I_OnUserPreNick] = List[I_OnRehash] = 1;
- }
-
- virtual void OnRehash(const std::string ¶meter)
- {
- delete Conf;
- Conf = new ConfigReader(ServerInstance);
- }
-
- virtual void OnUserQuit(userrec* user, const std::string &reason)
- {
- dccallowlist* dl;
-
- // remove their DCCALLOW list if they have one
- user->GetExt("dccallow_list", dl);
- if (dl)
- {
- DELETE(dl);
- user->Shrink("dccallow_list");
- RemoveFromUserlist(user);
- }
-
- // remove them from any DCCALLOW lists
- // they are currently on
- RemoveNick(user);
- }
-
-
- virtual int OnUserPreNick(userrec* user, const std::string &newnick)
- {
- RemoveNick(user);
- return 0;
- }
-
- virtual int OnUserPreMessage(userrec* user, void* dest, int target_type, std::string &text, char status)
- {
- return OnUserPreNotice(user, dest, target_type, text, status);
- }
-
- virtual int OnUserPreNotice(userrec* user, void* dest, int target_type, std::string &text, char status)
- {
- Expire();
-
- if (target_type == TYPE_USER)
- {
- userrec* u = (userrec*)dest;
-
- if ((text.length()) && (text[0] == '\1'))
- {
- // :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)
- {
- u->GetExt("dccallow_list", dl);
-
- if (dl)
- {
- if (dl->size())
- {
- for (dccallowlist::const_iterator iter = dl->begin(); iter != dl->end(); ++iter)
- {
- if (ServerInstance->MatchText(user->GetFullHost(), iter->hostmask))
- {
- return 0;
- }
- }
- }
- }
-
- // tokenize
- stringstream ss(text);
- std::string buf;
- vector<string> tokens;
-
- while (ss >> buf)
- tokens.push_back(buf);
-
- std::string type = tokens[1];
- ServerInstance->Log(DEBUG, "m_dccallow.so: got DCC type %s", type.c_str());
-
- const char* blockchat = Conf->ReadValue("dccallow", "blockchat", 0).c_str();
- ServerInstance->Log(DEBUG, "m_dccallow.so: got blockchat: %s", blockchat);
-
- if (type == "SEND")
- {
- const char* defaultaction = Conf->ReadValue("dccallow", "action", 0).c_str();
- std::string filename = tokens[2];
-
- if (strcmp(defaultaction, "allow") == 0)
- {
- return 0;
- }
-
- for (unsigned int i = 0; i < bfl.size(); i++)
- {
- if (ServerInstance->MatchText(filename, bfl[i].filemask))
- {
- if (strcmp(bfl[i].action.c_str(), "allow") == 0)
- {
- return 0;
- }
- }
- else
- {
- if (strcmp(defaultaction, "allow") == 0)
- {
- 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);
- }
- }
- else if ((type == "CHAT") && (strcmp(blockchat, "yes") == 0))
- {
- 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;
- }
- }
- }
- return 0;
- }
-
- void Expire()
- {
- for (userlist::iterator iter = ul.begin(); iter != ul.end(); ++iter)
- {
- userrec* u = (userrec*)(*iter);
- u->GetExt("dccallow_list", dl);
-
- if (dl)
- {
- if (dl->size())
- {
- dccallowlist::iterator iter = dl->begin();
- while (iter != dl->end())
- {
- if ((iter->set_on + iter->length) <= ServerInstance->Time())
- {
- u->WriteServ("997 %s %s :DCCALLOW entry for %s has expired", u->nick, u->nick, iter->nickname.c_str());
- iter = dl->erase(iter);
- }
- else
- {
- ++iter;
- }
- }
- }
- }
- else
- {
- DELETE(dl);
- u->Shrink("dccallow_list");
- RemoveFromUserlist(u);
- ServerInstance->Log(DEBUG, "m_dccallow.so: UH OH! Couldn't get DCCALLOW list for %s", u->nick);
- }
- }
- }
-
- void RemoveNick(userrec* user)
- {
- /* Iterate through all DCCALLOW lists and remove user */
- for (userlist::iterator iter = ul.begin(); iter != ul.end(); ++iter)
- {
- userrec *u = (userrec*)(*iter);
- u->GetExt("dccallow_list", dl);
-
- if (dl)
- {
- if (dl->size())
- {
- for (dccallowlist::iterator i = dl->begin(); i != dl->end(); ++i)
- {
- if (i->nickname == user->nick)
- {
-
- u->WriteServ("NOTICE %s :%s left the network or changed their nickname and has been removed from your DCCALLOW list", u->nick, i->nickname.c_str());
- u->WriteServ("995 %s %s :Removed %s from your DCCALLOW list", u->nick, u->nick, i->nickname.c_str());
- dl->erase(i);
- break;
- }
- }
- }
- }
- else
- {
- DELETE(dl);
- u->Shrink("dccallow_list");
- RemoveFromUserlist(u);
- }
- }
- }
-
- void RemoveFromUserlist(userrec *user)
- {
- // remove user from userlist
- for (userlist::iterator j = ul.begin(); j != ul.end(); ++j)
- {
- userrec* u = (userrec*)(*j);
- if (u->nick == user->nick)
- {
- ul.erase(j);
- break;
- }
- }
- }
-
- void ReadFileConf()
- {
- bfl.clear();
- for (int i = 0; i < Conf->Enumerate("banfile"); i++)
- {
- BannedFileList bf;
- std::string fileglob = Conf->ReadValue("banfile", "pattern", i);
- std::string action = Conf->ReadValue("banfile", "action", i);
- bf.filemask = fileglob;
- bf.action = action;
- bfl.push_back(bf);
- }
-
- }
-
- virtual ~ModuleDCCAllow()
- {
- }
-
- virtual Version GetVersion()
- {
- return Version(1,0,0,0,VF_COMMON,API_VERSION);
- }
-};
-
-class ModuleDCCAllowFactory : public ModuleFactory