Manual merge. Only 1 conflict, in ChangeLog.
--- a/.hgignore Sun Apr 14 13:16:34 2013 -0700
+++ b/.hgignore Thu Jan 09 20:17:35 2014 -0800
@@ -7,6 +7,7 @@
.*/perl/common/pm_to_blib$
+.*/perl/common/MYMETA\.(json|yml) --- a/COPYRIGHT Sun Apr 14 13:16:34 2013 -0700
+++ b/COPYRIGHT Thu Jan 09 20:17:35 2014 -0800
@@ -214,6 +214,7 @@
--- a/ChangeLog Sun Apr 14 13:16:34 2013 -0700
+++ b/ChangeLog Thu Jan 09 20:17:35 2014 -0800
@@ -4,13 +4,20 @@
* Impose maximum download size for all HTTP fetches.
+ * Add support for Python3 in build scripts. (Ashish Gupta) (#15624) * Fix a possible crash when receiving a malformed message in a Direct IM
+ * Disabled buddy list import/export from/to server (it didn't worked + anymore). Buddy list synchronization will be implemented in 3.0.0. Windows-Specific Changes:
* Updates to dependencies:
- * NSS 3.14.3 and NSPR 4.9.5
+ * NSS 3.15.2 and NSPR 4.10.1 version 2.10.7 (02/13/2013):
--- a/configure.ac Sun Apr 14 13:16:34 2013 -0700
+++ b/configure.ac Thu Jan 09 20:17:35 2014 -0800
@@ -1493,13 +1493,13 @@
if test "x$enable_consoleui" = "xyes" -a ! -z "$PYTHON" -a x"$PYTHON" != x"no" ; then
AC_MSG_CHECKING(for Python compile flags)
- PY_PREFIX=`$PYTHON -c 'import sys ; print sys.prefix'`
- PY_EXEC_PREFIX=`$PYTHON -c 'import sys ; print sys.exec_prefix'`
+ PY_PREFIX=`$PYTHON -c 'import sys ; sys.stdout.write(sys.prefix)'` + PY_EXEC_PREFIX=`$PYTHON -c 'import sys ; sys.stdout.write(sys.exec_prefix)'` - PY_VERSION=`$PYTHON -c 'import sys ; print sys.version[0:3]'`
- PY_MAJOR=`$PYTHON -c 'import sys ; print sys.version[0:2]'`
+ PY_VERSION=`$PYTHON -c 'import sys ; sys.stdout.write(sys.version[0:3])'` + PY_MAJOR=`$PYTHON -c 'import sys ; sys.stdout.write(sys.version[0:2])'` - if test -f $PY_PREFIX/include/python$PY_VERSION/Python.h -a "$PY_MAJOR" = "2."; then
+ if test -f $PY_PREFIX/include/python$PY_VERSION/Python.h; then AC_CHECK_LIB(pthread, pthread_create, )
AC_CHECK_LIB(util, openpty, )
--- a/libpurple/Makefile.mingw Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/Makefile.mingw Thu Jan 09 20:17:35 2014 -0800
@@ -117,6 +117,7 @@
--- a/libpurple/dbus-analyze-functions.py Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/dbus-analyze-functions.py Thu Jan 09 20:17:35 2014 -0800
@@ -1,3 +1,4 @@
+from __future__ import print_function @@ -236,38 +237,38 @@
paramslist = ", ".join(self.paramshdr)
- print "%s %s(%s)" % (self.functiontype, self.function.name,
+ print("%s %s(%s)" % (self.functiontype, self.function.name,
- print 'dbus_g_proxy_call(purple_proxy, "%s", NULL,' % ctopascal(self.function.name)
+ print('dbus_g_proxy_call(purple_proxy, "%s", NULL,' % ctopascal(self.function.name)) for type_name in self.inputparams:
- print "\t%s, %s, " % type_name,
- print "G_TYPE_INVALID,"
+ print("\t%s, %s, " % type_name, end=' ') + print("G_TYPE_INVALID,") for type_name in self.outputparams:
- print "\t%s, &%s, " % type_name,
- print "G_TYPE_INVALID);"
+ print("\t%s, &%s, " % type_name, end=' ') + print("G_TYPE_INVALID);") for code in self.returncode:
def definepurplestructure(self, type):
if (self.headersonly) and (type[0] not in self.knowntypes):
- print "struct _%s;" % type[0]
- print "typedef struct _%s %s;" % (type[0], type[0])
+ print("struct _%s;" % type[0]) + print("typedef struct _%s %s;" % (type[0], type[0])) self.knowntypes.append(type[0])
def inputsimple(self, type, name, us):
@@ -353,39 +354,39 @@
self.argfunc = "dbus_message_get_args"
- print "static DBusMessage*"
- print "%s_DBUS(DBusMessage *message_DBUS, DBusError *error_DBUS) {" % \
+ print("static DBusMessage*") + print("%s_DBUS(DBusMessage *message_DBUS, DBusError *error_DBUS) {" % \ - print "\tDBusMessage *reply_DBUS;"
+ print("\tDBusMessage *reply_DBUS;")
- print "\t%s(message_DBUS, error_DBUS," % self.argfunc,
+ print("\t%s(message_DBUS, error_DBUS," % self.argfunc,end=' ') for param in self.cparams:
- print "DBUS_TYPE_%s, &%s," % param,
- print "DBUS_TYPE_INVALID);"
+ print("DBUS_TYPE_%s, &%s," % param, end=' ') + print("DBUS_TYPE_INVALID);") - print "\tCHECK_ERROR(error_DBUS);"
+ print("\tCHECK_ERROR(error_DBUS);")
- print "\treply_DBUS = dbus_message_new_method_return (message_DBUS);"
+ print("\treply_DBUS = dbus_message_new_method_return (message_DBUS);") - print "\tdbus_message_append_args(reply_DBUS,",
+ print("\tdbus_message_append_args(reply_DBUS,", end=' ') for param in self.cparamsout:
+ print("%s," % param, end=' ') - print "DBUS_TYPE_%s, &%s," % param,
- print "DBUS_TYPE_INVALID);"
+ print("DBUS_TYPE_%s, &%s," % param, end=' ') + print("DBUS_TYPE_INVALID);") for code in self.ccodeout:
- print "\treturn reply_DBUS;\n}\n"
+ print("\treturn reply_DBUS;\n}\n") def addstring(self, *items):
@@ -436,7 +437,7 @@
self.cdecls.append("\t%s *%s;" % (type[0], name))
self.cparams.append(("INT32", name + "_ID"))
self.ccode.append("\tPURPLE_DBUS_ID_TO_POINTER(%s, %s_ID, %s, error_DBUS);" % \
self.addintype("i", name)
def inputpointer(self, type, name):
@@ -539,7 +540,7 @@
- print "/* Generated by %s. Do not edit! */" % sys.argv[0]
+ print("/* Generated by %s. Do not edit! */" % sys.argv[0]) for line in self.inputiter:
@@ -554,7 +555,7 @@
# empty line has been encountered
while (myline.count("(") > myline.count(")")) or self.typeregexp.match(myline):
- newline = self.inputiter.next().strip()
+ newline = next(self.inputiter).strip() @@ -597,15 +598,15 @@
self.functions.append((binding.function.name, binding.dparams))
- print "static PurpleDBusBinding bindings_DBUS[] = { "
+ print("static PurpleDBusBinding bindings_DBUS[] = { ") for function, params in self.functions:
- print '{"%s", "%s", %s_DBUS},' % \
- (ctopascal(function), params, function)
+ print('{"%s", "%s", %s_DBUS},' % \ + (ctopascal(function), params, function)) - print "{NULL, NULL, NULL}"
+ print("{NULL, NULL, NULL}") - print "#define PURPLE_DBUS_REGISTER_BINDINGS(handle) purple_dbus_register_bindings(handle, bindings_DBUS)"
+ print("#define PURPLE_DBUS_REGISTER_BINDINGS(handle) purple_dbus_register_bindings(handle, bindings_DBUS)") class ClientBindingSet (BindingSet):
def __init__(self, inputfile, fprefix, headersonly):
@@ -643,7 +644,7 @@
bindings = ClientBindingSet(sys.stdin, fprefix,
- options.has_key("headers"))
bindings = ServerBindingSet(sys.stdin, fprefix)
--- a/libpurple/dbus-analyze-signals.py Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/dbus-analyze-signals.py Thu Jan 09 20:17:35 2014 -0800
@@ -5,7 +5,7 @@
# <signal name="Changed">
# <arg name="new_value" type="b"/>
+from __future__ import print_function @@ -23,8 +23,8 @@
registerregex = re.compile("purple_signal_register[^;]+\"([\w\-]+)\"[^;]+(purple_marshal_\w+)[^;]+;")
nameregex = re.compile('[-_][a-z]')
-print "/* Generated by %s. Do not edit! */" % sys.argv[0]
-print "const char *dbus_signals = "
+print("/* Generated by %s. Do not edit! */" % sys.argv[0]) +print("const char *dbus_signals = ") for match in registerregex.finditer(sys.stdin.read()):
@@ -32,7 +32,7 @@
signal = nameregex.sub(lambda x:x.group()[1].upper(), '-'+signal)
- print "\" <signal name='%s'>\\n\""%signal
+ print("\" <signal name='%s'>\\n\"" % signal) args = marshal.split('_')
# ['purple', 'marshal', <return type>, '', args...]
@@ -52,9 +52,9 @@
- print "\" <arg type='%s'/>\\n\""%type
+ print("\" <arg type='%s'/>\\n\"" % type) - print "\" </signal>\\n\""
+ print("\" </signal>\\n\"")
--- a/libpurple/dbus-analyze-types.py Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/dbus-analyze-types.py Thu Jan 09 20:17:35 2014 -0800
@@ -7,14 +7,14 @@
# --enum DBUS_POINTER_NAME1,
+from __future__ import print_function @@ -37,39 +37,33 @@
keyword = options.get("keyword", "struct")
pattern = options.get("pattern", "%s")
-verbatim = options.has_key("verbatim")
+verbatim = "verbatim" in options structregexp1 = re.compile(r"^(typedef\s+)?%s\s+\w+\s+(\w+)\s*;" % keyword)
structregexp2 = re.compile(r"^(typedef\s+)?%s" % keyword)
structregexp3 = re.compile(r"^}\s+(\w+)\s*;")
-print "/* Generated by %s. Do not edit! */" % sys.argv[0]
+print("/* Generated by %s. Do not edit! */" % sys.argv[0]) myinput = iter(sys.stdin)
match = structregexp1.match(line)
- print toprint(match.group(2), line)
+ print(toprint(match.group(2), line)) match = structregexp2.match(line)
match = structregexp3.match(line)
- print toprint(match.group(1), line)
+ print(toprint(match.group(1), line)) if line[0] not in [" ", "\t", "{", "\n"]:
--- a/libpurple/dnssrv.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/dnssrv.c Thu Jan 09 20:17:35 2014 -0800
@@ -61,13 +61,6 @@
-static DNS_STATUS (WINAPI *MyDnsQuery_UTF8) (
- PCSTR lpstrName, WORD wType, DWORD fOptions,
- PIP4_ARRAY aipServers, PDNS_RECORD* ppQueryResultsSet,
- PVOID* pReserved) = NULL;
-static void (WINAPI *MyDnsRecordListFree) (PDNS_RECORD pRecordList,
- DNS_FREE_TYPE FreeType) = NULL;
struct _PurpleSrvTxtQueryData {
@@ -646,7 +639,7 @@
PurpleSrvTxtQueryData *query_data = data;
- ds = MyDnsQuery_UTF8(query_data->query, type, DNS_QUERY_STANDARD, NULL, &dr, NULL);
+ ds = DnsQuery_UTF8(query_data->query, type, DNS_QUERY_STANDARD, NULL, &dr, NULL); if (ds != ERROR_SUCCESS) {
gchar *msg = g_win32_error_message(ds);
if (type == DNS_TYPE_SRV) {
@@ -679,7 +672,7 @@
lst = g_list_prepend(lst, srvres);
- MyDnsRecordListFree(dr, DnsFreeRecordList);
+ DnsRecordListFree(dr, DnsFreeRecordList); query_data->results = purple_srv_sort(lst);
} else if (type == DNS_TYPE_TXT) {
@@ -707,7 +700,7 @@
lst = g_list_append(lst, txtres);
- MyDnsRecordListFree(dr, DnsFreeRecordList);
+ DnsRecordListFree(dr, DnsFreeRecordList); query_data->results = lst;
@@ -747,7 +740,6 @@
- static gboolean initialized = FALSE;
if (!protocol || !*protocol || !transport || !*transport || !domain || !*domain) {
@@ -836,21 +828,10 @@
- MyDnsQuery_UTF8 = (void*) wpurple_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
- MyDnsRecordListFree = (void*) wpurple_find_and_loadproc(
- "dnsapi.dll", "DnsRecordListFree");
- if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree)
- query_data->error_message = g_strdup("System missing DNS API (Requires W2K+)\n");
- query_data->resolver = g_thread_create(res_thread, query_data, FALSE, &err);
- if (query_data->resolver == NULL) {
- query_data->error_message = g_strdup_printf("SRV thread create failure: %s\n", (err && err->message) ? err->message : "");
+ query_data->resolver = g_thread_create(res_thread, query_data, FALSE, &err); + if (query_data->resolver == NULL) { + query_data->error_message = g_strdup_printf("SRV thread create failure: %s\n", (err && err->message) ? err->message : ""); /* The query isn't going to happen, so finish the SRV lookup now.
@@ -883,7 +864,6 @@
- static gboolean initialized = FALSE;
proxy_type = purple_proxy_info_get_type(
@@ -967,21 +947,10 @@
- MyDnsQuery_UTF8 = (void*) wpurple_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
- MyDnsRecordListFree = (void*) wpurple_find_and_loadproc(
- "dnsapi.dll", "DnsRecordListFree");
- if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree)
- query_data->error_message = g_strdup("System missing DNS API (Requires W2K+)\n");
- query_data->resolver = g_thread_create(res_thread, query_data, FALSE, &err);
- if (query_data->resolver == NULL) {
- query_data->error_message = g_strdup_printf("TXT thread create failure: %s\n", (err && err->message) ? err->message : "");
+ query_data->resolver = g_thread_create(res_thread, query_data, FALSE, &err); + if (query_data->resolver == NULL) { + query_data->error_message = g_strdup_printf("TXT thread create failure: %s\n", (err && err->message) ? err->message : ""); /* The query isn't going to happen, so finish the TXT lookup now.
--- a/libpurple/plugins/dbus-buddyicons-example.py Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/plugins/dbus-buddyicons-example.py Thu Jan 09 20:17:35 2014 -0800
@@ -21,6 +21,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+from __future__ import print_function @@ -32,5 +33,5 @@
if purple.PurpleBlistNodeIsBuddy(node):
icon = purple.PurpleBuddyGetIcon(node)
- print purple.PurpleBuddyGetAlias(node)
+ print(purple.PurpleBuddyGetAlias(node)) node = purple.PurpleBlistNodeNext(node, 0)
--- a/libpurple/plugins/perl/common/Network.xs Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/plugins/perl/common/Network.xs Thu Jan 09 20:17:35 2014 -0800
@@ -21,6 +21,11 @@
purple_network_ip_atoi(ip)
+ RETVAL = purple_network_ip_atoi(ip); + sv_setpvn(TARG, (const char *)RETVAL, 4); Purple::NetworkListenData
purple_network_listen(port, socket_type, cb, cb_data)
--- a/libpurple/plugins/ssl/ssl-nss.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/plugins/ssl/ssl-nss.c Thu Jan 09 20:17:35 2014 -0800
@@ -29,7 +29,15 @@
#define SSL_NSS_PLUGIN_ID "ssl-nss"
+/* TODO: Why is this done? + * This is probably being overridden by <nspr.h> (prcpucfg.h) on *nix OSes */ #undef HAVE_LONG_LONG /* Make Mozilla less angry. If angry, Mozilla SMASH! */
@@ -910,11 +918,49 @@
/* NSS's native PRTime type *almost* corresponds to time_t; however,
it measures *microseconds* since the epoch, not seconds. Hence
+ nss_activ = nss_activ / 1000000; + nss_expir = nss_expir / 1000000; - *activation = nss_activ / 1000000;
+ *activation = nss_activ; + /** Hack to deal with dates past the 32-bit barrier. + Handling is different for signed vs unsigned 32-bit types. + if (*activation != nss_activ) { + purple_debug_warning("nss", + "Setting Activation Date to epoch to handle pre-epoch value\n"); + purple_debug_error("nss", + "Activation date past 32-bit barrier, forcing invalidity\n"); - *expiration = nss_expir / 1000000;
+ *expiration = nss_expir; + if (*expiration != nss_expir) { + if (*expiration < nss_expir) { + purple_debug_warning("nss", + "Setting Expiration Date to 32-bit signed max\n"); + *expiration = PR_INT32_MAX; + purple_debug_warning("nss", + "Setting Expiration Date to 32-bit unsigned max\n"); + *expiration = PR_UINT32_MAX; + purple_debug_error("nss", + "Expiration date prior to unix epoch, forcing invalidity\n"); --- a/libpurple/plugins/startup.py Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/plugins/startup.py Thu Jan 09 20:17:35 2014 -0800
@@ -21,16 +21,15 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+from __future__ import print_function - print "Usage:", sys.argv[0], """<purple-client> [arguments]
- """, sys.argv[0], "pidgin -d -c /my/home"
+ print("Usage:", sys.argv[0], "<purple-client> [arguments]") + print("\nExample:\n ", sys.argv[0], "pidgin -d -c /my/home") home = os.path.expanduser('~/.purple/')
for arg in range(1, len(sys.argv[1:])):
@@ -47,10 +46,10 @@
if not os.path.isabs(userdir):
userdir = os.path.join(purple.PurpleHomeDir(), userdir)
- print "Already running."
+ print("Already running.") - print "Starting client from a different home directory."
+ print("Starting client from a different home directory.") os.execlp(sys.argv[1], " ".join(sys.argv[2:]))
--- a/libpurple/protocols/gg/gg.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/gg/gg.c Thu Jan 09 20:17:35 2014 -0800
@@ -62,6 +62,19 @@
/* ----- HELPERS -------------------------------------------------------- */
+static PurpleInputCondition +ggp_tcpsocket_inputcond_gg_to_purple(enum gg_check_t check) + PurpleInputCondition cond = 0; + if (check & GG_CHECK_READ) + cond |= PURPLE_INPUT_READ; + if (check & GG_CHECK_WRITE) + cond |= PURPLE_INPUT_WRITE; * Set up libgadu's proxy.
@@ -123,10 +136,8 @@
if (token->req->state != GG_STATE_DONE) {
purple_input_remove(token->inpa);
token->inpa = purple_input_add(token->req->fd,
- (token->req->check == 1)
- ggp_async_token_handler, gc);
+ ggp_tcpsocket_inputcond_gg_to_purple(token->req->check), + ggp_async_token_handler, gc); @@ -192,58 +203,6 @@
/* ---------------------------------------------------------------------- */
- * Request buddylist from the server.
- * Buddylist is received in the ggp_callback_recv().
- * @param Current action handler.
-static void ggp_action_buddylist_get(PurplePluginAction *action)
- PurpleConnection *gc = (PurpleConnection *)action->context;
- GGPInfo *info = gc->proto_data;
- purple_debug_info("gg", "Downloading...\n");
- gg_userlist_request(info->session, GG_USERLIST_GET, NULL);
- * Upload the buddylist to the server.
- * @param action Current action handler.
-static void ggp_action_buddylist_put(PurplePluginAction *action)
- PurpleConnection *gc = (PurpleConnection *)action->context;
- GGPInfo *info = gc->proto_data;
- char *buddylist = ggp_buddylist_dump(purple_connection_get_account(gc));
- purple_debug_info("gg", "Uploading...\n");
- gg_userlist_request(info->session, GG_USERLIST_PUT, buddylist);
- * Delete buddylist from the server.
- * @param action Current action handler.
-static void ggp_action_buddylist_delete(PurplePluginAction *action)
- PurpleConnection *gc = (PurpleConnection *)action->context;
- GGPInfo *info = gc->proto_data;
- purple_debug_info("gg", "Deleting...\n");
- gg_userlist_request(info->session, GG_USERLIST_PUT, NULL);
static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *filename)
PurpleAccount *account = purple_connection_get_account(gc);
@@ -1731,6 +1690,11 @@
+ purple_input_remove(gc->inpa); + gc->inpa = purple_input_add(info->session->fd, + ggp_tcpsocket_inputcond_gg_to_purple(info->session->check), + ggp_callback_recv, gc); @@ -1809,22 +1773,6 @@
ggp_generic_status_handler(gc, ev->event.status60.uin,
GG_S(ev->event.status60.status), ev->event.status60.descr);
- case GG_EVENT_USERLIST:
- if (ev->event.userlist.type == GG_USERLIST_GET_REPLY) {
- purple_debug_info("gg", "GG_USERLIST_GET_REPLY\n");
- purple_notify_info(gc, NULL,
- _("Buddy list downloaded"),
- _("Your buddy list was downloaded from the server."));
- if (ev->event.userlist.reply != NULL) {
- ggp_buddylist_load(gc, ev->event.userlist.reply);
- purple_debug_info("gg", "GG_USERLIST_PUT_REPLY\n");
- purple_notify_info(gc, NULL,
- _("Buddy list uploaded"),
- _("Your buddy list was stored on the server."));
case GG_EVENT_PUBDIR50_SEARCH_REPLY:
ggp_pubdir_reply_handler(gc, ev->event.pubdir50);
@@ -1905,8 +1853,7 @@
/** XXX I think that this shouldn't be done if ev->type is GG_EVENT_CONN_FAILED or GG_EVENT_CONN_SUCCESS -datallah */
if (info->session->fd >= 0)
gc->inpa = purple_input_add(info->session->fd,
- (info->session->check == 1) ? PURPLE_INPUT_WRITE :
+ ggp_tcpsocket_inputcond_gg_to_purple(info->session->check), ggp_async_login_handler, gc);
@@ -1919,8 +1866,8 @@
purple_debug_info("gg", "GG_EVENT_CONN_SUCCESS\n");
purple_input_remove(gc->inpa);
gc->inpa = purple_input_add(info->session->fd,
- ggp_callback_recv, gc);
+ ggp_tcpsocket_inputcond_gg_to_purple(info->session->check), + ggp_callback_recv, gc); purple_connection_update_progress(gc, _("Connected"), 1, 2);
@@ -2190,8 +2137,9 @@
- gc->inpa = purple_input_add(info->session->fd, PURPLE_INPUT_READ,
- ggp_async_login_handler, gc);
+ gc->inpa = purple_input_add(info->session->fd, + ggp_tcpsocket_inputcond_gg_to_purple(info->session->check), + ggp_async_login_handler, gc); static void ggp_close(PurpleConnection *gc)
@@ -2624,18 +2572,6 @@
m = g_list_append(m, NULL);
- act = purple_plugin_action_new(_("Upload buddylist to Server"),
- ggp_action_buddylist_put);
- m = g_list_append(m, act);
- act = purple_plugin_action_new(_("Download buddylist from Server"),
- ggp_action_buddylist_get);
- m = g_list_append(m, act);
- act = purple_plugin_action_new(_("Delete buddylist from Server"),
- ggp_action_buddylist_delete);
- m = g_list_append(m, act);
act = purple_plugin_action_new(_("Save buddylist to file..."),
ggp_action_buddylist_save);
m = g_list_append(m, act);
--- a/libpurple/protocols/gg/lib/handlers.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/gg/lib/handlers.c Thu Jan 09 20:17:35 2014 -0800
@@ -1766,7 +1766,7 @@
{ GG_DISCONNECT_ACK, GG_STATE_DISCONNECTING, 0, gg_session_handle_disconnect_ack },
{ GG_XML_EVENT, GG_STATE_CONNECTED, 0, gg_session_handle_xml_event },
{ GG_PUBDIR50_REPLY, GG_STATE_CONNECTED, 0, gg_session_handle_pubdir50_reply },
- { GG_USERLIST_REPLY, GG_STATE_CONNECTED, 0, gg_session_handle_userlist_reply },
+ { GG_USERLIST_REPLY, GG_STATE_CONNECTED, sizeof(char), gg_session_handle_userlist_reply }, { GG_DCC7_ID_REPLY, GG_STATE_CONNECTED, sizeof(struct gg_dcc7_id_reply), gg_session_handle_dcc7_id_reply },
{ GG_DCC7_ACCEPT, GG_STATE_CONNECTED, sizeof(struct gg_dcc7_accept), gg_session_handle_dcc7_accept },
{ GG_DCC7_NEW, GG_STATE_CONNECTED, sizeof(struct gg_dcc7_new), gg_session_handle_dcc7_new },
--- a/libpurple/protocols/gg/lib/http.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/gg/lib/http.c Thu Jan 09 20:17:35 2014 -0800
@@ -47,6 +47,8 @@
+#define GG_HTTP_MAX_LENGTH 1000000000 * Rozpoczyna połączenie HTTP.
@@ -364,6 +366,11 @@
+ if (h->body_size > GG_HTTP_MAX_LENGTH) { + gg_debug(GG_DEBUG_MISC, "=> http, content-length too big\n"); + h->body_size = GG_HTTP_MAX_LENGTH; if (left > h->body_size) {
gg_debug(GG_DEBUG_MISC, "=> http, oversized reply (%d bytes needed, %d bytes left)\n", h->body_size, left);
--- a/libpurple/protocols/msn/msg.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/msn/msg.c Thu Jan 09 20:17:35 2014 -0800
@@ -366,11 +366,12 @@
- n += g_strlcpy(n, "\r\n", end - n);
+ n += g_strlcpy(n, "\r\n", end - n); body = msn_message_get_bin_data(msg, &body_len);
+ if (body != NULL && (end - n) > body_len) memcpy(n, body, body_len);
--- a/libpurple/protocols/mxit/formcmds.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/mxit/formcmds.c Thu Jan 09 20:17:35 2014 -0800
@@ -267,7 +267,7 @@
if (nm) { /* indicates response must be a structured response */
gchar* seltext = g_markup_escape_text(purple_url_decode(selmsg), -1);
- gchar* replycmd = g_strdup_printf("type=reply|nm=%s|res=%s|err=0", nm, replymsg);
+ gchar* replycmd = g_strdup_printf("type=reply|nm=%s|res=%s|err=0", nm, purple_url_decode(replymsg)); mxit_add_html_link( mx, replycmd, TRUE, seltext );
@@ -298,7 +298,7 @@
selmsg = g_hash_table_lookup(hash, "selmsg"); /* find the selection message */
+ if (selmsg && (strlen(selmsg) > 0)) { text = g_markup_escape_text(purple_url_decode(selmsg), -1);
--- a/libpurple/protocols/mxit/markup.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/mxit/markup.c Thu Jan 09 20:17:35 2014 -0800
@@ -86,7 +86,7 @@
* @param buf The data to dump
* @param len The length of the data
-static void hex_dump( const char* buf, int len )
+static void hex_dump( const gchar* buf, int len ) @@ -102,11 +102,11 @@
pos += sprintf( &msg[pos], "%04i: ", i );
- pos += sprintf( &msg[pos], "0x%02X ", (unsigned char) buf[i] );
+ pos += sprintf( &msg[pos], "0x%02X ", buf[i] ); pos += sprintf( &msg[pos], "\n" );
- purple_debug_info( MXIT_PLUGIN_ID, msg );
+ purple_debug_info( MXIT_PLUGIN_ID, "%s", msg ); @@ -115,7 +115,7 @@
pos += sprintf( &msg[pos], "\n" );
- purple_debug_info( MXIT_PLUGIN_ID, msg );
+ purple_debug_info( MXIT_PLUGIN_ID, "%s", msg ); @@ -133,27 +133,26 @@
void mxit_add_html_link( struct RXMsgData* mx, const char* replydata, gboolean isStructured, const char* displaytext )
* The link content is encoded as follows:
* MXIT_LINK_KEY | ACCOUNT_USER | ACCOUNT_PROTO | REPLY_TO | REPLY_FORMAT | REPLY_DATA
- len = g_snprintf( retstr, sizeof( retstr ), "%s|%s|%s|%s|%i|%s",
+ link = g_strdup_printf( "%s|%s|%s|%s|%i|%s", purple_account_get_username( mx->session->acc ),
purple_account_get_protocol_id( mx->session->acc ),
- retstr64 = purple_base64_encode( (const unsigned char*) retstr, len );
- g_snprintf( link, sizeof( link ), "%s%s", MXIT_LINK_PREFIX, retstr64 );
+ link64 = purple_base64_encode( (const unsigned char*) link, strlen( link ) ); - g_string_append_printf( mx->msg, "<a href=\"%s\">%s</a>", link, displaytext );
+ g_string_append_printf( mx->msg, "<a href=\"%s%s\">%s</a>", MXIT_LINK_PREFIX, link64, displaytext ); g_string_append_printf( mx->msg, "<b>%s</b>", replydata );
@@ -167,7 +166,7 @@
* @param size The extracted length
* @return The number of bytes extracted
-static unsigned int asn_getlength( const char* data, int* size )
+static unsigned int asn_getlength( const gchar* data, int* size ) @@ -202,21 +201,29 @@
* @param utf8 The extracted string. Must be deallocated by caller.
* @return The number of bytes extracted
-static int asn_getUtf8( const char* data, unsigned char type, char** utf8 )
+static int asn_getUtf8( const gchar* data, gchar type, char** utf8 )
/* validate the field type [1 byte] */
/* this is not a utf-8 string! */
- purple_debug_error( MXIT_PLUGIN_ID, "Invalid UTF-8 encoded string in ASN data (0x%02X)\n", (unsigned char) data[0] );
+ purple_debug_error( MXIT_PLUGIN_ID, "Invalid UTF-8 encoded string in ASN data (got 0x%02X, expected 0x%02X)\n", data[0], type ); - len = data[1]; /* length field [1 bytes] */
- *utf8 = g_malloc( len + 1 );
- memcpy( *utf8, &data[2], len ); /* data field */
+ len = (uint8_t)data[1]; /* length field [1 byte] */ + out_str = g_malloc(len + 1); + purple_debug_fatal(MXIT_PLUGIN_ID, "asn_getUtf8: out of memory"); + memcpy(out_str, &data[2], len); /* data field */ @@ -472,9 +479,8 @@
static void emoticon_returned( PurpleUtilFetchUrlData* url_data, gpointer user_data, const gchar* url_text, gsize len, const gchar* error_message )
struct RXMsgData* mx = (struct RXMsgData*) user_data;
- const char* data = url_text;
+ const gchar* data = url_text;
@@ -483,9 +489,7 @@
purple_debug_info( MXIT_PLUGIN_ID, "emoticon_returned\n" );
/* remove request from the async outstanding calls list */
mx->session->async_calls = g_slist_remove( mx->session->async_calls, url_data );
@@ -500,12 +504,8 @@
- /* parse out the emoticon */
- /* validate the binary data received from the wapsite */
+ /* validate that the returned data starts with the magic constant that indicates it is a custom emoticon */ if ( memcmp( MXIT_FRAME_MAGIC, &data[pos], strlen( MXIT_FRAME_MAGIC ) ) != 0 ) {
- /* bad data, magic constant is wrong */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad magic)\n" );
@@ -513,16 +513,14 @@
/* validate the image frame desc byte */
if ( data[pos] != '\x6F' ) {
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad frame desc)\n" );
- /* get the data length */
+ /* get the frame image data length */ res = asn_getlength( &data[pos], &em_size );
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad frame length)\n" );
@@ -534,7 +532,6 @@
/* utf-8 (emoticon name) */
res = asn_getUtf8( &data[pos], 0x0C, &str );
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad name string)\n" );
@@ -548,7 +545,6 @@
/* utf-8 (emoticon shortcut) */
res = asn_getUtf8( &data[pos], 0x81, &str );
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad shortcut string)\n" );
@@ -560,7 +556,6 @@
/* validate the image data type */
if ( data[pos] != '\x82' ) {
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad data type)\n" );
@@ -580,8 +575,17 @@
purple_debug_info( MXIT_PLUGIN_ID, "read the length '%i'\n", em_size );
+ /* strip the mxit markup tags from the emoticon id (eg, .{XY} -> XY) */ + if ( ( em_id[0] == '.' ) && ( em_id[1] == '{' ) ) { + char emo[MXIT_MAX_EMO_ID + 1]; + parse_emoticon_str( &em_id[2], emo ); if ( g_hash_table_lookup( mx->session->iimages, em_id ) ) {
/* emoticon found in the table, so ignore this one */
@@ -589,12 +593,6 @@
em_data = g_malloc( em_size );
memcpy( em_data, &data[pos], em_size );
- /* strip the mxit markup tags from the emoticon id */
- if ( ( em_id[0] == '.' ) && ( em_id[1] == '{' ) ) {
- parse_emoticon_str( &em_id[2], emo );
/* we now have the emoticon, store it in the imagestore */
id = purple_imgstore_add_with_id( em_data, em_size, NULL );
--- a/libpurple/protocols/mxit/protocol.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/mxit/protocol.c Thu Jan 09 20:17:35 2014 -0800
@@ -1684,6 +1684,30 @@
/*------------------------------------------------------------------------
+ * Parse the received presence value, and ensure that it is supported. + * @param value The received presence value. + * @return A valid presence value. +static short mxit_parse_presence( const char* value ) + short presence = atoi( value ); + /* ensure that the presence value is valid */ + case MXIT_PRESENCE_OFFLINE : + case MXIT_PRESENCE_ONLINE : + case MXIT_PRESENCE_AWAY : + case MXIT_PRESENCE_DND : + return MXIT_PRESENCE_ONLINE; +/*------------------------------------------------------------------------ * Process a received contact update packet.
* @param session The MXit session object
@@ -1714,7 +1738,7 @@
mxit_strip_domain( contact->username ); /* remove dummy domain */
g_strlcpy( contact->alias, rec->fields[2]->data, sizeof( contact->alias ) );
- contact->presence = atoi( rec->fields[3]->data );
+ contact->presence = mxit_parse_presence( rec->fields[3]->data ); contact->type = atoi( rec->fields[4]->data );
contact->mood = atoi( rec->fields[5]->data );
@@ -1773,7 +1797,7 @@
if ( rec->fcount >= 7 ) /* flags field is included */
flags = atoi( rec->fields[6]->data );
- mxit_update_buddy_presence( session, rec->fields[0]->data, atoi( rec->fields[1]->data ), atoi( rec->fields[2]->data ),
+ mxit_update_buddy_presence( session, rec->fields[0]->data, mxit_parse_presence( rec->fields[1]->data ), atoi( rec->fields[2]->data ), rec->fields[3]->data, rec->fields[4]->data, flags );
mxit_update_buddy_avatar( session, rec->fields[0]->data, rec->fields[5]->data );
--- a/libpurple/protocols/yahoo/libymsg.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/protocols/yahoo/libymsg.c Thu Jan 09 20:17:35 2014 -0800
@@ -1717,6 +1717,8 @@
purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage3\n");
+ g_return_if_fail(crypt != NULL); md5_cipher = purple_ciphers_find_cipher("md5");
md5_ctx = purple_cipher_context_new(md5_cipher, NULL);
purple_cipher_context_append(md5_ctx, (guchar *)crypt, strlen(crypt));
@@ -1858,6 +1860,9 @@
/* Some error in the login process */
PurpleConnectionError error;
--- a/libpurple/prpl.h Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/prpl.h Thu Jan 09 20:17:35 2014 -0800
@@ -417,14 +417,13 @@
* the account is not connected, return -ENOTCONN. If the
* PRPL is unable to send the message for another reason, return
* some other negative value. You can use one of the valid
- * errno values, or just big something. If the message should
- * not be echoed to the conversation window, return 0.
+ * errno values, or just big something. * @param id The id of the chat to send the message to.
* @param message The message to send to the chat.
* @param flags A bitwise OR of #PurpleMessageFlags representing
- * @return A positive number or 0 in case of succes,
+ * @return A positive number or 0 in case of success, * a negative error number in case of failure.
int (*chat_send)(PurpleConnection *, int id, const char *message, PurpleMessageFlags flags);
--- a/libpurple/util.c Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/util.c Thu Jan 09 20:17:35 2014 -0800
@@ -37,6 +37,8 @@
#define DEFAULT_MAX_HTTP_DOWNLOAD (512 * 1024)
+#define MAX_HTTP_CHUNK_SIZE (10 * 1024 * 1024) struct _PurpleUtilFetchUrlData
PurpleUtilFetchUrlCallback callback;
@@ -710,7 +712,7 @@
long tzoff = PURPLE_NO_TZ_OFF;
- gboolean mktime_with_utc = TRUE;
+ gboolean mktime_with_utc = FALSE; @@ -811,7 +813,7 @@
} while (*str >= '0' && *str <= '9');
- sign = (*str == '+') ? -1 : 1;
+ sign = (*str == '+') ? 1 : -1; /* Process the timezone */
if (*str == '+' || *str == '-') {
@@ -820,26 +822,29 @@
if (((sscanf(str, "%02d:%02d", &tzhrs, &tzmins) == 2 && (str += 5)) ||
(sscanf(str, "%02d%02d", &tzhrs, &tzmins) == 2 && (str += 4))))
+ mktime_with_utc = TRUE; tzoff = tzhrs * 60 * 60 + tzmins * 60;
- if (rest != NULL && *str != '\0')
} else if (*str == 'Z') {
- mktime_with_utc = FALSE;
+ mktime_with_utc = TRUE;
+ /* No timezone specified. */ + mktime_with_utc = TRUE; @@ -3781,11 +3786,12 @@
- if (s + sz > data + *len) {
+ if (sz > MAX_HTTP_CHUNK_SIZE || s + sz > data + *len) { purple_debug_error("util", "Error processing chunked data: "
"Chunk size %" G_GSIZE_FORMAT " bytes was longer "
"than the data remaining in the buffer (%"
G_GSIZE_FORMAT " bytes)\n", sz, data + *len - s);
/* Move all data overtop of the chunk length that we read in earlier */
@@ -3793,7 +3799,7 @@
- if (*s != '\r' && *(s + 1) != '\n') {
+ if (*s == '\0' || (*s != '\r' && *(s + 1) != '\n')) { purple_debug_error("util", "Error processing chunked data: "
"Expected \\r\\n, found: %s\n", s);
--- a/libpurple/win32/global.mak Sun Apr 14 13:16:34 2013 -0700
+++ b/libpurple/win32/global.mak Thu Jan 09 20:17:35 2014 -0800
@@ -17,7 +17,7 @@
BONJOUR_TOP ?= $(WIN32_DEV_TOP)/Bonjour_SDK
LIBXML2_TOP ?= $(WIN32_DEV_TOP)/libxml2-2.9.0
MEANWHILE_TOP ?= $(WIN32_DEV_TOP)/meanwhile-1.0.2_daa3
-NSS_TOP ?= $(WIN32_DEV_TOP)/nss-3.14.3-nspr-4.9.5
+NSS_TOP ?= $(WIN32_DEV_TOP)/nss-3.15.2-nspr-4.10.1 PERL_LIB_TOP ?= $(WIN32_DEV_TOP)/perl-5.10.0
SILC_TOOLKIT ?= $(WIN32_DEV_TOP)/silc-toolkit-1.1.10
TCL_LIB_TOP ?= $(WIN32_DEV_TOP)/tcl-8.4.5
--- a/pidgin/gtkdialogs.c Sun Apr 14 13:16:34 2013 -0700
+++ b/pidgin/gtkdialogs.c Thu Jan 09 20:17:35 2014 -0800
@@ -164,8 +164,7 @@
{N_("Czech"), "cs", "David Vachulka", "david@konstrukce-cad.com"},
{N_("Danish"), "da", "Peter Bach", "bach.peter@gmail.com"},
{N_("Danish"), "da", "Morten Brix Pedersen", "morten@wtf.dk"},
- {N_("German"), "de", "Jochen Kemnade", "jochenkemnade@web.de"},
- {N_("German"), "de", "Björn Voigt", "bjoern@cs.tu-berlin.de"},
+ {N_("German"), "de", "Björn Voigt", "bjoernv@arcor.de"}, {N_("Dzongkha"), "dz", "Norbu", "nor_den@hotmail.com"},
{N_("Dzongkha"), "dz", "Jurmey Rabgay", "jur_gay@yahoo.com"},
{N_("Dzongkha"), "dz", "Wangmo Sherpa", "rinwanshe@yahoo.com"},
@@ -272,6 +271,7 @@
{N_("Czech"), "cs", "Honza Král", NULL},
{N_("Czech"), "cs", "Miloslav Trmac", "mitr@volny.cz"},
{N_("German"), "de", "Daniel Seifert, Karsten Weiss", NULL},
+ {N_("German"), "de", "Jochen Kemnade", "jochenkemnade@web.de"}, {N_("British English"), "en_GB", "Luke Ross", "luke@lukeross.name"},
{N_("Spanish"), "es", "JM Pérez Cáncer", NULL},
{N_("Spanish"), "es", "Nicolás Lichtmaier", NULL},
--- a/pidgin/gtknotify.c Sun Apr 14 13:16:34 2013 -0700
+++ b/pidgin/gtknotify.c Thu Jan 09 20:17:35 2014 -0800
@@ -1192,51 +1192,85 @@
-uri_command(const char *command, gboolean sync)
+uri_command(GSList *arg_list, gboolean sync)
- purple_debug_misc("gtknotify", "Executing %s\n", command);
+ g_return_val_if_fail(arg_list != NULL, FALSE); - if (!purple_program_is_valid(command))
- tmp = g_strdup_printf(_("The browser command \"%s\" is invalid."),
- command ? command : "(none)");
+ program = arg_list->data; + purple_debug_misc("gtknotify", "Executing %s (%s)\n", program, + sync ? "sync" : "async"); + if (!purple_program_is_valid(program)) { + purple_debug_error("gtknotify", "Command \"%s\" is invalid\n", + _("The browser command \"%s\" is invalid."), + program ? program : "(null)"); purple_notify_error(NULL, NULL, _("Unable to open URL"), tmp);
- if (!g_spawn_command_line_sync(command, NULL, NULL, &status, &error))
- tmp = g_strdup_printf(_("Error launching \"%s\": %s"),
- command, error->message);
- purple_notify_error(NULL, NULL, _("Unable to open URL"), tmp);
- if (!g_spawn_command_line_async(command, &error))
- tmp = g_strdup_printf(_("Error launching \"%s\": %s"),
- command, error->message);
- purple_notify_error(NULL, NULL, _("Unable to open URL"), tmp);
+ argc = g_slist_length(arg_list); + argv = g_new(gchar*, argc + 1); + for (it = arg_list; it; it = g_slist_next(it)) { + if (purple_debug_is_verbose()) { + purple_debug_misc("gtknotify", "argv[%d] = \"%s\"\n", + if (g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, + NULL, NULL, NULL, NULL, &exit_status, &error) && + purple_debug_error("gtknotify", + "Error launching \"%s\": %s (status: %d)\n", program, + error ? error->message : "(null)", exit_status); + tmp = g_strdup_printf(_("Error launching \"%s\": %s"), program, + error ? error->message : "(null)"); + purple_notify_error(NULL, NULL, _("Unable to open URL"), tmp); + if (g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL, + purple_debug_warning("gtknotify", "Error launching \"%s\": %s\n", + program, error ? error->message : "(null)"); @@ -1244,183 +1278,208 @@
pidgin_notify_uri(const char *uri)
- char *escaped = g_shell_quote(uri);
- char *remote_command = NULL;
+ gchar *uri_escaped, *uri_custom = NULL; + GSList *argv = NULL, *argv_remote = NULL; + gchar **usercmd_argv = NULL; - web_browser = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser");
+ uri_escaped = g_uri_escape_string(uri, ":/%#,+", FALSE); + web_browser = purple_prefs_get_string(PIDGIN_PREFS_ROOT place = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/browsers/place");
/* if they are running gnome, use the gnome web browser */
- if (purple_running_gnome() == TRUE)
+ if (purple_running_gnome() == TRUE) { char *tmp = g_find_program_in_path("xdg-open");
- command = g_strdup_printf("gnome-open %s", escaped);
+ argv = g_slist_append(argv, "gnome-open"); - command = g_strdup_printf("xdg-open %s", escaped);
+ argv = g_slist_append(argv, "xdg-open");
- else if (purple_running_osx() == TRUE)
- command = g_strdup_printf("open %s", escaped);
- else if (!strcmp(web_browser, "epiphany") ||
+ argv = g_slist_append(argv, uri_escaped); + } else if (purple_running_osx() == TRUE) { + argv = g_slist_append(argv, "open"); + argv = g_slist_append(argv, (gpointer)uri); + } else if (!strcmp(web_browser, "epiphany") || !strcmp(web_browser, "galeon"))
+ argv = g_slist_append(argv, (gpointer)web_browser); if (place == PIDGIN_BROWSER_NEW_WINDOW)
- command = g_strdup_printf("%s -w %s", web_browser, escaped);
+ argv = g_slist_append(argv, "-w"); else if (place == PIDGIN_BROWSER_NEW_TAB)
- command = g_strdup_printf("%s -n %s", web_browser, escaped);
- command = g_strdup_printf("%s %s", web_browser, escaped);
- else if (!strcmp(web_browser, "xdg-open"))
- command = g_strdup_printf("xdg-open %s", escaped);
- else if (!strcmp(web_browser, "gnome-open"))
- command = g_strdup_printf("gnome-open %s", escaped);
- else if (!strcmp(web_browser, "kfmclient"))
- command = g_strdup_printf("kfmclient openURL %s", escaped);
+ argv = g_slist_append(argv, "-n"); + argv = g_slist_append(argv, (gpointer)uri); + } else if (!strcmp(web_browser, "xdg-open")) { + argv = g_slist_append(argv, "xdg-open"); + argv = g_slist_append(argv, uri_escaped); + } else if (!strcmp(web_browser, "gnome-open")) { + argv = g_slist_append(argv, "gnome-open"); + argv = g_slist_append(argv, uri_escaped); + } else if (!strcmp(web_browser, "kfmclient")) { + argv = g_slist_append(argv, "kfmclient"); + argv = g_slist_append(argv, "openURL"); + argv = g_slist_append(argv, (gpointer)uri); * Does Konqueror have options to open in new tab
- else if (!strcmp(web_browser, "mozilla") ||
- !strcmp(web_browser, "mozilla-firebird") ||
- !strcmp(web_browser, "firefox") ||
- !strcmp(web_browser, "seamonkey"))
+ } else if (!strcmp(web_browser, "mozilla") || + !strcmp(web_browser, "mozilla-firebird") || + !strcmp(web_browser, "firefox") || + !strcmp(web_browser, "seamonkey"))
+ argv = g_slist_append(argv, (gpointer)web_browser); + argv = g_slist_append(argv, uri_escaped); - command = g_strdup_printf("%s %s", web_browser, escaped);
+ g_assert(uri_custom == NULL); + if (place == PIDGIN_BROWSER_NEW_WINDOW) { + uri_custom = g_strdup_printf("openURL(%s,new-window)", + } else if (place == PIDGIN_BROWSER_NEW_TAB) { + uri_custom = g_strdup_printf("openURL(%s,new-tab)", + } else if (place == PIDGIN_BROWSER_CURRENT) { + uri_custom = g_strdup_printf("openURL(%s)", + if (uri_custom != NULL) { + argv_remote = g_slist_append(argv_remote, + (gpointer)web_browser);
- * Firefox 0.9 and higher require a "-a firefox" option when
- * using -remote commands. This breaks older versions of
- * mozilla. So we include this other handly little string
- * when calling firefox. If the API for remote calls changes
- * any more in firefox then firefox should probably be split
- * apart from mozilla-firebird and mozilla... but this is good
- if (!strcmp(web_browser, "firefox"))
+ /* Firefox 0.9 and higher require a "-a firefox" option + * when using -remote commands. This breaks older + * versions of mozilla. So we include this other handly + * little string when calling firefox. If the API for + * remote calls changes any more in firefox then firefox + * should probably be split apart from mozilla-firebird + * and mozilla... but this is good for now. + if (!strcmp(web_browser, "firefox")) { + argv_remote = g_slist_append(argv_remote, "-a"); + argv_remote = g_slist_append(argv_remote, - if (place == PIDGIN_BROWSER_NEW_WINDOW)
- remote_command = g_strdup_printf("%s %s -remote "
- "openURL(%s,new-window)",
- web_browser, args, escaped);
- else if (place == PIDGIN_BROWSER_NEW_TAB)
- remote_command = g_strdup_printf("%s %s -remote "
- web_browser, args, escaped);
- else if (place == PIDGIN_BROWSER_CURRENT)
- remote_command = g_strdup_printf("%s %s -remote "
- web_browser, args, escaped);
- else if (!strcmp(web_browser, "netscape"))
- command = g_strdup_printf("netscape %s", escaped);
+ argv_remote = g_slist_append(argv_remote, "-remote"); + argv_remote = g_slist_append(argv_remote, uri_custom); + } else if (!strcmp(web_browser, "netscape")) { + argv = g_slist_append(argv, "netscape"); + argv = g_slist_append(argv, (gpointer)uri); + if (place == PIDGIN_BROWSER_NEW_WINDOW) { + uri_custom = g_strdup_printf("openURL(%s,new-window)", + } else if (place == PIDGIN_BROWSER_CURRENT) { + uri_custom = g_strdup_printf("openURL(%s)", + argv_remote = g_slist_append(argv_remote, "netscape"); + argv_remote = g_slist_append(argv_remote, "-remote"); + argv_remote = g_slist_append(argv_remote, uri_custom); + } else if (!strcmp(web_browser, "opera")) { + argv = g_slist_append(argv, "opera"); if (place == PIDGIN_BROWSER_NEW_WINDOW)
- remote_command = g_strdup_printf("netscape -remote "
- "openURL(%s,new-window)",
+ argv = g_slist_append(argv, "-newwindow"); + else if (place == PIDGIN_BROWSER_NEW_TAB) + argv = g_slist_append(argv, "-newpage"); else if (place == PIDGIN_BROWSER_CURRENT)
- remote_command = g_strdup_printf("netscape -remote "
- "openURL(%s)", escaped);
- else if (!strcmp(web_browser, "opera"))
- if (place == PIDGIN_BROWSER_NEW_WINDOW)
- command = g_strdup_printf("opera -newwindow %s", escaped);
- else if (place == PIDGIN_BROWSER_NEW_TAB)
- command = g_strdup_printf("opera -newpage %s", escaped);
- else if (place == PIDGIN_BROWSER_CURRENT)
- remote_command = g_strdup_printf("opera -remote "
- "openURL(%s)", escaped);
- command = g_strdup_printf("opera %s", escaped);
- command = g_strdup_printf("opera %s", escaped);
+ argv = g_slist_append(argv, "-activetab"); + /* `opera -remote "openURL(%s)"` command causes Pidgin's hang, + * if there is no Opera instance running.
- else if (!strcmp(web_browser, "google-chrome"))
- /* Google Chrome doesn't have command-line arguments that control the
- * opening of links from external calls. This is controlled solely from
- * a preference within Google Chrome. */
- command = g_strdup_printf("google-chrome %s", escaped);
- else if (!strcmp(web_browser, "chrome"))
+ argv = g_slist_append(argv, (gpointer)uri); + } else if (!strcmp(web_browser, "google-chrome")) { + /* Google Chrome doesn't have command-line arguments that + * control the opening of links from external calls. This is + * controlled solely from a preference within Google Chrome. + argv = g_slist_append(argv, "google-chrome"); + argv = g_slist_append(argv, (gpointer)uri); + } else if (!strcmp(web_browser, "chrome")) { + /* Chromium doesn't have command-line arguments that control + * the opening of links from external calls. This is controlled + * solely from a preference within Chromium. + argv = g_slist_append(argv, "chrome"); + argv = g_slist_append(argv, (gpointer)uri); + } else if (!strcmp(web_browser, "chromium-browser")) { /* Chromium doesn't have command-line arguments that control the
- * opening of links from external calls. This is controlled solely from
- * a preference within Chromium. */
- command = g_strdup_printf("chrome %s", escaped);
- else if (!strcmp(web_browser, "chromium-browser"))
- /* Chromium doesn't have command-line arguments that control the
- * opening of links from external calls. This is controlled solely from
- * a preference within Chromium. */
- command = g_strdup_printf("chromium-browser %s", escaped);
- else if (!strcmp(web_browser, "custom"))
- const char *web_command;
+ * opening of links from external calls. This is controlled + * solely from a preference within Chromium. + argv = g_slist_append(argv, "chromium-browser"); + argv = g_slist_append(argv, (gpointer)uri); + } else if (!strcmp(web_browser, "custom")) { + const char *usercmd_command; + gboolean uri_added = FALSE; - web_command = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/manual_command");
+ usercmd_command = purple_prefs_get_string(PIDGIN_PREFS_ROOT + "/browsers/manual_command"); - if (web_command == NULL || *web_command == '\0')
+ if (usercmd_command == NULL || *usercmd_command == '\0') { purple_notify_error(NULL, NULL, _("Unable to open URL"),
- _("The 'Manual' browser command has been "
- "chosen, but no command has been set."));
+ _("The 'Manual' browser command has been " + "chosen, but no command has been set.")); - if (strstr(web_command, "%s"))
- command = purple_strreplace(web_command, "%s", escaped);
+ if (!g_shell_parse_argv(usercmd_command, &usercmd_argc, + &usercmd_argv, &error))
- * There is no "%s" in the browser command. Assume the user
- * wanted the URL tacked on to the end of the command.
- command = g_strdup_printf("%s %s", web_command, escaped);
+ purple_notify_error(NULL, NULL, _("Unable to open URL: " + "the 'Manual' browser command seems invalid."), + error ? error->message : NULL); + for (i = 0; i < usercmd_argc; i++) { + gchar *cmd_part = usercmd_argv[i]; + if (uri_added || strstr(cmd_part, "%s") == NULL) { + argv = g_slist_append(argv, cmd_part); + uri_custom = purple_strreplace(cmd_part, "%s", + argv = g_slist_append(argv, uri_custom); + /* There is no "%s" in the browser command. Assume the user + * wanted the URL tacked on to the end of the command. + argv = g_slist_append(argv, uri_escaped);
- if (remote_command != NULL)
+ if (argv_remote != NULL) { /* try the remote command first */
- if (uri_command(remote_command, TRUE) != 0)
- uri_command(command, FALSE);
+ if (!uri_command(argv_remote, TRUE)) + uri_command(argv, FALSE); + uri_command(argv, FALSE); - g_free(remote_command);
- uri_command(command, FALSE);
+ if (usercmd_argv != NULL) + g_strfreev(usercmd_argv); + g_slist_free(argv_remote); winpidgin_notify_uri(uri);
--- a/pidgin/gtkthemes.c Sun Apr 14 13:16:34 2013 -0700
+++ b/pidgin/gtkthemes.c Thu Jan 09 20:17:35 2014 -0800
@@ -222,9 +222,10 @@
void pidgin_themes_load_smiley_theme(const char *file, gboolean load)
- FILE *f = g_fopen(file, "r");
+ FILE *f = g_fopen(file, "rb"); struct smiley_theme *theme=NULL;
struct smiley_list *list = NULL;
GSList *lst = smiley_themes;
@@ -260,6 +261,7 @@
if (!fgets(buf, sizeof(buf), f)) {
if (buf[0] == '#' || buf[0] == '\0')
@@ -271,6 +273,11 @@
+ if (! g_utf8_validate(buf, -1, NULL)) { + purple_debug_error("gtkthemes", "%s:%d is invalid UTF-8\n", file, line_nbr); @@ -309,10 +316,16 @@
while (*i && !isspace(*i) && li < sizeof(l) - 1) {
if (*i == '\\' && *(i+1) != '\0')
+ next = g_utf8_next_char(i); + if ((next - i) > (sizeof(l) - li -1)) { Binary file pidgin/pixmaps/protocols/16/mxit.png has changed
Binary file pidgin/pixmaps/protocols/22/mxit.png has changed
Binary file pidgin/pixmaps/protocols/48/mxit.png has changed
--- a/pidgin/pixmaps/protocols/scalable/mxit.svg Sun Apr 14 13:16:34 2013 -0700
+++ b/pidgin/pixmaps/protocols/scalable/mxit.svg Thu Jan 09 20:17:35 2014 -0800
@@ -1,24 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
-<image overflow="visible" width="34" height="39" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEASABIAAD/7AARRHVja3kAAQAEAAAAHgAA/+4AIUFkb2JlAGTAAAAAAQMA
-EAMCAwYAAAH0AAACSgAAA6n/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoX
-Hh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoa
-JjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIACgAIwMBIgACEQEDEQH/
-xACyAAEAAwEBAAAAAAAAAAAAAAAAAQMFBAIBAAMBAQAAAAAAAAAAAAAAAAABAgMEEAABBAECBgMB
-AAAAAAAAAAABAAIDBAUREyESIhQVRRAjNQYRAAEDAgMDBwgLAAAAAAAAAAERAgMAEiETBDFRIkFh
-cUIUhcWhMlKDs9M01GKSIzNzwyRkhJQVEgABAwAGCQUAAAAAAAAAAAAAARECIUFRYYESEDFxodEy
-QoKicjNDNIT/2gAMAwEAAhEDEQAAANWbtDvwx51+eStam/NlFqUEyBo7eck8dAFoyr//2gAIAQIA
-AQUAe+RpEry7QJ4POA4FDeR3V9q//9oACAEDAAEFAAAUWjRDTTh8dC6V0r//2gAIAQEAAQUAiihn
-hNOsu1rBMr0HLks9hi7UdSE5ytyx5evM/J6dx6rCcInfp3ON2+CZfVY1z46RMm9IHyveZpW+q8Vc
-rtkr51qbF/QEx0s04eCg2//aAAgBAgIGPwBoxWSbRIyisXvNSfZsJrbFYkFblRlP1FOTHK+J8fid
-XuefE//aAAgBAwIGPwCmTDpJzsE9Tkrzs0VlXLuP/9oACAEBAQY/AIZ54GanU6mJk8sksTZnEyNa
-9Be11rW3IAMK+ChH8SP3dY6KH+pH7uvhNORy2wxscOhzGtc01n9rmvzP85bup2zs2b+JZ1q0csgJ
-adHC3hRVMcR5SN1XWSIqLw7fr0GNa8KQ242oC7Aea4moCAFc14cd4FqV3n4lWjP7KL2cNXfT/Kph
-3ZPtDUL0Nrbmk7i61K7z8SrQyNAd+khaQSm2OPmO6s5G3XXWrgllm1KLyjCjbUN2LSXLsFBha0BW
-kkOJ80g7Leau8vEqy9HPEdO0/ZRTxOe6NvoNeyWPhHIow31wt0rvVS/MVjHph6qX5iuKXTQr1mwv
-Lhzi+dwXpFZWdNZk5SX9fMzs/Z95fivkr//Z" transform="matrix(0.9999 0 0 0.9999 7.0146 6.0142)">
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-0.5654" y1="38.3721" x2="-1.3676" y2="-7.5858" gradientTransform="matrix(1 0 0 -1 24.9448 39.3594)"> + <stop offset="0" style="stop-color:#D67B43"/> + <stop offset="0.2638" style="stop-color:#D16841"/> + <stop offset="1" style="stop-color:#CB222B"/> + <path fill="url(#SVGID_1_)" d="M1,23.964c0,17.022,5.954,22.978,22.978,22.978s22.978-5.953,22.978-22.978 + C46.956,7.315,41.254,1.259,25.077,1h-2.194C6.702,1.259,1,7.315,1,23.964"/> + <rect x="20.251" y="22.668" fill="#FFFFFF" width="6.656" height="12.984"/> + <path fill="#FFFFFF" d="M30.659,12.288h-20.03v5.796l0,0c0,0.003,0,0.007,0,0.011c0,0.478,0.387,0.864,0.865,0.864 + c0.008,0,0.017-0.002,0.027-0.002c0,0.002,0,0.003,0.002,0.005h15.795c0,0,3.34,0,3.34,3.34v10.012 + c0,1.947,1.39,3.338,3.336,3.338h3.331V18.714C37.156,12.291,30.659,12.288,30.659,12.288z"/> + <path fill="#FFFFFF" d="M10.629,32.314c0,1.949,1.391,3.338,3.337,3.338h3.322V22.657h-6.659V32.314z"/> --- a/pidgin/win32/nsis/pidgin-installer.nsi Sun Apr 14 13:16:34 2013 -0700
+++ b/pidgin/win32/nsis/pidgin-installer.nsi Thu Jan 09 20:17:35 2014 -0800
@@ -537,6 +537,7 @@
Delete "$INSTDIR\ca-certs\CAcert_Root.pem"
Delete "$INSTDIR\ca-certs\Deutsche_Telekom_Root_CA_2.pem"
Delete "$INSTDIR\ca-certs\DigiCertHighAssuranceCA-3.pem"
+ Delete "$INSTDIR\ca-certs\DigiCertHighAssuranceEVRootCA.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"
--- a/po/de.po Sun Apr 14 13:16:34 2013 -0700
+++ b/po/de.po Thu Jan 09 20:17:35 2014 -0800
@@ -2,8 +2,9 @@
# Pidgin German translation
# Copyright (C) 2001, Daniel Seifert <Pidgin-translation@dseifert.de>
# Copyright (C) 2002, Karsten Weiss <knweiss@gmx.de>
-# Copyright (C) 2002-2013, Björn Voigt <bjoern@cs.tu-berlin.de>,
+# Copyright (C) 2002-2013, Björn Voigt <bjoernv@arcor.de>, # Jochen Kemnade <jochenkemnade@web.de>
+# Copyright (C) 2013, Björn Voigt <bjoernv@arcor.de>, # This file is distributed under the same license as the Pidgin package.
@@ -11,8 +12,8 @@
"Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-04-03 20:47+0200\n"
-"PO-Revision-Date: 2013-04-03 20:46+0200\n"
+"POT-Creation-Date: 2013-07-18 21:34+0200\n" +"PO-Revision-Date: 2013-07-18 21:34+0200\n" "Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
"Language-Team: German <de@li.org>\n"
@@ -2978,7 +2979,7 @@
msgstr "Buddy _untätig wird"
msgid "Buddy _Signs On/Off"
-msgstr "Buddy hat_sich an- oder abgemeldet"
+msgstr "Buddy _sich an- oder abgemeldet hat" --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/ca-certs/DigiCertHighAssuranceEVRootCA.pem Thu Jan 09 20:17:35 2014 -0800
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +-----END CERTIFICATE----- --- a/share/ca-certs/Makefile.am Sun Apr 14 13:16:34 2013 -0700
+++ b/share/ca-certs/Makefile.am Thu Jan 09 20:17:35 2014 -0800
@@ -5,6 +5,7 @@
Deutsche_Telekom_Root_CA_2.pem \
+ DigiCertHighAssuranceEVRootCA.pem \ Entrust.net_Secure_Server_CA.pem \
Equifax_Secure_Global_eBusiness_CA-1.pem \