* 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
+ * Copyright (c) 2007-2018 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 open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
*
- * 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
+ * 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.
*/
#include "sysdep.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 "locate_host.h"
#include "citadel_dirs.h"
-
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
-
-
#include "ctdl_module.h"
#include "serv_sieve.h"
-/**
+/*
* http://tools.ietf.org/html/draft-martin-managesieve-06
*
* this is the draft this code tries to implement.
#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 (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;
/* todo, check length*/
{
char auth[SIZ];
- int retval;
char *message;
char *username;
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, strlen(MGSVE->transmitted_message));
}
else
- retval = CtdlDecodeBase64(auth, parms[2], SIZ);
+ CtdlDecodeBase64(auth, parms[2], strlen(parms[2]));
username = auth;
if ((*username == '\0') && (*(username + 1) != '\0'))
username ++;
- if (login_ok == CtdlLoginExistingUser(NULL, username))
+ if (login_ok == CtdlLoginExistingUser(username))
{
char *pass;
}
}
cprintf("NO \"Authentication Failure.\"\r\n");/* we just support auth plain. */
- CC->kill_me = 1;
+ CC->kill_me = KILLME_AUTHFAILED;
}
-/**
- *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)
if (MGSVE->command_state != mgsve_password)
{
cprintf("NO\r\n");
- CC->kill_me = 1;
+ CC->kill_me = KILLME_QUOTA;
}
else
{
}
}
-/**
+/*
* PUTSCRIPT command, see chapter 2.6
*/
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;
}
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]);
if (strlen(argbuf) >= 7) {
}
else {
- CtdlEncodeBase64(username_prompt, "Username:", 9, 0);
+ size_t len = CtdlEncodeBase64(username_prompt, "Username:", 9, 0);
+ if (username_prompt[len - 1] == '\n') {
+ username_prompt[len - 1] = '\0';
+ }
cprintf("334 %s\r\n", username_prompt);
}
return;
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);
}
}
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;
}
/* 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);
}
{
if (!threading)
{
- CtdlRegisterServiceHook(config.c_managesieve_port,
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_managesieve_port"),
NULL,
managesieve_greeting,
managesieve_command_loop,
NULL,
CitadelServiceManageSieve);
- CtdlRegisterSessionHook(managesieve_cleanup_function, EVT_STOP);
+ CtdlRegisterSessionHook(managesieve_cleanup_function, EVT_STOP, PRIO_STOP + 30);
}
- /* return our Subversion id for the Log */
+ /* return our module name for the log */
return "managesieve";
}