1a5ebb44aa
Thread objects now use variable names consistent with MCS convention; Fixed a few *nix threading cornercases git-svn-id: http://mc-server.googlecode.com/svn/trunk@392 0a769ca7-a7f5-676a-18bf-c427514a06d6
86 lines
1.9 KiB
C++
86 lines
1.9 KiB
C++
|
|
// cAuthenticator.h
|
|
|
|
// Interfaces to the cAuthenticator class representing the thread that authenticates users against the official MC server
|
|
// Authentication prevents "hackers" from joining with an arbitrary username (possibly impersonating the server admins)
|
|
// For more info, see http://wiki.vg/Session#Server_operation
|
|
// In MCS, authentication is implemented as a single thread that receives queued auth requests and dispatches them one by one.
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
#ifndef CAUTHENTICATOR_H_INCLUDED
|
|
#define CAUTHENTICATOR_H_INCLUDED
|
|
|
|
#include "cIsThread.h"
|
|
|
|
|
|
|
|
|
|
|
|
// fwd: "cRoot.h"
|
|
class cRoot;
|
|
|
|
|
|
|
|
|
|
|
|
class cAuthenticator :
|
|
public cIsThread
|
|
{
|
|
typedef cIsThread super;
|
|
|
|
public:
|
|
cAuthenticator(void);
|
|
~cAuthenticator();
|
|
|
|
/// (Re-)read server and address from INI:
|
|
void ReadINI(void);
|
|
|
|
/// Queues a request for authenticating a user. If the auth fails, the user is kicked
|
|
void Authenticate(int a_ClientID, const AString & a_UserName, const AString & a_ServerHash);
|
|
|
|
// Stops the authenticator thread
|
|
void Stop(void);
|
|
|
|
private:
|
|
|
|
class cUser
|
|
{
|
|
public:
|
|
int mClientID;
|
|
AString mName;
|
|
AString mServerHash;
|
|
|
|
cUser(int a_ClientID, const AString & a_Name, const AString & a_ServerHash) : mClientID(a_ClientID), mName(a_Name), mServerHash(a_ServerHash) {}
|
|
} ;
|
|
|
|
typedef std::deque<cUser> cUserList;
|
|
|
|
cCriticalSection m_CS;
|
|
cUserList m_Queue;
|
|
cEvent m_QueueNonempty;
|
|
|
|
AString m_Server;
|
|
AString m_Address;
|
|
bool m_ShouldAuthenticate;
|
|
|
|
// cIsThread override:
|
|
virtual void Execute(void) override;
|
|
|
|
// Returns true if the user authenticated okay, false on error; iLevel is the recursion deptht (bails out if too deep)
|
|
bool AuthFromAddress(const AString & a_Server, const AString & a_Address, const AString & a_UserName, int a_Level = 1);
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // CAUTHENTICATOR_H_INCLUDED
|
|
|
|
|
|
|
|
|