diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-09-26 16:41:07 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-09-26 16:41:07 +0000 |
commit | 7107ec12d8640d35cfe3d5002db1bc1deb33625d (patch) | |
tree | 72597b00288c0d895880e24a97cadb8a178b5517 /src/modules | |
parent | ee913368d7162dbe0dd119091f8b468eb7be0f1a (diff) |
Flexible SendQ
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11766 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/m_password_hash.cpp | 4 | ||||
-rw-r--r-- | src/modules/m_safelist.cpp | 236 |
2 files changed, 1 insertions, 239 deletions
diff --git a/src/modules/m_password_hash.cpp b/src/modules/m_password_hash.cpp index 011a592e7..12769acd4 100644 --- a/src/modules/m_password_hash.cpp +++ b/src/modules/m_password_hash.cpp @@ -29,6 +29,7 @@ class CommandMkpasswd : public Command CommandMkpasswd(Module* Creator, hashymodules &h, std::deque<std::string> &n) : Command(Creator, "MKPASSWD", 2), hashers(h), names(n) { syntax = "<hashtype> <any-text>"; + Penalty = 5; } void MakeHash(User* user, const char* algo, const char* stuff) @@ -57,9 +58,6 @@ class CommandMkpasswd : public Command CmdResult Handle (const std::vector<std::string>& parameters, User *user) { MakeHash(user, parameters[0].c_str(), parameters[1].c_str()); - // this hashing could take some time, increasing server load. - // Slow down the user if they are trying to flood mkpasswd requests - user->IncreasePenalty(5); return CMD_SUCCESS; } diff --git a/src/modules/m_safelist.cpp b/src/modules/m_safelist.cpp deleted file mode 100644 index 0160de7c2..000000000 --- a/src/modules/m_safelist.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ - * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits - * - * This program is free but copyrighted software; see - * the file COPYING for details. - * - * --------------------------------------------------- - */ - -#include "inspircd.h" - -/** Holds a users m_safelist state - */ -class ListData : public classbase -{ - public: - long list_start; - long list_position; - bool list_ended; - const std::string glob; - int minusers; - int maxusers; - - ListData() : list_start(0), list_position(0), list_ended(false) {}; - ListData(long pos, time_t t, const std::string &pattern, int mi, int ma) : list_start(t), list_position(pos), list_ended(false), glob(pattern), minusers(mi), maxusers(ma) {}; -}; - -/* $ModDesc: A module overriding /list, and making it safe - stop those sendq problems. */ - -class ModuleSafeList : public Module -{ - time_t ThrottleSecs; - size_t ServerNameSize; - int global_listing; - int LimitList; - SimpleExtItem<ListData> listData; - LocalIntExt listTime; - public: - ModuleSafeList() : listData("safelist_data", this), listTime("safelist_last", this) - { - OnRehash(NULL); - Extensible::Register(&listData); - Extensible::Register(&listTime); - Implementation eventlist[] = { I_OnBufferFlushed, I_OnPreCommand, I_On005Numeric, I_OnRehash }; - ServerInstance->Modules->Attach(eventlist, this, 4); - } - - ~ModuleSafeList() - { - } - - void OnRehash(User* user) - { - ConfigReader MyConf; - ThrottleSecs = MyConf.ReadInteger("safelist", "throttle", "60", 0, true); - LimitList = MyConf.ReadInteger("safelist", "maxlisters", "50", 0, true); - ServerNameSize = strlen(ServerInstance->Config->ServerName) + 4; - global_listing = 0; - } - - Version GetVersion() - { - return Version("A module overriding /list, and making it safe - stop those sendq problems.",VF_VENDOR,API_VERSION); - } - - - /* - * OnPreCommand() - * Intercept the LIST command. - */ - ModResult OnPreCommand(std::string &command, std::vector<std::string> ¶meters, User *user, bool validated, const std::string &original_line) - { - /* If the command doesnt appear to be valid, we dont want to mess with it. */ - if (!validated) - return MOD_RES_PASSTHRU; - - if (command == "LIST") - { - return this->HandleList(parameters, user); - } - return MOD_RES_PASSTHRU; - } - - /* - * HandleList() - * Handle (override) the LIST command. - */ - ModResult HandleList(const std::vector<std::string> ¶meters, User* user) - { - int pcnt = parameters.size(); - int minusers = 0, maxusers = 0; - - if (global_listing >= LimitList && !IS_OPER(user)) - { - user->WriteServ("NOTICE %s :*** Server load is currently too heavy. Please try again later.", user->nick.c_str()); - user->WriteNumeric(321, "%s Channel :Users Name",user->nick.c_str()); - user->WriteNumeric(323, "%s :End of channel list.",user->nick.c_str()); - return MOD_RES_DENY; - } - - /* First, let's check if the user is currently /list'ing */ - ListData *ld = listData.get(user); - - if (ld) - { - /* user is already /list'ing, we don't want to do shit. */ - return MOD_RES_DENY; - } - - /* Work around mIRC suckyness. YOU SUCK, KHALED! */ - if (pcnt == 1) - { - if (parameters[0][0] == '<') - { - maxusers = atoi(parameters[0].c_str()+1); - ServerInstance->Logs->Log("m_safelist",DEBUG,"Max users: %d", maxusers); - pcnt = 0; - } - else if (parameters[0][0] == '>') - { - minusers = atoi(parameters[0].c_str()+1); - ServerInstance->Logs->Log("m_safelist",DEBUG,"Min users: %d", minusers); - pcnt = 0; - } - } - - time_t last_list_time = listTime.get(user); - if (last_list_time && ServerInstance->Time() < last_list_time + ThrottleSecs) - { - user->WriteServ("NOTICE %s :*** Woah there, slow down a little, you can't /LIST so often!",user->nick.c_str()); - user->WriteNumeric(321, "%s Channel :Users Name",user->nick.c_str()); - user->WriteNumeric(323, "%s :End of channel list.",user->nick.c_str()); - return MOD_RES_DENY; - } - - /* - * start at channel 0! ;) - */ - ld = new ListData(0,ServerInstance->Time(), (pcnt && (parameters[0][0] != '<' && parameters[0][0] != '>')) ? parameters[0] : "*", minusers, maxusers); - listData.set(user, ld); - listTime.set(user, ServerInstance->Time()); - - user->WriteNumeric(321, "%s Channel :Users Name",user->nick.c_str()); - - global_listing++; - - return MOD_RES_DENY; - } - - void OnBufferFlushed(User* user) - { - char buffer[MAXBUF]; - ListData* ld = listData.get(user); - if (ld) - { - Channel* chan = NULL; - unsigned long amount_sent = 0; - do - { - chan = ServerInstance->GetChannelIndex(ld->list_position); - bool is_special = (chan && (chan->HasUser(user) || user->HasPrivPermission("channels/auspex"))); - long users = chan ? chan->GetUserCounter() : 0; - - bool too_few = (ld->minusers && (users <= ld->minusers)); - bool too_many = (ld->maxusers && (users >= ld->maxusers)); - - if (chan && (too_many || too_few)) - { - ld->list_position++; - continue; - } - - if (chan) - { - bool display = (InspIRCd::Match(chan->name, ld->glob) || (!chan->topic.empty() && InspIRCd::Match(chan->topic, ld->glob))); - - if (!users || !display) - { - ld->list_position++; - continue; - } - - /* +s, not in chan / not got channels/auspex */ - if (chan->IsModeSet('s') && !is_special) - { - ld->list_position++; - continue; - } - - if (chan->IsModeSet('p') && !is_special) - { - /* Channel is +p and user is outside/not privileged */ - int counter = snprintf(buffer, MAXBUF, "322 %s * %ld :", user->nick.c_str(), users); - amount_sent += counter + ServerNameSize; - user->WriteServ(std::string(buffer)); - } - else - { - /* User is in the channel/privileged, channel is not +s */ - int counter = snprintf(buffer, MAXBUF, "322 %s %s %ld :[+%s] %s", user->nick.c_str(), chan->name.c_str(), users, chan->ChanModes(is_special), chan->topic.c_str()); - amount_sent += counter + ServerNameSize; - user->WriteServ(std::string(buffer)); - } - } - else - { - if (!ld->list_ended) - { - ld->list_ended = true; - user->WriteNumeric(323, "%s :End of channel list.",user->nick.c_str()); - } - } - - ld->list_position++; - } - while ((chan != NULL) && (amount_sent < (user->MyClass->GetSendqMax() / 4))); - if (ld->list_ended) - { - listData.unset(user); - global_listing--; - } - } - } - - void On005Numeric(std::string &output) - { - output.append(" SAFELIST"); - } - -}; - -MODULE_INIT(ModuleSafeList) |