Trying to make gsasl authentication work...
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
// Main loop.
|
||||||
|
boost::asio::io_service::work ioWork(*m_ioService);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
InitAuthContext();
|
||||||
// Start sub-threads.
|
// Start sub-threads.
|
||||||
m_avatarDownloader.reset(new DownloaderThread);
|
m_avatarDownloader.reset(new DownloaderThread);
|
||||||
m_avatarDownloader->Run();
|
m_avatarDownloader->Run();
|
||||||
SetState(CLIENT_INITIAL_STATE::Instance());
|
SetState(CLIENT_INITIAL_STATE::Instance());
|
||||||
RegisterTimers();
|
RegisterTimers();
|
||||||
|
|
||||||
// Main loop.
|
|
||||||
boost::asio::io_service::work ioWork(*m_ioService);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user