*/
#include "inspircd.h"
-#include "configreader.h"
-#include "channels.h"
-#include "users.h"
#include <stdarg.h>
#include "socketengine.h"
#include "wildcard.h"
/* Invalidate cache */
operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
- if (!uid.empty())
+ if (uid.empty())
strlcpy(uuid, Instance->GetUID().c_str(), UUID_LENGTH);
else
strlcpy(uuid, uid.c_str(), UUID_LENGTH);
+ ServerInstance->Log(DEBUG,"New UUID for user: %s (%s)", uuid, uid.empty() ? "allocated new" : "used remote");
+
user_hash::iterator finduuid = Instance->uuidlist->find(uuid);
- if (finduuid != Instance->uuidlist->end())
+ if (finduuid == Instance->uuidlist->end())
(*Instance->uuidlist)[uuid] = this;
else
throw CoreException("Duplicate UUID "+std::string(uuid)+" in userrec constructor");
// unset their oper type (what IS_OPER checks), and remove +o
*this->oper = 0;
this->modes[UM_OPERATOR] = 0;
-
- // remove them from the opers list.
- for (std::vector<userrec*>::iterator a = ServerInstance->all_opers.begin(); a < ServerInstance->all_opers.end(); a++)
- {
- if (*a == this)
- {
- ServerInstance->all_opers.erase(a);
- return;
- }
- }
+
+ // remove the user from the oper list. Will remove multiple entries as a safeguard against bug #404
+ ServerInstance->all_opers.remove(this);
}
}
/* NOTE: Calling this one parameter constructor for userrec automatically
* allocates a new UUID and places it in the hash_map.
*/
- userrec* New = new userrec(Instance);
+ userrec* New = NULL;
+ try
+ {
+ New = new userrec(Instance);
+ }
+ catch (...)
+ {
+ Instance->Log(DEFAULT,"*** WTF *** Duplicated UUID! -- Crack smoking monkies have been unleashed.");
+ Instance->WriteOpers("*** WARNING *** Duplicate UUID allocated!");
+ return;
+ }
+
int j = 0;
Instance->unregistered_count++;
try
{
- /* ServerInstance->Log(DEBUG,"C[%d] <- %s", this->GetFd(), text.c_str());
+ /* ServerInstance->Log(DEBUG,"C[%d] O %s", this->GetFd(), text.c_str());
* WARNING: The above debug line is VERY loud, do NOT
* enable it till we have a good way of filtering it
* out of the logs (e.g. 1.2 would be good).