X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusermanager.cpp;h=1917606863872e9976836a1a0aca2eef64e340ef;hb=02830985a18950497003f3392cf8d6cc30c15c50;hp=8a05c811c37476889e04409b6c953f6ecd015945;hpb=79db1cf848c64ba50bebadef4c683ae4237080b7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 8a05c811c..191760686 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -63,7 +63,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs UserIOHandler* eh = &New->eh; /* Give each of the modules an attempt to hook the user for I/O */ - FOREACH_MOD(I_OnHookIO, OnHookIO(eh, via)); + FOREACH_MOD(OnHookIO, (eh, via)); if (eh->GetIOHook()) { @@ -112,7 +112,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs * Check connect class settings and initialise settings into User. * This will be done again after DNS resolution. -- w00t */ - New->CheckClass(); + New->CheckClass(ServerInstance->Config->CCOnConnect); if (New->quitting) return; @@ -129,8 +129,8 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs { /* user banned */ ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCache: Positive hit for " + New->GetIPString()); - if (!ServerInstance->Config->MoronBanner.empty()) - New->WriteNotice("*** " + ServerInstance->Config->MoronBanner); + if (!ServerInstance->Config->XLineMessage.empty()) + New->WriteNotice("*** " + ServerInstance->Config->XLineMessage); this->QuitUser(New, b->Reason); return; } @@ -162,11 +162,11 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs if (ServerInstance->Config->RawLog) New->WriteNotice("*** Raw I/O logging is enabled on this server. All messages, passwords, and commands are being recorded."); - FOREACH_MOD(I_OnSetUserIP,OnSetUserIP(New)); + FOREACH_MOD(OnSetUserIP, (New)); if (New->quitting) return; - FOREACH_MOD(I_OnUserInit,OnUserInit(New)); + FOREACH_MOD(OnUserInit, (New)); } void UserManager::QuitUser(User *user, const std::string &quitreason, const char* operreason) @@ -200,7 +200,7 @@ void UserManager::QuitUser(User *user, const std::string &quitreason, const char if (user->registered == REG_ALL) { - FOREACH_MOD(I_OnUserQuit,OnUserQuit(user, reason, oper_reason)); + FOREACH_MOD(OnUserQuit, (user, reason, oper_reason)); user->WriteCommonQuit(reason, oper_reason); } @@ -211,7 +211,7 @@ void UserManager::QuitUser(User *user, const std::string &quitreason, const char if (IS_LOCAL(user)) { LocalUser* lu = IS_LOCAL(user); - FOREACH_MOD(I_OnUserDisconnect,OnUserDisconnect(lu)); + FOREACH_MOD(OnUserDisconnect, (lu)); lu->eh.Close(); } @@ -316,19 +316,6 @@ void UserManager::ServerNoticeAll(const char* text, ...) } } -/* return how many users have a given mode e.g. 'a' */ -int UserManager::ModeCount(const char mode) -{ - int c = 0; - for(user_hash::iterator i = clientlist->begin(); i != clientlist->end(); ++i) - { - User* u = i->second; - if (u->modes[mode-65]) - c++; - } - return c; -} - void UserManager::GarbageCollect() { // Reset the already_sent IDs so we don't wrap it around and drop a message @@ -350,3 +337,71 @@ bool UserManager::AllModulesReportReady(LocalUser* user) FIRST_MOD_RESULT(OnCheckReady, res, (user)); return (res == MOD_RES_PASSTHRU); } + +/** + * This function is called once a second from the mainloop. + * It is intended to do background checking on all the user structs, e.g. + * stuff like ping checks, registration timeouts, etc. + */ +void UserManager::DoBackgroundUserStuff() +{ + /* + * loop over all local users.. + */ + for (LocalUserList::iterator i = local_users.begin(); i != local_users.end(); ++i) + { + LocalUser* curr = *i; + + if (curr->quitting) + continue; + + if (curr->CommandFloodPenalty || curr->eh.getSendQSize()) + { + unsigned int rate = curr->MyClass->GetCommandRate(); + if (curr->CommandFloodPenalty > rate) + curr->CommandFloodPenalty -= rate; + else + curr->CommandFloodPenalty = 0; + curr->eh.OnDataReady(); + } + + switch (curr->registered) + { + case REG_ALL: + if (ServerInstance->Time() > curr->nping) + { + // This user didn't answer the last ping, remove them + if (!curr->lastping) + { + time_t time = ServerInstance->Time() - (curr->nping - curr->MyClass->GetPingTime()); + const std::string message = "Ping timeout: " + ConvToStr(time) + (time == 1 ? " seconds" : " second"); + this->QuitUser(curr, message); + continue; + } + + curr->Write("PING :" + ServerInstance->Config->ServerName); + curr->lastping = 0; + curr->nping = ServerInstance->Time() + curr->MyClass->GetPingTime(); + } + break; + case REG_NICKUSER: + if (AllModulesReportReady(curr)) + { + /* User has sent NICK/USER, modules are okay, DNS finished. */ + curr->FullConnect(); + continue; + } + break; + } + + if (curr->registered != REG_ALL && (ServerInstance->Time() > (curr->age + curr->MyClass->GetRegTimeout()))) + { + /* + * registration timeout -- didnt send USER/NICK/HOST + * in the time specified in their connection class. + */ + this->QuitUser(curr, "Registration timeout"); + continue; + } + } +}