From 48d30d6ab4657e00c0c861d67285256daeff1142 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Wed, 1 Feb 2012 22:38:03 +0000 Subject: Rewritten cAuthenticator to make use of the new cIsThread architecture - now authentication runs in a single separate thread for all clients; Global player-kicking function (cServer, cRoot); More char * -> AString conversion git-svn-id: http://mc-server.googlecode.com/svn/trunk@221 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/cAuthenticator.h | 81 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 7 deletions(-) (limited to 'source/cAuthenticator.h') diff --git a/source/cAuthenticator.h b/source/cAuthenticator.h index dada1ce43..6b9e7142b 100644 --- a/source/cAuthenticator.h +++ b/source/cAuthenticator.h @@ -1,13 +1,80 @@ + +// 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 cBlockingTCPLink; -class cAuthenticator + + + +class cAuthenticator : + public cIsThread { + typedef cIsThread super; + public: - cAuthenticator(); - ~cAuthenticator(); + cAuthenticator(void); + + /// (Re-)read server and address from INI: + void ReadINI(void); - bool Authenticate( const char* a_PlayerName, const char* a_ServerID ); + /// Queues a request for authenticating a user. If the auth fails, the user is kicked + void Authenticate(const AString & iUserName, const AString & iServerHash); + private: - bool ParseReceived( const char* a_Data, cBlockingTCPLink* a_TCPLink ); -}; \ No newline at end of file + + class cUser + { + public: + AString mName; + AString mServerHash; + + cUser(const AString & iName, const AString & iServerHash) : mName(iName), mServerHash(iServerHash) {} + } ; + + typedef std::deque cUserList; + + cCriticalSection mCS; + cUserList mQueue; + cEvent mQueueNonempty; + + AString mServer; + AString mAddress; + bool mShouldAuthenticate; + + // 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 & iServer, const AString & iAddress, const AString & iUserName, int iLevel = 1); +}; + + + + + +#endif // CAUTHENTICATOR_H_INCLUDED + + + + -- cgit v1.2.3