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
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |