diff options
Diffstat (limited to 'libemail-engine/e-mail-authenticator.c')
-rw-r--r-- | libemail-engine/e-mail-authenticator.c | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/libemail-engine/e-mail-authenticator.c b/libemail-engine/e-mail-authenticator.c new file mode 100644 index 0000000000..9729d35e1f --- /dev/null +++ b/libemail-engine/e-mail-authenticator.c @@ -0,0 +1,267 @@ +/* + * e-mail-authenticator.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 "e-mail-authenticator.h" + +#include <config.h> +#include <glib/gi18n-lib.h> + +#define E_MAIL_AUTHENTICATOR_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MAIL_AUTHENTICATOR, EMailAuthenticatorPrivate)) + +struct _EMailAuthenticatorPrivate { + CamelService *service; + gchar *mechanism; +}; + +enum { + PROP_0, + PROP_MECHANISM, + PROP_SERVICE +}; + +/* Forward Declarations */ +static void e_mail_authenticator_interface_init + (ESourceAuthenticatorInterface *interface); + +G_DEFINE_TYPE_WITH_CODE ( + EMailAuthenticator, + e_mail_authenticator, + G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE ( + E_TYPE_SOURCE_AUTHENTICATOR, + e_mail_authenticator_interface_init)) + +static void +mail_authenticator_set_mechanism (EMailAuthenticator *auth, + const gchar *mechanism) +{ + g_return_if_fail (auth->priv->mechanism == NULL); + + auth->priv->mechanism = g_strdup (mechanism); +} + +static void +mail_authenticator_set_service (EMailAuthenticator *auth, + CamelService *service) +{ + g_return_if_fail (CAMEL_IS_SERVICE (service)); + g_return_if_fail (auth->priv->service == NULL); + + auth->priv->service = g_object_ref (service); +} + +static void +mail_authenticator_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_MECHANISM: + mail_authenticator_set_mechanism ( + E_MAIL_AUTHENTICATOR (object), + g_value_get_string (value)); + return; + + case PROP_SERVICE: + mail_authenticator_set_service ( + E_MAIL_AUTHENTICATOR (object), + g_value_get_object (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +mail_authenticator_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_MECHANISM: + g_value_set_string ( + value, + e_mail_authenticator_get_mechanism ( + E_MAIL_AUTHENTICATOR (object))); + return; + + case PROP_SERVICE: + g_value_set_object ( + value, + e_mail_authenticator_get_service ( + E_MAIL_AUTHENTICATOR (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +mail_authenticator_dispose (GObject *object) +{ + EMailAuthenticatorPrivate *priv; + + priv = E_MAIL_AUTHENTICATOR_GET_PRIVATE (object); + + if (priv->service != NULL) { + g_object_unref (priv->service); + priv->service = NULL; + } + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_mail_authenticator_parent_class)->dispose (object); +} + +static void +mail_authenticator_finalize (GObject *object) +{ + EMailAuthenticatorPrivate *priv; + + priv = E_MAIL_AUTHENTICATOR_GET_PRIVATE (object); + + g_free (priv->mechanism); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (e_mail_authenticator_parent_class)->finalize (object); +} + +static ESourceAuthenticationResult +mail_authenticator_try_password_sync (ESourceAuthenticator *auth, + const GString *password, + GCancellable *cancellable, + GError **error) +{ + CamelService *service; + EMailAuthenticator *mail_auth; + CamelAuthenticationResult camel_result; + ESourceAuthenticationResult source_result; + const gchar *mechanism; + + mail_auth = E_MAIL_AUTHENTICATOR (auth); + service = e_mail_authenticator_get_service (mail_auth); + mechanism = e_mail_authenticator_get_mechanism (mail_auth); + + camel_service_set_password (service, password->str); + + camel_result = camel_service_authenticate_sync ( + service, mechanism, cancellable, error); + + switch (camel_result) { + case CAMEL_AUTHENTICATION_ERROR: + source_result = E_SOURCE_AUTHENTICATION_ERROR; + break; + case CAMEL_AUTHENTICATION_ACCEPTED: + source_result = E_SOURCE_AUTHENTICATION_ACCEPTED; + break; + case CAMEL_AUTHENTICATION_REJECTED: + source_result = E_SOURCE_AUTHENTICATION_REJECTED; + break; + default: + g_set_error ( + error, CAMEL_SERVICE_ERROR, + CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, + _("Invalid authentication result code (%d)"), + camel_result); + source_result = E_SOURCE_AUTHENTICATION_ERROR; + break; + } + + return source_result; +} + +static void +e_mail_authenticator_class_init (EMailAuthenticatorClass *class) +{ + GObjectClass *object_class; + + g_type_class_add_private (class, sizeof (EMailAuthenticatorPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = mail_authenticator_set_property; + object_class->get_property = mail_authenticator_get_property; + object_class->dispose = mail_authenticator_dispose; + object_class->finalize = mail_authenticator_finalize; + + g_object_class_install_property ( + object_class, + PROP_MECHANISM, + g_param_spec_string ( + "mechanism", + "Mechanism", + "Authentication mechanism", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property ( + object_class, + PROP_SERVICE, + g_param_spec_object ( + "service", + "Service", + "The CamelService to authenticate", + CAMEL_TYPE_SERVICE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +e_mail_authenticator_interface_init (ESourceAuthenticatorInterface *interface) +{ + interface->try_password_sync = mail_authenticator_try_password_sync; +} + +static void +e_mail_authenticator_init (EMailAuthenticator *auth) +{ + auth->priv = E_MAIL_AUTHENTICATOR_GET_PRIVATE (auth); +} + +ESourceAuthenticator * +e_mail_authenticator_new (CamelService *service, + const gchar *mechanism) +{ + g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL); + + return g_object_new ( + E_TYPE_MAIL_AUTHENTICATOR, + "service", service, "mechanism", mechanism, NULL); +} + +CamelService * +e_mail_authenticator_get_service (EMailAuthenticator *auth) +{ + g_return_val_if_fail (E_IS_MAIL_AUTHENTICATOR (auth), NULL); + + return auth->priv->service; +} + +const gchar * +e_mail_authenticator_get_mechanism (EMailAuthenticator *auth) +{ + g_return_val_if_fail (E_IS_MAIL_AUTHENTICATOR (auth), NULL); + + return auth->priv->mechanism; +} + |