Fix for bug #40788.
authorJeffrey Stedfast <fejj@ximian.com>
Fri, 13 Jun 2003 19:06:52 +0000 (19:06 +0000)
committerJeffrey Stedfast <fejj@src.gnome.org>
Fri, 13 Jun 2003 19:06:52 +0000 (19:06 +0000)
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.

camel/ChangeLog
camel/providers/pop3/camel-pop3-engine.c
camel/providers/pop3/camel-pop3-engine.h
camel/providers/pop3/camel-pop3-provider.c
camel/providers/pop3/camel-pop3-store.c

index 335f346..968dcc4 100644 (file)
@@ -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.
index 7622123..2186136 100644 (file)
@@ -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;
index caf6ca1..3114980 100644 (file)
@@ -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);
 
index f01cf74..1354470 100644 (file)
@@ -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 }
 };
index be4469f..8b674e0 100644 (file)
@@ -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) {