Mercurial > pidgin
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); |