X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusers.cpp;h=b361205da7aa1053fc0ca50288d4111c94f6fea7;hb=05b111d6a245725c81a314794fb95e8375fb6720;hp=cd5aa247ec23bd399f25dfa9ecabf7941f113d8d;hpb=6e85701ecb09604f2c87010683638ec0446cc515;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/users.cpp b/src/users.cpp index cd5aa247e..b361205da 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -25,6 +25,8 @@ unsigned long uniq_id = 1; static unsigned long* already_sent = NULL; +LocalIntExt User::NICKForced("NICKForced", NULL); +LocalStringExt User::OperQuit("OperQuit", NULL); void InitializeAlreadySent(SocketEngine* SE) { @@ -32,7 +34,6 @@ void InitializeAlreadySent(SocketEngine* SE) memset(already_sent, 0, SE->GetMaxFds() * sizeof(unsigned long)); } - std::string User::ProcessNoticeMasks(const char *sm) { bool adding = true, oldadding = false; @@ -108,9 +109,9 @@ void User::StartDNSLookup() UserResolver *res_reverse; QueryType resolvtype = this->client_sa.sa.sa_family == AF_INET6 ? DNS_QUERY_PTR6 : DNS_QUERY_PTR4; - res_reverse = new UserResolver(this->ServerInstance, this, sip, resolvtype, cached); + res_reverse = new UserResolver(ServerInstance, this, sip, resolvtype, cached); - this->ServerInstance->AddResolver(res_reverse, cached); + ServerInstance->AddResolver(res_reverse, cached); } catch (CoreException& e) { @@ -204,7 +205,7 @@ void User::DecrementModes() } } -User::User(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance) +User::User(InspIRCd* Instance, const std::string &uid) { server = Instance->FindServerNamePtr(Instance->Config->ServerName); age = ServerInstance->Time(); @@ -217,7 +218,6 @@ User::User(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance client_sa.sa.sa_family = AF_UNSPEC; recvq.clear(); sendq.clear(); - Visibility = NULL; MyClass = NULL; AllowedPrivs = AllowedOperCommands = NULL; chans.clear(); @@ -716,7 +716,7 @@ void User::FlushWriteBuf() this->bytes_out += n_sent; this->cmds_out++; if (n_sent != old_sendq_length) - this->ServerInstance->SE->WantWrite(this); + ServerInstance->SE->WantWrite(this); } } @@ -787,7 +787,7 @@ void User::Oper(const std::string &opertype, const std::string &opername) this->AllowedPrivs->insert(mypriv); } - for (unsigned char* c = (unsigned char*)iter_operclass->second.umodelist; *c; ++c) + for (unsigned char* c = (unsigned char*)iter_operclass->second.umodelist.c_str(); *c; ++c) { if (*c == '*') { @@ -799,7 +799,7 @@ void User::Oper(const std::string &opertype, const std::string &opername) } } - for (unsigned char* c = (unsigned char*)iter_operclass->second.cmodelist; *c; ++c) + for (unsigned char* c = (unsigned char*)iter_operclass->second.cmodelist.c_str(); *c; ++c) { if (*c == '*') { @@ -870,12 +870,12 @@ void User::UnOper() /* adds or updates an entry in the whowas list */ void User::AddToWhoWas() { - Command* whowas_command = ServerInstance->Parser->GetHandler("WHOWAS"); - if (whowas_command) + Module* whowas = ServerInstance->Modules->Find("cmd_whowas.so"); + if (whowas) { - std::deque params; - params.push_back(this); - whowas_command->HandleInternal(WHOWAS_ADD, params); + WhowasRequest req(NULL, whowas, WhowasRequest::WHOWAS_ADD); + req.user = this; + req.Send(); } } @@ -955,9 +955,9 @@ void User::FullConnect() this->WriteServ("NOTICE Auth :Welcome to \002%s\002!",ServerInstance->Config->Network); this->WriteNumeric(RPL_WELCOME, "%s :Welcome to the %s IRC Network %s!%s@%s",this->nick.c_str(), ServerInstance->Config->Network, this->nick.c_str(), this->ident.c_str(), this->host.c_str()); - this->WriteNumeric(RPL_YOURHOSTIS, "%s :Your host is %s, running version InspIRCd-1.2",this->nick.c_str(),ServerInstance->Config->ServerName); + this->WriteNumeric(RPL_YOURHOSTIS, "%s :Your host is %s, running version InspIRCd-2.0",this->nick.c_str(),ServerInstance->Config->ServerName); this->WriteNumeric(RPL_SERVERCREATED, "%s :This server was created %s %s", this->nick.c_str(), __TIME__, __DATE__); - this->WriteNumeric(RPL_SERVERVERSION, "%s %s InspIRCd-1.2 %s %s %s", this->nick.c_str(), ServerInstance->Config->ServerName, ServerInstance->Modes->UserModeList().c_str(), ServerInstance->Modes->ChannelModeList().c_str(), ServerInstance->Modes->ParaModeList().c_str()); + this->WriteNumeric(RPL_SERVERVERSION, "%s %s InspIRCd-2.0 %s %s %s", this->nick.c_str(), ServerInstance->Config->ServerName, ServerInstance->Modes->UserModeList().c_str(), ServerInstance->Modes->ChannelModeList().c_str(), ServerInstance->Modes->ParaModeList().c_str()); ServerInstance->Config->Send005(this); this->WriteNumeric(RPL_YOURUUID, "%s %s :your unique ID", this->nick.c_str(), this->uuid.c_str()); @@ -970,10 +970,10 @@ void User::FullConnect() ServerInstance->Users->unregistered_count--; /* Trigger LUSERS output, give modules a chance too */ - int MOD_RESULT = 0; + ModResult MOD_RESULT; std::string command("LUSERS"); std::vector parameters; - FOREACH_RESULT(I_OnPreCommand, OnPreCommand(command, parameters, this, true, "LUSERS")); + FIRST_MOD_RESULT(ServerInstance, OnPreCommand, MOD_RESULT, (command, parameters, this, true, "LUSERS")); if (!MOD_RESULT) ServerInstance->CallCommandHandler(command, parameters, this); @@ -1025,17 +1025,15 @@ void User::InvalidateCache() bool User::ForceNickChange(const char* newnick) { - int MOD_RESULT = 0; + ModResult MOD_RESULT; this->InvalidateCache(); - this->Extend("NICKForced", "Enabled"); - - FOREACH_RESULT(I_OnUserPreNick,OnUserPreNick(this, newnick)); + NICKForced.set(this, 1); + FIRST_MOD_RESULT(ServerInstance, OnUserPreNick, MOD_RESULT, (this, newnick)); + NICKForced.set(this, 0); - this->Shrink("NICKForced"); - - if (MOD_RESULT) + if (MOD_RESULT == MOD_RES_DENY) { ServerInstance->stats->statsCollisions++; return false; @@ -1046,12 +1044,10 @@ bool User::ForceNickChange(const char* newnick) if (nickhandler) // wtfbbq, when would this not be here { std::vector parameters; - nickhandler->HandleInternal(1, dummy); parameters.push_back(newnick); - this->Extend("NICKForced", "Enabled"); + NICKForced.set(this, 1); bool result = (ServerInstance->Parser->CallHandler("NICK", parameters, this) == CMD_SUCCESS); - this->Shrink("NICKForced"); - nickhandler->HandleInternal(0, dummy); + NICKForced.set(this, 0); return result; } @@ -1223,7 +1219,7 @@ void User::Write(const std::string& text) this->AddWriteBuf("\r\n"); } ServerInstance->stats->statsSent += text.length() + 2; - this->ServerInstance->SE->WantWrite(this); + ServerInstance->SE->WantWrite(this); } /** Write() @@ -1276,11 +1272,11 @@ void User::WriteNumeric(unsigned int numeric, const char* text, ...) void User::WriteNumeric(unsigned int numeric, const std::string &text) { char textbuffer[MAXBUF]; - int MOD_RESULT = 0; + ModResult MOD_RESULT; - FOREACH_RESULT(I_OnNumeric, OnNumeric(this, numeric, text)); + FIRST_MOD_RESULT(ServerInstance, OnNumeric, MOD_RESULT, (this, numeric, text)); - if (MOD_RESULT) + if (MOD_RESULT == MOD_RES_DENY) return; snprintf(textbuffer,MAXBUF,":%s %03u %s",ServerInstance->Config->ServerName, numeric, text.c_str()); @@ -1366,8 +1362,8 @@ void User::WriteCommon(const std::string &text) for (UCListIter v = this->chans.begin(); v != this->chans.end(); v++) { - CUList* ulist = v->first->GetUsers(); - for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + const UserMembList* ulist = (*v)->GetUsers(); + for (UserMembList::const_iterator i = ulist->begin(); i != ulist->end(); i++) { if ((IS_LOCAL(i->first)) && (already_sent[i->first->fd] != uniq_id)) { @@ -1425,8 +1421,8 @@ void User::WriteCommonQuit(const std::string &normal_text, const std::string &op for (UCListIter v = this->chans.begin(); v != this->chans.end(); v++) { - CUList *ulist = v->first->GetUsers(); - for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + const UserMembList* ulist = (*v)->GetUsers(); + for (UserMembList::const_iterator i = ulist->begin(); i != ulist->end(); i++) { if (this != i->first) { @@ -1458,8 +1454,8 @@ void User::WriteCommonExcept(const std::string &text) for (UCListIter v = this->chans.begin(); v != this->chans.end(); v++) { - CUList *ulist = v->first->GetUsers(); - for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + const UserMembList* ulist = (*v)->GetUsers(); + for (UserMembList::const_iterator i = ulist->begin(); i != ulist->end(); i++) { if (this != i->first) { @@ -1525,7 +1521,7 @@ bool User::SharesChannelWith(User *other) /* Eliminate the inner loop (which used to be ~equal in size to the outer loop) * by replacing it with a map::find which *should* be more efficient */ - if (i->first->HasUser(other)) + if ((*i)->HasUser(other)) return true; } return false; @@ -1538,9 +1534,9 @@ bool User::ChangeName(const char* gecos) if (IS_LOCAL(this)) { - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnChangeLocalUserGECOS,OnChangeLocalUserGECOS(this,gecos)); - if (MOD_RESULT) + ModResult MOD_RESULT; + FIRST_MOD_RESULT(ServerInstance, OnChangeLocalUserGECOS, MOD_RESULT, (this,gecos)); + if (MOD_RESULT == MOD_RES_DENY) return false; FOREACH_MOD(I_OnChangeName,OnChangeName(this,gecos)); } @@ -1553,10 +1549,12 @@ void User::DoHostCycle(const std::string &quitline) { char buffer[MAXBUF]; - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnHostCycle, OnHostCycle(this)); + ModResult result = MOD_RES_PASSTHRU; + FIRST_MOD_RESULT(ServerInstance, OnHostCycle, result, (this)); - if (!ServerInstance->Config->CycleHosts || MOD_RESULT) + if (result == MOD_RES_DENY) + return; + if (result == MOD_RES_PASSTHRU && !ServerInstance->Config->CycleHosts) return; uniq_id++; @@ -1566,18 +1564,18 @@ void User::DoHostCycle(const std::string &quitline) for (UCListIter v = this->chans.begin(); v != this->chans.end(); v++) { - Channel* c = v->first; + Channel* c = *v; snprintf(buffer, MAXBUF, ":%s JOIN %s", GetFullHost().c_str(), c->name.c_str()); std::string joinline(buffer); - std::string modeline = this->ServerInstance->Modes->ModeString(this, c); + std::string modeline = ServerInstance->Modes->ModeString(this, c); if (modeline.length() > 0) { snprintf(buffer, MAXBUF, ":%s MODE %s +%s", GetFullHost().c_str(), c->name.c_str(), modeline.c_str()); modeline = buffer; } - CUList *ulist = c->GetUsers(); - for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + const UserMembList *ulist = c->GetUsers(); + for (UserMembList::const_iterator i = ulist->begin(); i != ulist->end(); i++) { User* u = i->first; if (u == this || !IS_LOCAL(u)) @@ -1602,9 +1600,9 @@ bool User::ChangeDisplayedHost(const char* shost) if (IS_LOCAL(this)) { - int MOD_RESULT = 0; - FOREACH_RESULT(I_OnChangeLocalUserHost,OnChangeLocalUserHost(this,shost)); - if (MOD_RESULT) + ModResult MOD_RESULT; + FIRST_MOD_RESULT(ServerInstance, OnChangeLocalUserHost, MOD_RESULT, (this,shost)); + if (MOD_RESULT == MOD_RES_DENY) return false; } @@ -1630,6 +1628,8 @@ bool User::ChangeIdent(const char* newident) if (this->ident == newident) return true; + FOREACH_MOD(I_OnChangeIdent, OnChangeIdent(this,newident)); + std::string quitstr = ":" + GetFullHost() + " QUIT :Changing ident"; this->ident.assign(newident, 0, ServerInstance->Config->Limits.IdentMax + 1); @@ -1667,13 +1667,14 @@ std::string User::ChannelList(User* source) for (UCListIter i = this->chans.begin(); i != this->chans.end(); i++) { + Channel* c = *i; /* If the target is the same as the sender, let them see all their channels. * If the channel is NOT private/secret OR the user shares a common channel * If the user is an oper, and the option is set. */ - if ((source == this) || (IS_OPER(source) && ServerInstance->Config->OperSpyWhois) || (((!i->first->IsModeSet('p')) && (!i->first->IsModeSet('s'))) || (i->first->HasUser(source)))) + if ((source == this) || (IS_OPER(source) && ServerInstance->Config->OperSpyWhois) || (((!c->IsModeSet('p')) && (!c->IsModeSet('s'))) || (c->HasUser(source)))) { - list.append(i->first->GetPrefixChar(this)).append(i->first->name).append(" "); + list.append(c->GetPrefixChar(this)).append(c->name).append(" "); } } @@ -1839,13 +1840,14 @@ void User::PurgeEmptyChannels() // firstly decrement the count on each channel for (UCListIter f = this->chans.begin(); f != this->chans.end(); f++) { - f->first->RemoveAllPrefixes(this); - if (f->first->DelUser(this) == 0) + Channel* c = *f; + c->RemoveAllPrefixes(this); + if (c->DelUser(this) == 0) { /* No users left in here, mark it for deletion */ try { - to_delete.push_back(f->first); + to_delete.push_back(c); } catch (...) { @@ -1860,9 +1862,9 @@ void User::PurgeEmptyChannels() chan_hash::iterator i2 = ServerInstance->chanlist->find(thischan->name); if (i2 != ServerInstance->chanlist->end()) { - int MOD_RESULT = 0; - FOREACH_RESULT_I(ServerInstance,I_OnChannelPreDelete, OnChannelPreDelete(i2->second)); - if (MOD_RESULT == 1) + ModResult MOD_RESULT; + FIRST_MOD_RESULT(ServerInstance, OnChannelPreDelete, MOD_RESULT, (i2->second)); + if (MOD_RESULT == MOD_RES_DENY) continue; // delete halted by module FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(i2->second)); delete i2->second; @@ -1924,16 +1926,6 @@ void User::HandleEvent(EventType et, int errornum) } } -void User::SetOperQuit(const std::string &oquit) -{ - operquitmsg = oquit; -} - -const std::string& User::GetOperQuit() -{ - return operquitmsg; -} - void User::IncreasePenalty(int increase) { this->Penalty += increase; @@ -1964,20 +1956,6 @@ const std::string FakeUser::GetFullRealHost() return nick; } -VisData::VisData() -{ -} - -VisData::~VisData() -{ -} - -bool VisData::VisibleTo(User* user) -{ - return true; -} - - ConnectClass::ConnectClass(char t, const std::string& mask) : type(t), name("unnamed"), registration_timeout(0), host(mask), pingtime(0), pass(""), hash(""), sendqmax(0), recvqmax(0), maxlocal(0), maxglobal(0), maxchans(0), port(0), limit(0), RefCount(1) {