summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.co.uk>2013-10-31 13:39:21 -0400
committerXavier Claessens <xavier.claessens@collabora.co.uk>2013-10-31 13:58:05 -0400
commit25cc10d3f586b7a1d4fc3f795c3957ec06e5bf37 (patch)
tree5805a49dc5d9a629c7f5d1787fc2a6fe35415f45
parentd922659a8312ba718f6a70ad7b78e2d92d14a370 (diff)
SASL: fix facebook mechanism
libsoup was escaping '_' and '.' in the challenge response but the facebook server is not expecting that. https://bugzilla.gnome.org/show_bug.cgi?id=707747
-rw-r--r--libempathy/empathy-sasl-mechanisms.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/libempathy/empathy-sasl-mechanisms.c b/libempathy/empathy-sasl-mechanisms.c
index 303bf9e3..790c7592 100644
--- a/libempathy/empathy-sasl-mechanisms.c
+++ b/libempathy/empathy-sasl-mechanisms.c
@@ -154,8 +154,7 @@ facebook_new_challenge_cb (TpChannel *channel,
GSimpleAsyncResult *result = user_data;
FacebookData *data;
GHashTable *h;
- GHashTable *params;
- gchar *response;
+ GString *response_string;
GArray *response_array;
DEBUG ("new challenge: %s", challenge->data);
@@ -164,27 +163,29 @@ facebook_new_challenge_cb (TpChannel *channel,
h = soup_form_decode (challenge->data);
- /* See https://developers.facebook.com/docs/chat/#platauth */
- params = g_hash_table_new (g_str_hash, g_str_equal);
- g_hash_table_insert (params, "method", g_hash_table_lookup (h, "method"));
- g_hash_table_insert (params, "nonce", g_hash_table_lookup (h, "nonce"));
- g_hash_table_insert (params, "access_token", data->access_token);
- g_hash_table_insert (params, "api_key", data->client_id);
- g_hash_table_insert (params, "call_id", "0");
- g_hash_table_insert (params, "v", "1.0");
-
- response = soup_form_encode_hash (params);
- DEBUG ("Response: %s", response);
+ /* See https://developers.facebook.com/docs/chat/#platauth.
+ * We don't use soup_form_encode() here because it would escape parameters
+ * and facebook server is not expecting that and would reject the response. */
+ response_string = g_string_new ("v=1.0&call_id=0");
+ g_string_append (response_string, "&access_token=");
+ g_string_append_uri_escaped (response_string, data->access_token, NULL, TRUE);
+ g_string_append (response_string, "&api_key=");
+ g_string_append_uri_escaped (response_string, data->client_id, NULL, TRUE);
+ g_string_append (response_string, "&method=");
+ g_string_append_uri_escaped (response_string, g_hash_table_lookup (h, "method"), NULL, TRUE);
+ g_string_append (response_string, "&nonce=");
+ g_string_append_uri_escaped (response_string, g_hash_table_lookup (h, "nonce"), NULL, TRUE);
+
+ DEBUG ("Response: %s", response_string->str);
response_array = g_array_new (FALSE, FALSE, sizeof (gchar));
- g_array_append_vals (response_array, response, strlen (response));
+ g_array_append_vals (response_array, response_string->str, response_string->len);
tp_cli_channel_interface_sasl_authentication_call_respond (data->channel, -1,
response_array, generic_cb, g_object_ref (result), g_object_unref, NULL);
g_hash_table_unref (h);
- g_hash_table_unref (params);
- g_free (response);
+ g_string_free (response_string, TRUE);
g_array_unref (response_array);
}