From b61d43859e11579e54e28a6eab27824ad5489fdf Mon Sep 17 00:00:00 2001 From: lotodore Date: Tue, 13 Oct 2009 21:03:32 +0000 Subject: [PATCH] Trying to make gsasl authentication work... --- src/net/clientthread.h | 8 +++++ src/net/common/clientstate.cpp | 14 ++++----- src/net/common/clientthread.cpp | 44 ++++++++++++++++++++++++---- src/net/common/serverlobbythread.cpp | 20 ++++++------- src/net/common/sessiondata.cpp | 10 +++---- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 83c33d37..904d32ed 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -42,6 +42,7 @@ class Game; class NetPacket; class AvatarManager; class QtToolsInterface; +struct Gsasl; class ClientThread : public Thread, public boost::enable_shared_from_this { @@ -91,6 +92,8 @@ public: ServerStats GetStatData() const; unsigned GetGameId() const; + Gsasl *GetAuthContext(); + ClientCallback &GetCallback(); GuiInterface &GetGui(); AvatarManager &GetAvatarManager(); @@ -106,6 +109,9 @@ protected: virtual void Main(); void RegisterTimers(); void CancelTimers(); + + void InitAuthContext(); + void ClearAuthContext(); void InitGame(); void SendSessionPacket(boost::shared_ptr packet); @@ -194,6 +200,8 @@ private: boost::shared_ptr m_ioService; boost::shared_ptr m_senderCallback; + Gsasl *m_authContext; + NetPacketList m_outPacketList; boost::shared_ptr m_context; diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 9c1fd6f8..8c54abaf 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -677,13 +677,13 @@ ClientStateStartSession::Enter(boost::shared_ptr client) netInit->login.present = login_PR_authenticatedLogin; AuthenticatedLogin_t *authLogin = &netInit->login.choice.authenticatedLogin; // TODO -/* OCTET_STRING_fromBuf(&authLogin->playerName, - context.GetPlayerName().c_str(), - context.GetPlayerName().length()); - OCTET_STRING_fromBuf(&authLogin->password, - context.GetPassword().c_str(), - context.GetPassword().length());*/ - //context.GetPassword(); + boost::shared_ptr tmpSession = context.GetSessionData(); + tmpSession->CreateAuthSession(client->GetAuthContext(), false, context.GetPlayerName(), context.GetPassword()); + string outUserData; + tmpSession->AuthStep(1, "", outUserData); + OCTET_STRING_fromBuf(&authLogin->clientUserData, + outUserData.c_str(), + outUserData.length()); string avatarFile = client->GetQtToolsInterface().stringFromUtf8(context.GetAvatarFile()); if (!avatarFile.empty()) { diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index d8833a6c..1ccf321d 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #define TEMP_AVATAR_FILENAME "avatar.tmp" #define CLIENT_AVATAR_LOOP_MSEC 100 @@ -440,16 +441,17 @@ ClientThread::GetAvatarManager() void ClientThread::Main() { - // Start sub-threads. - m_avatarDownloader.reset(new DownloaderThread); - m_avatarDownloader->Run(); - SetState(CLIENT_INITIAL_STATE::Instance()); - RegisterTimers(); - // Main loop. boost::asio::io_service::work ioWork(*m_ioService); 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); m_ioService->run(); // Will only be aborted asynchronously. @@ -468,6 +470,8 @@ ClientThread::Main() // Terminate sub-threads. m_avatarDownloader->SignalTermination(); m_avatarDownloader->Join(DOWNLOADER_THREAD_TERMINATE_TIMEOUT); + + ClearAuthContext(); } void @@ -486,6 +490,27 @@ ClientThread::CancelTimers() 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 ClientThread::InitGame() { @@ -893,6 +918,13 @@ ClientThread::SetGameId(unsigned id) m_curGameId = id; } +Gsasl * +ClientThread::GetAuthContext() +{ + assert(m_authContext); + return m_authContext; +} + const GameData & ClientThread::GetGameData() const { diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 9bd5d0d5..8144650a 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -693,15 +693,15 @@ ServerLobbyThread::CancelTimers() void ServerLobbyThread::InitAuthContext() { - int res = gsasl_init(&m_authContext); - if (res != GSASL_OK) - throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_INIT_FAILED, 0); - - if (!gsasl_server_support_p(m_authContext, "SCRAM-SHA-1")) - { - gsasl_done(m_authContext); - throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_NO_SCRAM, 0); - } + int res = gsasl_init(&m_authContext); + if (res != GSASL_OK) + throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_INIT_FAILED, 0); + + if (!gsasl_server_support_p(m_authContext, "SCRAM-SHA-1")) + { + gsasl_done(m_authContext); + throw ServerException(__FILE__, __LINE__, ERR_NET_GSASL_NO_SCRAM, 0); + } } void @@ -969,7 +969,7 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const InitMessage if (guestUser) InitAfterLogin(session); else - AuthenticatePlayer(session, authData); + AuthenticatePlayer(session, /*authData*/"testuser"); } void diff --git a/src/net/common/sessiondata.cpp b/src/net/common/sessiondata.cpp index 60646526..24201b93 100644 --- a/src/net/common/sessiondata.cpp +++ b/src/net/common/sessiondata.cpp @@ -87,11 +87,11 @@ SessionData::CreateAuthSession(Gsasl *context, bool server, const string &userNa errorCode = gsasl_server_start(context, "SCRAM-SHA-1", &m_authSession); else errorCode = gsasl_client_start(context, "SCRAM-SHA-1", &m_authSession); - if (errorCode == GSASL_OK) - { - gsasl_property_set(m_authSession, GSASL_AUTHID, userName.c_str()); - gsasl_property_set(m_authSession, GSASL_PASSWORD, password.c_str()); - retVal = true; + if (errorCode == GSASL_OK) + { + gsasl_property_set(m_authSession, GSASL_AUTHID, userName.c_str()); + gsasl_property_set(m_authSession, GSASL_PASSWORD, password.c_str()); + retVal = true; } return retVal; }