/soc/2015/jgeboski/facebook: 14857ad5b6b7: facebook: fixed URL c...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 14857ad5b6b7c06fa8fa99ac86812ef16bf2f924
Author:	 James Geboski <[email protected]>
Date:	 2015-08-17 23:15 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/14857ad5b6b7

Description:

facebook: fixed URL comparisons being overly strict

diffstat:

 libpurple/protocols/facebook/api.c  |  52 +++++++++++++----------------
 libpurple/protocols/facebook/http.c |  64 +++++++++++++++++++++++++++++++++++++
 libpurple/protocols/facebook/http.h |  15 ++++++++
 3 files changed, 103 insertions(+), 28 deletions(-)

diffs (205 lines):

diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -1166,14 +1166,14 @@ fb_api_cb_publish_typing(FbApi *api, GBy
 	json_node_free(root);
 }
 
-static gchar *
-fb_api_message_parse_xma(FbApi *api, JsonNode *root, GError **error)
+static gboolean
+fb_api_xma_parse(FbApi *api, FbApiMessage *msg, const gchar *body,
+                 JsonNode *root, GError **error)
 {
 	const gchar *str;
 	const gchar *url;
 	FbHttpParams *params;
 	FbJsonValues *values;
-	gchar *ret;
 	GError *err = NULL;
 
 	values = fb_json_values_new(root);
@@ -1186,7 +1186,7 @@ fb_api_message_parse_xma(FbApi *api, Jso
 	if (G_UNLIKELY(err != NULL)) {
 		g_propagate_error(error, err);
 		fb_json_values_free(values);
-		return NULL;
+		return FALSE;
 	}
 
 	str = fb_json_values_next_str(values, NULL);
@@ -1194,14 +1194,20 @@ fb_api_message_parse_xma(FbApi *api, Jso
 
 	if (purple_strequal(str, "ExternalUrl")) {
 		params = fb_http_params_new_parse(url, TRUE);
-		ret = fb_http_params_dup_str(params, "u", NULL);
+		msg->text = fb_http_params_dup_str(params, "u", NULL);
 		fb_http_params_free(params);
 	} else {
-		ret = g_strdup(url);
+		msg->text = g_strdup(url);
 	}
 
+	if (fb_http_urlcmp(body, msg->text, FALSE)) {
+		g_free(msg->text);
+		fb_json_values_free(values);
+		return FALSE;
+	}
+
 	fb_json_values_free(values);
-	return ret;
+	return TRUE;
 }
 
 static GSList *
@@ -1242,22 +1248,18 @@ fb_api_message_parse_attach(FbApi *api, 
 			}
 
 			xode = fb_json_node_get_nth(node, 0);
-			msg->text = fb_api_message_parse_xma(api, xode, &err);
+
+			if (fb_api_xma_parse(api, msg, body, xode, &err)) {
+				mptr = fb_api_message_dup(msg, FALSE);
+				msgs = g_slist_prepend(msgs, mptr);
+			}
+
 			json_node_free(node);
 
 			if (G_UNLIKELY(err != NULL)) {
 				break;
 			}
 
-			if (purple_strequal(msg->text, body)) {
-				g_free(msg->text);
-				continue;
-			}
-
-			if (G_LIKELY(msg->text != NULL)) {
-				mptr = fb_api_message_dup(msg, FALSE);
-				msgs = g_slist_prepend(msgs, mptr);
-			}
 			continue;
 		}
 
@@ -2184,22 +2186,16 @@ fb_api_cb_unread_msgs(PurpleHttpConnecti
 		xode = fb_json_node_get(node, "$.extensible_attachment", NULL);
 
 		if (xode != NULL) {
-			msg.text = fb_api_message_parse_xma(api, xode, &err);
+			if (fb_api_xma_parse(api, &msg, body, xode, &err)) {
+				mptr = fb_api_message_dup(&msg, FALSE);
+				msgs = g_slist_prepend(msgs, mptr);
+			}
+
 			json_node_free(xode);
 
 			if (G_UNLIKELY(err != NULL)) {
 				break;
 			}
-
-			if (purple_strequal(msg.text, body)) {
-				g_free(msg.text);
-				continue;
-			}
-
-			if (msg.text != NULL) {
-				mptr = fb_api_message_dup(&msg, FALSE);
-				msgs = g_slist_prepend(msgs, mptr);
-			}
 		}
 
 		msgs = fb_api_cb_unread_parse_attach(api, &msg, msgs, node,
diff --git a/libpurple/protocols/facebook/http.c b/libpurple/protocols/facebook/http.c
--- a/libpurple/protocols/facebook/http.c
+++ b/libpurple/protocols/facebook/http.c
@@ -294,3 +294,67 @@ fb_http_params_set_strf(FbHttpParams *pa
 
 	fb_http_params_set(params, name, val);
 }
+
+gboolean
+fb_http_urlcmp(const gchar *url1, const gchar *url2, gboolean protocol)
+{
+	const gchar *str1;
+	const gchar *str2;
+	gboolean ret = TRUE;
+	gint int1;
+	gint int2;
+	guint i;
+	PurpleHttpURL *purl1;
+	PurpleHttpURL *purl2;
+
+	static const const gchar * (*funcs[]) (const PurpleHttpURL *url) = {
+		/* Always first so it can be skipped */
+		purple_http_url_get_protocol,
+
+		purple_http_url_get_fragment,
+		purple_http_url_get_host,
+		purple_http_url_get_password,
+		purple_http_url_get_path,
+		purple_http_url_get_username
+	};
+
+	if ((url1 == NULL) || (url2 == NULL)) {
+		return url1 == url2;
+	}
+
+	purl1 = purple_http_url_parse(url1);
+
+	if (purl1 == NULL) {
+		return g_ascii_strcasecmp(url1, url2) == 0;
+	}
+
+	purl2 = purple_http_url_parse(url2);
+
+	if (purl2 == NULL) {
+		purple_http_url_free(purl1);
+		return g_ascii_strcasecmp(url1, url2) == 0;
+	}
+
+	for (i = protocol ? 0 : 1; i < G_N_ELEMENTS(funcs); i++) {
+		str1 = funcs[i](purl1);
+		str2 = funcs[i](purl2);
+
+		if (!purple_strequal(str1, str2)) {
+			ret = FALSE;
+			break;
+		}
+	}
+
+	if (ret && protocol) {
+		int1 = purple_http_url_get_port(purl1);
+		int2 = purple_http_url_get_port(purl2);
+
+		if (int1 != int2) {
+			ret = FALSE;
+		}
+	}
+
+	purple_http_url_free(purl1);
+	purple_http_url_free(purl2);
+	return ret;
+}
diff --git a/libpurple/protocols/facebook/http.h b/libpurple/protocols/facebook/http.h
--- a/libpurple/protocols/facebook/http.h
+++ b/libpurple/protocols/facebook/http.h
@@ -274,4 +274,19 @@ fb_http_params_set_strf(FbHttpParams *pa
                         const gchar *format, ...)
                         G_GNUC_PRINTF(3, 4);
 
+/**
+ * fb_http_urlcmp:
+ * @url1: The first URL.
+ * @url2: The second URL.
+ * @protocol: #TRUE to match the protocols, otherwise #FALSE.
+ *
+ * Compares two URLs. This is more reliable than just comparing two URL
+ * strings, as it avoids casing in some areas, while not in others. It
+ * can also, optionally, ignore the matching of the URL protocol.
+ *
+ * Returns: #TRUE if the URLs match, otherwise #FALSE.
+ */
+gboolean
+fb_http_urlcmp(const gchar *url1, const gchar *url2, gboolean protocol);
+
 #endif /* _FACEBOOK_HTTP_H_ */

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.