diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd_nick.cpp | 13 | ||||
-rw-r--r-- | src/helperfuncs.cpp | 22 | ||||
-rw-r--r-- | src/users.cpp | 4 |
3 files changed, 33 insertions, 6 deletions
diff --git a/src/cmd_nick.cpp b/src/cmd_nick.cpp index 06c1c8766..c1638469e 100644 --- a/src/cmd_nick.cpp +++ b/src/cmd_nick.cpp @@ -76,7 +76,8 @@ CmdResult cmd_nick::Handle (const char** parameters, int pcnt, userrec *user) * the nickname too, we force a nickchange on the older user (Simply the one who was * here first, no TS checks need to take place here) */ - userrec* InUse = ServerInstance->FindNick(parameters[0]); + userrec* InUse = ServerInstance->FindNickOnly(parameters[0]); + ServerInstance->Log(DEBUG,"Nick in use"); if (InUse && (InUse != user) && ((ServerInstance->IsNick(parameters[0]) || allowinvalid))) { if (InUse->registered != REG_ALL) @@ -93,15 +94,19 @@ CmdResult cmd_nick::Handle (const char** parameters, int pcnt, userrec *user) } else { + ServerInstance->Log(DEBUG,"Nick in use and user REG_ALL"); user->WriteServ("433 %s %s :Nickname is already in use.", user->registered >= REG_NICK ? user->nick : "*", parameters[0]); return CMD_FAILURE; } } } - if (((!allowinvalid || !ServerInstance->IsNick(parameters[0]))) && (IS_LOCAL(user))) + if (((!ServerInstance->IsNick(parameters[0]))) && (IS_LOCAL(user))) { - user->WriteServ("432 %s %s :Erroneous Nickname",user->nick,parameters[0]); - return CMD_FAILURE; + if (!allowinvalid) + { + user->WriteServ("432 %s %s :Erroneous Nickname",user->nick,parameters[0]); + return CMD_FAILURE; + } } if (user->registered == REG_ALL) diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 4338fb9da..66c9f21ba 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -261,9 +261,29 @@ userrec* InspIRCd::FindNick(const char* nick) return iter->second; } +userrec* InspIRCd::FindNickOnly(const std::string &nick) +{ + user_hash::iterator iter = clientlist->find(nick); + + if (iter == clientlist->end()) + return NULL; + + return iter->second; +} + +userrec* InspIRCd::FindNickOnly(const char* nick) +{ + user_hash::iterator iter = clientlist->find(nick); + + if (iter == clientlist->end()) + return NULL; + + return iter->second; +} + userrec *InspIRCd::FindUUID(const std::string &uid) { - return InspIRCd::FindUUID(uid.c_str()); + return FindUUID(uid.c_str()); } userrec *InspIRCd::FindUUID(const char *uid) diff --git a/src/users.cpp b/src/users.cpp index de745d325..cdcc245d4 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -351,8 +351,10 @@ userrec::userrec(InspIRCd* Instance, const std::string &uid) : ServerInstance(In 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"); |