[evolution-data-server] I#178 - Implement RFC 6856 - POP3 support for UTF-8



commit 4bf02eb3a4509a471298a7ecd69c074218fcb720
Author: Milan Crha <mcrha redhat com>
Date:   Tue Feb 4 10:38:28 2020 +0100

    I#178 - Implement RFC 6856 - POP3 support for UTF-8
    
    Closes https://gitlab.gnome.org/GNOME/evolution-data-server/issues/178

 src/camel/providers/pop3/camel-pop3-engine.c   | 16 ++++++
 src/camel/providers/pop3/camel-pop3-engine.h   |  4 +-
 src/camel/providers/pop3/camel-pop3-provider.c |  2 +
 src/camel/providers/pop3/camel-pop3-settings.c | 67 ++++++++++++++++++++++++++
 src/camel/providers/pop3/camel-pop3-settings.h |  5 ++
 src/camel/providers/pop3/camel-pop3-store.c    | 20 ++++++++
 6 files changed, 113 insertions(+), 1 deletion(-)
---
diff --git a/src/camel/providers/pop3/camel-pop3-engine.c b/src/camel/providers/pop3/camel-pop3-engine.c
index 7ac7b84d3..798d94180 100644
--- a/src/camel/providers/pop3/camel-pop3-engine.c
+++ b/src/camel/providers/pop3/camel-pop3-engine.c
@@ -183,6 +183,7 @@ static struct {
        { "APOP" , CAMEL_POP3_CAP_APOP },
        { "TOP" , CAMEL_POP3_CAP_TOP },
        { "UIDL", CAMEL_POP3_CAP_UIDL },
+       { "UTF8", CAMEL_POP3_CAP_UTF8 },
        { "PIPELINING", CAMEL_POP3_CAP_PIPE },
        { "STLS", CAMEL_POP3_CAP_STLS },  /* STARTTLS */
 };
@@ -223,6 +224,21 @@ cmd_capa (CamelPOP3Engine *pe,
                                        }
                                        tok = next;
                                }
