# HG changeset patch # User andrew.victor@mxit.com # Date 1304493703 0 # Node ID bb4eaf8e70d6fe886a0eca46f1047e307477745d # Parent 08dccf5274573754959344ccd3dfed747c47b508# Parent 5ec6859bf81a49d34982a82502ea799d81994fd1 propagate from branch 'im.pidgin.pidgin' (head b4610e0aa7f5df4daa5d4ad90ce8a8d80f46e0fe) to branch 'im.pidgin.pidgin.mxit' (head 8b579559174d8853ab2218dac2e81e3ba5baead2) diff -r 08dccf527457 -r bb4eaf8e70d6 COPYRIGHT --- a/COPYRIGHT Tue May 03 20:29:59 2011 +0000 +++ b/COPYRIGHT Wed May 04 07:21:43 2011 +0000 @@ -48,6 +48,7 @@ Stefan Becker Carlos Bederian Dave Bell +Matthew W.S. Bell Igor Belyi David Benjamin Brian Bernas diff -r 08dccf527457 -r bb4eaf8e70d6 ChangeLog --- a/ChangeLog Tue May 03 20:29:59 2011 +0000 +++ b/ChangeLog Wed May 04 07:21:43 2011 +0000 @@ -34,6 +34,9 @@ (Kartik Mohta) (#1131) * media: Allow libpurple and plugins to set SDES properties for RTP conferences. (Jakub Adam) (#12981) + * proxy: Add new "Tor/Privacy" proxy type that can be used to restrict + operations that could leak potentially sensitive data (e.g. DNS queries). + (#11110, #13928) Gadu-Gadu: * Allow showing your status only to buddies. (Mateusz Piękos) (#13358) @@ -86,6 +89,8 @@ XMPP: * Remember the previously entered user directory when searching. (Keith Moyer) (#12451) + * Correctly handle a buddy's unsetting his/her vCard-based avatar. + (Matthew W.S. Bell) (#13370) Plugins: * The Voice/Video Settings plugin now includes the ability to test @@ -96,7 +101,7 @@ Windows-Specific Changes: * Fix building libpurple with Visual C++ .NET 2005. This was accidentally broken in 2.7.11. (Florian Quèze) - * Build internal libgadu without -mms-bitfields, fixing several + * Build internal libgadu using packed structs, fixing several long-standing Gadu-Gadu issues. (#11958, #6297) version 2.7.11 (03/10/2011): diff -r 08dccf527457 -r bb4eaf8e70d6 finch/gntnotify.c --- a/finch/gntnotify.c Tue May 03 20:29:59 2011 +0000 +++ b/finch/gntnotify.c Wed May 04 07:21:43 2011 +0000 @@ -84,6 +84,10 @@ if (secondary) { GntWidget *msg; + /* XXX: This is broken. type is PurpleNotifyMsgType, not + * PurpleNotifyType. Also, the if() followed by the + * inner switch doesn't make much sense. + */ if (type == PURPLE_NOTIFY_FORMATTED) { int width = -1, height = -1; char *plain = (char*)secondary; diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/dnsquery.c --- a/libpurple/dnsquery.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/dnsquery.c Wed May 04 07:21:43 2011 +0000 @@ -24,6 +24,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * */ +#define _PURPLE_DNSQUERY_C_ #include "internal.h" #include "debug.h" diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/dnsquery.h --- a/libpurple/dnsquery.h Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/dnsquery.h Wed May 04 07:21:43 2011 +0000 @@ -102,7 +102,7 @@ */ PurpleDnsQueryData *purple_dnsquery_a_account(PurpleAccount *account, const char *hostname, int port, PurpleDnsQueryConnectFunction callback, gpointer data); -#ifndef PURPLE_DISABLE_DEPRECATED +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSQUERY_C_) /** * Perform an asynchronous DNS query. * diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/dnssrv.c --- a/libpurple/dnssrv.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/dnssrv.c Wed May 04 07:21:43 2011 +0000 @@ -20,6 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#define _PURPLE_DNSSRV_C_ #include "internal.h" #include "util.h" diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/dnssrv.h --- a/libpurple/dnssrv.h Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/dnssrv.h Wed May 04 07:21:43 2011 +0000 @@ -114,7 +114,7 @@ */ PurpleSrvTxtQueryData *purple_srv_resolve_account(PurpleAccount *account, const char *protocol, const char *transport, const char *domain, PurpleSrvCallback cb, gpointer extradata); -#ifndef PURPLE_DISABLE_DEPRECATED +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_) /** * Queries an SRV record. * @@ -149,7 +149,7 @@ */ PurpleSrvTxtQueryData *purple_txt_resolve_account(PurpleAccount *account, const char *owner, const char *domain, PurpleTxtCallback cb, gpointer extradata); -#ifndef PURPLE_DISABLE_DEPRECATED +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_DNSSRV_C_) /** * Queries an TXT record. * diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/bonjour/jabber.c --- a/libpurple/protocols/bonjour/jabber.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Wed May 04 07:21:43 2011 +0000 @@ -831,12 +831,45 @@ if (source < 0) { PurpleConversation *conv = NULL; PurpleAccount *account = NULL; + GSList *tmp = bb->ips; - purple_debug_error("bonjour", "Error connecting to buddy %s at %s:%d error: %s\n", - purple_buddy_get_name(pb), bb->conversation->ip, bb->port_p2pj, error ? error : "(null)"); + purple_debug_error("bonjour", "Error connecting to buddy %s at %s:%d (%s); Trying next IP address\n", + purple_buddy_get_name(pb), bb->conversation->ip, bb->port_p2pj, error); + + /* There may be multiple entries for the same IP - one per + * presence recieved (e.g. multiple interfaces). + * We need to make sure that we find the previously used entry. + */ + while (tmp && bb->conversation->ip_link != tmp->data) + tmp = g_slist_next(tmp); + if (tmp) + tmp = g_slist_next(tmp); account = purple_buddy_get_account(pb); + if (tmp != NULL) { + const gchar *ip; + PurpleProxyConnectData *connect_data; + + bb->conversation->ip_link = ip = tmp->data; + + purple_debug_info("bonjour", "Starting conversation with %s at %s:%d\n", + purple_buddy_get_name(pb), ip, bb->port_p2pj); + + connect_data = purple_proxy_connect(purple_account_get_connection(account), + account, ip, bb->port_p2pj, _connected_to_buddy, pb); + + if (connect_data != NULL) { + g_free(bb->conversation->ip); + bb->conversation->ip = g_strdup(ip); + bb->conversation->connect_data = connect_data; + + return; + } + } + + purple_debug_error("bonjour", "No more addresses for buddy %s. Aborting", purple_buddy_get_name(pb)); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, account); if (conv != NULL) purple_conversation_write(conv, NULL, @@ -995,10 +1028,9 @@ { PurpleProxyConnectData *connect_data; PurpleProxyInfo *proxy_info; - /* For better or worse, use the first IP*/ - const char *ip = bb->ips->data; + const char *ip = bb->ips->data; /* Start with the first IP address. */ - purple_debug_info("bonjour", "Starting conversation with %s\n", to); + purple_debug_info("bonjour", "Starting conversation with %s at %s:%d\n", to, ip, bb->port_p2pj); /* Make sure that the account always has a proxy of "none". * This is kind of dirty, but proxy_connect_none() isn't exposed. */ @@ -1021,6 +1053,7 @@ bb->conversation = bonjour_jabber_conv_new(pb, jdata->account, ip); bb->conversation->connect_data = connect_data; + bb->conversation->ip_link = ip; /* We don't want _send_data() to register the tx_handler; * that neeeds to wait until we're actually connected. */ bb->conversation->tx_handler = 0; diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/bonjour/jabber.h --- a/libpurple/protocols/bonjour/jabber.h Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/bonjour/jabber.h Wed May 04 07:21:43 2011 +0000 @@ -63,6 +63,8 @@ /* The following are only needed before attaching to a PurpleBuddy */ gchar *buddy_name; gchar *ip; + /* This points to a data entry in BonjourBuddy->ips */ + const gchar *ip_link; } BonjourJabberConversation; /** diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/gg/gg.c Wed May 04 07:21:43 2011 +0000 @@ -818,7 +818,6 @@ static void ggp_callback_add_to_chat_ok(PurpleBuddy *buddy, PurpleRequestFields *fields) { - GGPInfo *info; PurpleConnection *conn; PurpleRequestField *field; GList *sel; @@ -827,8 +826,6 @@ g_return_if_fail(conn != NULL); - info = conn->proto_data; - field = purple_request_fields_get_field(fields, "name"); sel = purple_request_field_list_get_selected(field); @@ -2595,9 +2592,6 @@ static void ggp_register_user(PurpleAccount *account) { PurpleConnection *gc = purple_account_get_connection(account); - GGPInfo *info; - - info = gc->proto_data = g_new0(GGPInfo, 1); ggp_token_request(gc, ggp_register_user_dialog); } diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/jabber/presence.c --- a/libpurple/protocols/jabber/presence.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/jabber/presence.c Wed May 04 07:21:43 2011 +0000 @@ -450,21 +450,23 @@ g_free(nickname); } - if ((photo = xmlnode_get_child(vcard, "PHOTO")) && - (binval = xmlnode_get_child(photo, "BINVAL")) && - (text = xmlnode_get_data(binval))) { - guchar *data; - gsize size; + if ((photo = xmlnode_get_child(vcard, "PHOTO"))) { + guchar *data = NULL; + gchar *hash = NULL; + gsize size = 0; - data = purple_base64_decode(text, &size); - if (data) { - gchar *hash = jabber_calculate_data_hash(data, size, "sha1"); - purple_buddy_icons_set_for_user(js->gc->account, from, data, - size, hash); - g_free(hash); + if ((binval = xmlnode_get_child(photo, "BINVAL")) && + (text = xmlnode_get_data(binval))) { + data = purple_base64_decode(text, &size); + g_free(text); + + if (data) + hash = jabber_calculate_data_hash(data, size, "sha1"); } - g_free(text); + purple_buddy_icons_set_for_user(js->gc->account, from, data, size, hash); + + g_free(hash); } } } @@ -840,20 +842,22 @@ } } - if(b && presence->vcard_avatar_hash) { - const char *avatar_hash2 = purple_buddy_icons_get_checksum_for_user(b); - if(!avatar_hash2 || strcmp(presence->vcard_avatar_hash, avatar_hash2)) { - JabberIq *iq; - xmlnode *vcard; - + if (b && presence->vcard_avatar_hash) { + const char *ah = presence->vcard_avatar_hash[0] != '\0' ? + presence->vcard_avatar_hash : NULL; + const char *ah2 = purple_buddy_icons_get_checksum_for_user(b); + if (!purple_strequal(ah, ah2)) { /* XXX this is a crappy way of trying to prevent * someone from spamming us with presence packets * and causing us to DoS ourselves...what we really * need is a queue system that can throttle itself, * but i'm too tired to write that right now */ if(!g_slist_find(js->pending_avatar_requests, presence->jb)) { + JabberIq *iq; + xmlnode *vcard; - js->pending_avatar_requests = g_slist_prepend(js->pending_avatar_requests, presence->jb); + js->pending_avatar_requests = + g_slist_prepend(js->pending_avatar_requests, presence->jb); iq = jabber_iq_new(js, JABBER_IQ_GET); xmlnode_set_attrib(iq->node, "to", buddy_name); @@ -1206,9 +1210,13 @@ parse_vcard_avatar(JabberStream *js, JabberPresence *presence, xmlnode *x) { xmlnode *photo = xmlnode_get_child(x, "photo"); + if (photo) { + char *hash_tmp = xmlnode_get_data(photo); + hash_tmp = xmlnode_get_data(photo); g_free(presence->vcard_avatar_hash); - presence->vcard_avatar_hash = xmlnode_get_data(photo); + presence->vcard_avatar_hash = + hash_tmp ? hash_tmp : g_strdup(""); } } diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/jabber/si.c --- a/libpurple/protocols/jabber/si.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/jabber/si.c Wed May 04 07:21:43 2011 +0000 @@ -965,15 +965,23 @@ jabber_si_xfer_bytestreams_send_init(PurpleXfer *xfer) { JabberSIXfer *jsx; + PurpleProxyType proxy_type; purple_xfer_ref(xfer); jsx = xfer->data; - /* TODO: Should there be an option to not use the local host as a ft proxy? - * (to prevent revealing IP address, etc.) */ - jsx->listen_data = purple_network_listen_range(0, 0, SOCK_STREAM, + /* TODO: This should probably be done with an account option instead of + * piggy-backing on the TOR proxy type. */ + proxy_type = purple_proxy_info_get_type( + purple_proxy_get_setup(purple_connection_get_account(jsx->js->gc))); + if (proxy_type == PURPLE_PROXY_TOR) { + purple_debug_info("jabber", "Skipping attempting local streamhost.\n"); + jsx->listen_data = NULL; + } else + jsx->listen_data = purple_network_listen_range(0, 0, SOCK_STREAM, jabber_si_xfer_bytestreams_listen_cb, xfer); + if (jsx->listen_data == NULL) { /* We couldn't open a local port. Perhaps we can use a proxy. */ jabber_si_xfer_bytestreams_listen_cb(-1, xfer); @@ -1683,7 +1691,10 @@ { JabberSIXfer *jsx; PurpleXfer *xfer; - xmlnode *file, *feature, *x, *field, *option, *value, *thumbnail; + xmlnode *file, *feature, *x, *field, *option, *value; +#if ENABLE_FT_THUMBNAILS + xmlnode *thumbnail; +#endif const char *stream_id, *filename, *filesize_c, *profile; guint64 filesize_64 = 0; size_t filesize = 0; @@ -1787,16 +1798,12 @@ if (cid) { jabber_data_request(js, cid, purple_xfer_get_remote_user(xfer), NULL, TRUE, jabber_si_thumbnail_cb, xfer); - } else { - purple_xfer_request(xfer); + return; } - } else { - purple_xfer_request(xfer); } -#else - thumbnail = NULL; /* Silence warning */ +#endif + purple_xfer_request(xfer); -#endif } void diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/msn/switchboard.c --- a/libpurple/protocols/msn/switchboard.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/msn/switchboard.c Wed May 04 07:21:43 2011 +0000 @@ -643,10 +643,8 @@ static void iro_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - PurpleAccount *account; MsnSwitchBoard *swboard; - account = cmdproc->session->account; swboard = cmdproc->data; swboard->total_users = atoi(cmd->params[2]); @@ -658,14 +656,12 @@ joi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; - PurpleAccount *account; MsnSwitchBoard *swboard; const char *passport; passport = cmd->params[0]; session = cmdproc->session; - account = session->account; swboard = cmdproc->data; msn_switchboard_add_user(swboard, passport); diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/mxit/profile.c --- a/libpurple/protocols/mxit/profile.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/mxit/profile.c Wed May 04 07:21:43 2011 +0000 @@ -124,7 +124,7 @@ /* decode hdate */ memset( &bdate, 0, sizeof( struct tm ) ); - strptime( date, "%Y-%m-%d", &bdate ); + purple_str_to_time(date, FALSE, &bdate, NULL, NULL); /* calculate difference */ age = now.tm_year - bdate.tm_year; diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/myspace/myspace.c Wed May 04 07:21:43 2011 +0000 @@ -377,19 +377,13 @@ static char * msim_status_text(PurpleBuddy *buddy) { - MsimSession *session; MsimUser *user; - const gchar *display_name, *headline; + const gchar *display_name = NULL, *headline = NULL; PurpleAccount *account; - PurpleConnection *gc; g_return_val_if_fail(buddy != NULL, NULL); account = purple_buddy_get_account(buddy); - gc = purple_account_get_connection(account); - session = (MsimSession *)gc->proto_data; - - display_name = headline = NULL; user = msim_get_user_from_buddy(buddy, FALSE); if (user != NULL) { @@ -859,7 +853,6 @@ msim_check_inbox_cb(MsimSession *session, const MsimMessage *reply, gpointer data) { MsimMessage *body; - guint old_inbox_status; guint i, n; /* Information for each new inbox message type. */ static struct @@ -896,8 +889,6 @@ if (body == NULL) return; - old_inbox_status = session->inbox_status; - n = 0; for (i = 0; i < G_N_ELEMENTS(message_types); ++i) { @@ -1357,7 +1348,6 @@ static gboolean msim_incoming_status(MsimSession *session, MsimMessage *msg) { - PurpleBuddyList *blist; MsimUser *user; GList *list; gchar *status_headline, *status_headline_escaped; @@ -1391,8 +1381,6 @@ purple_debug_info("msim", "msim_status: %s's status code = %d\n", username, status_code); status_headline = msim_msg_get_string_from_element(g_list_nth_data(list, MSIM_STATUS_ORDINAL_HEADLINE)); - blist = purple_get_blist(); - /* Add buddy if not found. * TODO: Could this be responsible for #3444? */ user = msim_find_user(session, username); @@ -2026,7 +2014,6 @@ msim_input_cb(gpointer gc_uncasted, gint source, PurpleInputCondition cond) { PurpleConnection *gc; - PurpleAccount *account; MsimSession *session; gchar *end; int n; @@ -2035,7 +2022,6 @@ g_return_if_fail(source >= 0); /* Note: 0 is a valid fd */ gc = (PurpleConnection *)(gc_uncasted); - account = purple_connection_get_account(gc); session = gc->proto_data; /* libpurple/eventloop.h only defines these two */ @@ -3187,14 +3173,11 @@ * Actions menu for account. */ static GList * -msim_actions(PurplePlugin *plugin, gpointer context) +msim_actions(PurplePlugin *plugin, gpointer context /* PurpleConnection* */) { - PurpleConnection *gc; GList *menu; PurplePluginAction *act; - gc = (PurpleConnection *)context; - menu = NULL; #if 0 diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/protocols/myspace/user.c --- a/libpurple/protocols/myspace/user.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/protocols/myspace/user.c Wed May 04 07:21:43 2011 +0000 @@ -565,7 +565,7 @@ { MsimMessage *body; gchar *field_name; - guint rid, cmd, dsn, lid; + guint rid, dsn, lid; g_return_if_fail(user != NULL); /* Callback can be null to not call anything, just lookup & store information. */ @@ -579,8 +579,6 @@ /* Send request */ - cmd = MSIM_CMD_GET; - if (msim_is_userid(user)) { field_name = "UserID"; dsn = MG_MYSPACE_INFO_BY_ID_DSN; @@ -602,7 +600,7 @@ g_return_if_fail(msim_send(session, "persist", MSIM_TYPE_INTEGER, 1, "sesskey", MSIM_TYPE_INTEGER, session->sesskey, - "cmd", MSIM_TYPE_INTEGER, 1, + "cmd", MSIM_TYPE_INTEGER, MSIM_CMD_GET, "dsn", MSIM_TYPE_INTEGER, dsn, "uid", MSIM_TYPE_INTEGER, session->userid, "lid", MSIM_TYPE_INTEGER, lid, diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/proxy.c --- a/libpurple/proxy.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/proxy.c Wed May 04 07:21:43 2011 +0000 @@ -29,6 +29,7 @@ /* it is intended to : 1st handle http proxy, using the CONNECT command , 2nd provide an easy way to add socks support , 3rd draw women to it like flies to honey */ +#define _PURPLE_PROXY_C_ #include "internal.h" #include "cipher.h" @@ -2397,9 +2398,6 @@ return connect_data; } -/* - * Combine some of this code with purple_proxy_connect() - */ PurpleProxyConnectData * purple_proxy_connect_socks5(void *handle, PurpleProxyInfo *gpi, const char *host, int port, @@ -2409,6 +2407,42 @@ return purple_proxy_connect_socks5_account(NULL, handle, gpi, host, port, connect_cb, data); } + + +/* This is called when we connect to the SOCKS5 proxy server (through any + * relevant account proxy) + */ +static void socks5_connected_to_proxy(gpointer data, gint source, + const gchar *error_message) { + /* This is the PurpleProxyConnectData for the overall SOCKS5 connection */ + PurpleProxyConnectData *connect_data = data; + + /* Check that the overall SOCKS5 connection wasn't cancelled while we were + * connecting to it (we don't have a way of associating the process of + * connecting to the SOCKS5 server to the overall PurpleProxyConnectData) + */ + if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data)) + return; + + if (error_message != NULL) { + purple_debug_error("proxy", "Unable to connect to SOCKS5 host.\n"); + connect_data->connect_cb(connect_data->data, source, error_message); + return; + } + + purple_debug_info("proxy", "Initiating SOCKS5 negotiation.\n"); + + purple_debug_info("proxy", + "Connecting to %s:%d via %s:%d using SOCKS5\n", + connect_data->host, connect_data->port, + purple_proxy_info_get_host(connect_data->gpi), + purple_proxy_info_get_port(connect_data->gpi)); + + connect_data->fd = source; + + s5_canwrite(connect_data, connect_data->fd, PURPLE_INPUT_WRITE); +} + /* * Combine some of this code with purple_proxy_connect() */ @@ -2420,6 +2454,7 @@ gpointer data) { PurpleProxyConnectData *connect_data; + PurpleProxyConnectData *account_proxy_conn_data; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port >= 0, NULL); @@ -2436,17 +2471,26 @@ connect_data->gpi = gpi; connect_data->account = account; - connect_data->query_data = - purple_dnsquery_a_account(account, - purple_proxy_info_get_host(gpi), - purple_proxy_info_get_port(gpi), - connection_host_resolved, connect_data); - if (connect_data->query_data == NULL) - { + /* If there is an account proxy, use it to connect to the desired SOCKS5 + * proxy. + */ + account_proxy_conn_data = purple_proxy_connect(connect_data->handle, + connect_data->account, + purple_proxy_info_get_host(connect_data->gpi), + purple_proxy_info_get_port(connect_data->gpi), + socks5_connected_to_proxy, connect_data); + + if (account_proxy_conn_data == NULL) { + purple_debug_error("proxy", "Unable to initiate connection to account proxy.\n"); purple_proxy_connect_data_destroy(connect_data); return NULL; } + /* The API doesn't really provide us with a way to cancel the specific + * proxy connection attempt (account_proxy_conn_data) when the overall + * SOCKS5 connection (connect_data) attempt is cancelled :( + */ + handles = g_slist_prepend(handles, connect_data); return connect_data; diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/proxy.h --- a/libpurple/proxy.h Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/proxy.h Wed May 04 07:21:43 2011 +0000 @@ -289,11 +289,15 @@ /** * Makes a connection through a SOCKS5 proxy. * + * Note that if the account that is making the connection uses a proxy, this + * connection to a SOCKS5 proxy will be made through the account proxy. + * * @param handle A handle that should be associated with this * connection attempt. The handle can be used * to cancel the connection attempt using the * purple_proxy_connect_cancel_with_handle() * function. + * @param account The account making the connection. * @param gpi The PurpleProxyInfo specifying the proxy settings * @param host The destination host. * @param port The destination port. @@ -312,7 +316,7 @@ const char *host, int port, PurpleProxyConnectFunction connect_cb, gpointer data); -#ifndef PURPLE_DISABLE_DEPRECATED +#if !(defined PURPLE_DISABLE_DEPRECATED) || (defined _PURPLE_PROXY_C_) /** * Makes a connection through a SOCKS5 proxy. * diff -r 08dccf527457 -r bb4eaf8e70d6 libpurple/util.c --- a/libpurple/util.c Tue May 03 20:29:59 2011 +0000 +++ b/libpurple/util.c Wed May 04 07:21:43 2011 +0000 @@ -713,6 +713,8 @@ g_return_val_if_fail(timestamp != NULL, 0); + memset(&t, 0, sizeof(struct tm)); + str = timestamp; /* Strip leading whitespace */ diff -r 08dccf527457 -r bb4eaf8e70d6 pidgin/gtkaccount.c --- a/pidgin/gtkaccount.c Tue May 03 20:29:59 2011 +0000 +++ b/pidgin/gtkaccount.c Wed May 04 07:21:43 2011 +0000 @@ -1003,12 +1003,6 @@ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, - 0, _("HTTP"), - 1, PURPLE_PROXY_HTTP, - -1); - - gtk_list_store_append(model, &iter); - gtk_list_store_set(model, &iter, 0, _("SOCKS 4"), 1, PURPLE_PROXY_SOCKS4, -1); @@ -1027,6 +1021,12 @@ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, + 0, _("HTTP"), + 1, PURPLE_PROXY_HTTP, + -1); + + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, 0, _("Use Environmental Settings"), 1, PURPLE_PROXY_USE_ENVVAR, -1); @@ -1042,8 +1042,14 @@ static void proxy_type_changed_cb(GtkWidget *menu, AccountPrefsDialog *dialog) { - dialog->new_proxy_type = - gtk_combo_box_get_active(GTK_COMBO_BOX(menu)) - 1; + GtkTreeIter iter; + + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(menu), &iter)) { + int int_value; + gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(menu)), &iter, + 1, &int_value, -1); + dialog->new_proxy_type = int_value; + } if (dialog->new_proxy_type == PURPLE_PROXY_USE_GLOBAL || dialog->new_proxy_type == PURPLE_PROXY_NONE || @@ -1085,6 +1091,8 @@ PurpleProxyInfo *proxy_info; GtkWidget *vbox; GtkWidget *vbox2; + GtkTreeIter iter; + GtkTreeModel *proxy_model; if (dialog->proxy_frame != NULL) gtk_widget_destroy(dialog->proxy_frame); @@ -1131,21 +1139,10 @@ if (dialog->account != NULL && (proxy_info = purple_account_get_proxy_info(dialog->account)) != NULL) { - - PurpleProxyType type = purple_proxy_info_get_type(proxy_info); const char *value; int int_val; - /* Hah! */ - /* I dunno what you're laughing about, fuzz ball. */ - dialog->new_proxy_type = type; - gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->proxy_dropdown), - type + 1); - - if (type == PURPLE_PROXY_USE_GLOBAL || type == PURPLE_PROXY_NONE || - type == PURPLE_PROXY_USE_ENVVAR) - gtk_widget_hide_all(vbox2); - + dialog->new_proxy_type = purple_proxy_info_get_type(proxy_info); if ((value = purple_proxy_info_get_host(proxy_info)) != NULL) gtk_entry_set_text(GTK_ENTRY(dialog->proxy_host_entry), value); @@ -1163,14 +1160,26 @@ if ((value = purple_proxy_info_get_password(proxy_info)) != NULL) gtk_entry_set_text(GTK_ENTRY(dialog->proxy_pass_entry), value); - } - else { + + } else dialog->new_proxy_type = PURPLE_PROXY_USE_GLOBAL; - gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->proxy_dropdown), - dialog->new_proxy_type + 1); - gtk_widget_hide_all(vbox2); + + proxy_model = gtk_combo_box_get_model( + GTK_COMBO_BOX(dialog->proxy_dropdown)); + if (gtk_tree_model_get_iter_first(proxy_model, &iter)) { + int int_val; + do { + gtk_tree_model_get(proxy_model, &iter, 1, &int_val, -1); + if (int_val == dialog->new_proxy_type) { + gtk_combo_box_set_active_iter( + GTK_COMBO_BOX(dialog->proxy_dropdown), &iter); + break; + } + } while(gtk_tree_model_iter_next(proxy_model, &iter)); } + proxy_type_changed_cb(dialog->proxy_dropdown, dialog); + /* Connect signals. */ g_signal_connect(G_OBJECT(dialog->proxy_dropdown), "changed", G_CALLBACK(proxy_type_changed_cb), dialog); diff -r 08dccf527457 -r bb4eaf8e70d6 pidgin/win32/nsis/pidgin-installer.nsi --- a/pidgin/win32/nsis/pidgin-installer.nsi Tue May 03 20:29:59 2011 +0000 +++ b/pidgin/win32/nsis/pidgin-installer.nsi Wed May 04 07:21:43 2011 +0000 @@ -580,7 +580,6 @@ Delete "$INSTDIR\plugins\libmyspace.dll" Delete "$INSTDIR\plugins\libnapster.dll" Delete "$INSTDIR\plugins\libnovell.dll" - Delete "$INSTDIR\plugins\libqq.dll" Delete "$INSTDIR\plugins\libsametime.dll" Delete "$INSTDIR\plugins\libsilc.dll" Delete "$INSTDIR\plugins\libsimple.dll" diff -r 08dccf527457 -r bb4eaf8e70d6 po/de.po --- a/po/de.po Tue May 03 20:29:59 2011 +0000 +++ b/po/de.po Wed May 04 07:21:43 2011 +0000 @@ -11,9 +11,9 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-03-06 12:25+0100\n" -"PO-Revision-Date: 2011-03-06 12:25+0100\n" -"Last-Translator: Jochen Kemnade \n" +"POT-Creation-Date: 2011-05-03 22:53+0200\n" +"PO-Revision-Date: 2011-05-03 22:55+0200\n" +"Last-Translator: Björn Voigt \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -219,6 +219,9 @@ msgid "Alias (optional)" msgstr "Alias (optional)" +msgid "Invite message (optional)" +msgstr "Einladungsnachricht (optional)" + msgid "Add in group" msgstr "Zu Gruppe hinzufügen" @@ -1954,6 +1957,9 @@ msgid "Unknown reason" msgstr "Unbekannter Grund" +msgid "Aborting DNS lookup in Tor Proxy mode." +msgstr "DNS-Anfrage im Tor-Proxy-Modus abgebrochen" + #, c-format msgid "" "Error reading %s: \n" @@ -3208,6 +3214,21 @@ msgid "Change Gadu-Gadu Password" msgstr "Gadu-Gadu Passwort ändern" +msgid "Show status to:" +msgstr "Zeige Status:" + +msgid "All people" +msgstr "Allen Leuten" + +msgid "Only buddies" +msgstr "Nur Buddys" + +msgid "Change status broadcasting" +msgstr "Statusveröffentlichung ändern" + +msgid "Please, select who can see your status" +msgstr "Bitte wählen Sie, wer Ihren Status sehen darf" + #, c-format msgid "Select a chat for buddy: %s" msgstr "Wählen Sie einen Chat für den Benutzer: %s" @@ -3351,6 +3372,19 @@ msgid "GG server" msgstr "GG-Server" +msgid "Don't use encryption" +msgstr "Keine Verschlüsselung benutzen" + +msgid "Use encryption if available" +msgstr "Verschlüsselung benutzen, wenn verfügbar" + +#. TODO +msgid "Require encryption" +msgstr "Verschlüsselung fordern" + +msgid "Connection security" +msgstr "Verbindungssicherheit" + #, c-format msgid "Unknown command: %s" msgstr "Unbekanntes Kommando: %s" @@ -3386,7 +3420,6 @@ #. * buffer that stores what is "being sent" until the #. * PurpleHTTPConnection reports it is fully sent. #. -#. TODO: what to do here - do we really have to disconnect? #. TODO: do we really want to disconnect on a failure to write? #, c-format msgid "Lost connection with server: %s" @@ -3642,6 +3675,9 @@ msgid "action <action to perform>: Perform an action." msgstr "action <Aktion>: Führe eine Aktion durch." +msgid "authserv: Send a command to authserv" +msgstr "authserv: Sendet ein Kommando zum Authserv" + msgid "" "away [message]: Set an away message, or use no message to return from being " "away." @@ -4782,18 +4818,9 @@ msgid "Domain" msgstr "Domain" -msgid "Require encryption" -msgstr "Verschlüsselung fordern" - -msgid "Use encryption if available" -msgstr "Verschlüsselung benutzen, wenn verfügbar" - msgid "Use old-style SSL" msgstr "Alte SSL-Methode verwenden" -msgid "Connection security" -msgstr "Verbindungssicherheit" - msgid "Allow plaintext auth over unencrypted streams" msgstr "Erlaube Klartext-Authentifikation über einen unverschlüsselten Kanal" @@ -4905,6 +4932,7 @@ "Kann die Datei nicht an %s senden, da der Client des Benutzers keine " "Dateiübertragung unterstützt" +#. not success msgid "File Send Failed" msgstr "Senden der Datei gescheitert" @@ -5632,18 +5660,6 @@ msgid "Unable to Add" msgstr "Kann nicht hinzufügen" -msgid "Authorization Request Message:" -msgstr "Autorisierungsanfrage:" - -msgid "Please authorize me!" -msgstr "Bitte autorisiere mich!" - -#. * -#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. -#. -msgid "_OK" -msgstr "_OK" - msgid "Error retrieving profile" msgstr "Fehler beim Empfangen des Profils" @@ -5856,6 +5872,11 @@ msgid "Mobile message was not sent because it was too long." msgstr "Mobile Nachricht wurde nicht gesendet, da sie zu lang war." +msgid "Mobile message was not sent because an unknown error occurred." +msgstr "" +"Mobile Nachricht konnte nicht gesendet werden, da ein unbekannter Fehler " +"aufgetreten ist." + #, c-format msgid "" "The MSN server will shut down for maintenance in %d minute. You will " @@ -6037,18 +6058,6 @@ msgid "The username specified is invalid." msgstr "Der angegebene Benutzername ist ungültig." -msgid "The PIN you entered is invalid." -msgstr "Der eingegebene PIN ist ungültig." - -msgid "The PIN you entered has an invalid length [4-10]." -msgstr "Die eingegebene PIN hat eine ungültige Länge [4-10]." - -msgid "The PIN is invalid. It should only consist of digits [0-9]." -msgstr "Die PIN ist ungültig. Sie sollte nur aus Ziffern [0-9] bestehen." - -msgid "The two PINs you entered do not match." -msgstr "Die beiden PINs, die Sie eingegeben haben, stimmen nicht überein." - msgid "The Display Name you entered is invalid." msgstr "Der eingegebene Anzeigename ist ungültig." @@ -6072,35 +6081,65 @@ "Ihre Profil-Informationen wurden noch nicht abgerufen. Bitte versuchen Sie " "es später noch einmal." -msgid "Your UID" -msgstr "Ihre UID" +#. display name +#. nick name (required) +msgid "Display Name" +msgstr "Anzeigename" + +#. about me +msgid "About Me" +msgstr "Über mich" + +#. where I live +msgid "Where I Live" +msgstr "Wo ich wohne" + +#. mobile number +msgid "Mobile Number" +msgstr "Handynummer" + +#. is searchable +msgid "Can be searched" +msgstr "Kann gesucht werden" + +#. is suggestable +msgid "Can be suggested" +msgstr "Kann vorgeschlagen werden" + +msgid "Update your MXit Profile" +msgstr "Aktualisieren Sie Ihr MXit-Profil" + +msgid "The PIN you entered is invalid." +msgstr "Die eingegebene PIN ist ungültig." + +msgid "The PIN you entered has an invalid length [4-10]." +msgstr "Die eingegebene PIN hat eine ungültige Länge [4-10]." + +msgid "The PIN is invalid. It should only consist of digits [0-9]." +msgstr "Die PIN ist ungültig. Sie sollte nur aus Ziffern [0-9] bestehen." + +msgid "The two PINs you entered do not match." +msgstr "Die beiden PINs, die Sie eingegeben haben, stimmen nicht überein." + +#. show error to user +msgid "PIN Update Error" +msgstr "PIN-Aktualisierungsfehler" #. pin #. pin (required) msgid "PIN" msgstr "PIN" +#. verify pin msgid "Verify PIN" msgstr "PIN bestätigen" -#. display name -#. nick name (required) -msgid "Display Name" -msgstr "Anzeigename" - -#. hidden -msgid "Hide my number" -msgstr "Meine Nummer verstecken" - -#. mobile number -msgid "Mobile Number" -msgstr "Handynummer" - -msgid "Update your Profile" -msgstr "Aktualisieren Sie Ihr Profil" - -msgid "Here you can update your MXit profile" -msgstr "Hier können Sie Ihr MXit-Profil aktualisieren" +#. (reference: "libpurple/request.h") +msgid "Change PIN" +msgstr "PIN ändern" + +msgid "Change MXit PIN" +msgstr "MXit-PIN ändern" msgid "View Splash" msgstr "Startbildschirm anschauen" @@ -6111,10 +6150,34 @@ msgid "About" msgstr "Info" +msgid "Search for user" +msgstr "Suche nach einem Benutzer" + +msgid "Search for a MXit contact" +msgstr "Suche nach einem MXit-Kontakt" + +msgid "Type search information" +msgstr "Eingabe der Benutzer-Information" + +msgid "_Search" +msgstr "_Suchen" + #. display / change profile msgid "Change Profile..." msgstr "Profil ändern..." +#. change PIN +msgid "Change PIN..." +msgstr "PIN ändern..." + +#. suggested friends +msgid "Suggested friends..." +msgstr "Vorgeschlagene Freunde..." + +#. search for contacts +msgid "Search for contacts..." +msgstr "Suche nach Kontakten..." + #. display splash-screen msgid "View Splash..." msgstr "Startbildschirm anzeigen..." @@ -6227,13 +6290,12 @@ msgid "Retrieving User Information..." msgstr "Abrufen der Benutzerinformationen..." -#. you were kicked +msgid "was kicked" +msgstr "wurde hinausgeworfen" + msgid "You have been kicked from this MultiMX." msgstr "Sie wurden von MultiMX hinausgeworfen." -msgid "was kicked" -msgstr "wurde hinausgeworfen" - msgid "_Room Name:" msgstr "_Raumname:" @@ -6281,6 +6343,30 @@ msgid "Last Online" msgstr "Zuletzt online" +msgid "Invite Message" +msgstr "Einladungsnachricht" + +msgid "No results" +msgstr "Keine Ergebnisse" + +msgid "No contacts found." +msgstr "Keine Kontakte gefunden." + +#. define columns +msgid "UserId" +msgstr "Benutzer-Id" + +msgid "Where I live" +msgstr "Wo ich wohne" + +#, c-format +msgid "You have %i suggested friends." +msgstr "Sie haben %i vorgeschlagene(n) Freund(e)." + +#, c-format +msgid "We found %i contacts that match your search." +msgstr "Wir fanden %i Kontakt(e), die Ihner Suchanfrage entspricht/entsprechen." + #. we must have lost the connection, so terminate it so that we can reconnect msgid "We have lost the connection to MXit. Please reconnect." msgstr "" @@ -7035,6 +7121,12 @@ msgid "Authorization Denied Message:" msgstr "Nachricht für die Ablehnung der Autorisierung:" +#. * +#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. +#. +msgid "_OK" +msgstr "_OK" + #, c-format msgid "Received unexpected response from %s: %s" msgstr "Unerwartete Antwort von %s erhalten: %s" @@ -7395,7 +7487,6 @@ msgstr "Autorisierung empfangen" #. Unregistered username -#. uid is not exist #. the username does not exist msgid "Username does not exist" msgstr "Benutzername existiert nicht" @@ -7890,9 +7981,6 @@ msgid "Type the email address of the buddy you are searching for." msgstr "Geben Sie die E-Mail-Adresse des Buddys ein, nach dem Sie suchen." -msgid "_Search" -msgstr "_Suchen" - msgid "Set User Info (web)..." msgstr "Benutzer-Info (Web) setzen..." @@ -7929,9 +8017,6 @@ msgid "Search for Buddy by Email Address..." msgstr "Suche Buddys nach E-Mail-Adresse..." -msgid "Don't use encryption" -msgstr "Keine Verschlüsselung benutzen" - msgid "Use clientLogin" msgstr "clientLogin benutzen" @@ -8206,722 +8291,6 @@ msgid "These buddies will always see you as offline" msgstr "Für diese Buddys werden Sie immer als offline angezeigt" -msgid "Aquarius" -msgstr "Wassermann" - -msgid "Pisces" -msgstr "Fische" - -msgid "Aries" -msgstr "Widder" - -msgid "Taurus" -msgstr "Stier" - -msgid "Gemini" -msgstr "Zwillinge" - -msgid "Cancer" -msgstr "Krebs" - -msgid "Leo" -msgstr "Löwe" - -msgid "Virgo" -msgstr "Jungfrau" - -msgid "Libra" -msgstr "Waage" - -msgid "Scorpio" -msgstr "Skorpion" - -msgid "Sagittarius" -msgstr "Schütze" - -msgid "Capricorn" -msgstr "Steinbock" - -msgid "Rat" -msgstr "Ratte" - -msgid "Ox" -msgstr "Ochse" - -msgid "Tiger" -msgstr "Tiger" - -msgid "Rabbit" -msgstr "Kaninchen" - -msgid "Dragon" -msgstr "Drache" - -msgid "Snake" -msgstr "Schlange" - -msgid "Horse" -msgstr "Pferd" - -msgid "Goat" -msgstr "Gans" - -msgid "Monkey" -msgstr "Affe" - -msgid "Rooster" -msgstr "Hahn" - -msgid "Dog" -msgstr "Hund" - -msgid "Pig" -msgstr "Schwein" - -msgid "Other" -msgstr "Andere" - -msgid "Visible" -msgstr "Sichtbar" - -msgid "Friend Only" -msgstr "Nur Freund" - -msgid "Private" -msgstr "Privat" - -msgid "QQ Number" -msgstr "QQ-Nummer" - -msgid "Country/Region" -msgstr "Land/Region" - -msgid "Province/State" -msgstr "Provinz/Staat" - -msgid "Zipcode" -msgstr "PLZ" - -msgid "Phone Number" -msgstr "Telefonnummer" - -msgid "Authorize adding" -msgstr "Hinzufügen autorisieren" - -msgid "Cellphone Number" -msgstr "Handy-Telefonnummer" - -msgid "Personal Introduction" -msgstr "Persönliche Vorstellung" - -msgid "City/Area" -msgstr "Stadt/Gegend" - -msgid "Publish Mobile" -msgstr "Handy veröffentlichen" - -msgid "Publish Contact" -msgstr "Kontakt veröffentlichen" - -msgid "College" -msgstr "College" - -msgid "Horoscope" -msgstr "Horoskop" - -msgid "Zodiac" -msgstr "Sternzeichen" - -msgid "Blood" -msgstr "Blutgruppe" - -msgid "True" -msgstr "Wahr" - -msgid "False" -msgstr "Falsch" - -msgid "Modify Contact" -msgstr "Kontakt bearbeiten" - -msgid "Modify Address" -msgstr "Adresse bearbeiten" - -msgid "Modify Extended Information" -msgstr "Erweiterte Informationen bearbeiten" - -msgid "Modify Information" -msgstr "Informationen bearbeiten" - -msgid "Update" -msgstr "Aktualisieren" - -msgid "Could not change buddy information." -msgstr "Konnte Buddy-Informationen nicht bearbeiten." - -msgid "Note" -msgstr "Bemerkung" - -#. callback -msgid "Buddy Memo" -msgstr "Buddy-Notiz" - -msgid "Change his/her memo as you like" -msgstr "Ändern Sie seine/ihre Notiz wie Sie möchten" - -msgid "_Modify" -msgstr "_Bearbeiten" - -msgid "Memo Modify" -msgstr "Memo bearbeiten" - -msgid "Server says:" -msgstr "Server meldet:" - -msgid "Your request was accepted." -msgstr "Ihre Anfrage wurde akzeptiert." - -msgid "Your request was rejected." -msgstr "Ihre Anfrage wurde abgelehnt." - -#, c-format -msgid "%u requires verification: %s" -msgstr "%u erfordert Überprüfung: %s" - -msgid "Add buddy question" -msgstr "Buddy-Frage hinzufügen" - -msgid "Enter answer here" -msgstr "Antwort hier eingeben" - -msgid "Send" -msgstr "Senden" - -msgid "Invalid answer." -msgstr "Ungültige Antwort." - -msgid "Authorization denied message:" -msgstr "Nachricht für die Ablehnung der Autorisierung:" - -msgid "Sorry, you're not my style." -msgstr "Tut mir Leid, du bist nicht mein Typ." - -#, c-format -msgid "%u needs authorization" -msgstr "%u benötigt Autorisierung" - -msgid "Add buddy authorize" -msgstr "Buddy-Autorisierung hinzufügen" - -msgid "Enter request here" -msgstr "Anfrage hier eingeben" - -msgid "Would you be my friend?" -msgstr "Möchten Sie mein Freund sein?" - -msgid "QQ Buddy" -msgstr "QQ-Buddy" - -msgid "Add buddy" -msgstr "Buddy hinzufügen" - -msgid "Invalid QQ Number" -msgstr "Ungültige QQ-Nummer" - -msgid "Failed sending authorize" -msgstr "Senden der Autorisierung fehlgeschlagen" - -#, c-format -msgid "Failed removing buddy %u" -msgstr "Kontakt %u konnte nicht entfernt werden" - -#, c-format -msgid "Failed removing me from %d's buddy list" -msgstr "Entfernen von %ds Buddy-Liste fehlgeschlagen" - -msgid "No reason given" -msgstr "Kein Grund angegeben" - -#. only need to get value -#, c-format -msgid "You have been added by %s" -msgstr "Sie wurden von %s hinzugefügt" - -msgid "Would you like to add him?" -msgstr "Möchten Sie ihn hinzufügen?" - -#, c-format -msgid "Rejected by %s" -msgstr "Abgelehnt von %s" - -#, c-format -msgid "Message: %s" -msgstr "Nachricht: %s" - -msgid "ID: " -msgstr "ID: " - -msgid "Group ID" -msgstr "Gruppen-ID" - -msgid "QQ Qun" -msgstr "QQ-Qun" - -msgid "Please enter Qun number" -msgstr "Bitte geben Sie die Qun-Nummer ein" - -msgid "You can only search for permanent Qun\n" -msgstr "Sie können nur nach permanenten Qun suchen\n" - -msgid "(Invalid UTF-8 string)" -msgstr "(Ungültige UTF8-Zeichenkette)" - -msgid "Not member" -msgstr "Kein Mitglied" - -msgid "Member" -msgstr "Mitglied" - -msgid "Requesting" -msgstr "Frage an" - -msgid "Admin" -msgstr "Admin" - -#. XXX: Should this be "Topic"? -msgid "Room Title" -msgstr "Raumtitel" - -msgid "Notice" -msgstr "Bemerkung" - -msgid "Detail" -msgstr "Detail" - -msgid "Creator" -msgstr "Ersteller" - -msgid "About me" -msgstr "Über mich" - -msgid "Category" -msgstr "Kategorie" - -msgid "The Qun does not allow others to join" -msgstr "Diesen Qun können andere nicht beitreten" - -msgid "Join QQ Qun" -msgstr "QQ-Qun betreten" - -msgid "Input request here" -msgstr "Anfrage hier eingeben" - -#, c-format -msgid "Successfully joined Qun %s (%u)" -msgstr "Qun %s (%u) erfolgreich betreten" - -msgid "Successfully joined Qun" -msgstr "Qun erfolgreich betreten" - -#, c-format -msgid "Qun %u denied from joining" -msgstr "Qun %u hat Ihren Beitritt abgelehnt" - -msgid "QQ Qun Operation" -msgstr "QQ-Qun-Operation" - -msgid "Failed:" -msgstr "Gescheitert:" - -msgid "Join Qun, Unknown Reply" -msgstr "Qun-Beitritt, Unbekannte Antwort" - -msgid "Quit Qun" -msgstr "Qun verlassen" - -msgid "" -"Note, if you are the creator, \n" -"this operation will eventually remove this Qun." -msgstr "" -"Beachten Sie, dass diese Operation den Qun entfernen könnte, \n" -"wenn Sie der Ersteller sind." - -msgid "Sorry, you are not our style" -msgstr "Tut mir Leid, du bist nicht unser Typ" - -msgid "Successfully changed Qun members" -msgstr "Qun-Mitglieder erfolgreich geändert" - -msgid "Successfully changed Qun information" -msgstr "Qun-Informationen erfolgreich bearbeitet" - -msgid "You have successfully created a Qun" -msgstr "Sie haben einen Qun angelegt" - -msgid "Would you like to set up detailed information now?" -msgstr "Möchten Sie jetzt Detail-Informationen einstellen?" - -msgid "Setup" -msgstr "Setup" - -#, c-format -msgid "%u requested to join Qun %u for %s" -msgstr "%u möchte dem Qun %u wegen %s beitreten" - -#, c-format -msgid "%u request to join Qun %u" -msgstr "%u möchte dem Qun %u beitreten" - -#, c-format -msgid "Failed to join Qun %u, operated by admin %u" -msgstr "Dem Qun %u, moderiert von admin %u, konnte nicht beigetreten werden" - -#, c-format -msgid "Joining Qun %u is approved by admin %u for %s" -msgstr "" -"Das Betreten des Qun %u wurde vom Admin bestätigt wegen by admin %u for " -"%s" - -#, c-format -msgid "Removed buddy %u." -msgstr "Buddy %u entfernt" - -#, c-format -msgid "New buddy %u joined." -msgstr "Neuer Buddy %u ist beigetreten." - -#, c-format -msgid "Unknown-%d" -msgstr "Unbekannt-%d" - -msgid "Level" -msgstr "Stufe" - -msgid " VIP" -msgstr " VIP" - -msgid " TCP" -msgstr " TCP" - -msgid " FromMobile" -msgstr " FromMobile" - -msgid " BindMobile" -msgstr " BindMobile" - -msgid " Video" -msgstr " Video" - -msgid " Zone" -msgstr " Zone" - -msgid "Flag" -msgstr "Flagge" - -msgid "Ver" -msgstr "Ver" - -msgid "Invalid name" -msgstr "QQ: Ungültiger Name" - -msgid "Select icon..." -msgstr "Icon wählen..." - -#, c-format -msgid "Login time: %d-%d-%d, %d:%d:%d
\n" -msgstr "Anmeldezeit: %d-%d-%d, %d:%d:%d
\n" - -#, c-format -msgid "Total Online Buddies: %d
\n" -msgstr "Insgesamt online: %d
\n" - -#, c-format -msgid "Last Refresh: %d-%d-%d, %d:%d:%d
\n" -msgstr "Letzte Aktualisierung: %d-%d-%d, %d:%d:%d
\n" - -#, c-format -msgid "Server: %s
\n" -msgstr "Server: %s
\n" - -#, c-format -msgid "Client Tag: %s
\n" -msgstr "Marke des Clients: %s
\n" - -#, c-format -msgid "Connection Mode: %s
\n" -msgstr "Verbindungsmodus: %s
\n" - -#, c-format -msgid "My Internet IP: %s:%d
\n" -msgstr "Meine Internet-IP: %s:%d
\n" - -#, c-format -msgid "Sent: %lu
\n" -msgstr "Gesendet: %lu
\n" - -#, c-format -msgid "Resend: %lu
\n" -msgstr "Erneut senden: %lu
\n" - -#, c-format -msgid "Lost: %lu
\n" -msgstr "Verloren: %lu
\n" - -#, c-format -msgid "Received: %lu
\n" -msgstr "Empfangen: %lu
\n" - -#, c-format -msgid "Received Duplicate: %lu
\n" -msgstr "Duplikat empfangen: %lu
\n" - -#, c-format -msgid "Time: %d-%d-%d, %d:%d:%d
\n" -msgstr "Zeit: %d-%d-%d, %d:%d:%d
\n" - -#, c-format -msgid "IP: %s
\n" -msgstr "IP: %s
\n" - -msgid "Login Information" -msgstr "Login-Informationen" - -msgid "

