[evolution-data-server] I#178 - Implement RFC 6856 - POP3 support for UTF-8
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] I#178 - Implement RFC 6856 - POP3 support for UTF-8
- Date: Tue, 4 Feb 2020 09:37:08 +0000 (UTC)
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]