pidgin/pidgin

9aeedc02a0e4
Merged in dequisdequis/pidgin (pull request #167)

Facebook: port fixes from bitlbee-facebook
--- a/libpurple/protocols/facebook/api.c Tue Oct 25 19:48:55 2016 +0000
+++ b/libpurple/protocols/facebook/api.c Tue Nov 01 02:10:27 2016 +0000
@@ -600,6 +600,12 @@
priv->token = NULL;
}
+ /* 509 is used for "invalid attachment id" */
+ if (code == 509) {
+ errc = FB_API_ERROR_NONFATAL;
+ success = FALSE;
+ }
+
str = fb_json_values_next_str(values, NULL);
if (purple_strequal(str, "ERROR_QUEUE_NOT_FOUND") ||
@@ -1949,6 +1955,28 @@
prms, fb_api_cb_auth);
}
+static gchar *
+fb_api_user_icon_checksum(gchar *icon)
+{
+ gchar *csum;
+ FbHttpParams *prms;
+
+ if (G_UNLIKELY(icon == NULL)) {
+ return NULL;
+ }
+
+ prms = fb_http_params_new_parse(icon, TRUE);
+ csum = fb_http_params_dup_str(prms, "oh", NULL);
+ fb_http_params_free(prms);
+
+ if (G_UNLIKELY(csum == NULL)) {
+ /* Revert to the icon URL as the unique checksum */
+ csum = g_strdup(icon);
+ }
+
+ return csum;
+}
+
static void
fb_api_cb_contact(PurpleHttpConnection *con, PurpleHttpResponse *res,
gpointer data)
@@ -1956,7 +1984,6 @@
const gchar *str;
FbApi *api = data;
FbApiUser user;
- FbHttpParams *prms;
FbJsonValues *values;
GError *err = NULL;
JsonNode *node;
@@ -1978,7 +2005,7 @@
values = fb_json_values_new(node);
fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.id");
fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.name");
- fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+ fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
"$.profile_pic_large.uri");
fb_json_values_update(values, &err);
@@ -1994,14 +2021,7 @@
user.name = fb_json_values_next_str_dup(values, NULL);
user.icon = fb_json_values_next_str_dup(values, NULL);
- prms = fb_http_params_new_parse(user.icon, TRUE);
- user.csum = fb_http_params_dup_str(prms, "oh", NULL);
- fb_http_params_free(prms);
-
- if (G_UNLIKELY(user.csum == NULL)) {
- /* Revert to the icon URL as the unique checksum */
- user.csum = g_strdup(user.icon);
- }
+ user.csum = fb_api_user_icon_checksum(user.icon);
g_signal_emit_by_name(api, "contact", &user);
fb_api_user_reset(&user, TRUE);
@@ -2032,7 +2052,6 @@
FbApi *api = data;
FbApiPrivate *priv = api->priv;
FbApiUser *user;
- FbHttpParams *prms;
FbId uid;
FbJsonValues *values;
gboolean complete;
@@ -2045,13 +2064,13 @@
}
values = fb_json_values_new(root);
- fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+ fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
"$.represented_profile.id");
- fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+ fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
"$.represented_profile.friendship_status");
- fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+ fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
"$.structured_name.text");
- fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+ fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
"$.hugePictureUrl.uri");
fb_json_values_set_array(values, FALSE, "$.viewer.messenger_contacts"
".nodes");
@@ -2061,8 +2080,8 @@
uid = FB_ID_FROM_STR(str);
str = fb_json_values_next_str(values, NULL);
- if (!purple_strequal(str, "ARE_FRIENDS") &&
- (uid != priv->uid))
+ if ((!purple_strequal(str, "ARE_FRIENDS") &&
+ (uid != priv->uid)) || (uid == 0))
{
continue;
}
@@ -2072,14 +2091,7 @@
user->name = fb_json_values_next_str_dup(values, NULL);
user->icon = fb_json_values_next_str_dup(values, NULL);
- prms = fb_http_params_new_parse(user->icon, TRUE);
- user->csum = fb_http_params_dup_str(prms, "oh", NULL);
- fb_http_params_free(prms);
-
- if (G_UNLIKELY(user->csum == NULL)) {
- /* Revert to the icon URL as the unique checksum */
- user->csum = g_strdup(user->icon);
- }
+ user->csum = fb_api_user_icon_checksum(user->icon);
users = g_slist_prepend(users, user);
}
@@ -2174,6 +2186,7 @@
JsonBuilder *bldr;
mid = FB_API_MSGID(g_get_real_time() / 1000, g_random_int());
+ priv->lastmid = mid;
if (msg->tid != 0) {
tpfx = "tfbid_";
--- a/libpurple/protocols/facebook/api.h Tue Oct 25 19:48:55 2016 +0000
+++ b/libpurple/protocols/facebook/api.h Tue Nov 01 02:10:27 2016 +0000
@@ -350,6 +350,7 @@
* @FB_API_ERROR_GENERAL: General failure.
* @FB_API_ERROR_AUTH: Authentication failure.
* @FB_API_ERROR_QUEUE: Queue failure.
+ * @FB_API_ERROR_NONFATAL: Other non-fatal errors.
*
* The error codes for the #FB_API_ERROR domain.
*/
@@ -357,7 +358,8 @@
{
FB_API_ERROR_GENERAL,
FB_API_ERROR_AUTH,
- FB_API_ERROR_QUEUE
+ FB_API_ERROR_QUEUE,
+ FB_API_ERROR_NONFATAL
} FbApiError;
/**
--- a/libpurple/protocols/facebook/facebook.c Tue Oct 25 19:48:55 2016 +0000
+++ b/libpurple/protocols/facebook/facebook.c Tue Nov 01 02:10:27 2016 +0000
@@ -353,7 +353,10 @@
errc = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
}
- purple_connection_error(gc, errc, error->message);
+
+ if (!g_error_matches(error, FB_API_ERROR, FB_API_ERROR_NONFATAL)) {
+ purple_connection_error(gc, errc, error->message);
+ }
}
static void
--- a/libpurple/protocols/facebook/http.c Tue Oct 25 19:48:55 2016 +0000
+++ b/libpurple/protocols/facebook/http.c Tue Nov 01 02:10:27 2016 +0000
@@ -396,6 +396,10 @@
return url1 == url2;
}
+ if (strstr(url1, url2) != NULL || strstr(url2, url1) != NULL) {
+ return TRUE;
+ }
+
purl1 = purple_http_url_parse(url1);
if (purl1 == NULL) {