issue 1253 - prevent multiple logins with same username
This commit is contained in:
parent
883230abbc
commit
61e761fdc2
@ -1798,6 +1798,24 @@ bool cClientHandle::HandleHandshake(const AString & a_Username)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!(cRoot::Get()->GetServer()->isAllowMultiLogin()))
|
||||||
|
{
|
||||||
|
std::list<std::string> usernamesServer = cRoot::Get()->GetServer()->GetUsernames();
|
||||||
|
std::list<std::string> usernamesWorld = cRoot::Get()->GetDefaultWorld()-> GetUsernames();
|
||||||
|
|
||||||
|
usernamesServer.sort();
|
||||||
|
usernamesWorld.sort();
|
||||||
|
usernamesServer.merge(usernamesWorld);
|
||||||
|
|
||||||
|
for (std::list<std::string>::iterator itr = usernamesServer.begin(); itr != usernamesServer.end(); ++itr)
|
||||||
|
{
|
||||||
|
if ((*itr).compare(a_Username) == 0)
|
||||||
|
{
|
||||||
|
Kick("User already logged in.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +201,7 @@ bool cServer::InitServer(cIniFile & a_SettingsIni, bool a_ShouldAuth)
|
|||||||
m_Description = a_SettingsIni.GetValueSet("Server", "Description", "MCServer - in C++!");
|
m_Description = a_SettingsIni.GetValueSet("Server", "Description", "MCServer - in C++!");
|
||||||
m_MaxPlayers = a_SettingsIni.GetValueSetI("Server", "MaxPlayers", 100);
|
m_MaxPlayers = a_SettingsIni.GetValueSetI("Server", "MaxPlayers", 100);
|
||||||
m_bIsHardcore = a_SettingsIni.GetValueSetB("Server", "HardcoreEnabled", false);
|
m_bIsHardcore = a_SettingsIni.GetValueSetB("Server", "HardcoreEnabled", false);
|
||||||
|
m_bAllowMultiLogin = a_SettingsIni.GetValueSetB("Server", "AllowMultiLogin", false);
|
||||||
m_PlayerCount = 0;
|
m_PlayerCount = 0;
|
||||||
m_PlayerCountDiff = 0;
|
m_PlayerCountDiff = 0;
|
||||||
|
|
||||||
@ -303,6 +304,22 @@ int cServer::GetNumPlayers(void) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::list<std::string> cServer::GetUsernames()
|
||||||
|
{
|
||||||
|
std::list<std::string> usernames;
|
||||||
|
cCSLock Lock(m_CSClients);
|
||||||
|
for (ClientList::iterator itr = m_Clients.begin(); itr != m_Clients.end(); ++itr)
|
||||||
|
{
|
||||||
|
std::string username = (*itr)->GetUsername();
|
||||||
|
usernames.insert(usernames.begin(),username);
|
||||||
|
}
|
||||||
|
return usernames;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cServer::PrepareKeys(void)
|
void cServer::PrepareKeys(void)
|
||||||
{
|
{
|
||||||
LOGD("Generating protocol encryption keypair...");
|
LOGD("Generating protocol encryption keypair...");
|
||||||
|
@ -67,6 +67,12 @@ public: // tolua_export
|
|||||||
int GetNumPlayers(void) const;
|
int GetNumPlayers(void) const;
|
||||||
void SetMaxPlayers(int a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; }
|
void SetMaxPlayers(int a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; }
|
||||||
|
|
||||||
|
// Get the users waiting to be put into the World.
|
||||||
|
std::list<std::string> GetUsernames(void);
|
||||||
|
|
||||||
|
// Can login more than once with same username.
|
||||||
|
bool isAllowMultiLogin(void) { return m_bAllowMultiLogin; }
|
||||||
|
|
||||||
// Hardcore mode or not:
|
// Hardcore mode or not:
|
||||||
bool IsHardcore(void) const { return m_bIsHardcore; }
|
bool IsHardcore(void) const { return m_bIsHardcore; }
|
||||||
|
|
||||||
@ -216,6 +222,9 @@ private:
|
|||||||
int m_MaxPlayers;
|
int m_MaxPlayers;
|
||||||
bool m_bIsHardcore;
|
bool m_bIsHardcore;
|
||||||
|
|
||||||
|
/** True - allow same username to login more than once False - only once */
|
||||||
|
bool m_bAllowMultiLogin;
|
||||||
|
|
||||||
cTickThread m_TickThread;
|
cTickThread m_TickThread;
|
||||||
cEvent m_RestartEvent;
|
cEvent m_RestartEvent;
|
||||||
|
|
||||||
|
@ -3666,3 +3666,15 @@ void cWorld::cChunkGeneratorCallbacks::CallHookChunkGenerated (cChunkDesc & a_Ch
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::list<std::string> cWorld::GetUsernames()
|
||||||
|
{
|
||||||
|
std::list<std::string> usernames;
|
||||||
|
cCSLock Lock(m_CSPlayers);
|
||||||
|
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||||
|
{
|
||||||
|
std::string username = (*itr)->GetName();
|
||||||
|
usernames.insert(usernames.begin(),username);
|
||||||
|
}
|
||||||
|
return usernames;
|
||||||
|
}
|
||||||
|
@ -808,6 +808,8 @@ public:
|
|||||||
as at least one requests is active the chunk will be ticked). */
|
as at least one requests is active the chunk will be ticked). */
|
||||||
void SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked = true); // tolua_export
|
void SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked = true); // tolua_export
|
||||||
|
|
||||||
|
/** Get the usernames from the World. */
|
||||||
|
std::list<std::string> GetUsernames(void);
|
||||||
private:
|
private:
|
||||||
|
|
||||||
friend class cRoot;
|
friend class cRoot;
|
||||||
|
Loading…
Reference in New Issue
Block a user