pidgin/pidgin

Manual merge. Only 1 conflict, in ChangeLog.
release-2.x.y
2014-01-09, Mark Doliner
188b3b588b6d
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/[^/]+\.c$
.*/perl/common/blib.*
.*/perl/common/pm_to_blib$
+.*/perl/common/MYMETA\.(json|yml)
.*~$
.*\.a$
.*\.asc$
--- a/COPYRIGHT Sun Apr 14 13:16:34 2013 -0700
+++ b/COPYRIGHT Thu Jan 09 20:17:35 2014 -0800
@@ -214,6 +214,7 @@
Vladislav Guberinić
Gideon N. Guillen
Aman Gupta
+Ashish Gupta
Christian Hammond
Erick Hamness
Fred Hampton
--- a/ChangeLog Sun Apr 14 13:16:34 2013 -0700
+++ b/ChangeLog Thu Jan 09 20:17:35 2014 -0800
@@ -4,13 +4,20 @@
libpurple:
* Impose maximum download size for all HTTP fetches.
+ General:
+ * Add support for Python3 in build scripts. (Ashish Gupta) (#15624)
+
AIM and ICQ:
* Fix a possible crash when receiving a malformed message in a Direct IM
session.
+ Gadu-Gadu:
+ * 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):
Alien hatchery:
--- 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 @@
dnl (Thanks to XChat)
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)'`
changequote(<<, >>)dnl
- 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])'`
changequote([, ])dnl
- 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_MSG_RESULT()
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 @@
## LIBRARIES
##
LIBS = \
+ -ldnsapi \
-lglib-2.0 \
-lgthread-2.0 \
-lgobject-2.0 \
--- 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
import re
import string
import sys
@@ -236,38 +237,38 @@
paramslist = ", ".join(self.paramshdr)
if (paramslist == "") :
paramslist = "void"
- print "%s %s(%s)" % (self.functiontype, self.function.name,
- paramslist),
+ print("%s %s(%s)" % (self.functiontype, self.function.name,
+ paramslist), end=' ')
if self.headersonly:
- print ";"
+ print(";")
return
- print "{"
+ print("{")
for decl in self.decls:
- print decl
+ print(decl)
- 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:
- print code
+ print(code)
- print "}\n"
+ print("}\n")
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"
def flush(self):
- print "static DBusMessage*"
- print "%s_DBUS(DBusMessage *message_DBUS, DBusError *error_DBUS) {" % \
- self.function.name
+ print("static DBusMessage*")
+ print("%s_DBUS(DBusMessage *message_DBUS, DBusError *error_DBUS) {" % \
+ self.function.name)
- print "\tDBusMessage *reply_DBUS;"
+ print("\tDBusMessage *reply_DBUS;")
for decl in self.cdecls:
- print decl
+ print(decl)
- 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);")
for code in self.ccode:
- print code
+ print(code)
- 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:
if type(param) is str:
- print "%s," % param,
+ print("%s," % param, end=' ')
else:
- 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 code
+ print(code)
- 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);" % \
- (name, name, type[0]))
+ (name, name, type[0]))
self.addintype("i", name)
def inputpointer(self, type, name):
@@ -539,7 +540,7 @@
def process(self):
- 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:
words = line.split()
@@ -554,7 +555,7 @@
# empty line has been encountered
myline = line.strip()
while (myline.count("(") > myline.count(")")) or self.typeregexp.match(myline):
- newline = self.inputiter.next().strip()
+ newline = next(self.inputiter).strip()
if len(newline) == 0:
break
myline += " " + newline
@@ -597,15 +598,15 @@
self.functions.append((binding.function.name, binding.dparams))
def flush(self):
- 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 "};"
+ print("{NULL, NULL, NULL}")
+ print("};")
- 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 @@
if "client" in options:
bindings = ClientBindingSet(sys.stdin, fprefix,
- options.has_key("headers"))
+ "headers" in options)
else:
bindings = ServerBindingSet(sys.stdin, fprefix)
bindings.process()
--- 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"/>
# </signal>
-
+from __future__ import print_function
import re
import sys
@@ -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()):
signal = match.group(1)
marshal = match.group(2)
@@ -32,7 +32,7 @@
continue
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 @@
type = 't'
elif arg == "BOOLEAN":
type = 'b'
- print "\" <arg type='%s'/>\\n\""%type
+ print("\" <arg type='%s'/>\\n\"" % type)
- print "\" </signal>\\n\""
+ print("\" </signal>\\n\"")
-print ";"
+print(";")
--- 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,
# DBUS_POINTER_NAME2,
-# DBUS_POINTER_NAME3,
-#
+# DBUS_POINTER_NAME3,
+#
# --list NAME1
# NAME2
# NAME3
-#
+#
-
+from __future__ import print_function
import re
import sys
@@ -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)
for line in myinput:
match = structregexp1.match(line)
if match is not None:
- print toprint(match.group(2), line)
+ print(toprint(match.group(2), line))
continue
match = structregexp2.match(line)
if match is not None:
while True:
if verbatim:
- print line.rstrip()
- line = myinput.next()
+ print(line.rstrip())
+ line = next(myinput)
match = structregexp3.match(line)
if match is not None:
- print toprint(match.group(1), line)
+ print(toprint(match.group(1), line))
break
if line[0] not in [" ", "\t", "{", "\n"]:
if verbatim:
- print line
+ print(line)
break
-
-
-
-
-
-
--- 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 @@
HEADER hdr;
u_char buf[1024];
} queryans;
-#else
-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;
#endif
struct _PurpleSrvTxtQueryData {
@@ -646,7 +639,7 @@
DNS_STATUS ds;
PurpleSrvTxtQueryData *query_data = data;
type = query_data->type;
- 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) {
PDNS_RECORD dr_tmp;
@@ -707,7 +700,7 @@
lst = g_list_append(lst, txtres);
}
- MyDnsRecordListFree(dr, DnsFreeRecordList);
+ DnsRecordListFree(dr, DnsFreeRecordList);
query_data->results = lst;
} else {
@@ -747,7 +740,6 @@
int pid;
#else
GError* err = NULL;
- static gboolean initialized = FALSE;
#endif
if (!protocol || !*protocol || !transport || !*transport || !domain || !*domain) {
@@ -836,21 +828,10 @@
return query_data;
#else
- if (!initialized) {
- MyDnsQuery_UTF8 = (void*) wpurple_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
- MyDnsRecordListFree = (void*) wpurple_find_and_loadproc(
- "dnsapi.dll", "DnsRecordListFree");
- initialized = TRUE;
- }
-
- if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree)
- query_data->error_message = g_strdup("System missing DNS API (Requires W2K+)\n");
- else {
- 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 : "");
- g_error_free(err);
- }
+ 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 : "");
+ g_error_free(err);
}
/* The query isn't going to happen, so finish the SRV lookup now.
@@ -883,7 +864,6 @@
int pid;
#else
GError* err = NULL;
- static gboolean initialized = FALSE;
#endif
proxy_type = purple_proxy_info_get_type(
@@ -967,21 +947,10 @@
return query_data;
#else
- if (!initialized) {
- MyDnsQuery_UTF8 = (void*) wpurple_find_and_loadproc("dnsapi.dll", "DnsQuery_UTF8");
- MyDnsRecordListFree = (void*) wpurple_find_and_loadproc(
- "dnsapi.dll", "DnsRecordListFree");
- initialized = TRUE;
- }
-
- if (!MyDnsQuery_UTF8 || !MyDnsRecordListFree)
- query_data->error_message = g_strdup("System missing DNS API (Requires W2K+)\n");
- else {
- 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 : "");
- g_error_free(err);
- }
+ 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 : "");
+ g_error_free(err);
}
/* 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
import dbus
bus = dbus.SessionBus()
@@ -32,5 +33,5 @@
if purple.PurpleBlistNodeIsBuddy(node):
icon = purple.PurpleBuddyGetIcon(node)
if icon != 0:
- 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 @@
const unsigned char *
purple_network_ip_atoi(ip)
const char *ip
+PPCODE:
+ RETVAL = purple_network_ip_atoi(ip);
+ sv_setpvn(TARG, (const char *)RETVAL, 4);
+ XSprePUSH;
+ PUSHTARG;
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"
+#ifdef _WIN32
+# ifndef HAVE_LONG_LONG
+#define HAVE_LONG_LONG
+# endif
+#else
+/* 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! */
+#endif
#include <nspr.h>
#include <nss.h>
@@ -910,11 +918,49 @@
/* NSS's native PRTime type *almost* corresponds to time_t; however,
it measures *microseconds* since the epoch, not seconds. Hence
the funny conversion. */
+ nss_activ = nss_activ / 1000000;
+ nss_expir = nss_expir / 1000000;
+
if (activation) {
- *activation = nss_activ / 1000000;
+ *activation = nss_activ;
+#if SIZEOF_TIME_T == 4
+ /** Hack to deal with dates past the 32-bit barrier.
+ Handling is different for signed vs unsigned 32-bit types.
+ */
+ if (*activation != nss_activ) {
+ if (nss_activ < 0) {
+ purple_debug_warning("nss",
+ "Setting Activation Date to epoch to handle pre-epoch value\n");
+ *activation = 0;
+ } else {
+ purple_debug_error("nss",
+ "Activation date past 32-bit barrier, forcing invalidity\n");
+ return FALSE;
+ }
+ }
+#endif
}
if (expiration) {
- *expiration = nss_expir / 1000000;
+ *expiration = nss_expir;
+#if SIZEOF_TIME_T == 4
+ if (*expiration != nss_expir) {
+ if (*expiration < nss_expir) {
+ if (*expiration < 0) {
+ purple_debug_warning("nss",
+ "Setting Expiration Date to 32-bit signed max\n");
+ *expiration = PR_INT32_MAX;
+ } else {
+ purple_debug_warning("nss",
+ "Setting Expiration Date to 32-bit unsigned max\n");
+ *expiration = PR_UINT32_MAX;
+ }
+ } else {
+ purple_debug_error("nss",
+ "Expiration date prior to unix epoch, forcing invalidity\n");
+ return FALSE;
+ }
+ }
+#endif
}
return TRUE;
--- 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
import sys
import dbus
import os
if len(sys.argv) == 1:
- print "Usage:", sys.argv[0], """<purple-client> [arguments]
-
-Example:
- """, sys.argv[0], "pidgin -d -c /my/home"
- sys.exit(1)
+ print("Usage:", sys.argv[0], "<purple-client> [arguments]")
+ print("\nExample:\n ", sys.argv[0], "pidgin -d -c /my/home")
+ sys.exit(1)
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)
if home == userdir:
- print "Already running."
+ print("Already running.")
purple.PurpleBlistShow()
else:
- print "Starting client from a different home directory."
+ print("Starting client from a different home directory.")
raise
except:
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;
+
+ return cond;
+}
+
/**
* 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)
- ? PURPLE_INPUT_WRITE
- : PURPLE_INPUT_READ,
- ggp_async_token_handler, gc);
+ ggp_tcpsocket_inputcond_gg_to_purple(token->req->check),
+ ggp_async_token_handler, gc);
return;
}
@@ -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");
-
- if (buddylist == NULL)
- return;
-
- gg_userlist_request(info->session, GG_USERLIST_PUT, buddylist);
- g_free(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 @@
return;
}
+ 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);
+
switch (ev->type) {
case GG_EVENT_NONE:
/* Nothing happened. */
@@ -1809,22 +1773,6 @@
ggp_generic_status_handler(gc, ev->event.status60.uin,
GG_S(ev->event.status60.status), ev->event.status60.descr);
break;
- 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);
- }
- } else {
- 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."));
- }
- break;
case GG_EVENT_PUBDIR50_SEARCH_REPLY:
ggp_pubdir_reply_handler(gc, ev->event.pubdir50);
break;
@@ -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 :
- PURPLE_INPUT_READ,
+ ggp_tcpsocket_inputcond_gg_to_purple(info->session->check),
ggp_async_login_handler, gc);
switch (ev->type) {
@@ -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,
- PURPLE_INPUT_READ,
- ggp_callback_recv, gc);
+ ggp_tcpsocket_inputcond_gg_to_purple(info->session->check),
+ ggp_callback_recv, gc);
ggp_buddylist_send(gc);
purple_connection_update_progress(gc, _("Connected"), 1, 2);
@@ -2190,8 +2137,9 @@
g_free(glp);
return;
}
- 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 @@
#include <string.h>
#include <unistd.h>
+#define GG_HTTP_MAX_LENGTH 1000000000
+
/**
* Rozpoczyna połączenie HTTP.
*
@@ -364,6 +366,11 @@
h->body_size = left;
}
+ 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);
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 += strlen(n);
}
- n += g_strlcpy(n, "\r\n", end - n);
+ if ((end - n) > 2)
+ n += g_strlcpy(n, "\r\n", end - n);
body = msn_message_get_bin_data(msg, &body_len);
- if (body != NULL)
+ if (body != NULL && (end - n) > body_len)
{
memcpy(n, body, body_len);
n += 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 @@
char* dest;
selmsg = g_hash_table_lookup(hash, "selmsg"); /* find the selection message */
- if (selmsg) {
+ 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 )
{
char msg[256];
int pos;
@@ -102,11 +102,11 @@
if ( pos == 0 )
pos += sprintf( &msg[pos], "%04i: ", i );
- pos += sprintf( &msg[pos], "0x%02X ", (unsigned char) buf[i] );
+ pos += sprintf( &msg[pos], "0x%02X ", buf[i] );
if ( i % 16 == 15 ) {
pos += sprintf( &msg[pos], "\n" );
- purple_debug_info( MXIT_PLUGIN_ID, msg );
+ purple_debug_info( MXIT_PLUGIN_ID, "%s", msg );
pos = 0;
}
else if ( i % 16 == 7 )
@@ -115,7 +115,7 @@
if ( pos > 0 ) {
pos += sprintf( &msg[pos], "\n" );
- purple_debug_info( MXIT_PLUGIN_ID, msg );
+ purple_debug_info( MXIT_PLUGIN_ID, "%s", msg );
pos = 0;
}
}
@@ -133,27 +133,26 @@
void mxit_add_html_link( struct RXMsgData* mx, const char* replydata, gboolean isStructured, const char* displaytext )
{
#ifdef MXIT_LINK_CLICK
- char retstr[256];
- gchar* retstr64;
- char link[256];
- int len;
+ gchar* link = NULL;
+ gchar* link64 = NULL;
/*
* 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",
MXIT_LINK_KEY,
purple_account_get_username( mx->session->acc ),
purple_account_get_protocol_id( mx->session->acc ),
mx->from,
isStructured ? 1 : 0,
replydata );
- retstr64 = purple_base64_encode( (const unsigned char*) retstr, len );
- g_snprintf( link, sizeof( link ), "%s%s", MXIT_LINK_PREFIX, retstr64 );
- g_free( 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_free( link64 );
+ g_free( link );
#else
g_string_append_printf( mx->msg, "<b>%s</b>", replydata );
#endif
@@ -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 )
{
unsigned int len = 0;
unsigned char bytes;
@@ -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 )
{
- int len;
+ unsigned int len;
+ gchar *out_str;
/* validate the field type [1 byte] */
if ( data[0] != type ) {
/* 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 );
return -1;
}
- len = data[1]; /* length field [1 bytes] */
- *utf8 = g_malloc( len + 1 );
- memcpy( *utf8, &data[2], len ); /* data field */
- (*utf8)[len] = '\0';
+ len = (uint8_t)data[1]; /* length field [1 byte] */
+ out_str = g_malloc(len + 1);
+ if (out_str == NULL) {
+ purple_debug_fatal(MXIT_PLUGIN_ID, "asn_getUtf8: out of memory");
+ return -1;
+ }
+
+ memcpy(out_str, &data[2], len); /* data field */
+ out_str[len] = '\0';
+
+ *utf8 = out_str;
return ( len + 2 );
}
@@ -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;
unsigned int pos = 0;
- char emo[16];
int id;
char* str;
int em_size = 0;
@@ -483,9 +489,7 @@
int* intptr = NULL;
int res;
-#ifdef MXIT_DEBUG_EMO
purple_debug_info( MXIT_PLUGIN_ID, "emoticon_returned\n" );
-#endif
/* 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 @@
hex_dump( data, len );
#endif
- /* parse out the emoticon */
- pos = 0;
-
- /* 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" );
goto done;
}
@@ -513,16 +513,14 @@
/* validate the image frame desc byte */
if ( data[pos] != '\x6F' ) {
- /* bad frame desc */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad frame desc)\n" );
goto done;
}
pos++;
- /* get the data length */
+ /* get the frame image data length */
res = asn_getlength( &data[pos], &em_size );
if ( res <= 0 ) {
- /* bad frame length */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad frame length)\n" );
goto done;
}
@@ -534,7 +532,6 @@
/* utf-8 (emoticon name) */
res = asn_getUtf8( &data[pos], 0x0C, &str );
if ( res <= 0 ) {
- /* bad utf-8 string */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad name string)\n" );
goto done;
}
@@ -548,7 +545,6 @@
/* utf-8 (emoticon shortcut) */
res = asn_getUtf8( &data[pos], 0x81, &str );
if ( res <= 0 ) {
- /* bad utf-8 string */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad shortcut string)\n" );
goto done;
}
@@ -560,7 +556,6 @@
/* validate the image data type */
if ( data[pos] != '\x82' ) {
- /* bad frame desc */
purple_debug_error( MXIT_PLUGIN_ID, "Invalid emoticon received from wapsite (bad data type)\n" );
g_free( em_id );
goto done;
@@ -580,8 +575,17 @@
purple_debug_info( MXIT_PLUGIN_ID, "read the length '%i'\n", em_size );
#endif
+ /* 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 );
+ strcpy( em_id, emo );
+ }
+
if ( g_hash_table_lookup( mx->session->iimages, em_id ) ) {
/* emoticon found in the table, so ignore this one */
+ g_free( em_id );
goto done;
}
@@ -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 );
- strcpy( em_id, 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 */
+ switch ( presence ) {
+ case MXIT_PRESENCE_OFFLINE :
+ case MXIT_PRESENCE_ONLINE :
+ case MXIT_PRESENCE_AWAY :
+ case MXIT_PRESENCE_DND :
+ return presence;
+
+ default :
+ 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 @@
g_strfreev(splits);
g_strfreev(split_data);
+ if (crumb == NULL)
+ response_no = -1;
+
if(response_no != 0) {
/* 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
* message flags.
- * @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 @@
specified a length) */
#define DEFAULT_MAX_HTTP_DOWNLOAD (512 * 1024)
+#define MAX_HTTP_CHUNK_SIZE (10 * 1024 * 1024)
+
struct _PurpleUtilFetchUrlData
{
PurpleUtilFetchUrlCallback callback;
@@ -710,7 +712,7 @@
gint year = 0;
long tzoff = PURPLE_NO_TZ_OFF;
time_t retval;
- gboolean mktime_with_utc = TRUE;
+ gboolean mktime_with_utc = FALSE;
if (rest != NULL)
*rest = NULL;
@@ -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;
tzoff *= sign;
- } else {
- if (rest != NULL && *str != '\0')
- *rest = str;
-
- return 0;
}
} else if (*str == 'Z') {
/* 'Z' = Zulu = UTC */
str++;
- utc = TRUE;
- } else if (!utc) {
- /* Local Time */
- t.tm_isdst = -1;
- mktime_with_utc = FALSE;
+ mktime_with_utc = TRUE;
+ tzoff = 0;
}
- if (utc)
- tzoff = 0;
+ if (!mktime_with_utc)
+ {
+ /* No timezone specified. */
+
+ if (utc) {
+ mktime_with_utc = TRUE;
+ tzoff = 0;
+ } else {
+ /* Local Time */
+ t.tm_isdst = -1;
+ }
+ }
}
}
@@ -3781,11 +3786,12 @@
break;
s += 2;
- 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);
+ break;
}
/* Move all data overtop of the chunk length that we read in earlier */
@@ -3793,7 +3799,7 @@
p += sz;
s += sz;
newlen += sz;
- 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);
break;
--- 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 @@
}
#ifndef _WIN32
-static gint
-uri_command(const char *command, gboolean sync)
+static gboolean
+uri_command(GSList *arg_list, gboolean sync)
{
gchar *tmp;
GError *error = NULL;
- gint ret = 0;
+ GSList *it;
+ gchar **argv;
+ gint argc, i;
+ gchar *program;
- 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",
+ program);
+ tmp = g_strdup_printf(
+ _("The browser command \"%s\" is invalid."),
+ program ? program : "(null)");
purple_notify_error(NULL, NULL, _("Unable to open URL"), tmp);
g_free(tmp);
- }
- else if (sync)
- {
- gint status;
-
- 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);
- g_free(tmp);
- g_error_free(error);
- }
- else
- ret = status;
- }
- else
- {
- 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);
- g_free(tmp);
- g_error_free(error);
- }
+ return FALSE;
}
- return ret;
+ argc = g_slist_length(arg_list);
+ argv = g_new(gchar*, argc + 1);
+ i = 0;
+ for (it = arg_list; it; it = g_slist_next(it)) {
+ if (purple_debug_is_verbose()) {
+ purple_debug_misc("gtknotify", "argv[%d] = \"%s\"\n",
+ i, (gchar*)it->data);
+ }
+ argv[i++] = it->data;
+ }
+ argv[i] = NULL;
+
+ if (sync) {
+ gint exit_status = 0;
+
+ 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) &&
+ exit_status == 0)
+ {
+ g_free(argv);
+ return TRUE;
+ }
+
+ 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)");
+ g_error_free(error);
+ purple_notify_error(NULL, NULL, _("Unable to open URL"), tmp);
+ g_free(tmp);
+
+ g_free(argv);
+ return FALSE;
+ }
+
+ if (g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH |
+ G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL,
+ NULL, NULL, &error))
+ {
+ g_free(argv);
+ return TRUE;
+ }
+
+ purple_debug_warning("gtknotify", "Error launching \"%s\": %s\n",
+ program, error ? error->message : "(null)");
+ g_error_free(error);
+
+ g_free(argv);
+ return FALSE;
}
#endif /* _WIN32 */
@@ -1244,183 +1278,208 @@
pidgin_notify_uri(const char *uri)
{
#ifndef _WIN32
- char *escaped = g_shell_quote(uri);
- char *command = NULL;
- char *remote_command = NULL;
const char *web_browser;
int place;
+ 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
+ "/browsers/browser");
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");
if (tmp == NULL)
- command = g_strdup_printf("gnome-open %s", escaped);
+ argv = g_slist_append(argv, "gnome-open");
else
- command = g_strdup_printf("xdg-open %s", escaped);
+ argv = g_slist_append(argv, "xdg-open");
g_free(tmp);
- }
- 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);
- else
- 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
* and/or current window?
*/
- }
- 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"))
{
- char *args = "";
+ 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)",
+ uri_escaped);
+ } else if (place == PIDGIN_BROWSER_NEW_TAB) {
+ uri_custom = g_strdup_printf("openURL(%s,new-tab)",
+ uri_escaped);
+ } else if (place == PIDGIN_BROWSER_CURRENT) {
+ uri_custom = g_strdup_printf("openURL(%s)",
+ uri_escaped);
+ }
+
+ 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
- * for now.
- */
- if (!strcmp(web_browser, "firefox"))
- args = "-a 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,
+ "firefox");
+ }
- 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 "
- "openURL(%s,new-tab)",
- web_browser, args, escaped);
- else if (place == PIDGIN_BROWSER_CURRENT)
- remote_command = g_strdup_printf("%s %s -remote "
- "openURL(%s)",
- 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)",
+ uri_escaped);
+ } else if (place == PIDGIN_BROWSER_CURRENT) {
+ uri_custom = g_strdup_printf("openURL(%s)",
+ uri_escaped);
+ }
+
+ if (uri_custom) {
+ 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)",
- escaped);
- }
+ 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);
- }
- else
- 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")) {
+ GError *error = NULL;
+ const char *usercmd_command;
+ gint usercmd_argc, i;
+ 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."));
return NULL;
}
- if (strstr(web_command, "%s"))
- command = purple_strreplace(web_command, "%s", escaped);
- else
+ 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);
+ g_error_free(error);
+ return 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);
+ continue;
+ }
+
+ uri_custom = purple_strreplace(cmd_part, "%s",
+ uri_escaped);
+ argv = g_slist_append(argv, uri_custom);
+ uri_added = TRUE;
+ }
+
+ /* There is no "%s" in the browser command. Assume the user
+ * wanted the URL tacked on to the end of the command.
+ */
+ if (!uri_added)
+ argv = g_slist_append(argv, uri_escaped);
}
- g_free(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);
+ } else
+ uri_command(argv, FALSE);
- g_free(remote_command);
-
- }
- else
- uri_command(command, FALSE);
-
- g_free(command);
+ if (usercmd_argv != NULL)
+ g_strfreev(usercmd_argv);
+ g_free(uri_escaped);
+ g_free(uri_custom);
+ g_slist_free(argv);
+ g_slist_free(argv_remote);
#else /* !_WIN32 */
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");
char buf[256];
char *i;
+ gsize line_nbr = 0;
struct smiley_theme *theme=NULL;
struct smiley_list *list = NULL;
GSList *lst = smiley_themes;
@@ -260,6 +261,7 @@
if (!fgets(buf, sizeof(buf), f)) {
break;
}
+ line_nbr++;
if (buf[0] == '#' || buf[0] == '\0')
continue;
@@ -271,6 +273,11 @@
continue;
}
+ if (! g_utf8_validate(buf, -1, NULL)) {
+ purple_debug_error("gtkthemes", "%s:%d is invalid UTF-8\n", file, line_nbr);
+ continue;
+ }
+
i = buf;
while (isspace(*i))
i++;
@@ -309,10 +316,16 @@
while (*i) {
char l[64];
int li = 0;
+ char *next;
while (*i && !isspace(*i) && li < sizeof(l) - 1) {
if (*i == '\\' && *(i+1) != '\0')
i++;
- l[li++] = *(i++);
+ next = g_utf8_next_char(i);
+ if ((next - i) > (sizeof(l) - li -1)) {
+ break;
+ }
+ while (i != next)
+ l[li++] = *(i++);
}
l[li] = 0;
if (!sfile) {
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)">
-</image>
+<g>
+
+ <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"/>
+ </linearGradient>
+ <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"/>
+ <g>
+ <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"/>
+ </g>
+</g>
</svg>
--- 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 @@
msgstr ""
"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"
"Language: de\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"
#. *< type
#. *< ui_requirement
--- /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
++OkuE6N36B9K
+-----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 @@
CAcert_Root.pem \
CAcert_Class3.pem \
Deutsche_Telekom_Root_CA_2.pem \
+ DigiCertHighAssuranceEVRootCA.pem \
Entrust.net_Secure_Server_CA.pem \
Equifax_Secure_CA.pem \
Equifax_Secure_Global_eBusiness_CA-1.pem \