From 61e761fdc2bfa5c77002d68bb24e0470def37b48 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 29 Nov 2014 00:36:15 -0800 Subject: issue 1253 - prevent multiple logins with same username --- src/ClientHandle.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index a6cbad32a..ae794d7cb 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1798,6 +1798,24 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) return false; } } + if (!(cRoot::Get()->GetServer()->isAllowMultiLogin())) + { + std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); + std::list usernamesWorld = cRoot::Get()->GetDefaultWorld()-> GetUsernames(); + + usernamesServer.sort(); + usernamesWorld.sort(); + usernamesServer.merge(usernamesWorld); + + for (std::list::iterator itr = usernamesServer.begin(); itr != usernamesServer.end(); ++itr) + { + if ((*itr).compare(a_Username) == 0) + { + Kick("User already logged in."); + return false; + } + } + } return true; } -- cgit v1.2.3 From a7bf2725c8bd5f8ec3e03584af87a7055cb15a60 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 29 Nov 2014 11:22:03 -0800 Subject: fixed naming of strings and changed from i to I --- src/ClientHandle.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index ae794d7cb..3c06f3401 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1798,16 +1798,16 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) return false; } } - if (!(cRoot::Get()->GetServer()->isAllowMultiLogin())) + if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) { - std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); - std::list usernamesWorld = cRoot::Get()->GetDefaultWorld()-> GetUsernames(); + std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); + std::list usernamesWorld = cRoot::Get()->GetDefaultWorld()-> GetUsernames(); usernamesServer.sort(); usernamesWorld.sort(); usernamesServer.merge(usernamesWorld); - for (std::list::iterator itr = usernamesServer.begin(); itr != usernamesServer.end(); ++itr) + for (std::list::iterator itr = usernamesServer.begin(); itr != usernamesServer.end(); ++itr) { if ((*itr).compare(a_Username) == 0) { -- cgit v1.2.3 From 72797b14fe5f83a7a27df17d5b733048d13d5d1b Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 29 Nov 2014 15:44:38 -0800 Subject: Uses callback for players already in World. --- src/ClientHandle.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 3c06f3401..f63754aab 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1790,6 +1790,7 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) bool cClientHandle::HandleHandshake(const AString & a_Username) { + if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(*this, a_Username)) { if (cRoot::Get()->GetServer()->GetNumPlayers() >= cRoot::Get()->GetServer()->GetMaxPlayers()) @@ -1801,11 +1802,6 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) { std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); - std::list usernamesWorld = cRoot::Get()->GetDefaultWorld()-> GetUsernames(); - - usernamesServer.sort(); - usernamesWorld.sort(); - usernamesServer.merge(usernamesWorld); for (std::list::iterator itr = usernamesServer.begin(); itr != usernamesServer.end(); ++itr) { @@ -1815,6 +1811,17 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) return false; } } + class cCallback : public cPlayerListCallback + { + virtual bool Item(cPlayer * a_Player) override + { + return false; + } + } Callback; + if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) + { + Kick("User already logged in."); + } } return true; } -- cgit v1.2.3 From 9caa3b19c15b257af47a924c68f9b13517447c26 Mon Sep 17 00:00:00 2001 From: vincentleung1 Date: Sat, 29 Nov 2014 15:59:48 -0800 Subject: removed extra space and fixed some formatting in cCallback --- src/ClientHandle.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index f63754aab..54a39cdc2 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1790,7 +1790,6 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) bool cClientHandle::HandleHandshake(const AString & a_Username) { - if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(*this, a_Username)) { if (cRoot::Get()->GetServer()->GetNumPlayers() >= cRoot::Get()->GetServer()->GetMaxPlayers()) @@ -1811,11 +1810,12 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) return false; } } - class cCallback : public cPlayerListCallback + class cCallback : + public cPlayerListCallback { virtual bool Item(cPlayer * a_Player) override { - return false; + return true; } } Callback; if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) -- cgit v1.2.3 From 438a9b04cbabcbbab06d9f5bd00ced3342eb97f8 Mon Sep 17 00:00:00 2001 From: vincentleung1 Date: Sat, 29 Nov 2014 16:05:22 -0800 Subject: Changed Kick message --- src/ClientHandle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 54a39cdc2..1ffb5f04b 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1806,7 +1806,7 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) { if ((*itr).compare(a_Username) == 0) { - Kick("User already logged in."); + Kick("A player of the username is already logged in"); return false; } } @@ -1820,7 +1820,7 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) } Callback; if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) { - Kick("User already logged in."); + Kick("A player of the username is already logged in"); } } return true; -- cgit v1.2.3 From 8edfd7829505d43c7d6bf7fcc582e0d7cb29e1d5 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 7 Dec 2014 12:41:42 -0800 Subject: changed from using iterator to auto for server and clienthandle --- src/ClientHandle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index f63754aab..94126d496 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1803,9 +1803,9 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) { std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); - for (std::list::iterator itr = usernamesServer.begin(); itr != usernamesServer.end(); ++itr) + for (auto item : usernamesServer) { - if ((*itr).compare(a_Username) == 0) + if ((item).compare(a_Username) == 0) { Kick("User already logged in."); return false; -- cgit v1.2.3 From d8d3b9aec5bbb0f6d632d86f1fb7b1e8f58e9063 Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 8 Dec 2014 00:12:48 -0800 Subject: Moved the check into a new function and just calls that function and a blank FindAndDoWithPlayer added. --- src/ClientHandle.cpp | 60 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 22 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 3fca48394..025588485 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1788,6 +1788,41 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) +bool cClientHandle::CheckMultiLogin(void) +{ + std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); + + for (auto item : usernamesServer) + { + if ((item).compare(a_Username) == 0) + { + Kick("A player of the username is already logged in"); + return false; + } + } + + class cCallback : + public cPlayerListCallback + { + virtual bool Item(cPlayer * a_Player) override + { + return true; + } + } Callback; + + if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) + { + Kick("A player of the username is already logged in"); + return false; + } + + return true; +} + + + + + bool cClientHandle::HandleHandshake(const AString & a_Username) { if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(*this, a_Username)) @@ -1798,31 +1833,12 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) return false; } } + if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) { - std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); - - for (auto item : usernamesServer) - { - if ((item).compare(a_Username) == 0) - { - Kick("A player of the username is already logged in"); - return false; - } - } - class cCallback : - public cPlayerListCallback - { - virtual bool Item(cPlayer * a_Player) override - { - return true; - } - } Callback; - if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) - { - Kick("A player of the username is already logged in"); - } + return CheckMultiLogin(); } + return true; } -- cgit v1.2.3 From ed09e76023436c9414356921bc761618b3bb9341 Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 8 Dec 2014 00:16:09 -0800 Subject: Changed HandleHandshake to return the result of CheckMultiLogin instead of just true since it already returns true if it finds and kicks the current player. --- src/ClientHandle.cpp | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 025588485..e60bb5373 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1790,30 +1790,33 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) bool cClientHandle::CheckMultiLogin(void) { - std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); - - for (auto item : usernamesServer) + if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) { - if ((item).compare(a_Username) == 0) + std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); + + for (auto item : usernamesServer) { - Kick("A player of the username is already logged in"); - return false; + if ((item).compare(a_Username) == 0) + { + Kick("A player of the username is already logged in"); + return false; + } } - } - class cCallback : - public cPlayerListCallback - { - virtual bool Item(cPlayer * a_Player) override + class cCallback : + public cPlayerListCallback { - return true; - } - } Callback; + virtual bool Item(cPlayer * a_Player) override + { + return true; + } + } Callback; - if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) - { - Kick("A player of the username is already logged in"); - return false; + if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) + { + Kick("A player of the username is already logged in"); + return false; + } } return true; @@ -1833,13 +1836,9 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) return false; } } + + return CheckMultiLogin(); - if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) - { - return CheckMultiLogin(); - } - - return true; } -- cgit v1.2.3 From 656964dc385e4460215d2443724f322cd1bc596d Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 8 Dec 2014 00:19:33 -0800 Subject: removed last space in handlehandshake --- src/ClientHandle.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index e60bb5373..4031fa1df 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1838,7 +1838,6 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) } return CheckMultiLogin(); - } -- cgit v1.2.3 From 6de07d4a39096f19c075695824aa87a1907e4edc Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 8 Dec 2014 00:45:29 -0800 Subject: Fixed compile errors --- src/ClientHandle.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 4031fa1df..6f7bd1faf 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1788,19 +1788,14 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) -bool cClientHandle::CheckMultiLogin(void) +bool cClientHandle::CheckMultiLogin(const AString & a_Username) { if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) { - std::list usernamesServer = cRoot::Get()->GetServer()->GetUsernames(); - - for (auto item : usernamesServer) + if (cRoot::Get()->GetServer()->IsPlayerInQueue(a_Username)) { - if ((item).compare(a_Username) == 0) - { Kick("A player of the username is already logged in"); return false; - } } class cCallback : @@ -1837,7 +1832,7 @@ bool cClientHandle::HandleHandshake(const AString & a_Username) } } - return CheckMultiLogin(); + return CheckMultiLogin(a_Username); } -- cgit v1.2.3 From e28cc876c4aa4d71f821fca45b5486b8ef6cca4e Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 8 Dec 2014 00:57:46 -0800 Subject: created callback in Root and changed CheckMultiLogin() to use the DoWithPlayer function at Root instead of World. --- src/ClientHandle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 6f7bd1faf..6fe7cbd4a 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1807,7 +1807,7 @@ bool cClientHandle::CheckMultiLogin(const AString & a_Username) } } Callback; - if (cRoot::Get()->GetDefaultWorld()->DoWithPlayer(a_Username, Callback)) + if (cRoot::Get()->DoWithPlayer(a_Username, Callback)) { Kick("A player of the username is already logged in"); return false; -- cgit v1.2.3 From 12c012fa01e719c7c103e36ae0407294a0d11bfb Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 8 Dec 2014 14:33:59 -0800 Subject: Changed CheckMultiLogin() to not have main body wrapped in an if statement. Added in indent to cPlayerListCallBack in cCallback class inside CheckMultiLogin(). Added doxy-comment for DoWithPlayer(). Changed comments on IsPlayerInQueue() and IsAllowMultiLogin() to doxy-comments. --- src/ClientHandle.cpp | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 6fe7cbd4a..3bc17d1a9 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1790,31 +1790,34 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) bool cClientHandle::CheckMultiLogin(const AString & a_Username) { - if (!(cRoot::Get()->GetServer()->IsAllowMultiLogin())) + // If the multilogin is allowed, skip this check entirely: + if ((cRoot::Get()->GetServer()->IsAllowMultiLogin())) { - if (cRoot::Get()->GetServer()->IsPlayerInQueue(a_Username)) - { - Kick("A player of the username is already logged in"); - return false; - } - - class cCallback : - public cPlayerListCallback - { - virtual bool Item(cPlayer * a_Player) override - { - return true; - } - } Callback; + return true; + } - if (cRoot::Get()->DoWithPlayer(a_Username, Callback)) - { + // Check if the player is waiting to be transferred to the World. + if (cRoot::Get()->GetServer()->IsPlayerInQueue(a_Username)) + { Kick("A player of the username is already logged in"); return false; + } + + class cCallback : + public cPlayerListCallback + { + virtual bool Item(cPlayer * a_Player) override + { + return true; } + } Callback; + + // Check if the player is in any World. + if (cRoot::Get()->DoWithPlayer(a_Username, Callback)) + { + Kick("A player of the username is already logged in"); + return false; } - - return true; } -- cgit v1.2.3 From 4b08ca261bed5ec2fd70f64ee96104ba6bee6927 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 9 Dec 2014 03:06:25 -0800 Subject: Fixed indent problems and added return definitions to CheckMultiLogin(). Changed from IsAllowMultiLogin() to DoesAllowMultiLogin(). Fixed CheckMultiLogin() to not run to the end without returning a value. --- src/ClientHandle.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 3bc17d1a9..6812c06ac 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1799,8 +1799,8 @@ bool cClientHandle::CheckMultiLogin(const AString & a_Username) // Check if the player is waiting to be transferred to the World. if (cRoot::Get()->GetServer()->IsPlayerInQueue(a_Username)) { - Kick("A player of the username is already logged in"); - return false; + Kick("A player of the username is already logged in"); + return false; } class cCallback : @@ -1816,8 +1816,8 @@ bool cClientHandle::CheckMultiLogin(const AString & a_Username) if (cRoot::Get()->DoWithPlayer(a_Username, Callback)) { Kick("A player of the username is already logged in"); - return false; } + return false; } -- cgit v1.2.3 From 3a2759fdc1a2c7282bd90a1f545fa1effae2728b Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 9 Dec 2014 14:23:44 -0800 Subject: Fixed return value in CheckMultiLogin() --- src/ClientHandle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 6812c06ac..87dc27f8f 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1816,8 +1816,9 @@ bool cClientHandle::CheckMultiLogin(const AString & a_Username) if (cRoot::Get()->DoWithPlayer(a_Username, Callback)) { Kick("A player of the username is already logged in"); + return false; } - return false; + return true; } -- cgit v1.2.3 From 9bba8e4c7d88c0769bb7643a2a8b577a3d12c1af Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 10 Dec 2014 00:45:24 -0800 Subject: Changed method call to DoesAllowMultiLogin() instead of IsAllowMultiLogin() Compiles correctly. --- src/ClientHandle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/ClientHandle.cpp') diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 87dc27f8f..8a39c3ecb 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1791,7 +1791,7 @@ void cClientHandle::HandleKeepAlive(int a_KeepAliveID) bool cClientHandle::CheckMultiLogin(const AString & a_Username) { // If the multilogin is allowed, skip this check entirely: - if ((cRoot::Get()->GetServer()->IsAllowMultiLogin())) + if ((cRoot::Get()->GetServer()->DoesAllowMultiLogin())) { return true; } -- cgit v1.2.3