X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fmanagesieve%2Fserv_managesieve.c;h=e085d5991a1691a7988e8df2f4c3f2c8afbef794;hb=425c3723bd35cf6e2048027e36c721a78784b8c7;hp=0bdc0f1001fe03873b7dbbd0e6b7593d3c742720;hpb=f1ee61891901850ebbdee1e9440b363dc6df540a;p=citadel.git diff --git a/citadel/modules/managesieve/serv_managesieve.c b/citadel/modules/managesieve/serv_managesieve.c index 0bdc0f100..e085d5991 100644 --- a/citadel/modules/managesieve/serv_managesieve.c +++ b/citadel/modules/managesieve/serv_managesieve.c @@ -6,21 +6,15 @@ * 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" @@ -68,17 +62,11 @@ #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. @@ -251,13 +239,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; @@ -279,7 +267,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; @@ -289,15 +276,15 @@ 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, 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; @@ -314,7 +301,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; } @@ -330,18 +317,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"); syslog(LOG_NOTICE, "MgSve bye."); - CC->kill_me = 1; + CC->kill_me = KILLME_CLIENT_LOGGED_OUT; } -/** +/* * HAVESPACE command. see chapter 2.5 */ void cmd_mgsve_havespace(void) @@ -352,7 +339,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 { @@ -362,7 +349,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) @@ -396,7 +383,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; } @@ -464,7 +451,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]); @@ -520,7 +507,10 @@ void mgsve_auth(char *argbuf) { 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; @@ -585,8 +575,8 @@ void managesieve_command_loop(void) { length = strlen(parms[0]); } if (length < 1) { - syslog(LOG_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; } syslog(LOG_INFO, "MANAGESIEVE: %s\n", cmdbuf); @@ -635,7 +625,7 @@ void managesieve_command_loop(void) { else { cprintf("No Invalid access or command.\r\n"); syslog(LOG_INFO, "illegal Managesieve command: %s", parms[0]); - CC->kill_me = 1; + CC->kill_me = KILLME_ILLEGAL_MANAGESIEVE_COMMAND; } @@ -661,16 +651,16 @@ CTDL_MODULE_INIT(managesieve) { 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"; }