summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)