comparison libpurple/protocols/qq/qq_base.c @ 24145:ec3f7d3e0445

2008.10.04 - lonicerae <lonicerae(at)gmail.com> * fixed a bug in qq_base.c
author SHiNE CsyFeK <csyfek@gmail.com>
date Wed, 22 Oct 2008 14:49:38 +0000
parents c2253c485728
children ce94189f15ad
comparison
equal deleted inserted replaced
24144:a95c7e71064c 24145:ec3f7d3e0445
64 struct in_addr ip; 64 struct in_addr ip;
65 guint16 port; 65 guint16 port;
66 struct tm *tm_local; 66 struct tm *tm_local;
67 67
68 qd = (qq_data *) gc->proto_data; 68 qd = (qq_data *) gc->proto_data;
69 /* qq_show_packet("Login reply", data, len); */ 69 qq_show_packet("Login reply", data, len);
70 70
71 if (len < 139) { 71 if (len < 139) {
72 purple_connection_error_reason(gc, 72 purple_connection_error_reason(gc,
73 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, 73 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
74 _("Can not decrypt get server reply")); 74 _("Can not decrypt get server reply"));
663 } 663 }
664 664
665 qd->redirect_len = data_len; 665 qd->redirect_len = data_len;
666 qd->redirect = g_realloc(qd->redirect, qd->redirect_len); 666 qd->redirect = g_realloc(qd->redirect, qd->redirect_len);
667 qq_getdata(qd->redirect, qd->redirect_len, data); 667 qq_getdata(qd->redirect, qd->redirect_len, data);
668 /* qq_show_packet("Redirect to", qd->redirect, qd->redirect_len); */ 668 qq_show_packet("Redirect to", qd->redirect, qd->redirect_len);
669 669
670 qq_getIP(&qd->redirect_ip, data + 11); 670 qq_getIP(&qd->redirect_ip, data + 11);
671 purple_debug_info("QQ", "Get server %s\n", inet_ntoa(qd->redirect_ip)); 671 purple_debug_info("QQ", "Get server %s\n", inet_ntoa(qd->redirect_ip));
672 return QQ_LOGIN_REPLY_REDIRECT; 672 return QQ_LOGIN_REPLY_REDIRECT;
673 } 673 }
910 bytes += qq_get8(&reply, data + bytes); 910 bytes += qq_get8(&reply, data + bytes);
911 911
912 bytes += qq_get16(&(qd->ld.token_ex_len), data + bytes); 912 bytes += qq_get16(&(qd->ld.token_ex_len), data + bytes);
913 qd->ld.token_ex = g_realloc(qd->ld.token_ex, qd->ld.token_ex_len); 913 qd->ld.token_ex = g_realloc(qd->ld.token_ex, qd->ld.token_ex_len);
914 bytes += qq_getdata(qd->ld.token_ex, qd->ld.token_ex_len, data + bytes); 914 bytes += qq_getdata(qd->ld.token_ex, qd->ld.token_ex_len, data + bytes);
915 /* qq_show_packet("Get token ex", qd->ld.token_ex, qd->ld.token_ex_len); */ 915 qq_show_packet("Get token ex", qd->ld.token_ex, qd->ld.token_ex_len);
916 916
917 if(reply != 1) 917 if(reply != 1)
918 { 918 {
919 purple_debug_info("QQ", "Captcha verified, result %d\n", reply); 919 purple_debug_info("QQ", "Captcha verified, result %d\n", reply);
920 return QQ_LOGIN_REPLY_OK; 920 return QQ_LOGIN_REPLY_OK;
930 bytes += qq_get8(&qd->captcha.next_index, data + bytes); 930 bytes += qq_get8(&qd->captcha.next_index, data + bytes);
931 931
932 bytes += qq_get16(&qd->captcha.token_len, data + bytes); 932 bytes += qq_get16(&qd->captcha.token_len, data + bytes);
933 qd->captcha.token = g_realloc(qd->captcha.token, qd->captcha.token_len); 933 qd->captcha.token = g_realloc(qd->captcha.token, qd->captcha.token_len);
934 bytes += qq_getdata(qd->captcha.token, qd->captcha.token_len, data + bytes); 934 bytes += qq_getdata(qd->captcha.token, qd->captcha.token_len, data + bytes);
935 /* qq_show_packet("Get captcha token", qd->captcha.token, qd->captcha.token_len); */ 935 qq_show_packet("Get captcha token", qd->captcha.token, qd->captcha.token_len);
936 936
937 purple_debug_info("QQ", "Request next captcha %d, new %d, total %d\n", 937 purple_debug_info("QQ", "Request next captcha %d, new %d, total %d\n",
938 qd->captcha.next_index, captcha_len, qd->captcha.data_len); 938 qd->captcha.next_index, captcha_len, qd->captcha.data_len);
939 if(qd->captcha.next_index > 0) 939 if(qd->captcha.next_index > 0)
940 { 940 {
1036 bytes += qq_put16(raw_data + bytes, 0x0003); 1036 bytes += qq_put16(raw_data + bytes, 0x0003);
1037 bytes += qq_put8(raw_data + bytes, 0); 1037 bytes += qq_put8(raw_data + bytes, 0);
1038 bytes += qq_put8(raw_data + bytes, qd->ld.pwd_md5[1]); 1038 bytes += qq_put8(raw_data + bytes, qd->ld.pwd_md5[1]);
1039 bytes += qq_put8(raw_data + bytes, qd->ld.pwd_md5[2]); 1039 bytes += qq_put8(raw_data + bytes, qd->ld.pwd_md5[2]);
1040 1040
1041 /* qq_show_packet("Check password", raw_data, bytes); */ 1041 qq_show_packet("Check password", raw_data, bytes);
1042 /* Encrypted by random key*/ 1042 /* Encrypted by random key*/
1043 encrypted_len = qq_encrypt(encrypted, raw_data, bytes, qd->ld.random_key); 1043 encrypted_len = qq_encrypt(encrypted, raw_data, bytes, qd->ld.random_key);
1044 1044
1045 buf = g_newa(guint8, MAX_PACKET_SIZE); 1045 buf = g_newa(guint8, MAX_PACKET_SIZE);
1046 memset(buf, 0, MAX_PACKET_SIZE); 1046 memset(buf, 0, MAX_PACKET_SIZE);
1066 g_return_val_if_fail(data != NULL && data_len != 0, QQ_LOGIN_REPLY_ERR); 1066 g_return_val_if_fail(data != NULL && data_len != 0, QQ_LOGIN_REPLY_ERR);
1067 1067
1068 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, QQ_LOGIN_REPLY_ERR); 1068 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, QQ_LOGIN_REPLY_ERR);
1069 qd = (qq_data *) gc->proto_data; 1069 qd = (qq_data *) gc->proto_data;
1070 1070
1071 /* qq_show_packet("Check password reply", data, data_len); */ 1071 qq_show_packet("Check password reply", data, data_len);
1072 1072
1073 bytes = 0; 1073 bytes = 0;
1074 bytes += qq_get16(&unknow_token_len, data + bytes); /* maybe total length */ 1074 bytes += qq_get16(&unknow_token_len, data + bytes); /* maybe total length */
1075 bytes += qq_get8(&ret, data + bytes); 1075 bytes += qq_get8(&ret, data + bytes);
1076 bytes += 4; /* 0x(00 00 6d b9) */ 1076 bytes += 4; /* 0x(00 00 6d b9) */
1084 /* get login_token */ 1084 /* get login_token */
1085 bytes += qq_get16(&qd->ld.login_token_len, data + bytes); 1085 bytes += qq_get16(&qd->ld.login_token_len, data + bytes);
1086 if (qd->ld.login_token != NULL) g_free(qd->ld.login_token); 1086 if (qd->ld.login_token != NULL) g_free(qd->ld.login_token);
1087 qd->ld.login_token = g_new0(guint8, qd->ld.login_token_len); 1087 qd->ld.login_token = g_new0(guint8, qd->ld.login_token_len);
1088 bytes += qq_getdata(qd->ld.login_token, qd->ld.login_token_len, data + bytes); 1088 bytes += qq_getdata(qd->ld.login_token, qd->ld.login_token_len, data + bytes);
1089 /* qq_show_packet("Get login token", qd->ld.login_token, qd->ld.login_token_len); */ 1089 qq_show_packet("Get login token", qd->ld.login_token, qd->ld.login_token_len);
1090
1091 /* get login_key */ 1090 /* get login_key */
1092 bytes += qq_getdata(qd->ld.login_key, sizeof(qd->ld.login_key), data + bytes); 1091 bytes += qq_getdata(qd->ld.login_key, sizeof(qd->ld.login_key), data + bytes);
1093 /* qq_show_packet("Get login key", qd->ld.login_key, sizeof(qd->ld.login_key)); */ 1092 qq_show_packet("Get login key", qd->ld.login_key, sizeof(qd->ld.login_key));
1094 return QQ_LOGIN_REPLY_OK; 1093 return QQ_LOGIN_REPLY_OK;
1095 } 1094 }
1096 1095
1097 switch (ret) 1096 switch (ret)
1098 { 1097 {
1201 bytes += qq_put8(raw_data + bytes, qd->login_mode); 1200 bytes += qq_put8(raw_data + bytes, qd->login_mode);
1202 /* unknow 10 bytes zero filled*/ 1201 /* unknow 10 bytes zero filled*/
1203 memset(raw_data + bytes, 0, 10); 1202 memset(raw_data + bytes, 0, 10);
1204 bytes += 10; 1203 bytes += 10;
1205 /* redirect data, 15 bytes */ 1204 /* redirect data, 15 bytes */
1206 /* qq_show_packet("Redirect", qd->redirect, qd->redirect_len); */ 1205 qq_show_packet("Redirect", qd->redirect, qd->redirect_len);
1207 bytes += qq_putdata(raw_data + bytes, qd->redirect, qd->redirect_len); 1206 bytes += qq_putdata(raw_data + bytes, qd->redirect, qd->redirect_len);
1208 /* unknow fill */ 1207 /* unknow fill */
1209 bytes += qq_putdata(raw_data + bytes, login_2_16, sizeof(login_2_16)); 1208 bytes += qq_putdata(raw_data + bytes, login_2_16, sizeof(login_2_16));
1210 /* captcha token get from qq_process_token_ex */ 1209 /* captcha token get from qq_process_token_ex */
1211 bytes += qq_put8(raw_data + bytes, (guint8)(qd->ld.token_ex_len & 0xff)); 1210 bytes += qq_put8(raw_data + bytes, (guint8)(qd->ld.token_ex_len & 0xff));
1213 /* unknow fill */ 1212 /* unknow fill */
1214 bytes += qq_putdata(raw_data + bytes, login_3_83, sizeof(login_3_83)); 1213 bytes += qq_putdata(raw_data + bytes, login_3_83, sizeof(login_3_83));
1215 memset(raw_data + bytes, 0, 332 - sizeof(login_3_83)); 1214 memset(raw_data + bytes, 0, 332 - sizeof(login_3_83));
1216 bytes += 332 - sizeof(login_3_83); 1215 bytes += 332 - sizeof(login_3_83);
1217 1216
1218 /* qq_show_packet("Login", raw_data, bytes); */ 1217 qq_show_packet("Login", raw_data, bytes);
1219 1218
1220 encrypted_len = qq_encrypt(encrypted, raw_data, bytes, qd->ld.login_key); 1219 encrypted_len = qq_encrypt(encrypted, raw_data, bytes, qd->ld.login_key);
1221 1220
1222 buf = g_newa(guint8, MAX_PACKET_SIZE); 1221 buf = g_newa(guint8, MAX_PACKET_SIZE);
1223 memset(buf, 0, MAX_PACKET_SIZE); 1222 memset(buf, 0, MAX_PACKET_SIZE);
1241 gchar *error; 1240 gchar *error;
1242 gchar *msg; 1241 gchar *msg;
1243 gchar *msg_utf8; 1242 gchar *msg_utf8;
1244 1243
1245 g_return_val_if_fail(data != NULL && data_len != 0, QQ_LOGIN_REPLY_ERR); 1244 g_return_val_if_fail(data != NULL && data_len != 0, QQ_LOGIN_REPLY_ERR);
1245 purple_debug_info("QQ", "FN_base, GO\n");
1246 1246
1247 qd = (qq_data *) gc->proto_data; 1247 qd = (qq_data *) gc->proto_data;
1248 1248
1249 bytes = 0; 1249 bytes = 0;
1250 bytes += qq_get8(&ret, data + bytes); 1250 bytes += qq_get8(&ret, data + bytes);
1251 if (ret != 0) { 1251 if (ret != 0) {
1252 purple_debug_info("QQ", "FN_base, RET!=0\n");
1252 msg = g_strndup((gchar *)data + bytes, data_len - bytes); 1253 msg = g_strndup((gchar *)data + bytes, data_len - bytes);
1253 msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); 1254 msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT);
1254 1255
1256 purple_debug_info("QQ", "FN_base, SW RET now\n");
1255 switch (ret) { 1257 switch (ret) {
1256 case 0x05: 1258 case 0x05:
1259 purple_debug_info("QQ", "FN_base, RET:0x%02x\n", ret);
1257 error = g_strdup_printf( 1260 error = g_strdup_printf(
1258 _("Server is busy now (0x%02X), Please try later\n%s"), 1261 _("Server is busy now, Please try later\n%s"),
1259 ret, msg_utf8); 1262 msg_utf8);
1260 break; 1263 break;
1261 case 0x0A: 1264 case 0x0A:
1262 /* 0a 2d 9a 4b 9a 01 01 00 00 00 05 00 00 00 00 79 0e 5f fd */ 1265 /* 0a 2d 9a 4b 9a 01 01 00 00 00 05 00 00 00 00 79 0e 5f fd */
1263 /* Missing get server before login*/
1264 default: 1266 default:
1265 error = g_strdup_printf( 1267 error = g_strdup_printf(
1266 _("Unknow reply code when login (0x%02X):\n%s"), 1268 _("Unknow reply code when login (0x%02X):\n%s"),
1267 ret, msg_utf8); 1269 ret, msg_utf8);
1268 break; 1270 break;
1408 bytes += qq_putdata(raw_data + bytes, login_6_16, sizeof(login_6_16)); 1410 bytes += qq_putdata(raw_data + bytes, login_6_16, sizeof(login_6_16));
1409 /* unknow 249 bytes zero filled*/ 1411 /* unknow 249 bytes zero filled*/
1410 memset(raw_data + bytes, 0, 249); 1412 memset(raw_data + bytes, 0, 249);
1411 bytes += 249; 1413 bytes += 249;
1412 1414
1413 /* qq_show_packet("Login request", raw_data, bytes); */ 1415 qq_show_packet("Login request", raw_data, bytes);
1414 encrypted_len = qq_encrypt(encrypted, raw_data, bytes, qd->ld.login_key); 1416 encrypted_len = qq_encrypt(encrypted, raw_data, bytes, qd->ld.login_key);
1415 1417
1416 buf = g_newa(guint8, MAX_PACKET_SIZE); 1418 buf = g_newa(guint8, MAX_PACKET_SIZE);
1417 memset(buf, 0, MAX_PACKET_SIZE); 1419 memset(buf, 0, MAX_PACKET_SIZE);
1418 bytes = 0; 1420 bytes = 0;
1446 msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); 1448 msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT);
1447 1449
1448 switch (ret) { 1450 switch (ret) {
1449 case 0x05: 1451 case 0x05:
1450 error = g_strdup_printf( 1452 error = g_strdup_printf(
1451 _("Server is busy now (0x%02X), Please try later\n%s"), 1453 _("Server is busy now, Please try later\n%s"),
1452 ret, msg_utf8); 1454 msg_utf8);
1453 break; 1455 break;
1454 default: 1456 default:
1455 error = g_strdup_printf( 1457 error = g_strdup_printf(
1456 _("Unknow reply code when login (0x%02X):\n%s"), 1458 _("Unknow reply code when login (0x%02X):\n%s"),
1457 ret, msg_utf8); 1459 ret, msg_utf8);