Mercurial > pidgin
diff libpurple/protocols/qq/qq_network.c @ 24135:dbc7a9742f8d
2008.09.26 - ccpaging <ccpaging(at)gmail.com>
* Added 'Request/Add/Remove Buddy' functions
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:35:05 +0000 |
parents | bdfcfd71449c |
children | 87e61a85f5dd |
line wrap: on
line diff
--- a/libpurple/protocols/qq/qq_network.c Wed Oct 22 14:33:20 2008 +0000 +++ b/libpurple/protocols/qq/qq_network.c Wed Oct 22 14:35:05 2008 +0000 @@ -202,7 +202,8 @@ if (qd->curr_server == NULL || strlen (qd->curr_server) == 0 || qd->connect_retry <= 0) { if ( set_new_server(qd) != TRUE) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Failed to connect all servers")); return FALSE; } @@ -220,7 +221,8 @@ qd->connect_retry--; if ( !connect_to_server(gc, server, port) ) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to connect.")); } @@ -353,7 +355,8 @@ qd = (qq_data *) gc->proto_data; if(cond != PURPLE_INPUT_READ) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Socket error")); return; } @@ -377,7 +380,9 @@ return; error_msg = g_strdup_printf(_("Lost connection with server:\n%d, %s"), errno, g_strerror(errno)); - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + error_msg); g_free(error_msg); return; } else if (buf_len == 0) { @@ -479,7 +484,8 @@ qd = (qq_data *) gc->proto_data; if(cond != PURPLE_INPUT_READ) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Socket error")); return; } @@ -489,7 +495,8 @@ /* here we have UDP proxy suppport */ buf_len = read(source, buf, MAX_PACKET_SIZE); if (buf_len <= 0) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to read from socket")); return; } @@ -537,7 +544,9 @@ if (ret < 0) { /* TODO: what to do here - do we really have to disconnect? */ purple_debug_error("UDP_SEND_OUT", "Send failed: %d, %s\n", errno, g_strerror(errno)); - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + g_strerror(errno)); } return ret; } @@ -569,8 +578,9 @@ return; else if (ret < 0) { /* TODO: what to do here - do we really have to disconnect? */ - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Write Error")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Write Error")); return; } @@ -614,7 +624,9 @@ /* TODO: what to do here - do we really have to disconnect? */ purple_debug_error("TCP_SEND_OUT", "Send to socket %d failed: %d, %s\n", qd->fd, errno, g_strerror(errno)); - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + g_strerror(errno)); return ret; } @@ -641,7 +653,8 @@ is_lost_conn = qq_trans_scan(gc); if (is_lost_conn) { purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Connection lost")); + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection lost")); return TRUE; } @@ -674,6 +687,8 @@ { qq_data *qd; const gchar *passwd; + guint8 *dest; + int dest_len = QQ_KEY_LENGTH; /* _qq_show_socket("Got login socket", source); */ @@ -689,14 +704,10 @@ qd->uid = strtol(purple_account_get_username(purple_connection_get_account(gc)), NULL, 10); #ifdef DEBUG - memset(qd->ld.init_key, 0x01, sizeof(qd->ld.init_key)); - memset(qd->ld.captcha_key, 0x02, sizeof(qd->ld.captcha_key)); + memset(qd->ld.random_key, 0x01, sizeof(qd->ld.random_key)); #else - for (bytes = 0; bytes < sizeof(qd->ld.init_key); bytes++) { - qd->ld.init_key[bytes] = (guint8) (rand() & 0xff); - } - for (bytes = 0; bytes < sizeof(qd->captcha_key); bytes++) { - qd->captcha_key[bytes] = (guint8) (rand() & 0xff); + for (bytes = 0; bytes < sizeof(qd->ld.random_key); bytes++) { + qd->ld.random_key[bytes] = (guint8) (rand() & 0xff); } #endif @@ -704,11 +715,13 @@ passwd = purple_account_get_password(purple_connection_get_account(gc)); /* use twice-md5 of user password as session key since QQ 2003iii */ - qq_get_md5(qd->ld.pwd_twice_md5, sizeof(qd->ld.pwd_twice_md5), - (guint8 *)passwd, strlen(passwd)); - qq_get_md5(qd->ld.pwd_twice_md5, sizeof(qd->ld.pwd_twice_md5), - qd->ld.pwd_twice_md5, sizeof(qd->ld.pwd_twice_md5)); + dest = qd->ld.pwd_2nd_md5; + qq_get_md5(dest, dest_len, (guint8 *)passwd, strlen(passwd)); + qq_get_md5(dest, dest_len, dest, dest_len); + dest = qd->ld.pwd_4th_md5; + qq_get_md5(dest, dest_len, qd->ld.pwd_2nd_md5, dest_len); + qq_get_md5(dest, dest_len, dest, dest_len); } /* the callback function after socket is built @@ -758,7 +771,7 @@ set_all_keys( gc ); - if (qd->is_above_2007) { + if (qd->client_version > 2005) { purple_connection_update_progress(gc, _("Get server ..."), 2, QQ_CONNECT_STEPS); qq_request_get_server(gc); return; @@ -836,8 +849,8 @@ if (!hosts || !hosts->data) { purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Couldn't resolve host")); + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't resolve host")); return; } @@ -915,7 +928,8 @@ qd = (qq_data *) gc->proto_data; if (server == NULL || strlen(server) == 0 || port == 0) { - purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Invalid server or port")); return FALSE; } @@ -1006,9 +1020,10 @@ qq_trans_remove_all(gc); - memset(qd->ld.init_key, 0, sizeof(qd->ld.init_key)); - memset(qd->ld.captcha_key, 0, sizeof(qd->ld.captcha_key)); - memset(qd->ld.pwd_twice_md5, 0, sizeof(qd->ld.pwd_twice_md5)); + memset(qd->ld.random_key, 0, sizeof(qd->ld.random_key)); + memset(qd->ld.pwd_2nd_md5, 0, sizeof(qd->ld.pwd_2nd_md5)); + memset(qd->ld.pwd_4th_md5, 0, sizeof(qd->ld.pwd_4th_md5)); + memset(qd->ld.login_key, 0, sizeof(qd->ld.login_key)); memset(qd->session_key, 0, sizeof(qd->session_key)); memset(qd->session_md5, 0, sizeof(qd->session_md5)); @@ -1032,7 +1047,7 @@ } /* now comes the normal QQ packet as UDP */ bytes += qq_put8(buf + bytes, QQ_PACKET_TAG); - bytes += qq_put16(buf + bytes, qd->client_version); + bytes += qq_put16(buf + bytes, qd->client_tag); bytes += qq_put16(buf + bytes, cmd); bytes += qq_put16(buf + bytes, seq); @@ -1079,7 +1094,7 @@ } gint qq_send_cmd_encrypted(PurpleConnection *gc, guint16 cmd, guint16 seq, - guint8 *encrypted_data, gint encrypted_len, gboolean is_save2trans) + guint8 *encrypted, gint encrypted_len, gboolean is_save2trans) { gint sent_len; @@ -1089,9 +1104,9 @@ seq, qq_get_cmd_desc(cmd), cmd, encrypted_len); #endif - sent_len = packet_send_out(gc, cmd, seq, encrypted_data, encrypted_len); + sent_len = packet_send_out(gc, cmd, seq, encrypted, encrypted_len); if (is_save2trans) { - qq_trans_add_client_cmd(gc, cmd, seq, encrypted_data, encrypted_len, 0, 0); + qq_trans_add_client_cmd(gc, cmd, seq, encrypted, encrypted_len, 0, 0); } return sent_len; } @@ -1101,7 +1116,7 @@ guint8 *data, gint data_len, gboolean is_save2trans, gint update_class, guint32 ship32) { qq_data *qd; - guint8 *encrypted_data; + guint8 *encrypted; gint encrypted_len; gint bytes_sent; @@ -1110,18 +1125,18 @@ g_return_val_if_fail(data != NULL && data_len > 0, -1); /* at most 16 bytes more */ - encrypted_data = g_newa(guint8, data_len + 16); - encrypted_len = qq_encrypt(encrypted_data, data, data_len, qd->session_key); + encrypted = g_newa(guint8, data_len + 16); + encrypted_len = qq_encrypt(encrypted, data, data_len, qd->session_key); if (encrypted_len < 16) { purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n", encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); return -1; } - bytes_sent = packet_send_out(gc, cmd, seq, encrypted_data, encrypted_len); + bytes_sent = packet_send_out(gc, cmd, seq, encrypted, encrypted_len); if (is_save2trans) { - qq_trans_add_client_cmd(gc, cmd, seq, encrypted_data, encrypted_len, + qq_trans_add_client_cmd(gc, cmd, seq, encrypted, encrypted_len, update_class, ship32); } return bytes_sent; @@ -1174,7 +1189,7 @@ gint qq_send_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len) { qq_data *qd; - guint8 *encrypted_data; + guint8 *encrypted; gint encrypted_len; gint bytes_sent; @@ -1187,16 +1202,16 @@ seq, qq_get_cmd_desc(cmd), cmd, data_len); #endif /* at most 16 bytes more */ - encrypted_data = g_newa(guint8, data_len + 16); - encrypted_len = qq_encrypt(encrypted_data, data, data_len, qd->session_key); + encrypted = g_newa(guint8, data_len + 16); + encrypted_len = qq_encrypt(encrypted, data, data_len, qd->session_key); if (encrypted_len < 16) { purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] 0x%04X %s\n", encrypted_len, seq, cmd, qq_get_cmd_desc(cmd)); return -1; } - bytes_sent = packet_send_out(gc, cmd, seq, encrypted_data, encrypted_len); - qq_trans_add_server_reply(gc, cmd, seq, encrypted_data, encrypted_len); + bytes_sent = packet_send_out(gc, cmd, seq, encrypted, encrypted_len); + qq_trans_add_server_reply(gc, cmd, seq, encrypted, encrypted_len); return bytes_sent; } @@ -1207,7 +1222,7 @@ qq_data *qd; guint8 *buf; gint buf_len; - guint8 *encrypted_data; + guint8 *encrypted; gint encrypted_len; gint bytes_sent; guint16 seq; @@ -1232,17 +1247,17 @@ qd->send_seq++; seq = qd->send_seq; - /* Encrypt to encrypted_data with session_key */ + /* Encrypt to encrypted with session_key */ /* at most 16 bytes more */ - encrypted_data = g_newa(guint8, buf_len + 16); - encrypted_len = qq_encrypt(encrypted_data, buf, buf_len, qd->session_key); + encrypted = g_newa(guint8, buf_len + 16); + encrypted_len = qq_encrypt(encrypted, buf, buf_len, qd->session_key); if (encrypted_len < 16) { purple_debug_error("QQ_ENCRYPT", "Error len %d: [%05d] %s (0x%02X)\n", encrypted_len, seq, qq_get_room_cmd_desc(room_cmd), room_cmd); return -1; } - bytes_sent = packet_send_out(gc, QQ_CMD_ROOM, seq, encrypted_data, encrypted_len); + bytes_sent = packet_send_out(gc, QQ_CMD_ROOM, seq, encrypted, encrypted_len); #if 1 /* qq_show_packet("send_room_cmd", buf, buf_len); */ purple_debug_info("QQ", @@ -1250,7 +1265,7 @@ seq, qq_get_room_cmd_desc(room_cmd), room_cmd, room_id, buf_len); #endif - qq_trans_add_room_cmd(gc, seq, room_cmd, room_id, encrypted_data, encrypted_len, + qq_trans_add_room_cmd(gc, seq, room_cmd, room_id, encrypted, encrypted_len, update_class, ship32); return bytes_sent; } @@ -1258,6 +1273,7 @@ gint qq_send_room_cmd_mess(PurpleConnection *gc, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len, gint update_class, guint32 ship32) { + g_return_val_if_fail(room_id > 0, -1); return send_room_cmd(gc, room_cmd, room_id, data, data_len, update_class, ship32); }