diff options
-rw-r--r-- | include/channels.h | 13 | ||||
-rw-r--r-- | include/users.h | 22 | ||||
-rw-r--r-- | src/channels.cpp | 10 | ||||
-rw-r--r-- | src/inspircd.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_channames.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_messageflood.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_sakick.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_spanningtree/encap.cpp | 11 | ||||
-rw-r--r-- | src/modules/m_spanningtree/fjoin.cpp | 27 | ||||
-rw-r--r-- | src/modules/m_spanningtree/fmode.cpp | 28 | ||||
-rw-r--r-- | src/modules/m_spanningtree/main.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_spanningtree/postcommand.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treeserver.cpp | 13 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treeserver.h | 3 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket.h | 8 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket1.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket2.cpp | 10 | ||||
-rw-r--r-- | src/modules/m_spanningtree/uid.cpp | 4 | ||||
-rw-r--r-- | src/modules/m_spanningtree/utils.cpp | 6 | ||||
-rw-r--r-- | src/modules/m_spanningtree/utils.h | 3 | ||||
-rw-r--r-- | src/usermanager.cpp | 1 | ||||
-rw-r--r-- | src/users.cpp | 43 |
22 files changed, 83 insertions, 134 deletions
diff --git a/include/channels.h b/include/channels.h index 2915ed390..5207acfdd 100644 --- a/include/channels.h +++ b/include/channels.h @@ -229,26 +229,13 @@ class CoreExport Channel : public Extensible * @param src The source of the kick * @param user The user being kicked (must be on this channel) * @param reason The reason for the kick - * @return The number of users left on the channel. If this is zero - * when the method returns, you MUST delete the Channel immediately! */ void KickUser(User *src, User *user, const char* reason); - /** Make the server kick user from this channel with the given reason. - * @param user The user being kicked (must be on this channel) - * @param reason The reason for the kick - * @param triggerevents True if you wish this kick to trigger module events - * @return The number of users left on the channel. If this is zero - * when the method returns, you MUST delete the Channel immediately! - */ - void ServerKickUser(User* user, const char* reason, const std::string& servername = ""); - /** Part a user from this channel with the given reason. * If the reason field is NULL, no reason will be sent. * @param user The user who is parting (must be on this channel) * @param reason The part reason - * @return The number of users left on the channel. If this is zero - * when the method returns, you MUST delete the Channel immediately! */ void PartUser(User *user, std::string &reason); diff --git a/include/users.h b/include/users.h index 8fac0d108..5e75414a4 100644 --- a/include/users.h +++ b/include/users.h @@ -297,7 +297,7 @@ class CoreExport User : public StreamSocket /** The user's unique identifier. * This is the unique identifier which the user has across the network. */ - std::string uuid; + const std::string uuid; /** The users ident reply. * Two characters are added to the user-defined limit to compensate for the tilde etc. @@ -336,7 +336,7 @@ class CoreExport User : public StreamSocket /** The server the user is connected to. */ - std::string server; + const std::string server; /** The user's away message. * If this string is empty, the user is not marked as away. @@ -401,8 +401,9 @@ class CoreExport User : public StreamSocket * @throw CoreException if the UID allocated to the user already exists * @param Instance Creator instance * @param uid User UUID, or empty to allocate one automatically + * @param srv Server that this user is from */ - User(const std::string &uid); + User(const std::string &uid, const std::string& srv); /** Check if the user matches a G or K line, and disconnect them if they do. * @param doZline True if ZLines should be checked (if IP has changed since initial connect) @@ -415,7 +416,7 @@ class CoreExport User : public StreamSocket * on the server, in nick!ident&at;host form. * @return The full masked host of the user */ - virtual const std::string GetFullHost(); + virtual const std::string& GetFullHost(); /** Returns the full real host of the user * This member function returns the hostname of the user as seen by other users @@ -423,7 +424,7 @@ class CoreExport User : public StreamSocket * e.g. through a module, then this method will ignore it and return the true hostname. * @return The full real host of the user */ - virtual const std::string GetFullRealHost(); + virtual const std::string& GetFullRealHost(); /** This clears any cached results that are used for GetFullRealHost() etc. * The results of these calls are cached as generating them can be generally expensive. @@ -891,7 +892,7 @@ class CoreExport LocalUser : public User class CoreExport RemoteUser : public User { public: - RemoteUser(const std::string& uid) : User(uid) + RemoteUser(const std::string& uid, const std::string& srv) : User(uid, srv) { SetFd(FD_MAGIC_NUMBER); } @@ -901,15 +902,16 @@ class CoreExport RemoteUser : public User class CoreExport FakeUser : public User { public: - FakeUser(const std::string &uid) : User(uid) + FakeUser(const std::string &uid, const std::string& srv) : User(uid, srv) { SetFd(FD_FAKEUSER_NUMBER); + nick = srv; } + virtual CullResult cull(); virtual void SendText(const std::string& line); - virtual const std::string GetFullHost(); - virtual const std::string GetFullRealHost(); - void SetFakeServer(std::string name); + virtual const std::string& GetFullHost(); + virtual const std::string& GetFullRealHost(); }; /* Faster than dynamic_cast */ diff --git a/src/channels.cpp b/src/channels.cpp index a4c24b455..fd9861279 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -483,16 +483,6 @@ void Channel::PartUser(User *user, std::string &reason) this->DelUser(user); } -void Channel::ServerKickUser(User* user, const char* reason, const std::string& servername) -{ - if (servername.empty() || !ServerInstance->Config->HideWhoisServer.empty()) - ServerInstance->FakeClient->server = ServerInstance->Config->ServerName; - else - ServerInstance->FakeClient->server = servername; - - KickUser(ServerInstance->FakeClient, user, reason); -} - void Channel::KickUser(User *src, User *user, const char* reason) { if (!src || !user || !reason) diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 19f90dd97..58480668b 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -546,8 +546,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : } /* set up fake client again this time with the correct uid */ - this->FakeClient = new FakeUser("!"); - this->FakeClient->SetFakeServer(Config->ServerName); + this->FakeClient = new FakeUser(Config->sid, Config->ServerName); // Get XLine to do it's thing. this->XLines->CheckELines(); diff --git a/src/modules/m_channames.cpp b/src/modules/m_channames.cpp index c137d0e71..40746af2c 100644 --- a/src/modules/m_channames.cpp +++ b/src/modules/m_channames.cpp @@ -82,7 +82,7 @@ class ModuleChannelNames : public Module const UserMembList* users = c->GetUsers(); for(UserMembCIter j = users->begin(); j != users->end(); ++j) if (IS_LOCAL(j->first)) - c->ServerKickUser(j->first, "Channel name no longer valid", NULL); + c->KickUser(ServerInstance->FakeClient, j->first, "Channel name no longer valid"); } badchan = false; } diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp index b2f82777f..c39bc9807 100644 --- a/src/modules/m_messageflood.cpp +++ b/src/modules/m_messageflood.cpp @@ -232,7 +232,7 @@ class ModuleMsgFlood : public Module char kickmessage[MAXBUF]; snprintf(kickmessage, MAXBUF, "Channel flood triggered (limit is %d lines in %d secs)", f->lines, f->secs); - dest->ServerKickUser(user, kickmessage); + dest->KickUser(ServerInstance->FakeClient, user, kickmessage); return MOD_RES_DENY; } diff --git a/src/modules/m_sakick.cpp b/src/modules/m_sakick.cpp index b81df75c6..d6b6e965b 100644 --- a/src/modules/m_sakick.cpp +++ b/src/modules/m_sakick.cpp @@ -31,7 +31,6 @@ class CommandSakick : public Command User* dest = ServerInstance->FindNick(parameters[1]); Channel* channel = ServerInstance->FindChan(parameters[0]); const char* reason = ""; - const char* servername = NULL; if (dest && channel) { @@ -56,7 +55,7 @@ class CommandSakick : public Command */ if (IS_LOCAL(dest)) { - channel->ServerKickUser(dest, reason, servername); + channel->KickUser(ServerInstance->FakeClient, dest, reason); Channel *n = ServerInstance->FindChan(parameters[1]); if (n && n->HasUser(dest)) diff --git a/src/modules/m_spanningtree/encap.cpp b/src/modules/m_spanningtree/encap.cpp index 175257b0a..e854df2f4 100644 --- a/src/modules/m_spanningtree/encap.cpp +++ b/src/modules/m_spanningtree/encap.cpp @@ -23,16 +23,12 @@ /** ENCAP */ -bool TreeSocket::Encap(const std::string &prefix, parameterlist ¶ms) +void TreeSocket::Encap(User* who, parameterlist ¶ms) { if (params.size() > 1) { if (InspIRCd::Match(ServerInstance->Config->GetSID(), params[0])) { - User* who = ServerInstance->FindUUID(prefix); - if (!who) - who = Utils->ServerUser; - parameterlist plist(params.begin() + 2, params.end()); ServerInstance->CallCommandHandler(params[1].c_str(), plist, who); // discard return value, ENCAP shall succeed even if the command does not exist @@ -42,11 +38,10 @@ bool TreeSocket::Encap(const std::string &prefix, parameterlist ¶ms) if (params[0].find('*') != std::string::npos) { - Utils->DoOneToAllButSender(prefix, "ENCAP", params, prefix); + Utils->DoOneToAllButSender(who->server, "ENCAP", params, who->server); } else - Utils->DoOneToOne(prefix, "ENCAP", params, params[0]); + Utils->DoOneToOne(who->server, "ENCAP", params, params[0]); } - return true; } diff --git a/src/modules/m_spanningtree/fjoin.cpp b/src/modules/m_spanningtree/fjoin.cpp index 810cf23a5..6895fa051 100644 --- a/src/modules/m_spanningtree/fjoin.cpp +++ b/src/modules/m_spanningtree/fjoin.cpp @@ -22,7 +22,7 @@ /** FJOIN, almost identical to TS6 SJOIN, except for nicklist handling. */ -bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) +void TreeSocket::ForceJoin(User* srcuser, parameterlist ¶ms) { /* 1.1 FJOIN works as follows: * @@ -51,7 +51,7 @@ bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) * who succeed at internets. :-) */ if (params.size() < 3) - return true; + return; irc::modestacker modestack(true); /* Modes to apply from the users in the user list */ User* who = NULL; /* User we are currently checking */ @@ -66,13 +66,13 @@ bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) if (params.size() > 3) params[params.size() - 1] = ":" + params[params.size() - 1]; - Utils->DoOneToAllButSender(source,"FJOIN",params,source); + Utils->DoOneToAllButSender(srcuser->server,"FJOIN",params,srcuser->server); if (!TS) { ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"*** BUG? *** TS of 0 sent to FJOIN. Are some services authors smoking craq, or is it 1970 again?. Dropped."); - ServerInstance->SNO->WriteToSnoMask('d', "WARNING: The server %s is sending FJOIN with a TS of zero. Total craq. Command was dropped.", source.c_str()); - return true; + ServerInstance->SNO->WriteToSnoMask('d', "WARNING: The server %s is sending FJOIN with a TS of zero. Total craq. Command was dropped.", srcuser->server.c_str()); + return; } if (created) @@ -103,7 +103,7 @@ bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) ourTS = TS; chan->age = TS; param_list.push_back(channel); - this->RemoveStatus(ServerInstance->Config->GetSID(), param_list); + this->RemoveStatus(ServerInstance->FakeClient, param_list); } // The silent case here is ourTS == TS, we don't need to remove modes here, just to merge them later on. } @@ -123,7 +123,7 @@ bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) modelist.push_back(params[idx]); } - ServerInstance->SendMode(modelist, Utils->ServerUser); + ServerInstance->SendMode(modelist, srcuser); } /* Now, process every 'modes,nick' pair */ @@ -145,7 +145,7 @@ bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) else { this->SendError(std::string("Unknown status mode '")+(*unparsedmodes)+"' in FJOIN"); - return false; + return; } usr++; @@ -186,18 +186,16 @@ bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) while (modestack.GetStackedLine(stackresult)) { - ServerInstance->SendMode(stackresult, Utils->ServerUser); + ServerInstance->SendMode(stackresult, srcuser); stackresult.erase(stackresult.begin() + 1, stackresult.end()); } } - - return true; } -bool TreeSocket::RemoveStatus(const std::string &prefix, parameterlist ¶ms) +void TreeSocket::RemoveStatus(User* srcuser, parameterlist ¶ms) { if (params.size() < 1) - return true; + return; Channel* c = ServerInstance->FindChan(params[0]); @@ -221,10 +219,9 @@ bool TreeSocket::RemoveStatus(const std::string &prefix, parameterlist ¶ms) while (stack.GetStackedLine(stackresult)) { - ServerInstance->SendMode(stackresult, Utils->ServerUser); + ServerInstance->SendMode(stackresult, srcuser); stackresult.erase(stackresult.begin() + 1, stackresult.end()); } } - return true; } diff --git a/src/modules/m_spanningtree/fmode.cpp b/src/modules/m_spanningtree/fmode.cpp index 3bca098d6..4dd05b101 100644 --- a/src/modules/m_spanningtree/fmode.cpp +++ b/src/modules/m_spanningtree/fmode.cpp @@ -22,30 +22,17 @@ /** FMODE command - server mode with timestamp checks */ -bool TreeSocket::ForceMode(const std::string &source, parameterlist ¶ms) +void TreeSocket::ForceMode(User* who, parameterlist ¶ms) { /* Chances are this is a 1.0 FMODE without TS */ if (params.size() < 3) { /* No modes were in the command, probably a channel with no modes set on it */ - return true; + return; } - std::string sourceserv; + std::string sourceserv = who->server; - /* Are we dealing with an FMODE from a user, or from a server? */ - User* who = ServerInstance->FindNick(source); - if (who) - { - /* FMODE from a user, set sourceserv to the users server name */ - sourceserv = who->server; - } - else - { - /* FMODE from a server, use a fake user to receive mode feedback */ - who = Utils->ServerUser; - sourceserv = source; /* Set sourceserv to the actual source string */ - } std::vector<std::string> modelist; time_t TS = 0; for (unsigned int q = 0; (q < params.size()) && (q < 64); q++) @@ -83,28 +70,27 @@ bool TreeSocket::ForceMode(const std::string &source, parameterlist ¶ms) } else /* Oops, channel doesnt exist! */ - return true; + return; } if (!TS) { ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"*** BUG? *** TS of 0 sent to FMODE. Are some services authors smoking craq, or is it 1970 again?. Dropped."); ServerInstance->SNO->WriteToSnoMask('d', "WARNING: The server %s is sending FMODE with a TS of zero. Total craq. Mode was dropped.", sourceserv.c_str()); - return true; + return; } /* TS is equal or less: Merge the mode changes into ours and pass on. */ if (TS <= ourTS) { - ServerInstance->Modes->Process(modelist, who, (who == Utils->ServerUser)); + ServerInstance->Modes->Process(modelist, who, IS_SERVER(who)); /* HOT POTATO! PASS IT ON! */ - Utils->DoOneToAllButSender(source,"FMODE",params,sourceserv); + Utils->DoOneToAllButSender(sourceserv,"FMODE",params,sourceserv); } /* If the TS is greater than ours, we drop the mode and dont pass it anywhere. */ - return true; } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 624049357..d14f0ebe4 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -731,7 +731,7 @@ void ModuleSpanningTree::OnUserKick(User* source, Membership* memb, const std::s { Utils->DoOneToMany(source->uuid,"KICK",params); } - else if (IS_SERVER(source) && source != Utils->ServerUser) + else if (source == ServerInstance->FakeClient) { Utils->DoOneToMany(ServerInstance->Config->GetSID(),"KICK",params); } diff --git a/src/modules/m_spanningtree/postcommand.cpp b/src/modules/m_spanningtree/postcommand.cpp index 84ca342ec..c382bc874 100644 --- a/src/modules/m_spanningtree/postcommand.cpp +++ b/src/modules/m_spanningtree/postcommand.cpp @@ -52,7 +52,7 @@ void SpanningTreeUtilities::RouteCommand(TreeServer* origin, const std::string & routing = ROUTE_BROADCAST; else return; - if (user == ServerUser) + if (IS_SERVER(user) && user != ServerInstance->FakeClient) return; } else if (routing.type == ROUTE_TYPE_OPT_BCAST) diff --git a/src/modules/m_spanningtree/treeserver.cpp b/src/modules/m_spanningtree/treeserver.cpp index 5c7162094..38d91f54c 100644 --- a/src/modules/m_spanningtree/treeserver.cpp +++ b/src/modules/m_spanningtree/treeserver.cpp @@ -27,7 +27,7 @@ * no socket associated with it. Its version string is our own local version. */ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::string Desc, const std::string &id) - : ServerName(Name.c_str()), ServerDesc(Desc), Utils(Util) + : ServerName(Name.c_str()), ServerDesc(Desc), Utils(Util), ServerUser(ServerInstance->FakeClient) { age = ServerInstance->Time(); bursting = false; @@ -48,7 +48,7 @@ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::strin * its ping counters so that it will be pinged one minute from now. */ TreeServer::TreeServer(SpanningTreeUtilities* Util, std::string Name, std::string Desc, const std::string &id, TreeServer* Above, TreeSocket* Sock, bool Hide) - : Parent(Above), ServerName(Name.c_str()), ServerDesc(Desc), Socket(Sock), Utils(Util), Hidden(Hide) + : Parent(Above), ServerName(Name.c_str()), ServerDesc(Desc), Socket(Sock), Utils(Util), ServerUser(new FakeUser(id, Name)), Hidden(Hide) { age = ServerInstance->Time(); bursting = true; @@ -350,10 +350,19 @@ bool TreeServer::Tidy() return true; } +CullResult TreeServer::cull() +{ + if (ServerUser != ServerInstance->FakeClient) + ServerUser->cull(); + return classbase::cull(); +} + TreeServer::~TreeServer() { /* We'd better tidy up after ourselves, eh? */ this->DelHashEntry(); + if (ServerUser != ServerInstance->FakeClient) + delete ServerUser; server_hash::iterator iter = Utils->sidlist.find(GetID()); if (iter != Utils->sidlist.end()) diff --git a/src/modules/m_spanningtree/treeserver.h b/src/modules/m_spanningtree/treeserver.h index 24f9c0499..353cc00ad 100644 --- a/src/modules/m_spanningtree/treeserver.h +++ b/src/modules/m_spanningtree/treeserver.h @@ -51,6 +51,7 @@ class TreeServer : public classbase void SetID(const std::string &id); public: + FakeUser* const ServerUser; /* User representing this server */ time_t age; bool Warned; /* True if we've warned opers about high latency on this server */ @@ -194,10 +195,10 @@ class TreeServer : public classbase /** Recursive call for child servers */ void FinishBurstInternal(); + CullResult cull(); /** Destructor */ ~TreeServer(); - }; #endif diff --git a/src/modules/m_spanningtree/treesocket.h b/src/modules/m_spanningtree/treesocket.h index 8359ebf37..34390f9d0 100644 --- a/src/modules/m_spanningtree/treesocket.h +++ b/src/modules/m_spanningtree/treesocket.h @@ -210,13 +210,13 @@ class TreeSocket : public BufferedSocket void Squit(TreeServer* Current, const std::string &reason); /** FMODE command - server mode with timestamp checks */ - bool ForceMode(const std::string &source, parameterlist ¶ms); + void ForceMode(User* who, parameterlist ¶ms); /** FTOPIC command */ bool ForceTopic(const std::string &source, parameterlist ¶ms); /** FJOIN, similar to TS6 SJOIN, but not quite. */ - bool ForceJoin(const std::string &source, parameterlist ¶ms); + void ForceJoin(User* who, parameterlist ¶ms); /* Used on nick collision ... XXX ugly function HACK */ int DoCollision(User *u, time_t remotets, const std::string &remoteident, const std::string &remoteip, const std::string &remoteuid); @@ -284,7 +284,7 @@ class TreeSocket : public BufferedSocket /** ENCAP command */ - bool Encap(const std::string &prefix, parameterlist ¶ms); + void Encap(User* who, parameterlist ¶ms); /** OPERQUIT command */ @@ -352,7 +352,7 @@ class TreeSocket : public BufferedSocket /** Remove all modes from a channel, including statusmodes (+qaovh etc), simplemodes, parameter modes. * This does not update the timestamp of the target channel, this must be done seperately. */ - bool RemoveStatus(const std::string &prefix, parameterlist ¶ms); + void RemoveStatus(User* source, parameterlist ¶ms); /** <- (remote) <- SERVER */ diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 8ef81173d..9d3de187d 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -214,6 +214,7 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason) SquitServer(from, Current); Current->Tidy(); Current->GetParent()->DelChild(Current); + Current->cull(); delete Current; if (LocalSquit) ServerInstance->SNO->WriteToSnoMask('l', "Netsplit complete, lost \002%d\002 user%s on \002%d\002 server%s.", num_lost_users, num_lost_users != 1 ? "s" : "", num_lost_servers, num_lost_servers != 1 ? "s" : ""); diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp index 4d2c3cd14..0023579fa 100644 --- a/src/modules/m_spanningtree/treesocket2.cpp +++ b/src/modules/m_spanningtree/treesocket2.cpp @@ -242,9 +242,7 @@ void TreeSocket::ProcessConnectedLine(std::string& prefix, std::string& command, if (ServerSource) { - who = Utils->ServerUser; - Utils->ServerUser->SetFakeServer(ServerSource->GetName()); - Utils->ServerUser->uuid = ServerSource->GetID(); + who = ServerSource->ServerUser; direction = prefix; } else @@ -301,7 +299,7 @@ void TreeSocket::ProcessConnectedLine(std::string& prefix, std::string& command, } else if (command == "FJOIN") { - this->ForceJoin(prefix,params); + this->ForceJoin(who,params); } else if (command == "STATS") { @@ -337,7 +335,7 @@ void TreeSocket::ProcessConnectedLine(std::string& prefix, std::string& command, } else if (command == "FMODE") { - this->ForceMode(prefix,params); + this->ForceMode(who,params); } else if (command == "FTOPIC") { @@ -467,7 +465,7 @@ void TreeSocket::ProcessConnectedLine(std::string& prefix, std::string& command, } else if (command == "ENCAP") { - this->Encap(prefix, params); + this->Encap(who, params); } else if (command == "NICK") { diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp index 340b7f496..24691c3ca 100644 --- a/src/modules/m_spanningtree/uid.cpp +++ b/src/modules/m_spanningtree/uid.cpp @@ -86,7 +86,7 @@ bool TreeSocket::ParseUID(const std::string &source, parameterlist ¶ms) User* _new = NULL; try { - _new = new RemoteUser(params[0]); + _new = new RemoteUser(params[0], remoteserver->GetName()); } catch (...) { @@ -94,11 +94,9 @@ bool TreeSocket::ParseUID(const std::string &source, parameterlist ¶ms) return false; } (*(ServerInstance->Users->clientlist))[params[2]] = _new; - _new->SetFd(FD_MAGIC_NUMBER); _new->nick.assign(params[2], 0, MAXBUF); _new->host.assign(params[3], 0, 64); _new->dhost.assign(params[4], 0, 64); - _new->server = remoteserver->GetName(); _new->ident.assign(params[5], 0, MAXBUF); _new->fullname.assign(params[params.size() - 1], 0, MAXBUF); _new->registered = REG_ALL; diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp index e5012dcba..723ff9352 100644 --- a/src/modules/m_spanningtree/utils.cpp +++ b/src/modules/m_spanningtree/utils.cpp @@ -147,8 +147,6 @@ SpanningTreeUtilities::SpanningTreeUtilities(ModuleSpanningTree* C) : Creator(C) ServerInstance->Logs->Log("m_spanningtree",DEBUG,"***** Using SID for hash: %s *****", ServerInstance->Config->GetSID().c_str()); this->TreeRoot = new TreeServer(this, ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc, ServerInstance->Config->GetSID()); - ServerUser = new FakeUser(TreeRoot->GetID()); - this->ReadConfiguration(); } @@ -170,10 +168,8 @@ CullResult SpanningTreeUtilities::cull() TreeSocket* s = i->first; ServerInstance->GlobalCulls.AddItem(s); } + TreeRoot->cull(); - ServerUser->uuid = TreeRoot->GetID(); - ServerUser->cull(); - delete ServerUser; return classbase::cull(); } diff --git a/src/modules/m_spanningtree/utils.h b/src/modules/m_spanningtree/utils.h index 507cb3c7d..63400563f 100644 --- a/src/modules/m_spanningtree/utils.h +++ b/src/modules/m_spanningtree/utils.h @@ -74,9 +74,6 @@ class SpanningTreeUtilities : public classbase /** This variable represents the root of the server tree */ TreeServer *TreeRoot; - /** Represents the server whose command we are processing - */ - FakeUser *ServerUser; /** IPs allowed to link to us */ std::vector<std::string> ValidIPs; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 511037596..577d52f67 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -63,7 +63,6 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs /* The users default nick is their UUID */ New->nick.assign(New->uuid, 0, ServerInstance->Config->Limits.NickMax); - New->server = ServerInstance->Config->ServerName; New->ident.assign("unknown"); New->registered = REG_NONE; diff --git a/src/users.cpp b/src/users.cpp index 170b0c7ec..36b41fb18 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -221,14 +221,14 @@ void User::DecrementModes() } } -User::User(const std::string &uid) +User::User(const std::string &uid, const std::string& sid) + : uuid(uid), server(sid) { - server = ServerInstance->Config->ServerName; age = ServerInstance->Time(); - signon = idle_lastmsg = registered = 0; + signon = idle_lastmsg = 0; + registered = 0; quietquit = quitting = exempt = dns_done = false; fd = -1; - uuid = uid; client_sa.sa.sa_family = AF_UNSPEC; ServerInstance->Logs->Log("USERS", DEBUG, "New UUID for user: %s", uuid.c_str()); @@ -240,7 +240,7 @@ User::User(const std::string &uid) throw CoreException("Duplicate UUID "+std::string(uuid)+" in User constructor"); } -LocalUser::LocalUser() : User(ServerInstance->GetUID()) +LocalUser::LocalUser() : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName) { bytes_in = bytes_out = cmds_in = cmds_out = 0; server_sa.sa.sa_family = AF_UNSPEC; @@ -250,7 +250,7 @@ LocalUser::LocalUser() : User(ServerInstance->GetUID()) User::~User() { - if (uuid.length()) + if (ServerInstance->Users->uuidlist->find(uuid) != ServerInstance->Users->uuidlist->end()) ServerInstance->Logs->Log("USERS", ERROR, "User destructor for %s called without cull", uuid.c_str()); } @@ -294,7 +294,7 @@ const std::string& User::MakeHostIP() return this->cached_hostip; } -const std::string User::GetFullHost() +const std::string& User::GetFullHost() { if (!this->cached_fullhost.empty()) return this->cached_fullhost; @@ -328,7 +328,7 @@ char* User::MakeWildHost() return nresult; } -const std::string User::GetFullRealHost() +const std::string& User::GetFullRealHost() { if (!this->cached_fullrealhost.empty()) return this->cached_fullrealhost; @@ -584,11 +584,6 @@ CullResult User::cull() { if (!quitting) ServerInstance->Users->QuitUser(this, "Culled without QuitUser"); - if (uuid.empty()) - { - ServerInstance->Logs->Log("USERS", DEBUG, "User culled twice? UUID empty"); - return Extensible::cull(); - } PurgeEmptyChannels(); if (IS_LOCAL(this) && fd != INT_MAX) Close(); @@ -597,7 +592,6 @@ CullResult User::cull() this->DecrementModes(); ServerInstance->Users->uuidlist->erase(uuid); - uuid.clear(); return Extensible::cull(); } @@ -614,6 +608,13 @@ CullResult LocalUser::cull() return User::cull(); } +CullResult FakeUser::cull() +{ + // Fake users don't quit, they just get culled. + quitting = true; + return User::cull(); +} + void User::Oper(OperInfo* info) { if (this->IsModeSet('o')) @@ -1670,24 +1671,18 @@ void User::ShowRULES() this->WriteNumeric(RPL_RULESEND, "%s :End of RULES command.",this->nick.c_str()); } -void FakeUser::SetFakeServer(std::string name) -{ - this->nick = name; - this->server = name; -} - -const std::string FakeUser::GetFullHost() +const std::string& FakeUser::GetFullHost() { if (!ServerInstance->Config->HideWhoisServer.empty()) return ServerInstance->Config->HideWhoisServer; - return nick; + return server; } -const std::string FakeUser::GetFullRealHost() +const std::string& FakeUser::GetFullRealHost() { if (!ServerInstance->Config->HideWhoisServer.empty()) return ServerInstance->Config->HideWhoisServer; - return nick; + return server; } ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask) |