Mercurial > pidgin.yaz
changeset 31040:10aa18ac6774
merged from im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Thu, 14 Oct 2010 14:53:35 +0900 |
parents | 7d19aaddba91 (current diff) bc0bccdbc28f (diff) |
children | 2eacc8595967 |
files | libpurple/protocols/jabber/jabber.c libpurple/protocols/oscar/family_icbm.c libpurple/protocols/oscar/oft.c libpurple/protocols/yahoo/libymsg.h pidgin/gtkprefs.c |
diffstat | 33 files changed, 584 insertions(+), 423 deletions(-) [+] |
line wrap: on
line diff
--- a/AUTHORS Thu Oct 14 14:51:46 2010 +0900 +++ b/AUTHORS Thu Oct 14 14:53:35 2010 +0900 @@ -18,6 +18,7 @@ Mark 'KingAnt' Doliner - Developer Sean Egan - Developer Casey Harkins - Developer +Ivan Komarov - Developer Gary 'grim' Kramlich - Developer Richard 'rlaager' Laager - Developer Sulabh 'sulabh_m' Mahajan - Developer
--- a/COPYRIGHT Thu Oct 14 14:51:46 2010 +0900 +++ b/COPYRIGHT Thu Oct 14 14:53:35 2010 +0900 @@ -66,6 +66,7 @@ Julien Bossart Craig Boston Chris Boyle +Stanislav Brabec Derrick J Brashear Mauro Sérgio Ferreira Brasil Luke Bratch
--- a/ChangeLog Thu Oct 14 14:51:46 2010 +0900 +++ b/ChangeLog Thu Oct 14 14:53:35 2010 +0900 @@ -5,11 +5,13 @@ * Fix search path for Tk when compiling on Debian Squeeze. (#12465) * purple-remote now expects and produces UTF-8. (Guillaume Brunerie) (#12049) + * Add Deutsche Telekom, Thawte Primary, and Go Daddy Class 2 root CAs + (#12667, #12668, and #12594) libpurple: * Fall back to an ordinary request if a UI does not support showing a request with an icon. Fixes receiving MSN file transfer requests - including a thumbnail in Finch. + including a thumbnail in Finch. (#12561) * Fix an invalid memory access when removing UPnP mappings that could cause sporadic crashes, most notably when MSN Direct Connections are enabled. (#12387) @@ -34,6 +36,8 @@ (Rodrigo Tobar Carrizo) (#12024) * The Send To menu can now be used if the active account in the conversation becomes disabled or inactive. (Keith Moyer) (#12471) + * xdg-open is now the default browser for new users on non-Windows + platforms. (Stanislav Brabec) (#12505) Finch: * Add support for drop-down account options (like the SILC cipher @@ -54,12 +58,23 @@ is "gmail.com" or "googlemail.com" (it's also needed for Google Talk used for accounts on arbitrary domains not using Google Apps for Your Domain). (#a14153) + * Improved handling of adding oneself to your buddy list when using + Non-SASL (legacy) authentication. (#12499) + * Generate a connection error instead of just stalling when the + _xmppconnect TXT record returns results, but none of them result + in a valid BOSH URI. (#a14367, #12744) Yahoo/Yahoo JAPAN: * Stop doing unnecessary lookups of certain alias information. This solves deadlocks when a given Yahoo account has a ridiculously large (>500 buddies) list and may improve login speed for those on slow connections. (#12532) + * Fix sending SMS messages. The lookup host changed on us. (Thanks to + todo) (#12688). + + Windows: + * Bonjour support now requires Apple Bonjour Print Services version + 2.0.0 or newer (http://support.apple.com/kb/dl999). version 2.7.3 (08/10/2010): General:
--- a/doc/pidgin.1.in Thu Oct 14 14:51:46 2010 +0900 +++ b/doc/pidgin.1.in Thu Oct 14 14:53:35 2010 +0900 @@ -624,6 +624,8 @@ .br Casey Harkins (developer) .br + Ivan Komarov +.br Gary 'grim' Kramlich (developer) .br Richard 'rlaager' Laager (developer) <\fIrlaager@pidgin.im\fR> @@ -662,8 +664,6 @@ Our crazy patch writers include: .br - Paul Aurich -.br Marcus 'malu' Lundblad .br Dennis 'EvilDennisR' Ristuccia
--- a/libpurple/ft.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/ft.c Thu Oct 14 14:53:35 2010 +0900 @@ -1291,6 +1291,11 @@ PurpleXferType type = purple_xfer_get_type(xfer); PurpleXferUiOps *ui_ops = purple_xfer_get_ui_ops(xfer); + if (xfer->start_time != 0) { + purple_debug_error("xfer", "Transfer is being started multiple times\n"); + g_return_if_reached(); + } + if (ui_ops == NULL || (ui_ops->ui_read == NULL && ui_ops->ui_write == NULL)) { xfer->dest_fp = g_fopen(purple_xfer_get_local_filename(xfer), type == PURPLE_XFER_RECEIVE ? "wb" : "rb");
--- a/libpurple/plugins/idle.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/plugins/idle.c Thu Oct 14 14:53:35 2010 +0900 @@ -104,7 +104,6 @@ PurpleAccount *acct = NULL; GList *list, *iter; int tm = purple_request_fields_get_integer(fields, "mins"); - const char *prpl_id = NULL; list = purple_accounts_get_all_active(); for(iter = list; iter; iter = iter->next) {
--- a/libpurple/protocols/bonjour/bonjour.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/bonjour.c Thu Oct 14 14:53:35 2010 +0900 @@ -46,7 +46,14 @@ static char *default_firstname; static char *default_lastname; -static char *default_hostname; + +const char * +bonjour_get_jid(PurpleAccount *account) +{ + PurpleConnection *conn = purple_account_get_connection(account); + BonjourData *bd = conn->proto_data; + return bd->jid; +} static void bonjour_removeallfromlocal(PurpleConnection *conn, PurpleGroup *bonjour_group) @@ -182,6 +189,7 @@ purple_xfer_cancel_local(bd->xfer_lists->data); } + g_free(bd->jid); g_free(bd); connection->proto_data = NULL; } @@ -389,7 +397,8 @@ purple_notify_user_info_add_pair(user_info, _("XMPP Account"), bb->jid); } -static void bonjour_do_group_change(PurpleBuddy *buddy, const char *new_group) { +static void +bonjour_do_group_change(PurpleBuddy *buddy, const char *new_group) { PurpleBlistNodeFlags oldflags; if (buddy == NULL) @@ -445,7 +454,6 @@ g_free(default_firstname); g_free(default_lastname); - g_free(default_hostname); return TRUE; } @@ -566,7 +574,8 @@ }; #ifdef WIN32 -static gboolean _set_default_name_cb(gpointer data) { +static gboolean +_set_default_name_cb(gpointer data) { gchar *fullname = data; const char *splitpoint; GList *tmp = prpl_info.protocol_options; @@ -603,7 +612,8 @@ return FALSE; } -static gpointer _win32_name_lookup_thread(gpointer data) { +static gpointer +_win32_name_lookup_thread(gpointer data) { gchar *fullname = NULL; wchar_t username[UNLEN + 1]; DWORD dwLenUsername = UNLEN + 1; @@ -707,24 +717,15 @@ } g_free(conv); - - /* Try to figure out a good host name to use */ - /* TODO: Avoid 'localhost,' if possible */ - default_hostname = g_strdup(purple_get_host_name()); } static void init_plugin(PurplePlugin *plugin) { - PurpleAccountUserSplit *split; PurpleAccountOption *option; initialize_default_account_values(); - /* Creating the user splits */ - split = purple_account_user_split_new(_("Hostname"), default_hostname, '@'); - prpl_info.user_splits = g_list_append(prpl_info.user_splits, split); - /* Creating the options for the protocol */ option = purple_account_option_int_new(_("Local Port"), "port", BONJOUR_DEFAULT_PORT); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
--- a/libpurple/protocols/bonjour/bonjour.h Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/bonjour.h Thu Oct 14 14:53:35 2010 +0900 @@ -45,6 +45,12 @@ BonjourDnsSd *dns_sd_data; BonjourJabber *jabber_data; GSList *xfer_lists; + gchar *jid; } BonjourData; +/** + * This will always be username@machinename + */ +const char *bonjour_get_jid(PurpleAccount *account); + #endif /* _BONJOUR_H_ */
--- a/libpurple/protocols/bonjour/bonjour_ft.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/bonjour_ft.c Thu Oct 14 14:53:35 2010 +0900 @@ -53,11 +53,12 @@ g_return_if_fail(error_code != NULL); g_return_if_fail(error_type != NULL); - if(!to || !id) + if(!to || !id) { + purple_debug_info("bonjour", "xep file transfer stream initialization error.\n"); return; + } - purple_debug_info("bonjour", "xep file transfer stream initialization error.\n"); - iq = xep_iq_new(bd, XEP_IQ_ERROR, to, purple_account_get_username(bd->jabber_data->account), id); + iq = xep_iq_new(bd, XEP_IQ_ERROR, to, bonjour_get_jid(bd->jabber_data->account), id); if(iq == NULL) return; @@ -195,7 +196,7 @@ /* Assign stream id. */ g_free(xf->iq_id); xf->iq_id = g_strdup_printf("%u", next_id++); - iq = xep_iq_new(xf->data, XEP_IQ_SET, to, purple_account_get_username(bd->jabber_data->account), xf->iq_id); + iq = xep_iq_new(xf->data, XEP_IQ_SET, to, bonjour_get_jid(bd->jabber_data->account), xf->iq_id); if(iq == NULL) return; @@ -255,7 +256,7 @@ bd = xf->data; purple_debug_info("bonjour", "xep file transfer stream initialization result.\n"); - iq = xep_iq_new(bd, XEP_IQ_RESULT, to, purple_account_get_username(bd->jabber_data->account), xf->iq_id); + iq = xep_iq_new(bd, XEP_IQ_RESULT, to, bonjour_get_jid(bd->jabber_data->account), xf->iq_id); if(iq == NULL) return; @@ -763,7 +764,7 @@ bd = xf->data; - iq = xep_iq_new(bd, XEP_IQ_SET, xfer->who, purple_account_get_username(bd->jabber_data->account), xf->sid); + iq = xep_iq_new(bd, XEP_IQ_SET, xfer->who, bonjour_get_jid(bd->jabber_data->account), xf->sid); query = xmlnode_new_child(iq->node, "query"); xmlnode_set_namespace(query, "http://jabber.org/protocol/bytestreams"); @@ -835,7 +836,7 @@ /* Here, start the file transfer.*/ /* Notify Initiator of Connection */ - iq = xep_iq_new(bd, XEP_IQ_RESULT, xfer->who, purple_account_get_username(bd->jabber_data->account), xf->iq_id); + iq = xep_iq_new(bd, XEP_IQ_RESULT, xfer->who, bonjour_get_jid(bd->jabber_data->account), xf->iq_id); q_node = xmlnode_new_child(iq->node, "query"); xmlnode_set_namespace(q_node, "http://jabber.org/protocol/bytestreams"); tmp_node = xmlnode_new_child(q_node, "streamhost-used"); @@ -868,7 +869,7 @@ name = purple_buddy_get_name(pb); account = purple_buddy_get_account(pb); - p = g_strdup_printf("%s%s%s", xf->sid, name, purple_account_get_username(account)); + p = g_strdup_printf("%s%s%s", xf->sid, name, bonjour_get_jid(account)); purple_cipher_digest_region("sha1", (guchar *)p, strlen(p), sizeof(hashval), hashval, NULL); g_free(p);
--- a/libpurple/protocols/bonjour/dns_sd_proxy.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/dns_sd_proxy.c Thu Oct 14 14:53:35 2010 +0900 @@ -1,181 +1,191 @@ -/* - * - * Purple is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA. - */ - -#include "win32dep.h" -#include "dns_sd_proxy.h" - -#ifndef LINK_DNS_SD_DIRECTLY -static DNSServiceErrorType (DNSSD_API* _DNSServiceAddRecord)(DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, - uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl); -static DNSServiceErrorType (DNSSD_API* _DNSServiceBrowse)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context); -static int (DNSSD_API* _DNSServiceConstructFullName)(char *fullName, const char *service, const char *regtype, const char *domain); -static DNSServiceErrorType (DNSSD_API* _DNSServiceProcessResult)(DNSServiceRef sdRef); -static DNSServiceErrorType (DNSSD_API* _DNSServiceQueryRecord)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context); -static void (DNSSD_API* _DNSServiceRefDeallocate)(DNSServiceRef sdRef); -static int (DNSSD_API* _DNSServiceRefSockFD)(DNSServiceRef sdRef); -static DNSServiceErrorType (DNSSD_API* _DNSServiceRegister)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - const char *name, const char *regtype, const char *domain, const char *host, uint16_t port, uint16_t txtLen, - const void *txtRecord, DNSServiceRegisterReply callBack, void *context); -static DNSServiceErrorType (DNSSD_API* _DNSServiceResolve)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, - const char *regtype, const char *domain, DNSServiceResolveReply callBack, void *context); -static DNSServiceErrorType (DNSSD_API* _DNSServiceRemoveRecord)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags); -static DNSServiceErrorType (DNSSD_API* _DNSServiceUpdateRecord)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, - uint16_t rdlen, const void *rdata, uint32_t ttl); -static void (DNSSD_API* _TXTRecordCreate)(TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer); -static void (DNSSD_API* _TXTRecordDeallocate)(TXTRecordRef *txtRecord); -static const void * (DNSSD_API* _TXTRecordGetBytesPtr)(const TXTRecordRef *txtRecord); -static int16_t (DNSSD_API* _TXTRecordGetLength)(const TXTRecordRef *txtRecord); -static const void * (DNSSD_API* _TXTRecordGetValuePtr)(uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen); -static DNSServiceErrorType (DNSSD_API* _TXTRecordSetValue)(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value); -#endif - -gboolean dns_sd_available(void) { -#ifndef LINK_DNS_SD_DIRECTLY - static gboolean initialized = FALSE; - static gboolean loaded = FALSE; - - if (!initialized) { - initialized = TRUE; - if ((_DNSServiceAddRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceAddRecord")) - && (_DNSServiceBrowse = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceBrowse")) - && (_DNSServiceConstructFullName = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceConstructFullName")) - && (_DNSServiceProcessResult = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceProcessResult")) - && (_DNSServiceQueryRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceQueryRecord")) - && (_DNSServiceRefDeallocate = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefDeallocate")) - && (_DNSServiceRefSockFD = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefSockFD")) - && (_DNSServiceRegister = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRegister")) - && (_DNSServiceResolve = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceResolve")) - && (_DNSServiceRemoveRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRemoveRecord")) - && (_DNSServiceUpdateRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceUpdateRecord")) - && (_TXTRecordCreate = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordCreate")) - && (_TXTRecordDeallocate = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordDeallocate")) - && (_TXTRecordGetBytesPtr = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetBytesPtr")) - && (_TXTRecordGetLength = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetLength")) - && (_TXTRecordGetValuePtr = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetValuePtr")) - && (_TXTRecordSetValue = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordSetValue"))) { - loaded = TRUE; - } - } - return loaded; -#else - return TRUE; -#endif -} - -#ifndef LINK_DNS_SD_DIRECTLY - -DNSServiceErrorType _wpurple_DNSServiceAddRecord(DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, - uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl) { - g_return_val_if_fail(_DNSServiceAddRecord != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceAddRecord)(sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl); -} - -DNSServiceErrorType _wpurple_DNSServiceBrowse(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context) { - g_return_val_if_fail(_DNSServiceBrowse != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceBrowse)(sdRef, flags, interfaceIndex, regtype, domain, callBack, context); -} - -int _wpurple_DNSServiceConstructFullName(char *fullName, const char *service, const char *regtype, const char *domain) { - g_return_val_if_fail(_DNSServiceConstructFullName != NULL, 0); - return (_DNSServiceConstructFullName)(fullName, service, regtype, domain); -} - -DNSServiceErrorType _wpurple_DNSServiceProcessResult(DNSServiceRef sdRef) { - g_return_val_if_fail(_DNSServiceProcessResult != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceProcessResult)(sdRef); -} - - -DNSServiceErrorType _wpurple_DNSServiceQueryRecord(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context) { - g_return_val_if_fail(_DNSServiceQueryRecord != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceQueryRecord)(sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context); -} - -void _wpurple_DNSServiceRefDeallocate(DNSServiceRef sdRef) { - g_return_if_fail(_DNSServiceRefDeallocate != NULL); - (_DNSServiceRefDeallocate)(sdRef); -} - -int _wpurple_DNSServiceRefSockFD(DNSServiceRef sdRef) { - g_return_val_if_fail(_DNSServiceRefSockFD != NULL, -1); - return (_DNSServiceRefSockFD)(sdRef); -} - -DNSServiceErrorType _wpurple_DNSServiceRegister(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, - const char *name, const char *regtype, const char *domain, const char *host, uint16_t port, uint16_t txtLen, - const void *txtRecord, DNSServiceRegisterReply callBack, void *context) { - g_return_val_if_fail(_DNSServiceRegister != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceRegister)(sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context); -} - -DNSServiceErrorType _wpurple_DNSServiceResolve(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, - const char *regtype, const char *domain, DNSServiceResolveReply callBack, void *context) { - g_return_val_if_fail(_DNSServiceResolve != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceResolve)(sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context); -} - -DNSServiceErrorType _wpurple_DNSServiceRemoveRecord(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags) { - g_return_val_if_fail(_DNSServiceRemoveRecord != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceRemoveRecord)(sdRef, RecordRef, flags); -} - -DNSServiceErrorType _wpurple_DNSServiceUpdateRecord(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, - uint16_t rdlen, const void *rdata, uint32_t ttl) { - g_return_val_if_fail(_DNSServiceUpdateRecord != NULL, kDNSServiceErr_Unknown); - return (_DNSServiceUpdateRecord)(sdRef, RecordRef, flags, rdlen, rdata, ttl); -} - -void _wpurple_TXTRecordCreate(TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer) { - g_return_if_fail(_TXTRecordCreate != NULL); - (_TXTRecordCreate)(txtRecord, bufferLen, buffer); -} - -void _wpurple_TXTRecordDeallocate(TXTRecordRef *txtRecord) { - g_return_if_fail(_TXTRecordDeallocate != NULL); - (_TXTRecordDeallocate)(txtRecord); -} - -const void * _wpurple_TXTRecordGetBytesPtr(const TXTRecordRef *txtRecord) { - g_return_val_if_fail(_TXTRecordGetBytesPtr != NULL, NULL); - return (_TXTRecordGetBytesPtr)(txtRecord); -} - -uint16_t _wpurple_TXTRecordGetLength(const TXTRecordRef *txtRecord) { - g_return_val_if_fail(_TXTRecordGetLength != NULL, 0); - return (_TXTRecordGetLength)(txtRecord); -} - -const void * _wpurple_TXTRecordGetValuePtr(uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen) { - g_return_val_if_fail(_TXTRecordGetValuePtr != NULL, NULL); - return (_TXTRecordGetValuePtr)(txtLen, txtRecord, key, valueLen); -} - -DNSServiceErrorType _wpurple_TXTRecordSetValue(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value) { - g_return_val_if_fail(_TXTRecordSetValue != NULL, kDNSServiceErr_Unknown); - return (_TXTRecordSetValue)(txtRecord, key, valueSize, value); -} - -#endif /*LINK_DNS_SD_DIRECTLY*/ - +/* + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA. + */ + +#include "win32dep.h" +#include "dns_sd_proxy.h" + +#ifndef LINK_DNS_SD_DIRECTLY +static DNSServiceErrorType (DNSSD_API* _DNSServiceAddRecord)(DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, + uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl); +static DNSServiceErrorType (DNSSD_API* _DNSServiceBrowse)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context); +static int (DNSSD_API* _DNSServiceConstructFullName)(char *fullName, const char *service, const char *regtype, const char *domain); +static DNSServiceErrorType (DNSSD_API* _DNSServiceGetAddrInfo)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context); +static DNSServiceErrorType (DNSSD_API* _DNSServiceProcessResult)(DNSServiceRef sdRef); +static DNSServiceErrorType (DNSSD_API* _DNSServiceQueryRecord)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context); +static void (DNSSD_API* _DNSServiceRefDeallocate)(DNSServiceRef sdRef); +static int (DNSSD_API* _DNSServiceRefSockFD)(DNSServiceRef sdRef); +static DNSServiceErrorType (DNSSD_API* _DNSServiceRegister)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + const char *name, const char *regtype, const char *domain, const char *host, uint16_t port, uint16_t txtLen, + const void *txtRecord, DNSServiceRegisterReply callBack, void *context); +static DNSServiceErrorType (DNSSD_API* _DNSServiceResolve)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, + const char *regtype, const char *domain, DNSServiceResolveReply callBack, void *context); +static DNSServiceErrorType (DNSSD_API* _DNSServiceRemoveRecord)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags); +static DNSServiceErrorType (DNSSD_API* _DNSServiceUpdateRecord)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, + uint16_t rdlen, const void *rdata, uint32_t ttl); +static void (DNSSD_API* _TXTRecordCreate)(TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer); +static void (DNSSD_API* _TXTRecordDeallocate)(TXTRecordRef *txtRecord); +static const void * (DNSSD_API* _TXTRecordGetBytesPtr)(const TXTRecordRef *txtRecord); +static int16_t (DNSSD_API* _TXTRecordGetLength)(const TXTRecordRef *txtRecord); +static const void * (DNSSD_API* _TXTRecordGetValuePtr)(uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen); +static DNSServiceErrorType (DNSSD_API* _TXTRecordSetValue)(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value); + +#endif + +gboolean dns_sd_available(void) { +#ifndef LINK_DNS_SD_DIRECTLY + static gboolean initialized = FALSE; + static gboolean loaded = FALSE; + + if (!initialized) { + initialized = TRUE; + if ((_DNSServiceAddRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceAddRecord")) + && (_DNSServiceBrowse = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceBrowse")) + && (_DNSServiceConstructFullName = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceConstructFullName")) + && (_DNSServiceGetAddrInfo = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceGetAddrInfo")) + && (_DNSServiceProcessResult = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceProcessResult")) + && (_DNSServiceQueryRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceQueryRecord")) + && (_DNSServiceRefDeallocate = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefDeallocate")) + && (_DNSServiceRefSockFD = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefSockFD")) + && (_DNSServiceRegister = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRegister")) + && (_DNSServiceResolve = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceResolve")) + && (_DNSServiceRemoveRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRemoveRecord")) + && (_DNSServiceUpdateRecord = (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceUpdateRecord")) + && (_TXTRecordCreate = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordCreate")) + && (_TXTRecordDeallocate = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordDeallocate")) + && (_TXTRecordGetBytesPtr = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetBytesPtr")) + && (_TXTRecordGetLength = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetLength")) + && (_TXTRecordGetValuePtr = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetValuePtr")) + && (_TXTRecordSetValue = (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordSetValue"))) { + loaded = TRUE; + } + } + return loaded; +#else + return TRUE; +#endif +} + +#ifndef LINK_DNS_SD_DIRECTLY + +DNSServiceErrorType _wpurple_DNSServiceAddRecord(DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, + uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl) { + g_return_val_if_fail(_DNSServiceAddRecord != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceAddRecord)(sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl); +} + +DNSServiceErrorType _wpurple_DNSServiceBrowse(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context) { + g_return_val_if_fail(_DNSServiceBrowse != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceBrowse)(sdRef, flags, interfaceIndex, regtype, domain, callBack, context); +} + +int _wpurple_DNSServiceConstructFullName(char *fullName, const char *service, const char *regtype, const char *domain) { + g_return_val_if_fail(_DNSServiceConstructFullName != NULL, 0); + return (_DNSServiceConstructFullName)(fullName, service, regtype, domain); +} + +DNSServiceErrorType _wpurple_DNSServiceGetAddrInfo(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context) { + g_return_val_if_fail(_DNSServiceGetAddrInfo != NULL, 0); + return (_DNSServiceGetAddrInfo)(sdRef, flags, interfaceIndex, protocol, hostname, callBack, context); +} + +DNSServiceErrorType _wpurple_DNSServiceProcessResult(DNSServiceRef sdRef) { + g_return_val_if_fail(_DNSServiceProcessResult != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceProcessResult)(sdRef); +} + + +DNSServiceErrorType _wpurple_DNSServiceQueryRecord(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context) { + g_return_val_if_fail(_DNSServiceQueryRecord != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceQueryRecord)(sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context); +} + +void _wpurple_DNSServiceRefDeallocate(DNSServiceRef sdRef) { + g_return_if_fail(_DNSServiceRefDeallocate != NULL); + (_DNSServiceRefDeallocate)(sdRef); +} + +int _wpurple_DNSServiceRefSockFD(DNSServiceRef sdRef) { + g_return_val_if_fail(_DNSServiceRefSockFD != NULL, -1); + return (_DNSServiceRefSockFD)(sdRef); +} + +DNSServiceErrorType _wpurple_DNSServiceRegister(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + const char *name, const char *regtype, const char *domain, const char *host, uint16_t port, uint16_t txtLen, + const void *txtRecord, DNSServiceRegisterReply callBack, void *context) { + g_return_val_if_fail(_DNSServiceRegister != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceRegister)(sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context); +} + +DNSServiceErrorType _wpurple_DNSServiceResolve(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, + const char *regtype, const char *domain, DNSServiceResolveReply callBack, void *context) { + g_return_val_if_fail(_DNSServiceResolve != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceResolve)(sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context); +} + +DNSServiceErrorType _wpurple_DNSServiceRemoveRecord(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags) { + g_return_val_if_fail(_DNSServiceRemoveRecord != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceRemoveRecord)(sdRef, RecordRef, flags); +} + +DNSServiceErrorType _wpurple_DNSServiceUpdateRecord(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, + uint16_t rdlen, const void *rdata, uint32_t ttl) { + g_return_val_if_fail(_DNSServiceUpdateRecord != NULL, kDNSServiceErr_Unknown); + return (_DNSServiceUpdateRecord)(sdRef, RecordRef, flags, rdlen, rdata, ttl); +} + +void _wpurple_TXTRecordCreate(TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer) { + g_return_if_fail(_TXTRecordCreate != NULL); + (_TXTRecordCreate)(txtRecord, bufferLen, buffer); +} + +void _wpurple_TXTRecordDeallocate(TXTRecordRef *txtRecord) { + g_return_if_fail(_TXTRecordDeallocate != NULL); + (_TXTRecordDeallocate)(txtRecord); +} + +const void * _wpurple_TXTRecordGetBytesPtr(const TXTRecordRef *txtRecord) { + g_return_val_if_fail(_TXTRecordGetBytesPtr != NULL, NULL); + return (_TXTRecordGetBytesPtr)(txtRecord); +} + +uint16_t _wpurple_TXTRecordGetLength(const TXTRecordRef *txtRecord) { + g_return_val_if_fail(_TXTRecordGetLength != NULL, 0); + return (_TXTRecordGetLength)(txtRecord); +} + +const void * _wpurple_TXTRecordGetValuePtr(uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen) { + g_return_val_if_fail(_TXTRecordGetValuePtr != NULL, NULL); + return (_TXTRecordGetValuePtr)(txtLen, txtRecord, key, valueLen); +} + +DNSServiceErrorType _wpurple_TXTRecordSetValue(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value) { + g_return_val_if_fail(_TXTRecordSetValue != NULL, kDNSServiceErr_Unknown); + return (_TXTRecordSetValue)(txtRecord, key, valueSize, value); +} + +#endif /*LINK_DNS_SD_DIRECTLY*/ +
--- a/libpurple/protocols/bonjour/dns_sd_proxy.h Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/dns_sd_proxy.h Thu Oct 14 14:53:35 2010 +0900 @@ -51,6 +51,11 @@ #define DNSServiceConstructFullName(fullName, service, regtype, domain) \ _wpurple_DNSServiceConstructFullName(fullName, service, regtype, domain) +DNSServiceErrorType _wpurple_DNSServiceGetAddrInfo(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context); +#define DNSServiceGetAddrInfo(sdRef, flags, interfaceIndex, protocol, hostname, callBack, context) \ + _wpurple_DNSServiceGetAddrInfo(sdRef, flags, interfaceIndex, protocol, hostname, callBack, context) + DNSServiceErrorType _wpurple_DNSServiceProcessResult(DNSServiceRef sdRef); #define DNSServiceProcessResult(sdRef) \ _wpurple_DNSServiceProcessResult(sdRef);
--- a/libpurple/protocols/bonjour/jabber.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/jabber.c Thu Oct 14 14:53:35 2010 +0900 @@ -425,7 +425,7 @@ bonjour_jabber_close_conversation(bconv); if (bconv->pb != NULL) { BonjourBuddy *bb = purple_buddy_get_protocol_data(bconv->pb); - + if(bb != NULL) bb->conversation = NULL; } @@ -534,7 +534,7 @@ if (bname == NULL) bname = ""; - stream_start = g_strdup_printf(DOCTYPE, purple_account_get_username(bconv->account), bname); + stream_start = g_strdup_printf(DOCTYPE, bonjour_get_jid(bconv->account), bname); len = strlen(stream_start); bconv->sent_stream_start = PARTIALLY_SENT; @@ -774,6 +774,10 @@ #ifdef PF_INET6 if (jdata->socket6 != -1) { struct sockaddr_in6 addr6; +#ifdef IPV6_V6ONLY + int on = 1; + setsockopt(jdata->socket6, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)); +#endif memset(&addr6, 0, sizeof(addr6)); addr6.sin6_family = AF_INET6; addr6.sin6_port = htons(jdata->port); @@ -1044,7 +1048,7 @@ message_node = xmlnode_new("message"); xmlnode_set_attrib(message_node, "to", bb->name); - xmlnode_set_attrib(message_node, "from", purple_account_get_username(jdata->account)); + xmlnode_set_attrib(message_node, "from", bonjour_get_jid(jdata->account)); xmlnode_set_attrib(message_node, "type", "chat"); /* Enclose the message from the UI within a "font" node */ @@ -1259,7 +1263,7 @@ for(l = acc->deny; l != NULL; l = l->next) { const gchar *name = purple_buddy_get_name(pb); - const gchar *username = purple_account_get_username(acc); + const gchar *username = bonjour_get_jid(acc); if(!purple_utf8_strcasecmp(name, (char *)l->data)) { purple_debug_info("bonjour", "%s has been blocked by %s.\n", name, username);
--- a/libpurple/protocols/bonjour/mdns_avahi.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/mdns_avahi.c Thu Oct 14 14:53:35 2010 +0900 @@ -252,7 +252,7 @@ /* A new peer has joined the network and uses iChat bonjour */ purple_debug_info("bonjour", "_browser_callback - new service\n"); /* Make sure it isn't us */ - if (purple_utf8_strcasecmp(name, account->username) != 0) { + if (purple_utf8_strcasecmp(name, bonjour_get_jid(account)) != 0) { if (!avahi_service_resolver_new(avahi_service_browser_get_client(b), interface, protocol, name, type, domain, protocol, 0, _resolver_callback, account)) { @@ -421,6 +421,8 @@ data->mdns_impl_data = idata; + bonjour_dns_sd_set_jid(data->account, avahi_client_get_host_name(idata->client)); + return TRUE; } @@ -454,14 +456,14 @@ publish_result = avahi_entry_group_add_service_strlst( idata->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, - purple_account_get_username(data->account), + bonjour_get_jid(data->account), LINK_LOCAL_RECORD_NAME, NULL, NULL, data->port_p2pj, lst); break; case PUBLISH_UPDATE: publish_result = avahi_entry_group_update_service_txt_strlst( idata->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, - purple_account_get_username(data->account), + bonjour_get_jid(data->account), LINK_LOCAL_RECORD_NAME, NULL, lst); break; } @@ -535,7 +537,7 @@ } svc_name = g_strdup_printf("%s." LINK_LOCAL_RECORD_NAME "local", - purple_account_get_username(data->account)); + bonjour_get_jid(data->account)); ret = avahi_entry_group_add_record(idata->buddy_icon_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, flags, svc_name,
--- a/libpurple/protocols/bonjour/mdns_common.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/mdns_common.c Thu Oct 14 14:53:35 2010 +0900 @@ -252,3 +252,36 @@ void bonjour_dns_sd_stop(BonjourDnsSd *data) { _mdns_stop(data); } + +void +bonjour_dns_sd_set_jid(PurpleAccount *account, const char *hostname) +{ + PurpleConnection *conn = purple_account_get_connection(account); + BonjourData *bd = conn->proto_data; + const char *tmp, *account_name = purple_account_get_username(account); + + /* Previously we allowed the hostname part of the jid to be set + * explicitly when it should always be the current hostname. + * That is what this is intended to deal with. + */ + if ((tmp = strchr(account_name, '@')) + && strstr(tmp, hostname) == (tmp + 1) + && *((tmp + 1) + strlen(hostname)) == '\0') + bd->jid = g_strdup(account_name); + else { + const char *tmp2; + GString *str = g_string_new(""); + /* Escape an '@' in the account name */ + tmp = account_name; + while ((tmp2 = strchr(tmp, '@')) != NULL) { + g_string_append_len(str, tmp, tmp2 - tmp); + g_string_append(str, "\\40"); + tmp = tmp2 + 1; + } + g_string_append(str, tmp); + g_string_append_c(str, '@'); + g_string_append(str, hostname); + + bd->jid = g_string_free(str, FALSE); + } +}
--- a/libpurple/protocols/bonjour/mdns_common.h Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/mdns_common.h Thu Oct 14 14:53:35 2010 +0900 @@ -57,4 +57,6 @@ */ void bonjour_dns_sd_stop(BonjourDnsSd *data); +void bonjour_dns_sd_set_jid(PurpleAccount *account, const char *hostname); + #endif
--- a/libpurple/protocols/bonjour/mdns_win32.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/bonjour/mdns_win32.c Thu Oct 14 14:53:35 2010 +0900 @@ -25,8 +25,8 @@ #include "buddy.h" #include "mdns_interface.h" #include "dns_sd_proxy.h" -#include "dnsquery.h" #include "mdns_common.h" +#include "bonjour.h" static GSList *pending_buddies = NULL; @@ -65,7 +65,6 @@ BonjourBuddy *bb; Win32SvcResolverData *res_data; gchar *full_service_name; - PurpleDnsQueryData *dns_query; } ResolveCallbackArgs; @@ -135,7 +134,7 @@ { if (errorCode != kDNSServiceErr_NoError) { - purple_debug_error("bonjour", "record query - callback error.\n"); + purple_debug_error("bonjour", "record query - callback error (%d).\n", errorCode); /* TODO: Probably should remove the buddy when this happens */ } else if (flags & kDNSServiceFlagsAdd) { if (rrtype == kDNSServiceType_TXT) { @@ -161,14 +160,22 @@ } } -static void -_mdns_resolve_host_callback(GSList *hosts, gpointer data, const char *error_message) +static void DNSSD_API +_mdns_resolve_host_callback(DNSServiceRef sdRef, DNSServiceFlags flags, + uint32_t interfaceIndex, DNSServiceErrorType errorCode, + const char *hostname, const struct sockaddr *address, + uint32_t ttl, void *context) { - ResolveCallbackArgs *args = (ResolveCallbackArgs*) data; + ResolveCallbackArgs *args = (ResolveCallbackArgs*) context; Win32BuddyImplData *idata = args->bb->mdns_impl_data; gboolean delete_buddy = FALSE; PurpleBuddy *pb = NULL; + purple_input_remove(args->resolver_query->input_handler); + DNSServiceRefDeallocate(args->resolver_query->sdRef); + g_free(args->resolver_query); + args->resolver_query = NULL; + if ((pb = purple_find_buddy(args->account, args->res_data->name))) { if (pb->proto_data != args->bb) { purple_debug_error("bonjour", "Found purple buddy for %s not matching bonjour buddy record.", @@ -181,12 +188,10 @@ goto cleanup; } - if (!hosts || !hosts->data) { - purple_debug_error("bonjour", "host resolution - callback error.\n"); + if (errorCode != kDNSServiceErr_NoError) { + purple_debug_error("bonjour", "host resolution - callback error (%d).\n", errorCode); delete_buddy = TRUE; } else { - struct sockaddr_in *addr = g_slist_nth_data(hosts, 1); - DNSServiceErrorType errorCode; DNSServiceRef txt_query_sr; /* finally, set up the continuous txt record watcher, and add the buddy to purple */ @@ -194,7 +199,7 @@ kDNSServiceInterfaceIndexAny, args->full_service_name, kDNSServiceType_TXT, kDNSServiceClass_IN, _mdns_record_query_callback, args->bb); if (errorCode == kDNSServiceErr_NoError) { - const char *ip = inet_ntoa(addr->sin_addr); + const char *ip = inet_ntoa(((struct sockaddr_in *) address)->sin_addr); purple_debug_info("bonjour", "Found buddy %s at %s:%d\n", args->bb->name, ip, args->bb->port_p2pj); @@ -218,13 +223,6 @@ cleanup: - /* free the hosts list*/ - while (hosts != NULL) { - hosts = g_slist_remove(hosts, hosts->data); - g_free(hosts->data); - hosts = g_slist_remove(hosts, hosts->data); - } - if (delete_buddy) { idata->resolvers = g_slist_remove(idata->resolvers, args->res_data); _cleanup_resolver_data(args->res_data); @@ -259,17 +257,20 @@ /* remove the input fd and destroy the service ref */ purple_input_remove(args->resolver_query->input_handler); DNSServiceRefDeallocate(args->resolver_query->sdRef); - g_free(args->resolver_query); - args->resolver_query = NULL; if (errorCode != kDNSServiceErr_NoError) - purple_debug_error("bonjour", "service resolver - callback error.\n"); + purple_debug_error("bonjour", "service resolver - callback error. (%d)\n", errorCode); else { + DNSServiceRef getaddrinfo_sr; /* set more arguments, and start the host resolver */ - - if ((args->dns_query = - purple_dnsquery_a(hosttarget, port, _mdns_resolve_host_callback, args)) != NULL) { - + errorCode = DNSServiceGetAddrInfo(&getaddrinfo_sr, 0, interfaceIndex, + kDNSServiceProtocol_IPv4, hosttarget, _mdns_resolve_host_callback, args); + if (errorCode != kDNSServiceErr_NoError) + purple_debug_error("bonjour", "service resolver - host resolution failed.\n"); + else { + args->resolver_query->sdRef = getaddrinfo_sr; + args->resolver_query->input_handler = purple_input_add(DNSServiceRefSockFD(getaddrinfo_sr), + PURPLE_INPUT_READ, _mdns_handle_event, args->resolver_query); args->full_service_name = g_strdup(fullname); /* TODO: Should this be per resolver? */ @@ -277,12 +278,14 @@ /* We don't want to hit the cleanup code */ return; - } else - purple_debug_error("bonjour", "service resolver - host resolution failed.\n"); + } } /* If we get this far, clean up */ + g_free(args->resolver_query); + args->resolver_query = NULL; + idata->resolvers = g_slist_remove(idata->resolvers, args->res_data); _cleanup_resolver_data(args->res_data); @@ -324,7 +327,7 @@ purple_debug_error("bonjour", "service browser - callback error (%d)\n", errorCode); else if (flags & kDNSServiceFlagsAdd) { /* A presence service instance has been discovered... check it isn't us! */ - if (purple_utf8_strcasecmp(serviceName, account->username) != 0) { + if (purple_utf8_strcasecmp(serviceName, bonjour_get_jid(account)) != 0) { DNSServiceErrorType resErrorCode; /* OK, lets go ahead and resolve it to add to the buddy list */ ResolveCallbackArgs *args = g_new0(ResolveCallbackArgs, 1); @@ -334,7 +337,7 @@ serviceName, interfaceIndex, regtype ? regtype : "", replyDomain ? replyDomain : ""); - resErrorCode = DNSServiceResolve(&resolver_sr, 0, 0, serviceName, regtype, + resErrorCode = DNSServiceResolve(&resolver_sr, 0, interfaceIndex, serviceName, regtype, replyDomain, _mdns_service_resolve_callback, args); if (resErrorCode == kDNSServiceErr_NoError) { GSList *tmp = pending_buddies; @@ -452,6 +455,9 @@ gboolean _mdns_init_session(BonjourDnsSd *data) { data->mdns_impl_data = g_new0(Win32SessionImplData, 1); + + bonjour_dns_sd_set_jid(data->account, purple_get_host_name()); + return TRUE; } @@ -483,7 +489,8 @@ switch (type) { case PUBLISH_START: purple_debug_info("bonjour", "Registering presence on port %d\n", data->port_p2pj); - errorCode = DNSServiceRegister(&presence_sr, 0, 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME, + errorCode = DNSServiceRegister(&presence_sr, kDNSServiceInterfaceIndexAny, + 0, bonjour_get_jid(data->account), LINK_LOCAL_RECORD_NAME, NULL, NULL, htons(data->port_p2pj), TXTRecordGetLength(&dns_data), TXTRecordGetBytesPtr(&dns_data), _mdns_service_register_callback, NULL); break; @@ -522,8 +529,9 @@ g_return_val_if_fail(idata != NULL, FALSE); - errorCode = DNSServiceBrowse(&browser_sr, 0, 0, LINK_LOCAL_RECORD_NAME, NULL, - _mdns_service_browse_callback, data->account); + errorCode = DNSServiceBrowse(&browser_sr, 0, kDNSServiceInterfaceIndexAny, + LINK_LOCAL_RECORD_NAME, NULL,_mdns_service_browse_callback, + data->account); if (errorCode == kDNSServiceErr_NoError) { idata->browser_query = g_new(DnsSDServiceRefHandlerData, 1); idata->browser_query->sdRef = browser_sr;
--- a/libpurple/protocols/jabber/jabber.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/jabber/jabber.c Thu Oct 14 14:53:35 2010 +0900 @@ -220,11 +220,30 @@ account = purple_connection_get_account(js->gc); +#if 0 + /* + * This code DOES NOT EXIST, will never be enabled by default, and + * will never ever be supported (by me). + * It's literally *only* for developer testing. + */ + { + const gchar *connection_security = purple_account_get_string(account, "connection_security", JABBER_DEFAULT_REQUIRE_TLS); + if (!g_str_equal(connection_security, "none") && + purple_ssl_is_supported()) { + jabber_send_raw(js, + "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1); + return TRUE; + } + } +#else if(purple_ssl_is_supported()) { jabber_send_raw(js, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1); return TRUE; + } else { + purple_debug_warning("jabber", "No libpurple TLS/SSL support found."); } +#endif starttls = xmlnode_get_child(packet, "starttls"); if(xmlnode_get_child(starttls, "required")) { @@ -745,18 +764,10 @@ txt_resolved_cb(GList *responses, gpointer data) { JabberStream *js = data; + gboolean found = FALSE; js->srv_query_data = NULL; - if (responses == NULL) { - purple_debug_warning("jabber", "Unable to find alternative XMPP connection " - "methods after failing to connect directly.\n"); - purple_connection_error_reason(js->gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Unable to connect")); - return; - } - while (responses) { PurpleTxtResponse *resp = responses->data; gchar **token; @@ -773,9 +784,17 @@ } if (js->bosh) { + found = TRUE; jabber_bosh_connection_connect(js->bosh); - } else { - purple_debug_info("jabber","Didn't find an alternative connection method.\n"); + } + + if (!found) { + purple_debug_warning("jabber", "Unable to find alternative XMPP connection " + "methods after failing to connect directly.\n"); + purple_connection_error_reason(js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to connect")); + return; } if (responses) { @@ -951,6 +970,11 @@ js->buddies = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_buddy_free); + /* This is overridden during binding, but we need it here + * in case the server only does legacy non-sasl auth!. + */ + purple_connection_set_display_name(gc, user); + js->user_jb = jabber_buddy_find(js, user, TRUE); g_free(user); if (!js->user_jb) { @@ -2644,13 +2668,19 @@ if(reason != NULL) { *reason = x; } if((error = xmlnode_get_child(packet, "error"))) { + xmlnode *t = xmlnode_get_child_with_namespace(error, "text", NS_XMPP_STANZAS); + if (t) + cdata = xmlnode_get_data(t); +#if 0 cdata = xmlnode_get_data(error); +#endif code = xmlnode_get_attrib(error, "code"); /* Stanza errors */ if(xmlnode_get_child(error, "bad-request")) { text = _("Bad Request"); } else if(xmlnode_get_child(error, "conflict")) { + SET_REASON(PURPLE_CONNECTION_ERROR_NAME_IN_USE); text = _("Conflict"); } else if(xmlnode_get_child(error, "feature-not-implemented")) { text = _("Feature Not Implemented");
--- a/libpurple/protocols/jabber/parser.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/jabber/parser.c Thu Oct 14 14:53:35 2010 +0900 @@ -109,7 +109,7 @@ js->stream_id = g_strdup(""); purple_debug_info("jabber", "Server failed to specify a stream " "ID (underspecified in rfc3920, but intended " - "to be a MUST; digest legacy auth may fail."); + "to be a MUST; digest legacy auth may fail.\n"); #endif } } else {
--- a/libpurple/protocols/oscar/family_icbm.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/oscar/family_icbm.c Thu Oct 14 14:53:35 2010 +0900 @@ -1976,10 +1976,9 @@ fmt = "<N><QUERY><Q><PluginID>srvMng</PluginID></Q></QUERY><NOTIFY><srv><id>cAwaySrv</id><req><id>AwayStat</id><trans>2</trans><senderId>%s</senderId></req></srv></NOTIFY></N>\r\n"; account = purple_connection_get_account(od->gc); - xmllen = strlen(fmt) - 2 + strlen(account->username); - statxml = g_malloc(xmllen); - snprintf(statxml, xmllen, fmt, account->username); + statxml = g_strdup_printf(fmt, account->username); + xmllen = strlen(statxml); aim_icbm_makecookie(cookie); @@ -2002,7 +2001,7 @@ /* Add Plugin Specific Data */ byte_stream_new(&plugindata, (sizeof(c_plugindata) + xmllen)); byte_stream_putraw(&plugindata, c_plugindata, sizeof(c_plugindata)); /* Content of TLV 0x2711 */ - byte_stream_putstr(&plugindata, statxml); + byte_stream_putraw(&plugindata, (const guint8*)statxml, xmllen); aim_tlvlist_add_raw(&inner_tlvlist, 0x2711, (sizeof(c_plugindata) + xmllen), plugindata.data); @@ -2088,20 +2087,18 @@ if (!msg) return -EINVAL; - len = strlen(fmt) - 6 + strlen(account->username) + strlen(title) + strlen(msg); - statxml = g_malloc(len); - - snprintf(statxml, len, fmt, account->username, title, msg); + statxml = g_strdup_printf(fmt, account->username, title, msg); + len = strlen(statxml); purple_debug_misc("oscar", "X-Status AutoReply: %s, %s\n", formatted_msg, msg); - byte_stream_new(&bs, 10 + 8 + 2 + 1 + strlen(sn) + 2 + sizeof(plugindata) + strlen(statxml)); /* 16 extra */ + byte_stream_new(&bs, 10 + 8 + 2 + 1 + strlen(sn) + 2 + sizeof(plugindata) + len); /* 16 extra */ snacid = aim_cachesnac(od, 0x0004, 0x000b, 0x0000, NULL, 0); aim_im_puticbm(&bs, cookie, 0x0002, sn); byte_stream_put16(&bs, 0x0003); byte_stream_putraw(&bs, plugindata, sizeof(plugindata)); - byte_stream_putraw(&bs, (const guint8*)statxml, strlen(statxml)); + byte_stream_putraw(&bs, (const guint8*)statxml, len); flap_connection_send_snac_with_priority(od, conn, 0x0004, 0x000b, snacid, &bs, TRUE);
--- a/libpurple/protocols/oscar/oft.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/oscar/oft.c Thu Oct 14 14:53:35 2010 +0900 @@ -207,7 +207,7 @@ checksum_data->callback = callback; checksum_data->size = size; checksum_data->checksum = 0xffff0000; - checksum_data->file = fopen(purple_xfer_get_local_filename(xfer), "rb"); + checksum_data->file = g_fopen(purple_xfer_get_local_filename(xfer), "rb"); if (checksum_data->file == NULL) {
--- a/libpurple/protocols/oscar/visibility.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/oscar/visibility.c Thu Oct 14 14:53:35 2010 +0900 @@ -16,10 +16,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - */ +*/ #include "visibility.h" -#include "request.h" /* 4 separate strings are needed in order to ease translators' job */ #define APPEAR_ONLINE N_("Appear Online") @@ -71,77 +70,17 @@ return purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), NULL, NULL); } -typedef void (*ShowDialog)(PurplePluginAction *); - -struct list_remove_data -{ - PurplePluginAction *action; - ShowDialog show_dialog_again; - OscarData *od; - guint16 list_type; - const gchar *list_name; -}; - static void -list_remove_cb(struct list_remove_data *data, PurpleRequestFields *fields) -{ - ShowDialog show_dialog_again = data->show_dialog_again; - PurplePluginAction *action = data->action; - PurpleRequestField *field = purple_request_fields_get_field(fields, "list-items"); - GList *sels = purple_request_field_list_get_selected(field); - for (; sels; sels = sels->next) { - const gchar *name = sels->data; - const gchar *bname = purple_request_field_list_get_data(field, name); - - purple_debug_info("oscar", "Removing %s from %s\n", bname, data->list_name); - - aim_ssi_del_from_private_list(data->od, bname, data->list_type); - } - - g_free(data); - show_dialog_again(action); -} - -static void -list_close_cb(struct list_remove_data *data, gpointer ignored) -{ - g_free(data); -} - -static void -show_private_list(PurplePluginAction *action, - guint16 list_type, - const gchar *list_name, - const gchar *list_description, - const gchar *menu_action_name, - ShowDialog caller) +show_private_list(PurplePluginAction *action, guint16 list_type, const gchar *title, const gchar *list_description, const gchar *menu_action_name) { PurpleConnection *gc = (PurpleConnection *) action->context; OscarData *od = purple_connection_get_protocol_data(gc); PurpleAccount *account = purple_connection_get_account(gc); - GSList *buddies, *cur; - gchar *desc; - struct list_remove_data *data; - - PurpleRequestField *field; - PurpleRequestFields *fields = purple_request_fields_new(); - PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL); - - purple_request_fields_add_group(fields, group); - - desc = g_strdup_printf(_("You can add a buddy to this list " - "by right-clicking on them and " - "selecting \"%s\""), menu_action_name); - - field = purple_request_field_list_new("list-items", desc); - g_free(desc); - - purple_request_field_group_add_field(group, field); - - purple_request_field_list_set_multi_select(field, TRUE); - purple_request_field_set_required(field, TRUE); + GSList *buddies, *filtered_buddies, *cur; + gchar *text, *secondary; buddies = purple_find_buddies(account, NULL); + filtered_buddies = NULL; for (cur = buddies; cur != NULL; cur = cur->next) { PurpleBuddy *buddy; const gchar *bname; @@ -149,51 +88,38 @@ buddy = cur->data; bname = purple_buddy_get_name(buddy); if (aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type)) { - const gchar *alias = purple_buddy_get_alias_only(buddy); - char *dname = alias ? g_strdup_printf("%s (%s)", bname, alias) : NULL; - purple_request_field_list_add(field, dname ? dname : bname, (void *)bname); - g_free(dname); + filtered_buddies = g_slist_prepend(filtered_buddies, buddy); } } g_slist_free(buddies); - data = g_new0(struct list_remove_data, 1); - data->action = action; - data->show_dialog_again = caller; - data->od = od; - data->list_type = list_type; - data->list_name = list_name; + filtered_buddies = g_slist_reverse(filtered_buddies); + text = oscar_format_buddies(filtered_buddies, _("you have no buddies on this list")); + g_slist_free(filtered_buddies); - purple_request_fields(gc, list_name, list_description, NULL, - fields, - _("Close"), G_CALLBACK(list_close_cb), - _("Remove"), G_CALLBACK(list_remove_cb), - account, NULL, NULL, - data); + secondary = g_strdup_printf(_("You can add a buddy to this list " + "by right-clicking on them and " + "selecting \"%s\""), menu_action_name); + purple_notify_formatted(gc, title, list_description, secondary, text, NULL, NULL); + g_free(secondary); + g_free(text); } void oscar_show_visible_list(PurplePluginAction *action) { - show_private_list(action, - AIM_SSI_TYPE_PERMIT, - _("Visible List"), - _("These buddies will see " - "your status when you switch " - "to \"Invisible\""), - _(APPEAR_ONLINE), - oscar_show_visible_list); + show_private_list(action, AIM_SSI_TYPE_PERMIT, _("Visible List"), + _("These buddies will see " + "your status when you switch " + "to \"Invisible\""), + _(APPEAR_ONLINE)); } void oscar_show_invisible_list(PurplePluginAction *action) { - show_private_list(action, - AIM_SSI_TYPE_DENY, - _("Invisible List"), - _("These buddies will always see you as offline"), - _(APPEAR_OFFLINE), - oscar_show_invisible_list); + show_private_list(action, AIM_SSI_TYPE_DENY, _("Invisible List"), + _("These buddies will always see you as offline"), + _(APPEAR_OFFLINE)); } -
--- a/libpurple/protocols/qq/file_trans.c Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/qq/file_trans.c Thu Oct 14 14:53:35 2010 +0900 @@ -84,7 +84,7 @@ if (filelen > QQ_MAX_FILE_MD5_LENGTH) filelen = QQ_MAX_FILE_MD5_LENGTH; - fp = fopen(filename, "rb"); + fp = g_fopen(filename, "rb"); g_return_if_fail(fp != NULL); buffer = g_newa(guint8, filelen); @@ -202,7 +202,7 @@ static int _qq_xfer_open_file(const gchar *filename, const gchar *method, PurpleXfer *xfer) { ft_info *info = xfer->data; - info->dest_fp = fopen(purple_xfer_get_local_filename(xfer), method); + info->dest_fp = g_fopen(purple_xfer_get_local_filename(xfer), method); if (info->dest_fp == NULL) { return -1; }
--- a/libpurple/protocols/yahoo/libymsg.h Thu Oct 14 14:51:46 2010 +0900 +++ b/libpurple/protocols/yahoo/libymsg.h Thu Oct 14 14:53:35 2010 +0900 @@ -64,7 +64,7 @@ #define WEBMESSENGER_URL "http://login.yahoo.com/config/login?.src=pg" -#define YAHOO_SMS_CARRIER_URL "http://lookup.msg.vip.mud.yahoo.com" +#define YAHOO_SMS_CARRIER_URL "http://validate.msg.yahoo.com" #define YAHOO_USERINFO_URL "http://address.yahoo.com/yab/us?v=XM&sync=1&tags=short&useutf8=1&noclear=1&legenc=codepage-1252" #define YAHOOJP_USERINFO_URL "http://address.yahoo.co.jp/yab/jp?v=XM&sync=1&tags=short&useutf8=1&noclear=1&legenc=codepage-1252"
--- a/pidgin/gtkdialogs.c Thu Oct 14 14:51:46 2010 +0900 +++ b/pidgin/gtkdialogs.c Thu Oct 14 14:53:35 2010 +0900 @@ -82,6 +82,7 @@ {"Mark 'KingAnt' Doliner", NULL, "mark@kingant.net"}, {"Sean Egan", NULL, "sean.egan@gmail.com"}, {"Casey Harkins", NULL, NULL}, + {"Ivan Komarov", NULL, NULL}, {"Gary 'grim' Kramlich", NULL, "grim@pidgin.im"}, {"Richard 'rlaager' Laager", NULL, "rlaager@pidgin.im"}, {"Sulabh 'sulabh_m' Mahajan", NULL, NULL},
--- a/pidgin/gtkmain.c Thu Oct 14 14:51:46 2010 +0900 +++ b/pidgin/gtkmain.c Thu Oct 14 14:53:35 2010 +0900 @@ -551,7 +551,7 @@ struct option long_options[] = { {"config", required_argument, NULL, 'c'}, {"debug", no_argument, NULL, 'd'}, - {"force-online", no_argument, NULL, 'd'}, + {"force-online", no_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, {"login", optional_argument, NULL, 'l'}, {"multiple", no_argument, NULL, 'm'},
--- a/pidgin/gtkprefs.c Thu Oct 14 14:51:46 2010 +0900 +++ b/pidgin/gtkprefs.c Thu Oct 14 14:53:35 2010 +0900 @@ -2832,7 +2832,7 @@ purple_prefs_add_none(PIDGIN_PREFS_ROOT "/browsers"); purple_prefs_add_int(PIDGIN_PREFS_ROOT "/browsers/place", PIDGIN_BROWSER_DEFAULT); purple_prefs_add_string(PIDGIN_PREFS_ROOT "/browsers/manual_command", ""); - purple_prefs_add_string(PIDGIN_PREFS_ROOT "/browsers/browser", "mozilla"); + purple_prefs_add_string(PIDGIN_PREFS_ROOT "/browsers/browser", "xdg-open"); #endif /* Plugins */
--- a/pidgin/win32/nsis/pidgin-installer.nsi Thu Oct 14 14:51:46 2010 +0900 +++ b/pidgin/win32/nsis/pidgin-installer.nsi Thu Oct 14 14:53:35 2010 +0900 @@ -534,15 +534,18 @@ Delete "$INSTDIR\ca-certs\AOL_Member_CA.pem" Delete "$INSTDIR\ca-certs\CAcert_Class3.pem" Delete "$INSTDIR\ca-certs\CAcert_Root.pem" + Delete "$INSTDIR\ca-certs\Deutsche_Telekom_Root_CA_2.pem" Delete "$INSTDIR\ca-certs\Entrust.net_Secure_Server_CA.pem" Delete "$INSTDIR\ca-certs\Equifax_Secure_CA.pem" Delete "$INSTDIR\ca-certs\Equifax_Secure_Global_eBusiness_CA-1.pem" + Delete "$INSTDIR\ca-certs\Go_Daddy_Class_2_CA.pem" Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem" Delete "$INSTDIR\ca-certs\Microsoft_Internet_Authority.pem" Delete "$INSTDIR\ca-certs\Microsoft_Secure_Server_Authority.pem" Delete "$INSTDIR\ca-certs\StartCom_Certification_Authority.pem" Delete "$INSTDIR\ca-certs\StartCom_Free_SSL_CA.pem" Delete "$INSTDIR\ca-certs\Thawte_Premium_Server_CA.pem" + Delete "$INSTDIR\ca-certs\Thawte_Primary_Root_CA.pem" Delete "$INSTDIR\ca-certs\ValiCert_Class_2_VA.crt" Delete "$INSTDIR\ca-certs\VeriSign_Class3_Extended_Validation_CA.pem" Delete "$INSTDIR\ca-certs\Verisign_Class3_Primary_CA.pem"
--- a/po/de.po Thu Oct 14 14:51:46 2010 +0900 +++ b/po/de.po Thu Oct 14 14:53:35 2010 +0900 @@ -11,14 +11,14 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-09-02 19:45+0200\n" -"PO-Revision-Date: 2010-09-06 10:01+0200\n" -"Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n" -"Language-Team: Deutsch <de@li.org>\n" +"POT-Creation-Date: 2010-10-04 20:42+0200\n" +"PO-Revision-Date: 2010-10-04 20:42+0200\n" +"Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n" +"Language-Team: German <de@li.org>\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Translators may want to transliterate the name. @@ -534,7 +534,6 @@ msgid "Certificate Manager" msgstr "Zertifikat-Manager" -#. Creating the user splits msgid "Hostname" msgstr "Rechnername" @@ -1710,9 +1709,12 @@ "Das Zertifikat ist nicht mehr gültig. Überprüfen Sie, ob Datum und Zeit " "Ihres Computers stimmen." -msgid "The certificate has expired and should not be considered valid." -msgstr "" -"Das Zertifikat ist abgelaufen und sollte nicht als gültig angesehen werden." +msgid "" +"The certificate has expired and should not be considered valid. Check that " +"your computer's date and time are accurate." +msgstr "" +"Das Zertifikat ist abgelaufen und sollte nicht mehr als gültig betrachtet " +"werden. Überprüfen Sie, ob Datum und Zeit Ihres Computers stimmen." #. Translators: "domain" refers to a DNS domain (e.g. talk.google.com) msgid "The certificate presented is not issued to this domain." @@ -4723,9 +4725,9 @@ "role <moderator|participant|visitor|none> [nick1] [nick2] ...: Get the " "users with a role or set users' role with the room." msgstr "" -"role <moderator|participant|visitor|none> [Spitzname1] [Spitzname2] ...: " -"Benutzer mit einer Rolle für den Raum erfragen oder Benutzern eine Rolle " -"zuweisen." +"role <moderator|participant|visitor|none> [Spitzname1] " +"[Spitzname2] ...: Benutzer mit einer Rolle für den Raum erfragen oder " +"Benutzern eine Rolle zuweisen." msgid "invite <user> [message]: Invite a user to the room." msgstr "" @@ -6807,8 +6809,8 @@ #, c-format msgid "Unable to send message. Could not get details for user (%s)." msgstr "" -"Kann die Nachricht nicht senden. Kann die Details vom Benutzer nicht holen (%" -"s)." +"Kann die Nachricht nicht senden. Kann die Details vom Benutzer nicht holen " +"(%s)." #, c-format msgid "Unable to add %s to your buddy list (%s)." @@ -6826,8 +6828,8 @@ #, c-format msgid "Unable to send message to %s. Could not create the conference (%s)." msgstr "" -"Kann die Nachricht nicht an %s senden. Kann die Konferenz nicht erstellen (%" -"s)." +"Kann die Nachricht nicht an %s senden. Kann die Konferenz nicht erstellen " +"(%s)." #, c-format msgid "Unable to send message. Could not create the conference (%s)." @@ -8311,8 +8313,8 @@ #, c-format msgid "<b>Joining Qun %u is approved by admin %u for %s</b>" msgstr "" -"<b>Das Betreten des Qun %u wurde vom Admin bestätigt wegen by admin %u for %" -"s</b>" +"<b>Das Betreten des Qun %u wurde vom Admin bestätigt wegen by admin %u for " +"%s</b>" #, c-format msgid "<b>Removed buddy %u.</b>" @@ -10932,29 +10934,24 @@ msgstr " (%s)" #. 10053 -#, c-format msgid "Connection interrupted by other software on your computer." msgstr "" "Die Verbindung wurde von einer anderen Software auf Ihrem Computer " "unterbrochen." #. 10054 -#, c-format msgid "Remote host closed connection." msgstr "Der entfernte Host hat die Verbindung beendet." #. 10060 -#, c-format msgid "Connection timed out." msgstr "Verbindungsabbruch wegen Zeitüberschreitung." #. 10061 -#, c-format msgid "Connection refused." msgstr "Verbindung abgelehnt." #. 10048 -#, c-format msgid "Address already in use." msgstr "Adresse wird bereits benutzt." @@ -12400,8 +12397,8 @@ "to multiple messaging services at once. %s is written in C using GTK+. %s " "is released, and may be modified and redistributed, under the terms of the " "GPL version 2 (or later). A copy of the GPL is distributed with %s. %s is " -"copyrighted by its contributors, a list of whom is also distributed with %" -"s. There is no warranty for %s.<BR><BR>" +"copyrighted by its contributors, a list of whom is also distributed with " +"%s. There is no warranty for %s.<BR><BR>" msgstr "" "%s ist ein Nachrichtendienst, basierend auf libpurple, der die Verbindung zu " "mehreren Nachrichtendiensten gleichzeitig unterstützt. %s wird in C " @@ -12973,16 +12970,16 @@ #, c-format msgid "" -"Are you sure you want to permanently delete the log of the conversation in %" -"s which started at %s?" +"Are you sure you want to permanently delete the log of the conversation in " +"%s which started at %s?" msgstr "" "Wollen Sie wirklich den Mitschnitt der Unterhaltung in %s, gestartet am %s, " "permanent löschen?" #, c-format msgid "" -"Are you sure you want to permanently delete the system log which started at %" -"s?" +"Are you sure you want to permanently delete the system log which started at " +"%s?" msgstr "" "Wollen Sie wirklich den Systemmitschnitt, gestartet am %s, permanent löschen?" @@ -13537,6 +13534,11 @@ msgid "Konqueror" msgstr "Konqueror" +msgid "Google Chrome" +msgstr "Google Chrome" + +#. Do not move the line below. Code below expects gnome-open to be in +#. * this list immediately after xdg-open! msgid "Desktop Default" msgstr "Desktop-Standard" @@ -13555,6 +13557,14 @@ msgid "Epiphany" msgstr "Epiphany" +#. Translators: please do not translate "chromium-browser" here! +msgid "Chromium (chromium-browser)" +msgstr "Chromium (chromium-browser)" + +#. Translators: please do not translate "chrome" here! +msgid "Chromium (chrome)" +msgstr "Chromium (chrome)" + msgid "Manual" msgstr "Manuell" @@ -15338,13 +15348,13 @@ #, no-c-format msgid "" "Error Installing Spellchecking ($R3).$\\rIf retrying fails, manual " -"installation instructions are at: http://developer.pidgin.im/wiki/Installing%" -"20Pidgin#manual_win32_spellcheck_installation" +"installation instructions are at: http://developer.pidgin.im/wiki/Installing" +"%20Pidgin#manual_win32_spellcheck_installation" msgstr "" "Fehler beim Installieren der Rechtschreibkontrolle ($R3).$\\rFalls ein " "erneuter Versuch fehlschlägt, finden Sie Anweisungen zur manuellen " -"Installation unter: http://developer.pidgin.im/wiki/Installing%" -"20Pidgin#manual_win32_spellcheck_installation" +"Installation unter: http://developer.pidgin.im/wiki/Installing" +"%20Pidgin#manual_win32_spellcheck_installation" #. Installer Subsection Text msgid "GTK+ Runtime (required if not present)"
--- a/po/hu.po Thu Oct 14 14:51:46 2010 +0900 +++ b/po/hu.po Thu Oct 14 14:53:35 2010 +0900 @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: pidgin 2.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-15 21:49+0200\n" -"PO-Revision-Date: 2010-08-15 21:48+0200\n" +"POT-Creation-Date: 2010-10-10 12:41+0200\n" +"PO-Revision-Date: 2010-10-10 12:33+0200\n" "Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n" "Language-Team: Hungarian <gnome at fsf dot hu>\n" "MIME-Version: 1.0\n" @@ -531,7 +531,6 @@ msgid "Certificate Manager" msgstr "Tanúsítványkezelő" -#. Creating the user splits msgid "Hostname" msgstr "Gépnév" @@ -1694,8 +1693,12 @@ "A tanúsítvány még nem érvényes. Ellenőrizze a számítógép dátumának és " "idejének pontosságát." -msgid "The certificate has expired and should not be considered valid." -msgstr "A tanúsítvány lejárt és nem tekinthető érvényesnek." +msgid "" +"The certificate has expired and should not be considered valid. Check that " +"your computer's date and time are accurate." +msgstr "" +"A tanúsítvány lejárt és nem tekinthető érvényesnek. Ellenőrizze a számítógép " +"dátumának és idejének pontosságát." #. Translators: "domain" refers to a DNS domain (e.g. talk.google.com) msgid "The certificate presented is not issued to this domain." @@ -4736,11 +4739,17 @@ msgid "Domain" msgstr "Tartomány" -msgid "Require SSL/TLS" -msgstr "SSL/TLS megkövetelése" - -msgid "Force old (port 5223) SSL" -msgstr "Régi (5223 port) SSL kényszerítése" +msgid "Require encryption" +msgstr "Titkosítás megkövetelése" + +msgid "Use encryption if available" +msgstr "Titkosítás használata, ha elérhető" + +msgid "Use old-style SSL" +msgstr "Régi stílusú SSL használata" + +msgid "Connection security" +msgstr "Kapcsolat biztonsága" msgid "Allow plaintext auth over unencrypted streams" msgstr "Egyszerű szöveges hitelesítés engedélyezése nem titkosított folyamokon" @@ -8015,8 +8024,8 @@ msgstr "A kérés visszautasítva." #, c-format -msgid "%u requires verification" -msgstr "%u ellenőrzést igényel" +msgid "%u requires verification: %s" +msgstr "%u ellenőrzést igényel: %s" msgid "Add buddy question" msgstr "Partnerkérdés felvétele" @@ -10818,27 +10827,22 @@ msgstr " (%s)" #. 10053 -#, c-format msgid "Connection interrupted by other software on your computer." msgstr "A kapcsolódást megszakította a számítógép egy másik szoftvere." #. 10054 -#, c-format msgid "Remote host closed connection." msgstr "A távoli gép lezárta a kapcsolatot." #. 10060 -#, c-format msgid "Connection timed out." msgstr "A kapcsolat túllépte az időkorlátot." #. 10061 -#, c-format msgid "Connection refused." msgstr "Kapcsolat visszautasítva." #. 10048 -#, c-format msgid "Address already in use." msgstr "A cím már használatban van." @@ -11249,6 +11253,8 @@ msgid "Edit User Mood" msgstr "Felhasználói hangulat szerkesztése" +#. NOTE: Do not set any accelerator to Control+O. It is mapped by +#. gtk_blist_key_press_cb to "Get User Info" on the selected buddy. #. Buddies menu msgid "/_Buddies" msgstr "/_Partnerek" @@ -13364,6 +13370,9 @@ msgid "_TURN server:" msgstr "_TURN kiszolgáló:" +msgid "_UDP Port:" +msgstr "_UDP port:" + msgid "Use_rname:" msgstr "_Felhasználónév:" @@ -13385,6 +13394,11 @@ msgid "Konqueror" msgstr "Konqueror" +msgid "Google Chrome" +msgstr "Google Chrome" + +#. Do not move the line below. Code below expects gnome-open to be in +#. * this list immediately after xdg-open! msgid "Desktop Default" msgstr "Asztali környezet alapértelmezése" @@ -13403,6 +13417,14 @@ msgid "Epiphany" msgstr "Epiphany" +#. Translators: please do not translate "chromium-browser" here! +msgid "Chromium (chromium-browser)" +msgstr "Chromium (chromium-browser)" + +#. Translators: please do not translate "chrome" here! +msgid "Chromium (chrome)" +msgstr "Chromium (chrome)" + msgid "Manual" msgstr "Egyéni" @@ -13942,7 +13964,7 @@ msgid "Small" msgstr "Kicsi" -msgid "Smaller versions of the default smilies" +msgid "Smaller versions of the default smileys" msgstr "Az alapértelmezett hangulatjelek kisebb változatai" msgid "Response Probability:" @@ -14981,6 +15003,9 @@ msgid "Voice/Video Settings" msgstr "Hang/videobeállítások" +msgid "Voice and Video Settings" +msgstr "Hang- és videobeállítások" + #. *< name #. *< version msgid "Configure your microphone and webcam."
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/ca-certs/Deutsche_Telekom_Root_CA_2.pem Thu Oct 14 14:53:35 2010 +0900 @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/ca-certs/Go_Daddy_Class_2_CA.pem Thu Oct 14 14:53:35 2010 +0900 @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQL +EyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMx +ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMo +R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAw +DQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d +/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9 +S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32qRe3H3I2 +TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVl +OARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFA +pMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44 +dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLEsNKR1EwRcbNh +yz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2oatTj +oWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdy +b3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF +BQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYX +MP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheab +IZ0KbIIOqPjCDPoQHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzr +Tia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBD +pqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE-----
--- a/share/ca-certs/Makefile.am Thu Oct 14 14:51:46 2010 +0900 +++ b/share/ca-certs/Makefile.am Thu Oct 14 14:53:35 2010 +0900 @@ -2,13 +2,16 @@ America_Online_Root_Certification_Authority_1.pem \ CAcert_Root.pem \ CAcert_Class3.pem \ + Deutsche_Telekom_Root_CA_2.pem \ Entrust.net_Secure_Server_CA.pem \ Equifax_Secure_CA.pem \ Equifax_Secure_Global_eBusiness_CA-1.pem \ + Go_Daddy_Class_2_CA.pem \ GTE_CyberTrust_Global_Root.pem \ StartCom_Certification_Authority.pem \ StartCom_Free_SSL_CA.pem \ Thawte_Premium_Server_CA.pem \ + Thawte_Primary_Root_CA.pem \ ValiCert_Class_2_VA.pem \ Verisign_RSA_Secure_Server_CA.pem \ Verisign_Class3_Primary_CA.pem \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/ca-certs/Thawte_Primary_Root_CA.pem Thu Oct 14 14:53:35 2010 +0900 @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE-----