From b373944e48f169123847cfb4427a33d53a761fe3 Mon Sep 17 00:00:00 2001 From: sje Date: Sat, 30 Jun 2007 17:01:14 +0000 Subject: fix packet reading a bit (i think) add login acks for login errors git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@224 4f64403b-2f21-0410-a795-97e2b3489a10 --- MySpace/server_con.cpp | 72 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 12 deletions(-) (limited to 'MySpace/server_con.cpp') diff --git a/MySpace/server_con.cpp b/MySpace/server_con.cpp index 47bfbcb..bd0d078 100644 --- a/MySpace/server_con.cpp +++ b/MySpace/server_con.cpp @@ -67,6 +67,25 @@ HANDLE FindContact(int uid) { return 0; } +int LookupUID(int uid) { + int ret; + // lookup user + ClientNetMessage msg_lookup; + msg_lookup.add_int("persist", 1); + msg_lookup.add_int("sesskey", sesskey); + msg_lookup.add_int("uid", my_uid); + msg_lookup.add_int("cmd", 1); + msg_lookup.add_int("dsn", 4); + msg_lookup.add_int("lid", 3); + msg_lookup.add_int("rid", ret = req_id++); + char body[512]; + mir_snprintf(body, 512, "UserID=%d", uid); + msg_lookup.add_string("body", body); + SendMessage(msg_lookup); + + return ret; +} + HANDLE CreateContact(int uid, char *nick, char *email) { HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); @@ -232,6 +251,14 @@ void __cdecl ServerThreadFunc(void*) { if(connection) Netlib_CloseHandle(connection); QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++); connection = (HANDLE)CallService(MS_NETLIB_OPENCONNECTION, (WPARAM)hNetlibUser, (LPARAM)&conn_data); + if(!connection) { + if(tries < 9) { + conn_data.wPort = try_ports[tries++]; + } else { + ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_NOSERVER); + break; + } + } } bytes = Netlib_Recv(connection, (char *)recv_buffer, SERVER_READ_BUFFER_SIZE, MSG_DUMPASTEXT); @@ -239,14 +266,18 @@ void __cdecl ServerThreadFunc(void*) { //PUShowMessage("Connection closed", SM_NOTIFY); if(login && tries < 9) { conn_data.wPort = try_ports[tries++]; - } else + } else { + if(login) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_NOSERVER); break; + } } else if(bytes == SOCKET_ERROR) { //PUShowMessage("Socket ERROR", SM_NOTIFY); if(login && tries < 9) { conn_data.wPort = try_ports[tries++]; - } else + } else { + if(login) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_NOSERVER); break; + } } else { if(login) { QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++); @@ -256,21 +287,28 @@ void __cdecl ServerThreadFunc(void*) { } char *pbuff = recv_buffer, *end; - while((end = strstr(pbuff, "\\final\\")) != 0) { + while((end = strstr(pbuff, "\\final\\")) != 0 && (end - recv_buffer <= bytes)) { //mir_snprintf(mt, 256, "recvd %d bytes", bytes); //PUShowMessage(mt, SM_NOTIFY); + end += 7; + if(end - pbuff > bytes) { + //PUShowMessage("More than one packet", SM_NOTIFY); + } if(pbuff != recv_buffer) { - PUShowMessage("Second packet", SM_NOTIFY); + //PUShowMessage("Not first packet", SM_NOTIFY); } - end += 7; - *end = 0; NetMessage msg; - msg.parse(recv_buffer, bytes); + msg.parse(pbuff, bytes); if(msg.exists(NMString("error"))) { char errmsg[256]; - if(msg.get_string("errmsg", errmsg, 256)) + if(msg.get_string("errmsg", errmsg, 256)) { PUShowMessage(errmsg, SM_WARNING); + int code = msg.get_int("Code"); + if(code == 0) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_OTHERLOCATION); + if(code == 259) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_BADUSERID); + if(code == 260) ProtoBroadcastAck(MODULE, 0, ACKTYPE_LOGIN, ACKRESULT_FAILED, (HANDLE)0, (LPARAM)LOGINERR_WRONGPASSWORD); + } } else if(msg.get_int("lc") == 1) { QueueUserAPC(sttMainThreadStatusCallback, mainThread, conn_stat++); try_login(msg, server_connection); @@ -342,7 +380,7 @@ void __cdecl ServerThreadFunc(void*) { HANDLE hContact = FindContact(uid); if(!hContact) { hContact = CreateContact(uid, 0, 0); - // lookup user? + LookupUID(uid); } char smsg[1024]; if(msg.get_string("msg", smsg, 1024)) { @@ -355,6 +393,7 @@ void __cdecl ServerThreadFunc(void*) { HANDLE hContact = FindContact(uid); if(!hContact) { hContact = CreateContact(uid, 0, 0); + LookupUID(uid); } char text[MAX_MESSAGE_SIZE]; if(msg.get_string("msg", text, MAX_MESSAGE_SIZE)) { @@ -378,8 +417,8 @@ void __cdecl ServerThreadFunc(void*) { lid = msg.get_int("lid"); req = msg.get_int("rid"); - mir_snprintf(mt, 256, "Peristr message: type is %d,%d,%d", cmd, dsn, lid); - PUShowMessage(mt, SM_NOTIFY); + //mir_snprintf(mt, 256, "Peristr message: type is %d,%d,%d", cmd, dsn, lid); + //PUShowMessage(mt, SM_NOTIFY); if(cmd == 1 && dsn == 5 && lid == 7) { // userinfo (lookup by username/email) Dictionary body = msg.get_dict("body"); char email[256], nick[256]; @@ -406,6 +445,7 @@ void __cdecl ServerThreadFunc(void*) { if(body.get_string("ErrorMessage", errmsg, 256)) { PUShowMessage(errmsg, SM_WARNING); ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); + ProtoBroadcastAck(MODULE, 0, ACKTYPE_GETINFO, ACKRESULT_FAILED, (HANDLE)0, 0); } else { char email[256], nick[256]; int uid = body.get_int("UserID"); @@ -421,7 +461,15 @@ void __cdecl ServerThreadFunc(void*) { mpsr.psr.email = email; mpsr.uid = uid; + HANDLE hContact = FindContact(uid); + if(hContact) { + if(mpsr.psr.nick) DBWriteContactSettingStringUtf(hContact, MODULE, "Nick", mpsr.psr.nick); + if(mpsr.psr.email) DBWriteContactSettingStringUtf(hContact, MODULE, "email", mpsr.psr.nick); + ProtoBroadcastAck(MODULE, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0); + } + ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)req, (LPARAM)&mpsr); + } ProtoBroadcastAck(MODULE, 0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)req, 0); } @@ -452,7 +500,7 @@ void __cdecl ServerThreadFunc(void*) { } } } - pbuff = end + 1; + pbuff = end; } } } -- cgit v1.2.3