diff options
Diffstat (limited to 'libemail-engine/camel-sasl-xoauth2.c')
-rw-r--r-- | libemail-engine/camel-sasl-xoauth2.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/libemail-engine/camel-sasl-xoauth2.c b/libemail-engine/camel-sasl-xoauth2.c new file mode 100644 index 0000000000..3cf43e7393 --- /dev/null +++ b/libemail-engine/camel-sasl-xoauth2.c @@ -0,0 +1,131 @@ +/* + * camel-sasl-xoauth2.c + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + */ + +#include <config.h> +#include <glib/gi18n-lib.h> + +#include "camel-sasl-xoauth2.h" + +#include <libemail-engine/e-mail-session.h> + +static CamelServiceAuthType sasl_xoauth2_auth_type = { + N_("OAuth2"), + N_("This option will use an OAuth 2.0 " + "access token to connect to the server"), + "XOAUTH2", + FALSE +}; + +G_DEFINE_TYPE (CamelSaslXOAuth2, camel_sasl_xoauth2, CAMEL_TYPE_SASL) + +static void +sasl_xoauth2_append_request (GByteArray *byte_array, + const gchar *user, + const gchar *access_token) +{ + GString *request; + + g_return_if_fail (user != NULL); + g_return_if_fail (access_token != NULL); + + /* Compared to OAuth 1.0, this step is trivial. */ + + /* The request is easier to assemble with a GString. */ + request = g_string_sized_new (512); + + g_string_append (request, "user="); + g_string_append (request, user); + g_string_append_c (request, 1); + g_string_append (request, "auth=Bearer "); + g_string_append (request, access_token); + g_string_append_c (request, 1); + g_string_append_c (request, 1); + + /* Copy the GString content to the GByteArray. */ + g_byte_array_append ( + byte_array, (guint8 *) request->str, request->len); + + g_string_free (request, TRUE); +} + +static GByteArray * +sasl_xoauth2_challenge_sync (CamelSasl *sasl, + GByteArray *token, + GCancellable *cancellable, + GError **error) +{ + GByteArray *byte_array = NULL; + CamelService *service; + CamelSession *session; + CamelSettings *settings; + ESourceRegistry *registry; + ESource *source; + const gchar *uid; + gchar *access_token = NULL; + gboolean success; + + service = camel_sasl_get_service (sasl); + session = camel_service_get_session (service); + settings = camel_service_ref_settings (service); + + uid = camel_service_get_uid (service); + registry = e_mail_session_get_registry (E_MAIL_SESSION (session)); + source = e_source_registry_ref_source (registry, uid); + g_return_val_if_fail (source != NULL, NULL); + + success = e_source_get_oauth2_access_token_sync ( + source, cancellable, &access_token, NULL, error); + + if (success) { + CamelNetworkSettings *network_settings; + gchar *user; + + network_settings = CAMEL_NETWORK_SETTINGS (settings); + user = camel_network_settings_dup_user (network_settings); + + byte_array = g_byte_array_new (); + sasl_xoauth2_append_request (byte_array, user, access_token); + + g_free (user); + } + + g_free (access_token); + + g_object_unref (source); + g_object_unref (settings); + + /* IMAP and SMTP services will Base64-encode the request. */ + + return byte_array; +} + +static void +camel_sasl_xoauth2_class_init (CamelSaslXOAuth2Class *class) +{ + CamelSaslClass *sasl_class; + + sasl_class = CAMEL_SASL_CLASS (class); + sasl_class->auth_type = &sasl_xoauth2_auth_type; + sasl_class->challenge_sync = sasl_xoauth2_challenge_sync; +} + +static void +camel_sasl_xoauth2_init (CamelSaslXOAuth2 *sasl) +{ +} + |