summaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2014-07-22 20:15:44 +0200
committerAttila Molnar <attilamolnar@hush.com>2014-07-24 14:05:50 +0200
commit2190782c352af6a4f55ab01131f0cb68fe65e989 (patch)
tree14858b4e9a60cc18c24a784b1cbae333ca803f1f /src/modules/m_spanningtree
parentde78843144d40b991cefc652532c03dd8c56e5cc (diff)
m_spanningtree Always treat the remote client as the winner on nick collision if the nick is used by a (local) client that isn't fully registered
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r--src/modules/m_spanningtree/treesocket2.cpp2
-rw-r--r--src/modules/m_spanningtree/uid.cpp17
2 files changed, 15 insertions, 4 deletions
diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp
index a2ae1aad0..fb658c9c7 100644
--- a/src/modules/m_spanningtree/treesocket2.cpp
+++ b/src/modules/m_spanningtree/treesocket2.cpp
@@ -447,7 +447,7 @@ void TreeSocket::ProcessConnectedLine(std::string& prefix, std::string& command,
*/
bool callfnc = true;
User* x = ServerInstance->FindNickOnly(params[0]);
- if ((x) && (x != who))
+ if ((x) && (x != who) && (x->registered == REG_ALL))
{
int collideret = 0;
/* x is local, who is remote */
diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp
index f33cb038d..6620dd13a 100644
--- a/src/modules/m_spanningtree/uid.cpp
+++ b/src/modules/m_spanningtree/uid.cpp
@@ -57,14 +57,25 @@ CmdResult CommandUID::Handle(const parameterlist &params, User* serversrc)
TreeSocket* sock = remoteserver->GetRoute()->GetSocket();
/* check for collision */
- user_hash::iterator iter = ServerInstance->Users->clientlist->find(params[2]);
+ User* const collideswith = ServerInstance->FindNickOnly(params[2]);
- if (iter != ServerInstance->Users->clientlist->end())
+ if ((collideswith) && (collideswith->registered != REG_ALL))
+ {
+ // User that the incoming user is colliding with is not fully registered, we force nick change the
+ // unregistered user to their uuid and tell them what happened
+ collideswith->WriteFrom(collideswith, "NICK %s", collideswith->uuid.c_str());
+ collideswith->WriteNumeric(433, "%s %s :Nickname overruled.", collideswith->nick.c_str(), collideswith->nick.c_str());
+
+ // Clear the bit before calling User::ChangeNick() to make it NOT run the OnUserPostNick() hook
+ collideswith->registered &= ~REG_NICK;
+ collideswith->ChangeNick(collideswith->uuid, true);
+ }
+ else if (collideswith)
{
/*
* Nick collision.
*/
- int collide = sock->DoCollision(iter->second, age_t, params[5], params[6], params[0]);
+ int collide = sock->DoCollision(collideswith, age_t, params[5], params[6], params[0]);
ServerInstance->Logs->Log("m_spanningtree",DEBUG,"*** Collision on %s, collide=%d", params[2].c_str(), collide);
if (collide != 1)