diff options
author | qarkai <qarkai@gmail.com> | 2017-03-24 23:23:23 +0300 |
---|---|---|
committer | qarkai <qarkai@gmail.com> | 2017-03-24 23:23:23 +0300 |
commit | 2e53c1f0f03beb7304d4794d579afcb1cdc7d806 (patch) | |
tree | 77025269515e15f2491ac0982b8f0ac08f886811 | |
parent | 8bf2dacfc2cdaba5a6d2ac2bd3d0f32266d84733 (diff) | |
parent | 06485acec6454873fd73c7dfde5a2b88fc4bb605 (diff) | |
download | pidgin-2e53c1f0f03beb7304d4794d579afcb1cdc7d806.tar.gz |
Merge release-2.x.y changes, resolve conflicts
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | libpurple/protocols/jabber/message.c | 122 | ||||
-rw-r--r-- | pidgin/gtkdialogs.c | 2 |
3 files changed, 72 insertions, 54 deletions
@@ -5,7 +5,7 @@ version 2.12.1 (??/??/????): version 2.12.0 (03/09/2017): libpurple: - * Fix an out of bounds memory read in purple_markup_unescape_entity. + * Fix an out of bounds memory write in purple_markup_unescape_entity. CVE-2017-2640 * Fix use of uninitialised memory if running non-debug-enabled versions of glib * Updated AIM dev and dist ID's to new ones that were assigned by AOL. diff --git a/libpurple/protocols/jabber/message.c b/libpurple/protocols/jabber/message.c index 967de19f10..d86b963230 100644 --- a/libpurple/protocols/jabber/message.c +++ b/libpurple/protocols/jabber/message.c @@ -39,6 +39,48 @@ #include <string.h> +static GString *jm_body_with_oob(JabberMessage *jm) { + GList *etc; + GString *body = g_string_new(""); + + if(jm->xhtml) + g_string_append(body, jm->xhtml); + else if(jm->body) + g_string_append(body, jm->body); + + for(etc = jm->etc; etc; etc = etc->next) { + xmlnode *x = etc->data; + const char *xmlns = xmlnode_get_namespace(x); + if(purple_strequal(xmlns, NS_OOB_X_DATA)) { + xmlnode *url, *desc; + char *urltxt, *desctxt; + + url = xmlnode_get_child(x, "url"); + desc = xmlnode_get_child(x, "desc"); + + if(!url) + continue; + + urltxt = xmlnode_get_data(url); + desctxt = desc ? xmlnode_get_data(desc) : urltxt; + + if(body->len && !purple_strequal(body->str, urltxt)) + g_string_append_printf(body, "<br/><a href='%s'>%s</a>", + urltxt, desctxt); + else + g_string_printf(body, "<a href='%s'>%s</a>", + urltxt, desctxt); + + g_free(urltxt); + + if(desctxt != urltxt) + g_free(desctxt); + } + } + + return body; +} + void jabber_message_free(JabberMessage *jm) { g_free(jm->from); @@ -64,6 +106,7 @@ static void handle_chat(JabberMessage *jm) PurpleAccount *account; JabberBuddy *jb; JabberBuddyResource *jbr; + GString *body; if(!jid) return; @@ -74,15 +117,17 @@ static void handle_chat(JabberMessage *jm) jb = jabber_buddy_find(jm->js, jm->from, TRUE); jbr = jabber_buddy_find_resource(jb, jid->resource); - if(!jm->xhtml && !jm->body) { - if (jbr && jm->chat_state != JM_STATE_NONE) - jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED; + if (jbr && jm->chat_state != JM_STATE_NONE) + jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED; - if(JM_STATE_COMPOSING == jm->chat_state) { + switch(jm->chat_state) { + case JM_STATE_COMPOSING: serv_got_typing(gc, jm->from, 0, PURPLE_TYPING); - } else if(JM_STATE_PAUSED == jm->chat_state) { + break; + case JM_STATE_PAUSED: serv_got_typing(gc, jm->from, 0, PURPLE_TYPED); - } else if(JM_STATE_GONE == jm->chat_state) { + break; + case JM_STATE_GONE: { PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, jm->from, account); if (conv && jid->node && jid->domain) { @@ -110,11 +155,21 @@ static void handle_chat(JabberMessage *jm) } } serv_got_typing_stopped(gc, jm->from); - - } else { - serv_got_typing_stopped(gc, jm->from); + break; } - } else { + default: + serv_got_typing_stopped(gc, jm->from); + } + + if (jm->js->googletalk && jm->body && jm->xhtml == NULL) { + char *tmp = jm->body; + jm->body = jabber_google_format_to_html(jm->body); + g_free(tmp); + } + + body = jm_body_with_oob(jm); + + if(body && body->len) { if (jid->resource) { /* * We received a message from a specific resource, so @@ -151,63 +206,26 @@ static void handle_chat(JabberMessage *jm) jbr->thread_id = g_strdup(jbr->thread_id); } - if (jm->js->googletalk && jm->xhtml == NULL) { - char *tmp = jm->body; - jm->body = jabber_google_format_to_html(jm->body); - g_free(tmp); - } - serv_got_im(gc, jm->from, jm->xhtml ? jm->xhtml : jm->body, 0, jm->sent); + serv_got_im(gc, jm->from, body->str, 0, jm->sent); } jabber_id_free(jid); + + if(body) + g_string_free(body, TRUE); } static void handle_headline(JabberMessage *jm) { char *title; GString *body; - GList *etc; if(!jm->xhtml && !jm->body) return; /* ignore headlines without any content */ - body = g_string_new(""); + body = jm_body_with_oob(jm); title = g_strdup_printf(_("Message from %s"), jm->from); - if(jm->xhtml) - g_string_append(body, jm->xhtml); - else if(jm->body) - g_string_append(body, jm->body); - - for(etc = jm->etc; etc; etc = etc->next) { - xmlnode *x = etc->data; - const char *xmlns = xmlnode_get_namespace(x); - if(purple_strequal(xmlns, NS_OOB_X_DATA)) { - xmlnode *url, *desc; - char *urltxt, *desctxt; - - url = xmlnode_get_child(x, "url"); - desc = xmlnode_get_child(x, "desc"); - - if(!url || !desc) - continue; - - urltxt = xmlnode_get_data(url); - desctxt = xmlnode_get_data(desc); - - /* I'm all about ugly hacks */ - if(body->len && jm->body && purple_strequal(body->str, jm->body)) - g_string_printf(body, "<a href='%s'>%s</a>", - urltxt, desctxt); - else - g_string_append_printf(body, "<br/><a href='%s'>%s</a>", - urltxt, desctxt); - - g_free(urltxt); - g_free(desctxt); - } - } - purple_notify_formatted(jm->js->gc, title, jm->subject ? jm->subject : title, NULL, body->str, NULL, NULL); diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c index 407e20a6f9..9085286938 100644 --- a/pidgin/gtkdialogs.c +++ b/pidgin/gtkdialogs.c @@ -178,7 +178,7 @@ static const struct translator translators[] = { {N_("Canadian English"), "en_CA", "Adam Weinberger", "adamw@gnome.org"}, {N_("Esperanto"), "eo", "Stéphane Fillod", "fillods@users.sourceforge.net"}, {N_("Spanish"), "es", "Javier Fernández-Sanguino Peña", "jfs@debian.org"}, - {N_("Argentine Spanish"), "es_AR", "KNTRO", "tskuhn@gmail.com"}, + {N_("Argentine Spanish"), "es_AR", "KNTRO", "kntro@msn.com"}, {N_("Estonian"), "et", "Ivar Smolin", "okul@linux.ee"}, {N_("Basque"), "eu", "Mikel Pascual Aldabaldetreku", "mikel.paskual@gmail.com"}, {N_("Persian"), "fa", "Elnaz Sarbar", "elnaz@farsiweb.info"}, |