X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fpop3%2Fserv_pop3.c;h=97681da8366e36b2fa5be74b9b936b79af9f9cda;hb=573281fcad13fe840b7f0795ff36be5cfc5b420a;hp=612b1db98c369e67a6ed854e31e23cf6ad0b6060;hpb=fc86ffaec2bf78ee472ed8fffc4f0a0fa9599105;p=citadel.git diff --git a/citadel/modules/pop3/serv_pop3.c b/citadel/modules/pop3/serv_pop3.c index 612b1db98..97681da83 100644 --- a/citadel/modules/pop3/serv_pop3.c +++ b/citadel/modules/pop3/serv_pop3.c @@ -1,23 +1,21 @@ /* - * $Id$ - * * POP3 service for the Citadel system * - * Copyright (c) 1998-2009 by the citadel.org team + * Copyright (c) 1998-2012 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 + * + * + * * * Current status of standards conformance: * @@ -62,7 +60,6 @@ #include "support.h" #include "config.h" #include "user_ops.h" -#include "policy.h" #include "database.h" #include "msgbase.h" #include "internet_addressing.h" @@ -84,7 +81,7 @@ void pop3_cleanup_function(void) { /* Don't do this stuff if this is not a POP3 session! */ if (CC->h_command_function != pop3_command_loop) return; - CtdlLogPrintf(CTDL_DEBUG, "Performing POP3 cleanup hook\n"); + syslog(LOG_DEBUG, "Performing POP3 cleanup hook"); if (POP3->msgs != NULL) free(POP3->msgs); free(POP3); @@ -101,8 +98,7 @@ void pop3_greeting(void) { CC->session_specific_data = malloc(sizeof(struct citpop3)); memset(POP3, 0, sizeof(struct citpop3)); - cprintf("+OK Citadel POP3 server %s\r\n", - CC->cs_nonce); + cprintf("+OK Citadel POP3 server ready.\r\n"); } @@ -114,9 +110,9 @@ void pop3s_greeting(void) { /* kill session if no crypto */ #ifdef HAVE_OPENSSL - if (!CC->redirect_ssl) CC->kill_me = 1; + if (!CC->redirect_ssl) CC->kill_me = KILLME_NO_CRYPTO; #else - CC->kill_me = 1; + CC->kill_me = KILLME_NO_CRYPTO; #endif pop3_greeting(); @@ -138,7 +134,7 @@ void pop3_user(char *argbuf) { strcpy(username, argbuf); striplt(username); - /* CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", username); */ + /* syslog(LOG_DEBUG, "Trying <%s>", username); */ if (CtdlLoginExistingUser(NULL, username) == login_ok) { cprintf("+OK Password required for %s\r\n", username); } @@ -169,15 +165,17 @@ void pop3_add_message(long msgnum, void *userdata) { */ GetMetaData(&smi, msgnum); if (smi.meta_rfc822_length <= 0L) { - CC->redirect_buffer = malloc(SIZ); - CC->redirect_len = 0; - CC->redirect_alloc = SIZ; - CtdlOutputMsg(msgnum, MT_RFC822, HEADERS_ALL, 0, 1, NULL, SUPPRESS_ENV_TO); - smi.meta_rfc822_length = CC->redirect_len; - free(CC->redirect_buffer); - CC->redirect_buffer = NULL; - CC->redirect_len = 0; - CC->redirect_alloc = 0; + CC->redirect_buffer = NewStrBufPlain(NULL, SIZ); + + CtdlOutputMsg(msgnum, + MT_RFC822, + HEADERS_ALL, + 0, 1, NULL, + SUPPRESS_ENV_TO, + NULL, NULL); + + smi.meta_rfc822_length = StrLength(CC->redirect_buffer); + FreeStrBuf(&CC->redirect_buffer); /* TODO: WHEW, all this for just knowing the length???? */ PutMetaData(&smi); } POP3->msgs[POP3->num_msgs-1].rfc822_length = smi.meta_rfc822_length; @@ -191,7 +189,7 @@ void pop3_add_message(long msgnum, void *userdata) { * of messages in the inbox, or -1 for error) */ int pop3_grab_mailbox(void) { - struct visit vbuf; + visit vbuf; int i; if (CtdlGetRoom(&CC->room, MAILROOM) != 0) return(-1); @@ -221,7 +219,7 @@ void pop3_login(void) if (msgs >= 0) { cprintf("+OK %s is logged in (%d messages)\r\n", CC->user.fullname, msgs); - CtdlLogPrintf(CTDL_NOTICE, "POP3 authenticated %s\n", CC->user.fullname); + syslog(LOG_NOTICE, "POP3 authenticated %s", CC->user.fullname); } else { cprintf("-ERR Can't open your mailbox\r\n"); @@ -229,60 +227,6 @@ void pop3_login(void) } -void pop3_apop(char *argbuf) -{ - char username[SIZ]; - char userdigest[MD5_HEXSTRING_SIZE]; - char realdigest[MD5_HEXSTRING_SIZE]; - char *sptr; - - if (CC->logged_in) - { - cprintf("-ERR You are already logged in; not in the AUTHORIZATION phase.\r\n"); - return; - } - - if ((sptr = strchr(argbuf, ' ')) == NULL) - { - cprintf("-ERR Invalid APOP line.\r\n"); - return; - } - - *sptr++ = '\0'; - - while ((*sptr) && isspace(*sptr)) - sptr++; - - strncpy(username, argbuf, sizeof(username)-1); - username[sizeof(username)-1] = '\0'; - - memset(userdigest, MD5_HEXSTRING_SIZE, 0); - strncpy(userdigest, sptr, MD5_HEXSTRING_SIZE-1); - - if (CtdlLoginExistingUser(NULL, username) != login_ok) - { - cprintf("-ERR No such user.\r\n"); - return; - } - - if (CtdlGetUser(&CC->user, CC->curr_user)) - { - cprintf("-ERR No such user.\r\n"); - return; - } - - make_apop_string(CC->user.password, CC->cs_nonce, realdigest, sizeof realdigest); - if (!strncasecmp(realdigest, userdigest, MD5_HEXSTRING_SIZE-1)) - { - do_login(); - pop3_login(); - } - else - { - cprintf("-ERR That is NOT the password.\r\n"); - } -} - /* * Authorize with password (implements POP3 "PASS" command) @@ -290,11 +234,11 @@ void pop3_apop(char *argbuf) void pop3_pass(char *argbuf) { char password[SIZ]; - strcpy(password, argbuf); + safestrncpy(password, argbuf, sizeof password); striplt(password); - /* CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", password); */ - if (CtdlTryPassword(password) == pass_ok) { + /* syslog(LOG_DEBUG, "Trying <%s>", password); */ + if (CtdlTryPassword(password, strlen(password)) == pass_ok) { pop3_login(); } else { @@ -387,9 +331,9 @@ void pop3_retr(char *argbuf) { cprintf("+OK Message %d:\r\n", which_one); CtdlOutputMsg(POP3->msgs[which_one - 1].msgnum, - MT_RFC822, HEADERS_ALL, 0, 1, NULL, - (ESC_DOT|SUPPRESS_ENV_TO) - ); + MT_RFC822, HEADERS_ALL, 0, 1, NULL, + (ESC_DOT|SUPPRESS_ENV_TO), + NULL, NULL); cprintf(".\r\n"); } @@ -402,8 +346,8 @@ void pop3_top(char *argbuf) { int lines_requested = 0; int lines_dumped = 0; char buf[1024]; - char *msgtext; - char *ptr; + StrBuf *msgtext; + const char *ptr; int in_body = 0; int done = 0; @@ -418,20 +362,22 @@ void pop3_top(char *argbuf) { return; } - CC->redirect_buffer = malloc(SIZ); - CC->redirect_len = 0; - CC->redirect_alloc = SIZ; - CtdlOutputMsg(POP3->msgs[which_one - 1].msgnum, MT_RFC822, HEADERS_ALL, 0, 1, NULL, SUPPRESS_ENV_TO); + CC->redirect_buffer = NewStrBufPlain(NULL, SIZ); + + CtdlOutputMsg(POP3->msgs[which_one - 1].msgnum, + MT_RFC822, + HEADERS_ALL, + 0, 1, NULL, + SUPPRESS_ENV_TO, + NULL, NULL); + msgtext = CC->redirect_buffer; CC->redirect_buffer = NULL; - CC->redirect_len = 0; - CC->redirect_alloc = 0; cprintf("+OK Message %d:\r\n", which_one); - - ptr = msgtext; - - while (ptr = memreadline(ptr, buf, (sizeof buf - 2)), + + ptr = ChrPtr(msgtext); + while (ptr = cmemreadline(ptr, buf, (sizeof buf - 2)), ( (*ptr != 0) && (done == 0))) { strcat(buf, "\r\n"); if (in_body == 1) { @@ -449,7 +395,7 @@ void pop3_top(char *argbuf) { } if (buf[strlen(buf)-1] != 10) cprintf("\n"); - free(msgtext); + FreeStrBuf(&msgtext); cprintf(".\r\n"); } @@ -483,7 +429,7 @@ void pop3_dele(char *argbuf) { */ void pop3_update(void) { int i; - struct visit vbuf; + visit vbuf; long *deletemsgs = NULL; int num_deletemsgs = 0; @@ -637,15 +583,15 @@ void pop3_command_loop(void) { time(&CC->lastcmd); memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */ if (client_getln(cmdbuf, sizeof cmdbuf) < 1) { - CtdlLogPrintf(CTDL_ERR, "Client disconnected: ending session.\r\n"); - CC->kill_me = 1; + syslog(LOG_ERR, "POP3 client disconnected: ending session."); + CC->kill_me = KILLME_CLIENT_DISCONNECTED; return; } if (!strncasecmp(cmdbuf, "PASS", 4)) { - CtdlLogPrintf(CTDL_INFO, "POP3: PASS...\r\n"); + syslog(LOG_INFO, "POP3: PASS..."); } else { - CtdlLogPrintf(CTDL_INFO, "POP3: %s\r\n", cmdbuf); + syslog(LOG_INFO, "POP3: %s", cmdbuf); } while (strlen(cmdbuf) < 5) strcat(cmdbuf, " "); @@ -660,7 +606,7 @@ void pop3_command_loop(void) { else if (!strncasecmp(cmdbuf, "QUIT", 4)) { cprintf("+OK Goodbye...\r\n"); pop3_update(); - CC->kill_me = 1; + CC->kill_me = KILLME_CLIENT_LOGGED_OUT; return; } @@ -672,11 +618,6 @@ void pop3_command_loop(void) { pop3_pass(&cmdbuf[5]); } - else if (!strncasecmp(cmdbuf, "APOP", 4)) - { - pop3_apop(&cmdbuf[5]); - } - #ifdef HAVE_OPENSSL else if (!strncasecmp(cmdbuf, "STLS", 4)) { pop3_stls(); @@ -689,7 +630,7 @@ void pop3_command_loop(void) { else if (CC->nologin) { cprintf("-ERR System busy, try later.\r\n"); - CC->kill_me = 1; + CC->kill_me = KILLME_NOLOGIN; } else if (!strncasecmp(cmdbuf, "LIST", 4)) { @@ -752,9 +693,9 @@ CTDL_MODULE_INIT(pop3) NULL, CitadelServicePop3S); #endif - CtdlRegisterSessionHook(pop3_cleanup_function, EVT_STOP); + CtdlRegisterSessionHook(pop3_cleanup_function, EVT_STOP, PRIO_STOP + 30); } - /* return our Subversion id for the Log */ - return "$Id$"; + /* return our module name for the log */ + return "pop3"; }