login protocol cancel

This commit is contained in:
Eduardo Bart 2011-08-16 01:24:20 -03:00
parent 3d4cfb793e
commit 65c1867f55
6 changed files with 34 additions and 54 deletions

View File

@ -1,55 +1,36 @@
function EnterGame_connectToLoginServer()
-- create login protocol
local protocolLogin = ProtocolLogin.create()
-- used to recreate enter game window
local recreateEnterGame = function()
loadUI("/mainmenu/ui/entergamewindow.otui")
rootWidget:addChild(loadUI("/mainmenu/ui/entergamewindow.otui"))
end
-- display loading message box
local loadBox = displayCancelBox("Please wait", "Connecting..")
-- cancel loading callback
loadBox.onCancel = function(msgbox)
-- cancel protocol and reacreate enter game window
protocolLogin:cancel()
protocolLogin:cancelLogin()
recreateEnterGame()
end
-- error callback
protocolLogin.onError = function(protocol, error)
-- destroy loading message box
loadBox:destroy()
-- display error message
local errorBox = displayErrorBox("Login Error", error)
-- cancel protocol and reacreate enter game window
protocol:cancel()
errorBox.onOk = recreateEnterGame
end
-- motd callback
protocolLogin.onMotd = function(protocol, motd)
-- destroy loading message box
loadBox:destroy()
-- display motd
local motdNumber = string.sub(motd, 0, string.find(motd, "\n"))
local motdText = string.sub(motd, string.find(motd, "\n") + 1, string.len(motd))
local motdBox = displayInfoBox("Message of the day", motdText)
-- hide main menu
displayInfoBox("Message of the day", motdText)
mainMenu.visible = false
end
-- get account and password then login
local enterGameWindow = rootWidget:getChild("enterGameWindow")
local account = enterGameWindow:getChild("accountNameLineEdit").text
local password = enterGameWindow:getChild("accountPasswordLineEdit").text
protocolLogin:login(account, password)
-- destroy enter game window
enterGameWindow:destroy()
end

View File

@ -11,45 +11,45 @@ void InputMessage::reset()
m_messageSize = 2;
}
uint8 InputMessage::getU8(bool blockReadPos)
uint8 InputMessage::getU8(bool peek)
{
assert(canRead(1));
uint8 v = m_buffer[m_readPos];
if(!blockReadPos)
if(!peek)
m_readPos += 1;
return v;
}
uint16 InputMessage::getU16(bool blockReadPos)
uint16 InputMessage::getU16(bool peek)
{
assert(canRead(2));
uint16 v = *(uint16_t*)(m_buffer + m_readPos);
if(!blockReadPos)
if(!peek)
m_readPos += 2;
return v;
}
uint32 InputMessage::getU32(bool blockReadPos)
uint32 InputMessage::getU32(bool peek)
{
assert(canRead(4));
uint32 v = *(uint32*)(m_buffer + m_readPos);
if(!blockReadPos)
if(!peek)
m_readPos += 4;
return v;
}
uint64 InputMessage::getU64(bool blockReadPos)
uint64 InputMessage::getU64(bool peek)
{
assert(canRead(8));
uint64 v = *(uint64*)(m_buffer + m_readPos);
if(!blockReadPos)
if(!peek)
m_readPos += 8;
return v;

View File

@ -20,17 +20,17 @@ public:
void reset();
uint8 getU8(bool blockReadPos = false);
uint16 getU16(bool blockReadPos = false);
uint32 getU32(bool blockReadPos = false);
uint64 getU64(bool blockReadPos = false);
uint8 getU8(bool peek = false);
uint16 getU16(bool peek = false);
uint32 getU32(bool peek = false);
uint64 getU64(bool peek = false);
std::string getString();
void skipBytes(uint16 bytes) { m_readPos += bytes; }
uint8* getBuffer() { return m_buffer; }
uint16 getMessageSize() { return m_messageSize; }
void setMessageSize(uint16 messageSize) { m_messageSize = messageSize; }
bool end() { return m_readPos == m_messageSize; }
bool eof() { return m_readPos == m_messageSize; }
private:
bool canRead(int bytes);

View File

@ -8,7 +8,7 @@
void ProtocolGame::parseMessage(InputMessage& msg)
{
while(!msg.end()) {
while(!msg.eof()) {
uint8 opt = msg.getU8();
switch(opt) {
case 0x0A:

View File

@ -26,7 +26,7 @@ void ProtocolGame::sendLoginPacket(uint32 timestamp, uint8 unknown)
oMsg.addU32(timestamp);
oMsg.addU8(unknown);
// fill the rest with zeros
// complete the 128 bytes for rsa encryption with zeros
oMsg.addPaddingBytes(128 - (29 + m_accountName.length() + m_characterName.length() + m_accountPassword.length()));
// encrypt with RSA

View File

@ -36,7 +36,7 @@ void ProtocolLogin::onConnect()
void ProtocolLogin::onRecv(InputMessage& inputMessage)
{
while(!inputMessage.end()) {
while(!inputMessage.eof()) {
uint8 opt = inputMessage.getU8();
switch(opt) {
case 0x0A:
@ -65,30 +65,29 @@ void ProtocolLogin::sendLoginPacket()
{
OutputMessage oMsg;
oMsg.addU8(0x01); // Protocol id
oMsg.addU16(0x02); // OS
oMsg.addU16(862); // Client version
oMsg.addU8(0x01); // protocol id
oMsg.addU16(0x02); // os
oMsg.addU16(862); // client version
oMsg.addU32(0x4E12DAFF); // Data Signature
oMsg.addU32(0x4E12DB27); // Sprite Signature
oMsg.addU32(0x4E119CBF); // Picture Signature
oMsg.addU32(0x4E12DAFF); // data signature
oMsg.addU32(0x4E12DB27); // sprite signature
oMsg.addU32(0x4E119CBF); // pic signature
oMsg.addU8(0); // First RSA byte must be 0x00 // 1
oMsg.addU8(0); // first RSA byte must be 0
// Add xtea key
// xtea key
generateXteaKey();
oMsg.addU32(m_xteaKey[0]); // 5
oMsg.addU32(m_xteaKey[1]); // 9
oMsg.addU32(m_xteaKey[2]); // 13
oMsg.addU32(m_xteaKey[3]); // 17
oMsg.addU32(m_xteaKey[0]);
oMsg.addU32(m_xteaKey[1]);
oMsg.addU32(m_xteaKey[2]);
oMsg.addU32(m_xteaKey[3]);
oMsg.addString(m_accountName); // Account Name // 19
oMsg.addString(m_accountPassword); // Password // 21
oMsg.addString(m_accountName);
oMsg.addString(m_accountPassword);
// Packet data must have since byte 0, start, 128 bytes
// complete the 128 bytes for rsa encryption with zeros
oMsg.addPaddingBytes(128 - (21 + m_accountName.length() + m_accountPassword.length()));
// Encrypt msg with RSA
if(!Rsa::encrypt((char*)oMsg.getBuffer() + 6 + oMsg.getMessageSize() - 128, 128, OTSERV_PUBLIC_RSA))
return;