--- a/libpurple/protocols/facebook/api.c Sun Jul 26 16:51:03 2015 -0400
+++ b/libpurple/protocols/facebook/api.c Mon Jul 27 16:43:41 2015 -0400
@@ -306,13 +306,24 @@
fb_api_json_chk(FbApi *api, gconstpointer data, gsize size, JsonNode **node)
+ FbApiError errc = FB_API_ERROR_GENERAL; - gboolean success = FALSE;
+ gboolean success = TRUE; + static const gchar *exprs[] = { + "$.failedSend.errorMessage", g_return_val_if_fail(FB_IS_API(api), FALSE);
@@ -325,37 +336,71 @@
root = fb_json_node_new(data, size, &err);
FB_API_ERROR_CHK(api, err, return FALSE);
- if (fb_json_node_chk_str(root, "$.error.summary", &msg) ||
- fb_json_node_chk_str(root, "$.failedSend.errorMessage", &msg))
+ if (fb_json_node_chk_int(root, "$.error_code", &code) && - fb_api_error(api, FB_API_ERROR_GENERAL, "%s", msg);
- } else if (fb_json_node_chk_int(root, "$.error_code", &code)) {
- if (!fb_json_node_chk_str(root, "$.error_msg", &msg)) {
- msg = g_strdup(_("Generic error"));
+ errc = FB_API_ERROR_AUTH; - fb_api_error(api, FB_API_ERROR_GENERAL, "%s", msg);
- } else if (fb_json_node_chk_str(root, "$.errorCode", &msg)) {
- if ((g_ascii_strcasecmp(msg, "ERROR_QUEUE_NOT_FOUND") == 0) ||
- (g_ascii_strcasecmp(msg, "ERROR_QUEUE_LOST") == 0))
+ if (fb_json_node_chk_str(root, "$.error.type", &str) && + (g_ascii_strcasecmp(str, "OAuthException") == 0)) + errc = FB_API_ERROR_AUTH; - fb_api_error(api, FB_API_ERROR_GENERAL, "%s", msg);
- if (success && (node != NULL)) {
+ if (fb_json_node_chk_str(root, "$.errorCode", &str) && ( + (g_ascii_strcasecmp(str, "ERROR_QUEUE_NOT_FOUND") == 0) || + (g_ascii_strcasecmp(str, "ERROR_QUEUE_LOST") == 0))) + errc = FB_API_ERROR_AUTH; + for (i = 0; i < G_N_ELEMENTS(exprs); i++) { + if (fb_json_node_chk_str(root, exprs[i], &msg)) { + if (!success && (msg == NULL)) { + msg = g_strdup(_("Unknown error")); + fb_api_error(api, errc, "%s", msg);
@@ -388,11 +433,21 @@
- if (!fb_http_error_chk(res, &err)) {
+ if ((root == NULL) && fb_http_error_chk(res, &err)) { + /* Rudimentary check to prevent wrongful error parsing */ + if ((size < 2) || (data[0] != '{') || (data[size - 1] != '}')) { FB_API_ERROR_CHK(api, err, return FALSE);
- return (root == NULL) || fb_api_json_chk(api, data, size, root);
+ if (fb_api_json_chk(api, data, size, root)) { + FB_API_ERROR_CHK(api, err, return FALSE); static PurpleHttpConnection *
--- a/libpurple/protocols/facebook/api.h Sun Jul 26 16:51:03 2015 -0400
+++ b/libpurple/protocols/facebook/api.h Mon Jul 27 16:43:41 2015 -0400
@@ -87,7 +87,8 @@
--- a/libpurple/protocols/facebook/facebook.c Sun Jul 26 16:51:03 2015 -0400
+++ b/libpurple/protocols/facebook/facebook.c Mon Jul 27 16:43:41 2015 -0400
@@ -170,23 +170,22 @@
fb_cb_api_error(FbApi *api, GError *error, gpointer data)
- PurpleConnectionError reason;
+ PurpleConnectionError errc;
- nfatal = (error->domain == FB_API_ERROR) ||
- (error->domain == FB_MQTT_ERROR);
- /* Non-fatal HTTP errors */
- nfatal |= (error->domain == FB_HTTP_ERROR) &&
- ((error->code < 400) || (error->code > 500));
- reason = (nfatal) ? PURPLE_CONNECTION_ERROR_NETWORK_ERROR
- : PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+ if ((error->domain == FB_HTTP_ERROR) && + (error->code >= 400) && + errc = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + } else if (g_error_matches(error, FB_API_ERROR, FB_API_ERROR_AUTH)) { + errc = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + errc = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; gc = fb_data_get_connection(fata);
- purple_connection_error(gc, reason, error->message);
+ purple_connection_error(gc, errc, error->message);