diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-03-02 23:38:04 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2009-03-02 23:38:04 +0000 |
commit | b2688f6cdf45c70985754001edcc2b1916f5bcb4 (patch) | |
tree | ee56a249e5c7a1d442336d19cf675d9e7e4fcbfe /src/modules/m_spanningtree | |
parent | 4820e6bb9578e53ea1553070108599349d0ffbcb (diff) |
Revert "Don't apply channel modes received in an non-burst, non-creation FJOIN, because they could be out of date"
This keeps the protocol closer to TS6 behavior. The mode sync in the FJOIN is
used to resync channel modes after a desync caused by modes crossing on the
wire. In the future, an alternate join command will be used to prevent MODExJOIN
desync without rejecting modes from an FJOIN.
This reverts commit 4820e6bb9578e53ea1553070108599349d0ffbcb.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11163 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r-- | src/modules/m_spanningtree/fjoin.cpp | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/src/modules/m_spanningtree/fjoin.cpp b/src/modules/m_spanningtree/fjoin.cpp index e7ce0ac54..55c72c474 100644 --- a/src/modules/m_spanningtree/fjoin.cpp +++ b/src/modules/m_spanningtree/fjoin.cpp @@ -58,8 +58,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p std::string channel = params[0]; /* Channel name, as a string */ time_t TS = atoi(params[1].c_str()); /* Timestamp given to us for remote side */ irc::tokenstream users((params.size() > 3) ? params[params.size() - 1] : ""); /* users from the user list */ - bool apply_other_sides_umodes = true; /* True if we are accepting the other side's user umodes */ - bool apply_other_sides_cmodes = true; /* True if we are accepting the other side's channel modes */ + bool apply_other_sides_modes = true; /* True if we are accepting the other side's modes */ Channel* chan = this->ServerInstance->FindChan(channel); /* The channel we're sending joins to */ bool created = !chan; /* True if the channel doesnt exist here yet */ std::string item; /* One item in the list of nicks */ @@ -91,8 +90,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p if (ourTS < TS) { ServerInstance->SNO->WriteToSnoMask('d', "NOT Applying modes from other side"); - apply_other_sides_umodes = false; - apply_other_sides_cmodes = false; + apply_other_sides_modes = false; } else if (ourTS > TS) { @@ -106,23 +104,11 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p param_list.push_back(channel); this->RemoveStatus(ServerInstance->Config->GetSID(), param_list); } - else - { - /* Timestamp equal. Apply the user modes always */ - apply_other_sides_umodes = true; - /* - * If the server is bursting, then the channel modes need to be applied; - * it is expected that servers will resync modes at this time. Otherwise, - * the mode string sent along with the FJOIN could be out-of-date, and - * applying the mode change could cause modes to be unexpectedly bounced. - */ - TreeServer *s = Utils->FindServer(source); - apply_other_sides_cmodes = s->bursting; - } + // The silent case here is ourTS == TS, we don't need to remove modes here, just to merge them later on. } /* First up, apply their modes if they won the TS war */ - if (apply_other_sides_cmodes) + if (apply_other_sides_modes) { ServerInstance->SNO->WriteToSnoMask('d', "Applying remote modestring for %s", params[0].c_str()); unsigned int idx = 2; @@ -193,7 +179,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque<std::string> &p } /* Flush mode stacker if we lost the FJOIN or had equal TS */ - if (apply_other_sides_umodes) + if (apply_other_sides_modes) { std::deque<std::string> stackresult; std::vector<std::string> mode_junk; |