Fixed: Implement alternate login system with LoginCustomParameters

This commit is contained in:
kervala 2016-02-23 17:03:40 +01:00
parent 840f5b7c61
commit 10f56871e6
3 changed files with 144 additions and 43 deletions

View file

@ -189,7 +189,7 @@ const std::string& CLoginStateMachine::toString(CLoginStateMachine::TEvent event
break; \ break; \
} \ } \
extern std::string LoginLogin, LoginPassword; extern std::string LoginLogin, LoginPassword, LoginCustomParameters;
extern bool noUserChar; extern bool noUserChar;
extern bool userChar; extern bool userChar;
extern bool serverReceivedReady; extern bool serverReceivedReady;
@ -248,12 +248,24 @@ void CLoginStateMachine::run()
{ {
if (LoginLogin.empty()) if (LoginLogin.empty())
{ {
// standard procedure if (LoginCustomParameters.empty())
SM_BEGIN_EVENT_TABLE {
SM_EVENT(ev_init_done, st_login); // standard procedure
SM_EVENT(ev_skip_all_login, st_ingame); SM_BEGIN_EVENT_TABLE
SM_EVENT(ev_quit, st_end); SM_EVENT(ev_init_done, st_login);
SM_END_EVENT_TABLE SM_EVENT(ev_skip_all_login, st_ingame);
SM_EVENT(ev_quit, st_end);
SM_END_EVENT_TABLE
}
else
{
// alternate login procedure
SM_BEGIN_EVENT_TABLE
SM_EVENT(ev_init_done, st_alt_login);
SM_EVENT(ev_skip_all_login, st_ingame);
SM_EVENT(ev_quit, st_end);
SM_END_EVENT_TABLE
}
} }
else else
{ {
@ -325,6 +337,27 @@ void CLoginStateMachine::run()
// SM_EVENT(ev_login_ok, st_check_patch); // SM_EVENT(ev_login_ok, st_check_patch);
// SM_EVENT(ev_quit, st_end); // SM_EVENT(ev_quit, st_end);
// SM_END_EVENT_TABLE // SM_END_EVENT_TABLE
// }
break;
case st_alt_login:
initAltLogin();
// if (ClientCfg.R2Mode)
{
// r2 mode
SM_BEGIN_EVENT_TABLE
SM_EVENT(ev_login_not_alt, st_login);
SM_EVENT(ev_login_ok, st_check_patch);
SM_EVENT(ev_quit, st_end);
SM_END_EVENT_TABLE
}
// else
// {
// // legacy mode
// SM_BEGIN_EVENT_TABLE
// SM_EVENT(ev_login_ok, st_check_patch);
// SM_EVENT(ev_quit, st_end);
// SM_END_EVENT_TABLE
// } // }
break; break;
case st_shard_list: case st_shard_list:

View file

@ -81,6 +81,8 @@ public:
st_rate_session, st_rate_session,
/// create account /// create account
st_create_account, st_create_account,
/// try to login with alternate login system
st_alt_login,
/// pseudo state to leave the state machine /// pseudo state to leave the state machine
st_end, st_end,
/// ///
@ -156,6 +158,8 @@ public:
ev_create_account, ev_create_account,
/// the client push the 'create account' button /// the client push the 'create account' button
ev_close_create_account, ev_close_create_account,
/// the client want to use alternate login system
ev_login_not_alt,
/// ///
ev_unknown ev_unknown
}; };
@ -203,6 +207,7 @@ void initEula();
void initPatchCheck(); void initPatchCheck();
void initCatDisplay(); void initCatDisplay();
void initAutoLogin(); void initAutoLogin();
void initAltLogin();
void initPatch(); void initPatch();
//void initWebBrowser(); //void initWebBrowser();
void initReboot(); void initReboot();

View file

@ -842,6 +842,55 @@ void initAutoLogin()
} }
} }
void initAltLogin()
{
// Check the alt param
if (!LoginCustomParameters.empty())
{
// don't use login and password for alternate login
string res = checkLogin("", "", ClientApp, LoginCustomParameters);
if (res.empty())
{
if (ClientCfg.R2Mode)
{
LoginSM.pushEvent(CLoginStateMachine::ev_login_ok);
}
else
{
// Select good shard
ShardSelected = -1;
for (uint32 i = 0; i < Shards.size(); ++i)
{
if (Shards[i].ShardId == LoginShardId)
{
ShardSelected = i;
break;
}
}
if (ShardSelected == -1)
{
CInterfaceManager *pIM = CInterfaceManager::getInstance();
pIM->messageBoxWithHelp(CI18N::get("uiErrServerLost"), "ui:login");
LoginSM.pushEvent(CLoginStateMachine::ev_quit);
}
else
{
LoginSM.pushEvent(CLoginStateMachine::ev_login_ok);
}
}
return;
}
}
// close the socket in case of error
HttpClient.disconnect();
// ignore error
LoginSM.pushEvent(CLoginStateMachine::ev_login_not_alt);
}
// *************************************************************************** // ***************************************************************************
// Called from client.cpp // Called from client.cpp
@ -2732,49 +2781,63 @@ string checkLogin(const string &login, const string &password, const string &cli
string res; string res;
// ask server for salt // don't use login with alt method
if(!HttpClient.sendGet(ClientCfg.ConfigFile.getVar("StartupPage").asString()+"?cmd=ask&login="+login+"&lg="+ClientCfg.LanguageCode, "", pPM->isVerboseLog())) if (!login.empty())
return "Can't send (error code 60)";
if(pPM->isVerboseLog()) nlinfo("Sent request for password salt");
if(!HttpClient.receive(res, pPM->isVerboseLog()))
return "Can't receive (error code 61)";
if(pPM->isVerboseLog()) nlinfo("Received request login check");
if(res.empty())
return "Empty answer from server (error code 62)";
if(res[0] == '0')
{ {
// server returns an error // ask server for salt
nlwarning("server error: %s", res.substr(2).c_str()); if(!HttpClient.sendGet(ClientCfg.ConfigFile.getVar("StartupPage").asString()+"?cmd=ask&login="+login+"&lg="+ClientCfg.LanguageCode, "", pPM->isVerboseLog()))
return res.substr(2); return "Can't send (error code 60)";
}
else if(res[0] == '1')
{
Salt = res.substr(2);
}
else
{
// server returns ???
nlwarning("%s", res.c_str());
return res;
}
// send login + crypted password + client app and cp=1 (as crypted password) if(pPM->isVerboseLog()) nlinfo("Sent request for password salt");
if(!HttpClient.connectToLogin())
return "Can't connect (error code 63)";
if(pPM->isVerboseLog()) nlinfo("Connected"); if(!HttpClient.receive(res, pPM->isVerboseLog()))
return "Can't receive (error code 61)";
if(pPM->isVerboseLog()) nlinfo("Received request login check");
if(res.empty())
return "Empty answer from server (error code 62)";
if(res[0] == '0')
{
// server returns an error
nlwarning("server error: %s", res.substr(2).c_str());
return res.substr(2);
}
else if(res[0] == '1')
{
Salt = res.substr(2);
}
else
{
// server returns ???
nlwarning("%s", res.c_str());
return res;
}
// send login + crypted password + client app and cp=1 (as crypted password)
if(!HttpClient.connectToLogin())
return "Can't connect (error code 63)";
if(pPM->isVerboseLog()) nlinfo("Connected");
}
if (ClientCfg.R2Mode) if (ClientCfg.R2Mode)
{ {
// R2 login sequence // R2 login sequence
std::string cryptedPassword = CCrypt::crypt(password, Salt);
if(!HttpClient.sendGet(ClientCfg.ConfigFile.getVar("StartupPage").asString()+"?cmd=login&login="+login+"&password="+cryptedPassword+"&clientApplication="+clientApp+"&cp=1"+"&lg="+ClientCfg.LanguageCode+customParameters)) if (!login.empty())
return "Can't send (error code 2)"; {
std::string cryptedPassword = CCrypt::crypt(password, Salt);
if(!HttpClient.sendGet(ClientCfg.ConfigFile.getVar("StartupPage").asString()+"?cmd=login&login="+login+"&password="+cryptedPassword+"&clientApplication="+clientApp+"&cp=1"+"&lg="+ClientCfg.LanguageCode+customParameters))
return "Can't send (error code 2)";
}
else
{
// don't send login and password if empty
if(!HttpClient.sendGet(ClientCfg.ConfigFile.getVar("StartupPage").asString()+"?cmd=login&clientApplication="+clientApp+"&cp=1"+"&lg="+ClientCfg.LanguageCode+customParameters))
return "Can't send (error code 2)";
}
// the response should contains the result code and the cookie value // the response should contains the result code and the cookie value
if(pPM->isVerboseLog()) nlinfo("Sent request login check"); if(pPM->isVerboseLog()) nlinfo("Sent request login check");