From: Xavier Claessens Date: Wed, 18 Jul 2012 11:50:46 +0000 (+0200) Subject: Implement Google X-OAUTH2 SASL mechanism X-Git-Url: https://git.0d.be/?p=empathy.git;a=commitdiff_plain;h=b98648af1d450203cd1a59ac45155e93f2216b19 Implement Google X-OAUTH2 SASL mechanism https://bugzilla.gnome.org/show_bug.cgi?id=680160 --- diff --git a/libempathy/empathy-sasl-mechanisms.c b/libempathy/empathy-sasl-mechanisms.c index 5bdc7590..78bb59b1 100644 --- a/libempathy/empathy-sasl-mechanisms.c +++ b/libempathy/empathy-sasl-mechanisms.c @@ -30,6 +30,7 @@ #define MECH_FACEBOOK "X-FACEBOOK-PLATFORM" #define MECH_WLM "X-MESSENGER-OAUTH2" +#define MECH_GOOGLE "X-OAUTH2" typedef struct { @@ -40,6 +41,7 @@ typedef struct static SupportedMech supported_mechanisms[] = { { EMPATHY_SASL_MECHANISM_FACEBOOK, MECH_FACEBOOK }, { EMPATHY_SASL_MECHANISM_WLM, MECH_WLM }, + { EMPATHY_SASL_MECHANISM_GOOGLE, MECH_GOOGLE }, }; static void @@ -254,6 +256,42 @@ empathy_sasl_auth_wlm_async (TpChannel *channel, g_object_unref (result); } +void +empathy_sasl_auth_google_async (TpChannel *channel, + const gchar *username, + const gchar *access_token, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; + GArray *credential; + + result = empathy_sasl_auth_common_async (channel, callback, user_data); + + g_return_if_fail (result != NULL); + g_return_if_fail (empathy_sasl_channel_supports_mechanism (channel, + MECH_GOOGLE)); + g_return_if_fail (!tp_str_empty (username)); + g_return_if_fail (!tp_str_empty (access_token)); + + DEBUG ("Start %s mechanism", MECH_GOOGLE); + + credential = g_array_sized_new (FALSE, FALSE, sizeof (gchar), + strlen (access_token) + strlen (username) + 2); + + g_array_append_val (credential, "\0"); + g_array_append_vals (credential, username, strlen (username)); + g_array_append_val (credential, "\0"); + g_array_append_vals (credential, access_token, strlen (access_token)); + + tp_cli_channel_interface_sasl_authentication_call_start_mechanism_with_data ( + channel, -1, MECH_GOOGLE, credential, + generic_cb, g_object_ref (result), g_object_unref, NULL); + + g_array_unref (credential); + g_object_unref (result); +} + gboolean empathy_sasl_auth_finish (TpChannel *channel, GAsyncResult *result, diff --git a/libempathy/empathy-sasl-mechanisms.h b/libempathy/empathy-sasl-mechanisms.h index 84165ac7..f0ac1234 100644 --- a/libempathy/empathy-sasl-mechanisms.h +++ b/libempathy/empathy-sasl-mechanisms.h @@ -30,6 +30,7 @@ typedef enum EMPATHY_SASL_MECHANISM_UNSUPPORTED, EMPATHY_SASL_MECHANISM_FACEBOOK, EMPATHY_SASL_MECHANISM_WLM, + EMPATHY_SASL_MECHANISM_GOOGLE, } EmpathySaslMechanism; void empathy_sasl_auth_facebook_async (TpChannel *channel, @@ -43,6 +44,12 @@ void empathy_sasl_auth_wlm_async (TpChannel *channel, GAsyncReadyCallback callback, gpointer user_data); +void empathy_sasl_auth_google_async (TpChannel *channel, + const gchar *username, + const gchar *access_token, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean empathy_sasl_auth_finish (TpChannel *channel, GAsyncResult *result, GError **error);