+                       } else if (strncmp ((const gchar *) line, "UTF8", 4) == 0 && (!line[4] || line[4] == 
' ')) {
+                               pe->capa |= CAMEL_POP3_CAP_UTF8;
+                               tok = line + 4 + (line[4] ? 1 : 0);
+                               dd (printf ("scanning tokens '%s'\n", tok));
+                               while (tok) {
+                                       next = (guchar *) strchr ((gchar *) tok, ' ');
+                                       if (next)
+                                               *next++ = 0;
+                                       if (!strcmp ((const gchar *) tok, "USER")) {
+                                               pe->capa |= CAMEL_POP3_CAP_UTF8_USER;
+                                       } else {
+                                               dd (printf ("unsupported UTF8 capability argument type 
'%s'\n", tok));
+                                       }
+                                       tok = next;
+                               }
                        } else {
                                for (i = 0; i < G_N_ELEMENTS (capa); i++) {
                                        if (strcmp ((gchar *) capa[i].cap, (gchar *) line) == 0)
diff --git a/src/camel/providers/pop3/camel-pop3-engine.h b/src/camel/providers/pop3/camel-pop3-engine.h
index 768fd6fc0..973387330 100644
--- a/src/camel/providers/pop3/camel-pop3-engine.h
+++ b/src/camel/providers/pop3/camel-pop3-engine.h
@@ -81,7 +81,9 @@ enum {
        CAMEL_POP3_CAP_SASL = 1 << 2,
        CAMEL_POP3_CAP_TOP = 1 << 3,
        CAMEL_POP3_CAP_PIPE = 1 << 4,
-       CAMEL_POP3_CAP_STLS = 1 << 5
+       CAMEL_POP3_CAP_STLS = 1 << 5,
+       CAMEL_POP3_CAP_UTF8 = 1 << 6,
+       CAMEL_POP3_CAP_UTF8_USER = 1 << 7
 };
 
 /* enable/disable flags for the engine itself */
diff --git a/src/camel/providers/pop3/camel-pop3-provider.c b/src/camel/providers/pop3/camel-pop3-provider.c
index 38079a431..d2f585983 100644
--- a/src/camel/providers/pop3/camel-pop3-provider.c
+++ b/src/camel/providers/pop3/camel-pop3-provider.c
@@ -44,6 +44,8 @@ static CamelProviderConfEntry pop3_conf_entries[] = {
          N_("Delete _expunged from local Inbox"), "0" },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "disable-extensions", NULL,
          N_("Disable _support for all POP3 extensions"), "0" },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "enable-utf8", "!disable-extensions",
+         N_("Enable _UTF-8 extension, when the server supports it"), "1" },
        { CAMEL_PROVIDER_CONF_SECTION_END },
        { CAMEL_PROVIDER_CONF_END }
 };
diff --git a/src/camel/providers/pop3/camel-pop3-settings.c b/src/camel/providers/pop3/camel-pop3-settings.c
index b598b95aa..c019bbb51 100644
--- a/src/camel/providers/pop3/camel-pop3-settings.c
+++ b/src/camel/providers/pop3/camel-pop3-settings.c
@@ -23,6 +23,7 @@ struct _CamelPOP3SettingsPrivate {
        gboolean disable_extensions;
        gboolean keep_on_server;
        gboolean auto_fetch;
+       gboolean enable_utf8;
        guint32 last_cache_expunge;
 };
 
@@ -38,6 +39,7 @@ enum {
        PROP_SECURITY_METHOD,
        PROP_USER,
        PROP_AUTO_FETCH,
+       PROP_ENABLE_UTF8,
        PROP_LAST_CACHE_EXPUNGE
 };
 
@@ -121,6 +123,12 @@ pop3_settings_set_property (GObject *object,
                                CAMEL_POP3_SETTINGS (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_ENABLE_UTF8:
+                       camel_pop3_settings_set_enable_utf8  (
+                               CAMEL_POP3_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -209,6 +217,13 @@ pop3_settings_get_property (GObject *object,
                                camel_pop3_settings_get_auto_fetch (
                                CAMEL_POP3_SETTINGS (object)));
                        return;
+
+               case PROP_ENABLE_UTF8:
+                       g_value_set_boolean (
+                               value,
+                               camel_pop3_settings_get_enable_utf8 (
+                               CAMEL_POP3_SETTINGS (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -319,6 +334,19 @@ camel_pop3_settings_class_init (CamelPOP3SettingsClass *class)
                        G_PARAM_EXPLICIT_NOTIFY |
                        G_PARAM_STATIC_STRINGS));
 
+       g_object_class_install_property (
+               object_class,
+               PROP_ENABLE_UTF8,
+               g_param_spec_boolean (
+                       "enable-utf8",
+                       "Enable UTF8",
+                       "Whether can use UTF-8 extension, when the server supports it",
+                       TRUE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       G_PARAM_STATIC_STRINGS));
+
        /* Inherited from CamelNetworkSettings. */
        g_object_class_override_property (
                object_class,
@@ -592,3 +620,42 @@ camel_pop3_settings_set_last_cache_expunge (CamelPOP3Settings *settings,
 
        g_object_notify (G_OBJECT (settings), "last-cache-expunge");
 }
+
+/**
+ * camel_pop3_settings_get_enable_utf8:
+ * @settings: a #CamelPOP3Settings
+ *
+ * Returns: Whether can use UTF-8 extension, when the server supports it
+ *
+ * Since: 3.36
+ **/
+gboolean
+camel_pop3_settings_get_enable_utf8 (CamelPOP3Settings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_POP3_SETTINGS (settings), FALSE);
+
+       return settings->priv->enable_utf8;
+}
+
+/**
+ * camel_pop3_settings_set_enable_utf8:
+ * @settings: a #CamelPOP3Settings
+ * @enable: the value to set
+ *
+ * Sets whether can use UTF-8 extension, when the server supports it
+ *
+ * Since: 3.36
+ **/
+void
+camel_pop3_settings_set_enable_utf8 (CamelPOP3Settings *settings,
+                                    gboolean enable)
+{
+       g_return_if_fail (CAMEL_IS_POP3_SETTINGS (settings));
+
+       if ((settings->priv->enable_utf8 ? 1 : 0) == (enable ? 1 : 0))
+               return;
+
+       settings->priv->enable_utf8 = enable;
+
+       g_object_notify (G_OBJECT (settings), "enable-utf8");
+}
diff --git a/src/camel/providers/pop3/camel-pop3-settings.h b/src/camel/providers/pop3/camel-pop3-settings.h
index fe30dcaec..699e014f4 100644
--- a/src/camel/providers/pop3/camel-pop3-settings.h
+++ b/src/camel/providers/pop3/camel-pop3-settings.h
@@ -88,6 +88,11 @@ guint32              camel_pop3_settings_get_last_cache_expunge
 void           camel_pop3_settings_set_last_cache_expunge
                                                (CamelPOP3Settings *settings,
                                                 guint32 last_cache_expunge);
+gboolean       camel_pop3_settings_get_enable_utf8
+                                               (CamelPOP3Settings *settings);
+void           camel_pop3_settings_set_enable_utf8
+                                               (CamelPOP3Settings *settings,
+                                                gboolean enable);
 
 G_END_DECLS
 
diff --git a/src/camel/providers/pop3/camel-pop3-store.c b/src/camel/providers/pop3/camel-pop3-store.c
index a3bdb4eb3..81c370f0a 100644
--- a/src/camel/providers/pop3/camel-pop3-store.c
+++ b/src/camel/providers/pop3/camel-pop3-store.c
@@ -647,6 +647,7 @@ pop3_store_authenticate_sync (CamelService *service,
        CamelPOP3Command *pcp = NULL;
        CamelPOP3Engine *pop3_engine;
        const gchar *password;
+       gboolean enable_utf8;
        gchar *host;
        gchar *user;
        gint status;
@@ -654,6 +655,7 @@ pop3_store_authenticate_sync (CamelService *service,
        password = camel_service_get_password (service);
 
        settings = camel_service_ref_settings (service);
+       enable_utf8 = camel_pop3_settings_get_enable_utf8 (CAMEL_POP3_SETTINGS (settings));
 
        network_settings = CAMEL_NETWORK_SETTINGS (settings);
        host = camel_network_settings_dup_host (network_settings);
@@ -679,6 +681,24 @@ pop3_store_authenticate_sync (CamelService *service,
                return CAMEL_AUTHENTICATION_ERROR;
        }
 
+       if ((pop3_engine->capa & CAMEL_POP3_CAP_UTF8) != 0 && enable_utf8) {
+               pcu = camel_pop3_engine_command_new (
+                       pop3_engine, 0, NULL, NULL, cancellable, error,
+                       "UTF8");
+               if (error && *error) {
+                       g_prefix_error (
+                               error,
+                               _("Unable to connect to POP server %s.\n"
+                               "Error enabling UTF-8 mode: "), host);
+                       result = CAMEL_AUTHENTICATION_ERROR;
+                       goto exit;
+               }
+               while (camel_pop3_engine_iterate (pop3_engine, NULL, cancellable, NULL) > 0)
+                       ;
+               camel_pop3_engine_command_free (pop3_engine, pcu);
+               pcu = NULL;
+       }
+
        if (mechanism == NULL) {
                if (password == NULL) {
                        g_set_error_literal (


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]