-/**
- * $Id$
- *
+/*
* This module is an managesieve implementation for the Citadel system.
* It is compliant with all of the following:
*
* http://tools.ietf.org/html/draft-martin-managesieve-06
* as this draft expires with this writing, you might need to search for
* the new one.
+ *
+ * Copyright (c) 2007-2009 by the citadel.org team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "sysdep.h"
#include "support.h"
#include "config.h"
#include "control.h"
-#include "room_ops.h"
#include "user_ops.h"
-#include "policy.h"
#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"
#include "ctdl_module.h"
-
-
-
-#ifdef HAVE_LIBSIEVE
-
#include "serv_sieve.h"
#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 */
/*****************************************************************************/
if (login_ok == CtdlLoginExistingUser(NULL, username))
{
char *pass;
+
pass = &(auth[strlen(auth)+1]);
/* for some reason the php script sends us the username twice. y? */
pass = &(pass[strlen(pass)+1]);
- if (pass_ok == CtdlTryPassword(pass))
+ if (pass_ok == CtdlTryPassword(pass, strlen(pass)))
{
MGSVE->command_state = mgsve_password;
cprintf("OK\r\n");
void cmd_mgsve_logout(struct sdm_userdata *u)
{
cprintf("OK\r\n");
- lprintf(CTDL_NOTICE, "MgSve bye.");
+ syslog(LOG_NOTICE, "MgSve bye.");
CC->kill_me = 1;
}
memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
length = client_getln(cmdbuf, sizeof cmdbuf);
if (length >= 1) {
- num_parms = imap_parameterize(parms, cmdbuf);
+ num_parms = old_imap_parameterize(parms, cmdbuf);
if (num_parms == 0) return;
length = strlen(parms[0]);
}
if (length < 1) {
- lprintf(CTDL_CRIT, "Client disconnected: ending session.\n");
+ syslog(LOG_CRIT, "Client disconnected: ending session.\n");
CC->kill_me = 1;
return;
}
- lprintf(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);
}
}
else {
cprintf("No Invalid access or command.\r\n");
- lprintf(CTDL_INFO, "illegal Managesieve command: %s", parms[0]);
+ syslog(LOG_INFO, "illegal Managesieve command: %s", parms[0]);
CC->kill_me = 1;
}
/* Don't do this stuff if this is not a managesieve session! */
if (CC->h_command_function != managesieve_command_loop) return;
- lprintf(CTDL_DEBUG, "Performing managesieve cleanup hook\n");
+ syslog(LOG_DEBUG, "Performing managesieve cleanup hook\n");
free(MGSVE);
}
-#endif /* HAVE_LIBSIEVE */
const char* CitadelServiceManageSieve = "ManageSieve";
CTDL_MODULE_INIT(managesieve)
{
if (!threading)
{
-#ifdef HAVE_LIBSIEVE
CtdlRegisterServiceHook(config.c_managesieve_port,
NULL,
managesieve_greeting,
NULL,
CitadelServiceManageSieve);
CtdlRegisterSessionHook(managesieve_cleanup_function, EVT_STOP);
-
-#else /* HAVE_LIBSIEVE */
-
- lprintf(CTDL_INFO, "This server is missing libsieve. Managesieve protocol is disabled..\n");
-
-#endif /* HAVE_LIBSIEVE */
}
/* return our Subversion id for the Log */
- return "$Id$";
+ return "managesieve";
}