Original Author:
\n" -msgstr "

Original-Autor:
\n" - -msgid "

Code Contributors:
\n" -msgstr "

Code-Mitwirkende:
\n" - -msgid "

Lovely Patch Writers:
\n" -msgstr "

Wunderbare Patch-Schreiber:
\n" - -msgid "

Acknowledgement:
\n" -msgstr "

Bestätigung:
\n" - -msgid "

Scrupulous Testers:
\n" -msgstr "

Gewissenhafte Tester:
\n" - -msgid "and more, please let me know... thank you!))" -msgstr "und andere, bitten sagen Sie mir Bescheid... Danke!))" - -msgid "

And, all the boys in the backroom...
\n" -msgstr "

Und all die Jungs im Hinterzimmer...
\n" - -msgid "Feel free to join us! :)" -msgstr "Treten Sie uns bei, wenn Sie mögen! :)" - -#, c-format -msgid "About OpenQ %s" -msgstr "Über OpenQ %s" - -msgid "Change Icon" -msgstr "Icon ändern" - -msgid "Change Password" -msgstr "Passwort ändern" - -msgid "Account Information" -msgstr "Kontoinformationen" - -msgid "Update all QQ Quns" -msgstr "Alle QQ-Quns aktualisieren" - -msgid "About OpenQ" -msgstr "Über OpenQ" - -msgid "Modify Buddy Memo" -msgstr "Buddy-Notiz bearbeiten" - -#. *< type -#. *< ui_requirement -#. *< flags -#. *< dependencies -#. *< priority -#. *< id -#. *< name -#. *< version -#. * summary -#. * description -msgid "QQ Protocol Plugin" -msgstr "QQ-Protokoll-Plugin" - -msgid "Auto" -msgstr "Auto" - -msgid "Select Server" -msgstr "Server wählen" - -msgid "QQ2008" -msgstr "QQ2008" - -msgid "QQ2007" -msgstr "QQ2007" - -msgid "QQ2005" -msgstr "QQ2005" - -msgid "Connect by TCP" -msgstr "Über TCP verbinden" - -msgid "Show server notice" -msgstr "Server-Nachricht anzeigen" - -msgid "Show server news" -msgstr "Server-News anzeigen" - -msgid "Show chat room when msg comes" -msgstr "Chatraum zeigen, wenn Nachricht empfangen wird" - -msgid "Use default font" -msgstr "Standardschriftart benutzen" - -msgid "Keep alive interval (seconds)" -msgstr "Intervall zum Aufrechterhalten der Verbindung (Sekunden)" - -msgid "Update interval (seconds)" -msgstr "Aktualisierungsintervall (Sekunden)" - -msgid "Unable to decrypt server reply" -msgstr "Kann die Antwort des Servers nicht entschlüsseln" - -#, c-format -msgid "Failed requesting token, 0x%02X" -msgstr "Fehler beim Anfordern des Tokens, 0x%02X" - -#, c-format -msgid "Invalid token len, %d" -msgstr "Ungültige Länge des Tokens, %d" - -#. extend redirect used in QQ2006 -msgid "Redirect_EX is not currently supported" -msgstr "Redirect_EX wird im Moment nicht unterstützt" - -#. need activation -#. need activation -#. need activation -msgid "Activation required" -msgstr "Aktivierung erforderlich" - -#, c-format -msgid "Unknown reply code when logging in (0x%02X)" -msgstr "Unbekannte Antwort bei der Anmeldung (0x%02X)" - -msgid "Requesting captcha" -msgstr "Captcha anfordern" - -msgid "Checking captcha" -msgstr "Captcha überprüfen" - -msgid "Failed captcha verification" -msgstr "Captcha-Überprüfung fehlgeschlagen" - -msgid "Captcha Image" -msgstr "Captcha-Bild" - -msgid "Enter code" -msgstr "Geben Sie den Code ein" - -msgid "QQ Captcha Verification" -msgstr "QQ-Captcha-Überprüfung" - -msgid "Enter the text from the image" -msgstr "Bitte geben Sie den Text aus dem Bild ein" - -#, c-format -msgid "Unknown reply when checking password (0x%02X)" -msgstr "Unbekannte Antwort bei Überprüfungen des Passwortes (0x%02X)" - -#, c-format -msgid "" -"Unknown reply code when logging in (0x%02X):\n" -"%s" -msgstr "" -"Unbekannte Antwort bei der Anmeldung (0x%02X):\n" -"%s" - -msgid "Socket error" -msgstr "Socket-Fehler" - -msgid "Getting server" -msgstr "Hole server" - -msgid "Requesting token" -msgstr "Fordere Token an" - -msgid "Unable to resolve hostname" -msgstr "Hostname konnte nicht aufgelöst werden" - -msgid "Invalid server or port" -msgstr "Ungültiger Server oder Port" - -msgid "Connecting to server" -msgstr "Verbinde mit Server" - -msgid "QQ Error" -msgstr "QQ-Fehler" - -#, c-format -msgid "" -"Server News:\n" -"%s\n" -"%s\n" -"%s" -msgstr "" -"Server-News:\n" -"%s\n" -"%s\n" -"%s" - -#, c-format -msgid "%s:%s" -msgstr "%s:%s" - -#, c-format -msgid "From %s:" -msgstr "Von %s:" - -#, c-format -msgid "" -"Server notice From %s: \n" -"%s" -msgstr "" -"Servernotiz von %s: \n" -"%s" - -msgid "Unknown SERVER CMD" -msgstr "Unbekanntes SERVER-CMD" - -#, c-format -msgid "" -"Error reply of %s(0x%02X)\n" -"Room %u, reply 0x%02X" -msgstr "" -"Fehlerantwort von %s(0x%02X)\n" -"Raum %u, Antwort 0x%02X" - -msgid "QQ Qun Command" -msgstr "QQ-Qun-Kommando" - -msgid "Unable to decrypt login reply" -msgstr "Konnte die Antwort der Anmeldung nicht entschlüsseln" - -msgid "Unknown LOGIN CMD" -msgstr "Unbekanntes LOGIN-CMD" - -msgid "Unknown CLIENT CMD" -msgstr "Unbekanntes CLIENT-CMD" - -#, c-format -msgid "%d has declined the file %s" -msgstr "%d hat die Datei %s abgelehnt" - -msgid "File Send" -msgstr "Dateiübertragung" - -#, c-format -msgid "%d cancelled the transfer of %s" -msgstr "%d hat die Übertragung von %s abgebrochen" - #, c-format msgid "Group Title: %s
" msgstr "Gruppentitel: %s
" @@ -9700,6 +9069,9 @@ msgid "Unit" msgstr "Abteilung" +msgid "Note" +msgstr "Bemerkung" + msgid "Join Chat" msgstr "Chat betreten" @@ -10358,6 +9730,9 @@ msgid "Unable to create listen socket" msgstr "Lauschender Socket konnte nicht erstellt werden" +msgid "Unable to resolve hostname" +msgstr "Hostname konnte nicht aufgelöst werden" + msgid "SIP usernames may not contain whitespaces or @ symbols" msgstr "SIP-Benutzernamen dürfen keine Leerzeichen oder @-Symbole enthalten" @@ -10474,6 +9849,9 @@ msgid "Yahoo! system message for %s:" msgstr "Yahoo!-Systemnachricht für %s:" +msgid "Authorization denied message:" +msgstr "Nachricht für die Ablehnung der Autorisierung:" + #, c-format msgid "" "%s has (retroactively) denied your request to add them to your list for the " @@ -11272,15 +10650,18 @@ msgid "No Proxy" msgstr "Kein Proxy" -msgid "HTTP" -msgstr "HTTP" - msgid "SOCKS 4" msgstr "SOCKS 4" msgid "SOCKS 5" msgstr "SOCKS 5" +msgid "Tor/Privacy (SOCKS5)" +msgstr "Tor/Privatsphäre (SOCKS5)" + +msgid "HTTP" +msgstr "HTTP" + msgid "Use Environmental Settings" msgstr "Benutze Umgebungsvariablen" @@ -11308,8 +10689,14 @@ msgid "Pa_ssword:" msgstr "P_asswort:" +msgid "Use _silence suppression" +msgstr "Benutze _Geräuschunterdrückung" + +msgid "_Voice and Video" +msgstr "Sprache und _Video" + msgid "Unable to save new account" -msgstr "Kann neues Konto nicht speichern" +msgstr "Sitzung wird fortgesetzt<" msgid "An account already exists with the specified criteria." msgstr "Ein Konto mit den angegebenen Daten existiert bereits." @@ -11357,10 +10744,21 @@ "bearbeiten oder löschen" #, c-format +msgid "" +"%s%s%s%s wants to add you (%s) to his or her buddy " +"list%s%s" +msgstr "" +"%s%s%s%s möchte Sie (%s) zu seiner oder ihrer Buddy-" +"Liste hinzufügen%s%s" + +#, c-format msgid "%s%s%s%s wants to add you (%s) to his or her buddy list%s%s" msgstr "" "%s%s%s%s möchte Sie (%s) zu seiner oder ihrer Buddy-Liste hinzufügen%s%s" +msgid "Send Instant Message" +msgstr "Sofortnachricht senden" + #. Buddy List msgid "Background Color" msgstr "Hintergrundfarbe" @@ -11918,6 +11316,9 @@ msgid "(Optional) A_lias:" msgstr "(Optionaler) A_lias:" +msgid "(Optional) _Invite message:" +msgstr "(Optionale) _Einladungsnachricht:" + msgid "Add buddy to _group:" msgstr "Buddy zu folgender _Gruppe hinzufügen:" @@ -13404,6 +12805,13 @@ msgid "New Pounces" msgstr "Neuer Alarm" +#. Translators: Make sure you translate "Dismiss" differently than +#. "close"! This string is used in the "You have pounced" dialog +#. that appears when one of your Buddy Pounces is triggered. In +#. this context "Dismiss" means "I acknowledge that I've seen that +#. this pounce was triggered--remove it from this list." Translating +#. it as "Remove" is acceptable if you can't think of a more precise +#. word. msgid "Dismiss" msgstr "Verwerfen" @@ -14530,6 +13938,9 @@ msgid "PubSub Leaf" msgstr "PubSub-Blatt" +msgid "Other" +msgstr "Andere" + msgid "" "\n" "Description: " @@ -15394,6 +14805,21 @@ msgid "D_evice" msgstr "G_erät" +msgid "DROP" +msgstr "VERWERFEN" + +msgid "Volume:" +msgstr "Lautstärke:" + +msgid "Silence threshold:" +msgstr "Schwellwert für Stille:" + +msgid "Input and Output Settings" +msgstr "Ein- und Ausgabeeinstellungen" + +msgid "Microphone Test" +msgstr "Mikrofontest" + #. *< magic #. *< major version #. *< minor version @@ -15406,9 +14832,6 @@ msgid "Voice/Video Settings" msgstr "Sprach-/Video-Einstellungen" -msgid "Voice and Video Settings" -msgstr "Sprach- und Video-Einstellungen" - #. *< name #. *< version msgid "Configure your microphone and webcam."