summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/inspircd.h5
-rw-r--r--include/users.h4
-rw-r--r--src/modules/m_spanningtree/treesocket1.cpp3
-rw-r--r--src/users.cpp31
4 files changed, 16 insertions, 27 deletions
diff --git a/include/inspircd.h b/include/inspircd.h
index 99b709518..f5a558e6e 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -461,6 +461,11 @@ class CoreExport InspIRCd : public classbase
*/
user_hash* clientlist;
+ /** Client list stored by UUID. Contains all clients, and is updated
+ * automatically by the constructor and destructor of userrec.
+ */
+ user_hash* uuidlist;
+
/** Channel list, a hash_map containing all channels
*/
chan_hash* chanlist;
diff --git a/include/users.h b/include/users.h
index bcd67a65d..17bc9ca2a 100644
--- a/include/users.h
+++ b/include/users.h
@@ -661,8 +661,10 @@ class CoreExport userrec : public connection
/** Default constructor
* @throw Nothing at present
+ * @param Instance Creator instance
+ * @param uid User UUID, or empty to allocate one automatically
*/
- userrec(InspIRCd* Instance);
+ userrec(InspIRCd* Instance, const std::string &uid = "");
/** Returns the full displayed host of the user
* This member function returns the hostname of the user as seen by other users
diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp
index 4d94ed957..a0eb6ad7f 100644
--- a/src/modules/m_spanningtree/treesocket1.cpp
+++ b/src/modules/m_spanningtree/treesocket1.cpp
@@ -976,11 +976,10 @@ bool TreeSocket::ParseUID(const std::string &source, std::deque<std::string> &pa
tempnick = params[0].c_str();
}
- userrec* _new = new userrec(this->Instance);
+ userrec* _new = new userrec(this->Instance, params[0]);
(*(this->Instance->clientlist))[tempnick] = _new;
_new->SetFd(FD_MAGIC_NUMBER);
strlcpy(_new->nick, tempnick, NICKMAX - 1);
- strlcpy(_new->uuid, params[0].c_str(), UUID_LENGTH);
strlcpy(_new->host, params[3].c_str(),64);
strlcpy(_new->dhost, params[4].c_str(),64);
_new->server = this->Instance->FindServerNamePtr(source.c_str());
diff --git a/src/users.cpp b/src/users.cpp
index 1c1181689..99377a224 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -323,7 +323,7 @@ void userrec::DecrementModes()
}
}
-userrec::userrec(InspIRCd* Instance) : ServerInstance(Instance)
+userrec::userrec(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance)
{
*password = *nick = *ident = *host = *dhost = *fullname = *awaymsg = *oper = *uuid = 0;
server = (char*)Instance->FindServerNamePtr(Instance->Config->ServerName);
@@ -345,6 +345,8 @@ userrec::userrec(InspIRCd* Instance) : ServerInstance(Instance)
memset(snomasks,0,sizeof(snomasks));
/* Invalidate cache */
operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
+ if (!uid.empty())
+ strlcpy(uuid, uid.c_str(), UUID_LENGTH);
}
void userrec::RemoveCloneCounts()
@@ -858,10 +860,9 @@ void userrec::AddToWhoWas()
/* add a client connection to the sockets list */
void userrec::AddClient(InspIRCd* Instance, int socket, int port, bool iscached, int socketfamily, sockaddr* ip)
{
- std::string tempnick = Instance->GetUID();
+ userrec* New = new userrec(Instance);
- Instance->Log(DEBUG,"New client has UID %s ..", tempnick.c_str());
- user_hash::iterator iter = Instance->clientlist->find(tempnick);
+ user_hash::iterator iter = Instance->clientlist->find(New->uuid);
char ipaddr[MAXBUF];
#ifdef IPV6
if (socketfamily == AF_INET6)
@@ -874,27 +875,9 @@ void userrec::AddClient(InspIRCd* Instance, int socket, int port, bool iscached,
Instance->unregistered_count++;
- /*
- * fix by brain.
- * as these nicknames are 'RFC impossible', we can be sure nobody is going to be
- * using one as a registered connection. As they are per fd, we can also safely assume
- * that we wont have collisions. Therefore, if the nick exists in the list, its only
- * used by a dead socket, erase the iterator so that the new client may reclaim it.
- * this was probably the cause of 'server ignores me when i hammer it with reconnects'
- * issue in earlier alphas/betas
- */
- if (iter != Instance->clientlist->end())
- {
- userrec* goner = iter->second;
- DELETE(goner);
- Instance->clientlist->erase(iter);
- }
-
- New = new userrec(Instance);
- (*(Instance->clientlist))[tempnick] = New;
+ (*(Instance->clientlist))[user->uuid] = New;
New->fd = socket;
- strlcpy(New->nick, tempnick.c_str(), NICKMAX - 1);
- strlcpy(New->uuid, tempnick.c_str(), UUID_LENGTH);
+ strlcpy(New->nick, New->uuid, NICKMAX - 1);
New->server = Instance->FindServerNamePtr(Instance->Config->ServerName);
/* We don't need range checking here, we KNOW 'unknown\0' will fit into the ident field. */