Trying to make gsasl authentication work...

This commit is contained in:
lotodore
2009-10-13 21:03:32 +00:00
parent cfc11f7f89
commit b61d43859e
5 changed files with 68 additions and 28 deletions
+8
View File
@@ -42,6 +42,7 @@ class Game;
class NetPacket; class NetPacket;
class AvatarManager; class AvatarManager;
class QtToolsInterface; class QtToolsInterface;
struct Gsasl;
class ClientThread : public Thread, public boost::enable_shared_from_this<ClientThread> class ClientThread : public Thread, public boost::enable_shared_from_this<ClientThread>
{ {
@@ -91,6 +92,8 @@ public:
ServerStats GetStatData() const; ServerStats GetStatData() const;
unsigned GetGameId() const; unsigned GetGameId() const;
Gsasl *GetAuthContext();
ClientCallback &GetCallback(); ClientCallback &GetCallback();
GuiInterface &GetGui(); GuiInterface &GetGui();
AvatarManager &GetAvatarManager(); AvatarManager &GetAvatarManager();
@@ -106,6 +109,9 @@ protected:
virtual void Main(); virtual void Main();
void RegisterTimers(); void RegisterTimers();
void CancelTimers(); void CancelTimers();
void InitAuthContext();
void ClearAuthContext();
void InitGame(); void InitGame();
void SendSessionPacket(boost::shared_ptr<NetPacket> packet); void SendSessionPacket(boost::shared_ptr<NetPacket> packet);
@@ -194,6 +200,8 @@ private:
boost::shared_ptr<boost::asio::io_service> m_ioService; boost::shared_ptr<boost::asio::io_service> m_ioService;
boost::shared_ptr<ClientSenderCallback> m_senderCallback; boost::shared_ptr<ClientSenderCallback> m_senderCallback;
Gsasl *m_authContext;
NetPacketList m_outPacketList; NetPacketList m_outPacketList;
boost::shared_ptr<ClientContext> m_context; boost::shared_ptr<ClientContext> m_context;
+7 -7
View File
@@ -677,13 +677,13 @@ ClientStateStartSession::Enter(boost::shared_ptr<ClientThread> client)
netInit->login.present = login_PR_authenticatedLogin; netInit->login.present = login_PR_authenticatedLogin;
AuthenticatedLogin_t *authLogin = &netInit->login.choice.authenticatedLogin; AuthenticatedLogin_t *authLogin = &netInit->login.choice.authenticatedLogin;
// TODO // TODO
/* OCTET_STRING_fromBuf(&authLogin->playerName, boost::shared_ptr<SessionData> tmpSession = context.GetSessionData();
context.GetPlayerName().c_str(), tmpSession->CreateAuthSession(client->GetAuthContext(), false, context.GetPlayerName(), context.GetPassword());
context.GetPlayerName().length()); string outUserData;
OCTET_STRING_fromBuf(&authLogin->password, tmpSession->AuthStep(1, "", outUserData);
context.GetPassword().c_str(), OCTET_STRING_fromBuf(&authLogin->clientUserData,
context.GetPassword().length());*/ outUserData.c_str(),
//context.GetPassword(); outUserData.length());
string avatarFile = client->GetQtToolsInterface().stringFromUtf8(context.GetAvatarFile()); string avatarFile = client->GetQtToolsInterface().stringFromUtf8(context.GetAvatarFile());
if (!avatarFile.empty()) if (!avatarFile.empty())
{ {
+38 -6
View File
@@ -37,6 +37,7 @@
#include <sstream> #include <sstream>
#include <memory> #include <memory>
#include <cassert> #include <cassert>
#include <gsasl.h>
#define TEMP_AVATAR_FILENAME "avatar.tmp" #define TEMP_AVATAR_FILENAME "avatar.tmp"
#define CLIENT_AVATAR_LOOP_MSEC 100 #define CLIENT_AVATAR_LOOP_MSEC 100
@@ -440,16 +441,17 @@ ClientThread::GetAvatarManager()
void void
ClientThread::Main() ClientThread::Main()
{ {
// Start sub-threads.
m_avatarDownloader.reset(new DownloaderThread);
m_avatarDownloader->Run();
SetState(CLIENT_INITIAL_STATE::Instance());
RegisterTimers();
// Main loop. // Main loop.
boost::asio::io_service::work ioWork(*m_ioService); boost::asio::io_service::work ioWork(*m_ioService);
try try
{ {
InitAuthContext();
// Start sub-threads.
m_avatarDownloader.reset(new DownloaderThread);
m_avatarDownloader->Run();
SetState(CLIENT_INITIAL_STATE::Instance());
RegisterTimers();
boost::asio::io_service::work ioWork(*m_ioService); boost::asio::io_service::work ioWork(*m_ioService);
m_ioService->run(); // Will only be aborted asynchronously. m_ioService->run(); // Will only be aborted asynchronously.
@@ -468,6 +470,8 @@ ClientThread::Main()
// Terminate sub-threads. // Terminate sub-threads.
m_avatarDownloader->SignalTermination(); m_avatarDownloader->SignalTermination();
m_avatarDownloader->Join(DOWNLOADER_THREAD_TERMINATE_TIMEOUT); m_avatarDownloader->Join(DOWNLOADER_THREAD_TERMINATE_TIMEOUT);
ClearAuthContext();
} }
void void
@@ -486,6 +490,27 @@ ClientThread::CancelTimers()
m_avatarTimer.cancel(); m_avatarTimer.cancel();
} }
void
ClientThread::InitAuthContext()
{
int res = gsasl_init(&m_authContext);
if (res != GSASL_OK)
throw ClientException(__FILE__, __LINE__, ERR_NET_GSASL_INIT_FAILED, 0);
if (!gsasl_server_support_p(m_authContext, "SCRAM-SHA-1"))
{
gsasl_done(m_authContext);
throw ClientException(__FILE__, __LINE__, ERR_NET_GSASL_NO_SCRAM, 0);
}
}
void
ClientThread::ClearAuthContext()
{
gsasl_done(m_authContext);
m_authContext = NULL;
}
void void
ClientThread::InitGame() ClientThread::InitGame()
{ {
@@ -893,6 +918,13 @@ ClientThread::SetGameId(unsigned id)
m_curGameId = id; m_curGameId = id;
} }
Gsasl *
ClientThread::GetAuthContext()
{
assert(m_authContext);
return m_authContext;
}
const GameData & const GameData &
ClientThread::GetGameData() const ClientThread::GetGameData() const
{ {
+10 -10
View File
@@ -693,15 +693,15 @@ ServerLobbyThread::CancelTimers()
void void
ServerLobbyThread::InitAuthContext() ServerLobbyThread::InitAuthContext()
{ {
int res = gsasl_init(&m_authContext); int res = gsasl_init(&m_authContext);
if (res != GSASL_OK) if (res != GSASL_OK)
throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_INIT_FAILED, 0); throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_INIT_FAILED, 0);
if (!gsasl_server_support_p(m_authContext, "SCRAM-SHA-1")) if (!gsasl_server_support_p(m_authContext, "SCRAM-SHA-1"))
{ {
gsasl_done(m_authContext); gsasl_done(m_authContext);
throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_NO_SCRAM, 0); throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_NO_SCRAM, 0);
} }
} }
void void
@@ -969,7 +969,7 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage
if (guestUser) if (guestUser)
InitAfterLogin(session); InitAfterLogin(session);
else else
AuthenticatePlayer(session, authData); AuthenticatePlayer(session, /*authData*/"testuser");
} }
void void
+5 -5
View File
@@ -87,11 +87,11 @@ SessionData::CreateAuthSession(Gsasl *context, bool server, const string &userNa
errorCode = gsasl_server_start(context, "SCRAM-SHA-1", &m_authSession); errorCode = gsasl_server_start(context, "SCRAM-SHA-1", &m_authSession);
else else
errorCode = gsasl_client_start(context, "SCRAM-SHA-1", &m_authSession); errorCode = gsasl_client_start(context, "SCRAM-SHA-1", &m_authSession);
if (errorCode == GSASL_OK) if (errorCode == GSASL_OK)
{ {
gsasl_property_set(m_authSession, GSASL_AUTHID, userName.c_str()); gsasl_property_set(m_authSession, GSASL_AUTHID, userName.c_str());
gsasl_property_set(m_authSession, GSASL_PASSWORD, password.c_str()); gsasl_property_set(m_authSession, GSASL_PASSWORD, password.c_str());
retVal = true; retVal = true;
} }
return retVal; return retVal;
} }