# HG changeset patch # User Marcus Lundblad # Date 1265231485 0 # Node ID 8271e42acdcb2649c331cee3b3674b0e77812cd9 # Parent 81a60d12897ff60f556385d30ab9b5080e4c9fcd jabber: Don't send custom smileys larger than the recommended maximum BoB size Closes #8356 diff -r 81a60d12897f -r 8271e42acdcb ChangeLog --- a/ChangeLog Wed Feb 03 20:15:19 2010 +0000 +++ b/ChangeLog Wed Feb 03 21:11:25 2010 +0000 @@ -33,6 +33,9 @@ with some clients. * Don't do an SRV lookup for a STUN server associated with the account if one is already set globally in prefs. + * Don't send custom smileys larger than the recommended maximum object size + specified in the BoB XEP. Will prevent getting disconnected because of + sending to large stanzas. Yahoo: * Don't send and tags. (Fartash Faghri) diff -r 81a60d12897f -r 8271e42acdcb libpurple/protocols/jabber/data.h --- a/libpurple/protocols/jabber/data.h Wed Feb 03 20:15:19 2010 +0000 +++ b/libpurple/protocols/jabber/data.h Wed Feb 03 21:11:25 2010 +0000 @@ -26,6 +26,8 @@ #include +#define JABBER_DATA_MAX_SIZE 8192 + typedef struct { char *cid; char *type; diff -r 81a60d12897f -r 8271e42acdcb libpurple/protocols/jabber/message.c --- a/libpurple/protocols/jabber/message.c Wed Feb 03 20:15:19 2010 +0000 +++ b/libpurple/protocols/jabber/message.c Wed Feb 03 21:11:25 2010 +0000 @@ -862,6 +862,7 @@ for (; smileys ; smileys = g_list_delete_link(smileys, smileys)) { PurpleSmiley *smiley = (PurpleSmiley *) smileys->data; + const gchar *shortcut = purple_smiley_get_shortcut(smiley); const gssize len = strlen(shortcut); @@ -983,36 +984,46 @@ if (found_smileys) { gchar *smileyfied_xhtml = NULL; const GList *iterator; - + GList *valid_smileys = NULL; + for (iterator = found_smileys; iterator ; iterator = g_list_next(iterator)) { - const PurpleSmiley *smiley = - (PurpleSmiley *) iterator->data; + PurpleSmiley *smiley = (PurpleSmiley *) iterator->data; const gchar *shortcut = purple_smiley_get_shortcut(smiley); const JabberData *data = jabber_data_find_local_by_alt(shortcut); + PurpleStoredImage *image = purple_smiley_get_stored_image(smiley); - /* the object has not been sent before */ - if (!data) { - PurpleStoredImage *image = - purple_smiley_get_stored_image(smiley); - const gchar *ext = purple_imgstore_get_extension(image); - JabberStream *js = jm->js; + if (purple_imgstore_get_size(image) <= JABBER_DATA_MAX_SIZE) { + /* the object has not been sent before */ + if (!data) { + const gchar *ext = purple_imgstore_get_extension(image); + JabberStream *js = jm->js; - JabberData *new_data = - jabber_data_create_from_data(purple_imgstore_get_data(image), - purple_imgstore_get_size(image), - jabber_message_get_mimetype_from_ext(ext), js); - purple_debug_info("jabber", - "cache local smiley alt = %s, cid = %s\n", - shortcut, jabber_data_get_cid(new_data)); - jabber_data_associate_local(new_data, shortcut); - } + JabberData *new_data = + jabber_data_create_from_data(purple_imgstore_get_data(image), + purple_imgstore_get_size(image), + jabber_message_get_mimetype_from_ext(ext), js); + purple_debug_info("jabber", + "cache local smiley alt = %s, cid = %s\n", + shortcut, jabber_data_get_cid(new_data)); + jabber_data_associate_local(new_data, shortcut); + } + valid_smileys = g_list_append(valid_smileys, smiley); + } else { + gchar *msg = + g_strdup_printf(_("Custom smiley with shortcut %s is too large to send."), + purple_smiley_get_shortcut(smiley)); + purple_conversation_write(conv, NULL, msg, + PURPLE_MESSAGE_ERROR, time(NULL)); + g_free(msg); + } } smileyfied_xhtml = - jabber_message_get_smileyfied_xhtml(xhtml, found_smileys); + jabber_message_get_smileyfied_xhtml(xhtml, valid_smileys); g_list_free(found_smileys); + g_list_free(valid_smileys); return smileyfied_xhtml; }