]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/imap/serv_imap.c
IMAP server: suppress untagged 'EXISTS' and 'EXPUNGE' responses
[citadel.git] / citadel / modules / imap / serv_imap.c
index 098ce942f5c520b402bac201ebb1a4fed42de264..b6ec6e5c5b4b051d312c233294cc03affc59ea26 100644 (file)
@@ -35,6 +35,7 @@
 #include <ctype.h>
 #include <string.h>
 #include <limits.h>
+#include <libcitadel.h>
 #include "citadel.h"
 #include "server.h"
 #include "citserver.h"
@@ -45,7 +46,6 @@
 #include "policy.h"
 #include "database.h"
 #include "msgbase.h"
-#include "tools.h"
 #include "internet_addressing.h"
 #include "serv_imap.h"
 #include "imap_tools.h"
@@ -491,7 +491,7 @@ void imap_greeting(void)
 {
 
        strcpy(CC->cs_clientname, "IMAP session");
-       IMAP = malloc(sizeof (struct citimap));
+       CC->session_specific_data = malloc(sizeof(struct citimap));
        memset(IMAP, 0, sizeof(struct citimap));
        IMAP->authstate = imap_as_normal;
        IMAP->cached_rfc822_data = NULL;
@@ -557,7 +557,7 @@ void imap_authenticate(int num_parms, char *parms[])
        }
 
        if (!strcasecmp(parms[2], "LOGIN")) {
-               CtdlEncodeBase64(buf, "Username:", 9);
+               CtdlEncodeBase64(buf, "Username:", 9, 0);
                cprintf("+ %s\r\n", buf);
                IMAP->authstate = imap_as_expecting_username;
                strcpy(IMAP->authseq, parms[0]);
@@ -565,7 +565,7 @@ void imap_authenticate(int num_parms, char *parms[])
        }
 
        if (!strcasecmp(parms[2], "PLAIN")) {
-               // CtdlEncodeBase64(buf, "Username:", 9);
+               // CtdlEncodeBase64(buf, "Username:", 9, 0);
                // cprintf("+ %s\r\n", buf);
                cprintf("+ \r\n");
                IMAP->authstate = imap_as_expecting_plainauth;
@@ -616,7 +616,7 @@ void imap_auth_login_user(char *cmd)
 
        CtdlDecodeBase64(buf, cmd, SIZ);
        CtdlLoginExistingUser(NULL, buf);
-       CtdlEncodeBase64(buf, "Password:", 9);
+       CtdlEncodeBase64(buf, "Password:", 9, 0);
        cprintf("+ %s\r\n", buf);
        IMAP->authstate = imap_as_expecting_password;
        return;
@@ -1370,19 +1370,24 @@ void imap_command_loop(void)
                return;
        }
 
-       /* Ok, at this point we're in normal command mode.  The first thing
-        * we do is print any incoming pages (yeah! we really do!)
-        */
-       imap_print_instant_messages();
 
-       /*
-        * Before processing the command that was just entered... if we happen
-        * to have a folder selected, we'd like to rescan that folder for new
-        * messages, and for deletions/changes of existing messages.  This
-        * could probably be optimized somehow, but IMAP sucks...
+       /* Ok, at this point we're in normal command mode.
+        * If the command just submitted does not contain a literal, we
+        * might think about delivering some untagged stuff...
         */
-       if (IMAP->selected) {
-               imap_rescan_msgids();
+       if (cmdbuf[strlen(cmdbuf)-1] != '}') {
+
+               imap_print_instant_messages();
+       
+               /*
+                * Before processing the command that was just entered... if we happen
+                * to have a folder selected, we'd like to rescan that folder for new
+                * messages, and for deletions/changes of existing messages.  This
+                * could probably be optimized somehow, but IMAP sucks...
+                */
+               if (IMAP->selected) {
+                       imap_rescan_msgids();
+               }
        }
 
        /* Now for the command set. */
@@ -1596,14 +1601,17 @@ const char *CitadelServiceIMAPS="IMAPS";
  */
 CTDL_MODULE_INIT(imap)
 {
-       CtdlRegisterServiceHook(config.c_imap_port,
-                               NULL, imap_greeting, imap_command_loop, NULL, CitadelServiceIMAP);
+       if (!threading)
+       {
+               CtdlRegisterServiceHook(config.c_imap_port,
+                                       NULL, imap_greeting, imap_command_loop, NULL, CitadelServiceIMAP);
 #ifdef HAVE_OPENSSL
-       CtdlRegisterServiceHook(config.c_imaps_port,
-                               NULL, imaps_greeting, imap_command_loop, NULL, CitadelServiceIMAPS);
+               CtdlRegisterServiceHook(config.c_imaps_port,
+                                       NULL, imaps_greeting, imap_command_loop, NULL, CitadelServiceIMAPS);
 #endif
-       CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP);
-
+               CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP);
+       }
+       
        /* return our Subversion id for the Log */
        return "$Id$";
 }