summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2003-06-13 19:06:52 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2003-06-13 19:06:52 +0000
commit201d2d3ebc1fb20c291c912a3380aad4858ba4f6 (patch)
treef06ce92fa9eab5b01cdc4a35f659d67bf63d0086
parent9db59e78a6cdbd8c3c00fd6c525676faa78547da (diff)
downloadevolution-data-server-201d2d3ebc1fb20c291c912a3380aad4858ba4f6.tar.gz
Fix for bug #40788.
2003-06-05 Jeffrey Stedfast <fejj@ximian.com> Fix for bug #40788. * providers/pop3/camel-pop3-engine.c (camel_pop3_engine_new): Now takes a flags argument. Currently there is only 1 flag which can be used to disable Pop3 server extensions. (get_capabilities): Don't check for Pop3 server extensions if the DISABLE_EXTENSIONS flag is set on the engine. (camel_pop3_engine_iterate): If we get a response that is neither +OK nor -ERR, default to treating it like a -ERR. * providers/pop3/camel-pop3-store.c (connect_to_server): Check for the disable_extensions param. * providers/pop3/camel-pop3-provider.c: Define a checkbox to disable all POP3 extension support.
-rw-r--r--camel/ChangeLog18
-rw-r--r--camel/providers/pop3/camel-pop3-engine.c40
-rw-r--r--camel/providers/pop3/camel-pop3-engine.h11
-rw-r--r--camel/providers/pop3/camel-pop3-provider.c2
-rw-r--r--camel/providers/pop3/camel-pop3-store.c6
5 files changed, 56 insertions, 21 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 335f346cc..968dcc4e0 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,21 @@
+2003-06-05 Jeffrey Stedfast <fejj@ximian.com>
+
+ Fix for bug #40788.
+
+ * providers/pop3/camel-pop3-engine.c (camel_pop3_engine_new): Now
+ takes a flags argument. Currently there is only 1 flag which can
+ be used to disable Pop3 server extensions.
+ (get_capabilities): Don't check for Pop3 server extensions if the
+ DISABLE_EXTENSIONS flag is set on the engine.
+ (camel_pop3_engine_iterate): If we get a response that is neither
+ +OK nor -ERR, default to treating it like a -ERR.
+
+ * providers/pop3/camel-pop3-store.c (connect_to_server): Check for
+ the disable_extensions param.
+
+ * providers/pop3/camel-pop3-provider.c: Define a checkbox to
+ disable all POP3 extension support.
+
2003-06-11 Jeffrey Stedfast <fejj@ximian.com>
Partial fix for bug #44457.
diff --git a/camel/providers/pop3/camel-pop3-engine.c b/camel/providers/pop3/camel-pop3-engine.c
index 762212388..2186136f9 100644
--- a/camel/providers/pop3/camel-pop3-engine.c
+++ b/camel/providers/pop3/camel-pop3-engine.c
@@ -97,6 +97,7 @@ camel_pop3_engine_get_type (void)
/**
* camel_pop3_engine_new:
* @source: source stream
+ * @flags: engine flags
*
* Returns a NULL stream. A null stream is always at eof, and
* always returns success for all reads and writes.
@@ -104,7 +105,7 @@ camel_pop3_engine_get_type (void)
* Return value: the stream
**/
CamelPOP3Engine *
-camel_pop3_engine_new(CamelStream *source)
+camel_pop3_engine_new(CamelStream *source, guint32 flags)
{
CamelPOP3Engine *pe;
@@ -112,7 +113,8 @@ camel_pop3_engine_new(CamelStream *source)
pe->stream = (CamelPOP3Stream *)camel_pop3_stream_new(source);
pe->state = CAMEL_POP3_ENGINE_AUTH;
-
+ pe->flags = flags;
+
get_capabilities(pe, TRUE);
return pe;
@@ -213,21 +215,23 @@ get_capabilities(CamelPOP3Engine *pe, int read_greeting)
pe->auth = g_list_prepend(pe->auth, &camel_pop3_password_authtype);
}
- pc = camel_pop3_engine_command_new(pe, CAMEL_POP3_COMMAND_MULTI, cmd_capa, NULL, "CAPA\r\n");
- while (camel_pop3_engine_iterate(pe, pc) > 0)
- ;
- camel_pop3_engine_command_free(pe, pc);
-
- if (pe->state == CAMEL_POP3_ENGINE_TRANSACTION && !(pe->capa & CAMEL_POP3_CAP_UIDL)) {
- /* check for UIDL support manually */
- pc = camel_pop3_engine_command_new (pe, CAMEL_POP3_COMMAND_SIMPLE, NULL, NULL, "UIDL 1\r\n");
- while (camel_pop3_engine_iterate (pe, pc) > 0)
+ if (!(pe->flags & CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS)) {
+ pc = camel_pop3_engine_command_new(pe, CAMEL_POP3_COMMAND_MULTI, cmd_capa, NULL, "CAPA\r\n");
+ while (camel_pop3_engine_iterate(pe, pc) > 0)
;
+ camel_pop3_engine_command_free(pe, pc);
- if (pc->state == CAMEL_POP3_COMMAND_OK)
- pe->capa |= CAMEL_POP3_CAP_UIDL;
-
- camel_pop3_engine_command_free (pe, pc);
+ if (pe->state == CAMEL_POP3_ENGINE_TRANSACTION && !(pe->capa & CAMEL_POP3_CAP_UIDL)) {
+ /* check for UIDL support manually */
+ pc = camel_pop3_engine_command_new (pe, CAMEL_POP3_COMMAND_SIMPLE, NULL, NULL, "UIDL 1\r\n");
+ while (camel_pop3_engine_iterate (pe, pc) > 0)
+ ;
+
+ if (pc->state == CAMEL_POP3_COMMAND_OK)
+ pe->capa |= CAMEL_POP3_CAP_UIDL;
+
+ camel_pop3_engine_command_free (pe, pc);
+ }
}
}
@@ -304,8 +308,8 @@ camel_pop3_engine_iterate(CamelPOP3Engine *pe, CamelPOP3Command *pcwait)
default:
/* what do we do now? f'knows! */
g_warning("Bad server response: %s\n", p);
- errno = EIO;
- return -1;
+ pc->state = CAMEL_POP3_COMMAND_ERR;
+ break;
}
e_dlist_addtail(&pe->done, (EDListNode *)pc);
@@ -313,7 +317,7 @@ camel_pop3_engine_iterate(CamelPOP3Engine *pe, CamelPOP3Command *pcwait)
/* Set next command */
pe->current = (CamelPOP3Command *)e_dlist_remhead(&pe->active);
-
+
/* check the queue for sending any we can now send also */
pw = (CamelPOP3Command *)pe->queue.head;
pn = pw->next;
diff --git a/camel/providers/pop3/camel-pop3-engine.h b/camel/providers/pop3/camel-pop3-engine.h
index caf6ca1d2..311498031 100644
--- a/camel/providers/pop3/camel-pop3-engine.h
+++ b/camel/providers/pop3/camel-pop3-engine.h
@@ -68,6 +68,11 @@ enum {
CAMEL_POP3_CAP_STLS = 1<<5
};
+/* enable/disable flags for the engine itself */
+enum {
+ CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS = 1<<0,
+};
+
typedef void (*CamelPOP3CommandFunc)(CamelPOP3Engine *pe, CamelPOP3Stream *stream, void *data);
struct _CamelPOP3Command {
@@ -86,7 +91,9 @@ struct _CamelPOP3Command {
struct _CamelPOP3Engine {
CamelObject parent;
-
+
+ guint32 flags;
+
camel_pop3_engine_t state;
GList *auth; /* authtypes supported */
@@ -114,7 +121,7 @@ struct _CamelPOP3EngineClass {
CamelType camel_pop3_engine_get_type (void);
-CamelPOP3Engine *camel_pop3_engine_new (CamelStream *source);
+CamelPOP3Engine *camel_pop3_engine_new (CamelStream *source, guint32 flags);
void camel_pop3_engine_reget_capabilities (CamelPOP3Engine *engine);
diff --git a/camel/providers/pop3/camel-pop3-provider.c b/camel/providers/pop3/camel-pop3-provider.c
index f01cf7425..1354470e6 100644
--- a/camel/providers/pop3/camel-pop3-provider.c
+++ b/camel/providers/pop3/camel-pop3-provider.c
@@ -42,6 +42,8 @@ CamelProviderConfEntry pop3_conf_entries[] = {
{ CAMEL_PROVIDER_CONF_CHECKSPIN, "delete_after", "UNIMPLEMENTED",
N_("Delete after %s day(s)"), "0:1:7:365" },
#endif
+ { CAMEL_PROVIDER_CONF_CHECKBOX, "disable_extensions", NULL,
+ N_("Disable support for all POP3 extensions"), "0" },
{ CAMEL_PROVIDER_CONF_SECTION_END },
{ CAMEL_PROVIDER_CONF_END }
};
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index be4469f3e..8b674e019 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -151,6 +151,7 @@ connect_to_server (CamelService *service, int ssl_mode, int try_starttls, CamelE
CamelStream *tcp_stream;
CamelPOP3Command *pc;
struct hostent *h;
+ guint32 flags = 0;
int clean_quit;
int ret, port;
@@ -197,7 +198,10 @@ connect_to_server (CamelService *service, int ssl_mode, int try_starttls, CamelE
return FALSE;
}
- store->engine = camel_pop3_engine_new (tcp_stream);
+ if (camel_url_get_param (service->url, "disable_extensions"))
+ flags |= CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS;
+
+ store->engine = camel_pop3_engine_new (tcp_stream, flags);
#ifdef HAVE_SSL
if (store->engine) {