X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fmanagesieve%2Fserv_managesieve.c;h=289bc5784ecafe8817a736a81e545881bb9f4e22;hb=e26a8dee20d1726b4995821f717f867f50fc5659;hp=e963781046295cdbd863e6d1b97e2693b486a745;hpb=263eb53ff5e8a68b61789dad6ac3f999d98e8f2c;p=citadel.git diff --git a/citadel/modules/managesieve/serv_managesieve.c b/citadel/modules/managesieve/serv_managesieve.c index e96378104..289bc5784 100644 --- a/citadel/modules/managesieve/serv_managesieve.c +++ b/citadel/modules/managesieve/serv_managesieve.c @@ -1,6 +1,4 @@ /* - * $Id$ - * * This module is an managesieve implementation for the Citadel system. * It is compliant with all of the following: * @@ -65,7 +63,6 @@ #include "database.h" #include "msgbase.h" #include "internet_addressing.h" -#include "imap_tools.h" /* Needed for imap_parameterize */ #include "genstamp.h" #include "domain.h" #include "clientsocket.h" @@ -106,6 +103,66 @@ enum { /** Command states for login authentication */ #define MGSVE ((struct citmgsve *)CC->session_specific_data) +int old_imap_parameterize(char** args, char *in) +{ + char* out = in; + int num = 0; + + for (;;) + { + /* Skip whitespace. */ + + while (isspace(*in)) + in++; + if (*in == 0) + break; + + /* Found the start of a token. */ + + args[num++] = out; + + /* Read in the token. */ + + for (;;) + { + int c = *in++; + if (isspace(c)) + break; + + if (c == '\"') + { + /* Found a quoted section. */ + + for (;;) + { + c = *in++; + if (c == '\"') + break; + else if (c == '\\') + c = *in++; + + *out++ = c; + if (c == 0) + return num; + } + } + else if (c == '\\') + { + c = *in++; + *out++ = c; + } + else + *out++ = c; + + if (c == 0) + return num; + } + *out++ = '\0'; + } + + return num; +} + /*****************************************************************************/ /* MANAGESIEVE Server */ /*****************************************************************************/ @@ -194,13 +251,13 @@ char *ReadString(long size, char *command) if (size < 1) { cprintf("NO %s: %ld BAD Message length must be at least 1.\r\n", command, size); - CC->kill_me = 1; + CC->kill_me = KILLME_READSTRING_FAILED; return NULL; } MGSVE->transmitted_message = malloc(size + 2); if (MGSVE->transmitted_message == NULL) { cprintf("NO %s Cannot allocate memory.\r\n", command); - CC->kill_me = 1; + CC->kill_me = KILLME_MALLOC_FAILED; return NULL; } MGSVE->transmitted_length = size; @@ -222,7 +279,6 @@ void cmd_mgsve_auth(int num_parms, char **parms, struct sdm_userdata *u) /* todo, check length*/ { char auth[SIZ]; - int retval; char *message; char *username; @@ -232,10 +288,10 @@ void cmd_mgsve_auth(int num_parms, char **parms, struct sdm_userdata *u) message = ReadString(GetSizeToken(parms[2]), parms[0]); if (message != NULL) {/**< do we have tokenized login? */ - retval = CtdlDecodeBase64(auth, MGSVE->transmitted_message, SIZ); + CtdlDecodeBase64(auth, MGSVE->transmitted_message, SIZ); } else - retval = CtdlDecodeBase64(auth, parms[2], SIZ); + CtdlDecodeBase64(auth, parms[2], SIZ); username = auth; if ((*username == '\0') && (*(username + 1) != '\0')) username ++; @@ -257,7 +313,7 @@ void cmd_mgsve_auth(int num_parms, char **parms, struct sdm_userdata *u) } } cprintf("NO \"Authentication Failure.\"\r\n");/* we just support auth plain. */ - CC->kill_me = 1; + CC->kill_me = KILLME_AUTHFAILED; } @@ -273,18 +329,18 @@ void cmd_mgsve_starttls(void) -/** - *LOGOUT command, see chapter 2.3 +/* + * LOGOUT command, see chapter 2.3 */ void cmd_mgsve_logout(struct sdm_userdata *u) { cprintf("OK\r\n"); - CtdlLogPrintf(CTDL_NOTICE, "MgSve bye."); - CC->kill_me = 1; + syslog(LOG_NOTICE, "MgSve bye."); + CC->kill_me = KILLME_CLIENT_LOGGED_OUT; } -/** +/* * HAVESPACE command. see chapter 2.5 */ void cmd_mgsve_havespace(void) @@ -295,7 +351,7 @@ void cmd_mgsve_havespace(void) if (MGSVE->command_state != mgsve_password) { cprintf("NO\r\n"); - CC->kill_me = 1; + CC->kill_me = KILLME_QUOTA; } else { @@ -305,7 +361,7 @@ void cmd_mgsve_havespace(void) } } -/** +/* * PUTSCRIPT command, see chapter 2.6 */ void cmd_mgsve_putscript(int num_parms, char **parms, struct sdm_userdata *u) @@ -339,7 +395,7 @@ void cmd_mgsve_putscript(int num_parms, char **parms, struct sdm_userdata *u) } else { cprintf("%s NO Read failed.\r\n", parms[0]); - CC->kill_me = 1; + CC->kill_me = KILLME_READ_FAILED; return; } @@ -407,7 +463,7 @@ void cmd_mgsve_getscript(int num_parms, char **parms, struct sdm_userdata *u) slen = strlen(script_content); outbuf = malloc (slen + 64); snprintf(outbuf, slen + 64, "{%ld+}\r\n%s\r\nOK\r\n",slen, script_content); - cprintf(outbuf); + cprintf("%s", outbuf); } else cprintf("No \"there is no script by that name %s \"\r\n", parms[1]); @@ -528,11 +584,11 @@ void managesieve_command_loop(void) { length = strlen(parms[0]); } if (length < 1) { - CtdlLogPrintf(CTDL_CRIT, "Client disconnected: ending session.\n"); - CC->kill_me = 1; + syslog(LOG_CRIT, "managesieve: client disconnected: ending session.\n"); + CC->kill_me = KILLME_CLIENT_DISCONNECTED; return; } - CtdlLogPrintf(CTDL_INFO, "MANAGESIEVE: %s\n", cmdbuf); + syslog(LOG_INFO, "MANAGESIEVE: %s\n", cmdbuf); if ((length>= 12) && (!strncasecmp(parms[0], "AUTHENTICATE", 12))){ cmd_mgsve_auth(num_parms, parms, &u); } @@ -577,8 +633,8 @@ void managesieve_command_loop(void) { } else { cprintf("No Invalid access or command.\r\n"); - CtdlLogPrintf(CTDL_INFO, "illegal Managesieve command: %s", parms[0]); - CC->kill_me = 1; + syslog(LOG_INFO, "illegal Managesieve command: %s", parms[0]); + CC->kill_me = KILLME_ILLEGAL_MANAGESIEVE_COMMAND; } @@ -593,7 +649,7 @@ void managesieve_cleanup_function(void) { /* Don't do this stuff if this is not a managesieve session! */ if (CC->h_command_function != managesieve_command_loop) return; - CtdlLogPrintf(CTDL_DEBUG, "Performing managesieve cleanup hook\n"); + syslog(LOG_DEBUG, "Performing managesieve cleanup hook\n"); free(MGSVE); } @@ -613,8 +669,8 @@ CTDL_MODULE_INIT(managesieve) CtdlRegisterSessionHook(managesieve_cleanup_function, EVT_STOP); } - /* return our Subversion id for the Log */ - return "$Id$"; + /* return our module name for the log */ + return "managesieve"; }