X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fpop3%2Fserv_pop3.c;h=2c1402dbde6ff72cbc1aca20fdbbb4448204570b;hb=6ab0a033e52ed0e31feadec942f3d2c4dc8040b1;hp=dcdbb8ec6d8b2c581ed164e883719ce0bfa35759;hpb=2ed96d7a59a16ca0ebb5707f32044dc411bde25a;p=citadel.git diff --git a/citadel/modules/pop3/serv_pop3.c b/citadel/modules/pop3/serv_pop3.c index dcdbb8ec6..2c1402dbd 100644 --- a/citadel/modules/pop3/serv_pop3.c +++ b/citadel/modules/pop3/serv_pop3.c @@ -2,8 +2,22 @@ * $Id$ * * POP3 service for the Citadel system - * Copyright (C) 1998-2001 by Art Cancro and others. - * This code is released under the terms of the GNU General Public License. + * + * Copyright (c) 1998-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 * * Current status of standards conformance: * @@ -47,9 +61,7 @@ #include "citserver.h" #include "support.h" #include "config.h" -#include "room_ops.h" #include "user_ops.h" -#include "policy.h" #include "database.h" #include "msgbase.h" #include "internet_addressing.h" @@ -71,7 +83,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; - lprintf(CTDL_DEBUG, "Performing POP3 cleanup hook\n"); + CtdlLogPrintf(CTDL_DEBUG, "Performing POP3 cleanup hook\n"); if (POP3->msgs != NULL) free(POP3->msgs); free(POP3); @@ -125,7 +137,7 @@ void pop3_user(char *argbuf) { strcpy(username, argbuf); striplt(username); - /* lprintf(CTDL_DEBUG, "Trying <%s>\n", username); */ + /* CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", username); */ if (CtdlLoginExistingUser(NULL, username) == login_ok) { cprintf("+OK Password required for %s\r\n", username); } @@ -156,15 +168,10 @@ 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); - 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); + 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; @@ -181,7 +188,7 @@ int pop3_grab_mailbox(void) { struct visit vbuf; int i; - if (getroom(&CC->room, MAILROOM) != 0) return(-1); + if (CtdlGetRoom(&CC->room, MAILROOM) != 0) return(-1); /* Load up the messages */ CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL, @@ -208,7 +215,7 @@ void pop3_login(void) if (msgs >= 0) { cprintf("+OK %s is logged in (%d messages)\r\n", CC->user.fullname, msgs); - lprintf(CTDL_NOTICE, "POP3 authenticated %s\n", CC->user.fullname); + CtdlLogPrintf(CTDL_NOTICE, "POP3 authenticated %s\n", CC->user.fullname); } else { cprintf("-ERR Can't open your mailbox\r\n"); @@ -252,7 +259,7 @@ void pop3_apop(char *argbuf) return; } - if (getuser(&CC->user, CC->curr_user)) + if (CtdlGetUser(&CC->user, CC->curr_user)) { cprintf("-ERR No such user.\r\n"); return; @@ -277,11 +284,11 @@ void pop3_apop(char *argbuf) void pop3_pass(char *argbuf) { char password[SIZ]; - strcpy(password, argbuf); + safestrncpy(password, argbuf, sizeof password); striplt(password); - /* lprintf(CTDL_DEBUG, "Trying <%s>\n", password); */ - if (CtdlTryPassword(password) == pass_ok) { + /* CtdlLogPrintf(CTDL_DEBUG, "Trying <%s>\n", password); */ + if (CtdlTryPassword(password, strlen(password)) == pass_ok) { pop3_login(); } else { @@ -373,7 +380,10 @@ 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); + CtdlOutputMsg(POP3->msgs[which_one - 1].msgnum, + MT_RFC822, HEADERS_ALL, 0, 1, NULL, + (ESC_DOT|SUPPRESS_ENV_TO) + ); cprintf(".\r\n"); } @@ -386,8 +396,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; @@ -402,21 +412,15 @@ 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); + CC->redirect_buffer = NewStrBufPlain(NULL, SIZ); + CtdlOutputMsg(POP3->msgs[which_one - 1].msgnum, MT_RFC822, HEADERS_ALL, 0, 1, NULL, SUPPRESS_ENV_TO); 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) { @@ -434,7 +438,7 @@ void pop3_top(char *argbuf) { } if (buf[strlen(buf)-1] != 10) cprintf("\n"); - free(msgtext); + FreeStrBuf(&msgtext); cprintf(".\r\n"); } @@ -489,14 +493,14 @@ void pop3_update(void) { /* Set last read pointer */ if (POP3->num_msgs > 0) { - lgetuser(&CC->user, CC->curr_user); + CtdlGetUserLock(&CC->user, CC->curr_user); CtdlGetRelationship(&vbuf, &CC->user, &CC->room); snprintf(vbuf.v_seen, sizeof vbuf.v_seen, "*:%ld", POP3->msgs[POP3->num_msgs-1].msgnum); CtdlSetRelationship(&vbuf, &CC->user, &CC->room); - lputuser(&CC->user); + CtdlPutUserLock(&CC->user); } } @@ -622,15 +626,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) { - lprintf(CTDL_ERR, "Client disconnected: ending session.\r\n"); + CtdlLogPrintf(CTDL_ERR, "Client disconnected: ending session.\r\n"); CC->kill_me = 1; return; } if (!strncasecmp(cmdbuf, "PASS", 4)) { - lprintf(CTDL_INFO, "POP3: PASS...\r\n"); + CtdlLogPrintf(CTDL_INFO, "POP3: PASS...\r\n"); } else { - lprintf(CTDL_INFO, "POP3: %s\r\n", cmdbuf); + CtdlLogPrintf(CTDL_INFO, "POP3: %s\r\n", cmdbuf); } while (strlen(cmdbuf) < 5) strcat(cmdbuf, " "); @@ -671,6 +675,11 @@ void pop3_command_loop(void) { else if (!CC->logged_in) { cprintf("-ERR Not logged in.\r\n"); } + + else if (CC->nologin) { + cprintf("-ERR System busy, try later.\r\n"); + CC->kill_me = 1; + } else if (!strncasecmp(cmdbuf, "LIST", 4)) { pop3_list(&cmdbuf[5]); @@ -716,22 +725,25 @@ const char *CitadelServicePop3S="POP3S"; CTDL_MODULE_INIT(pop3) { - CtdlRegisterServiceHook(config.c_pop3_port, - NULL, - pop3_greeting, - pop3_command_loop, - NULL, - CitadelServicePop3); + if(!threading) + { + CtdlRegisterServiceHook(config.c_pop3_port, + NULL, + pop3_greeting, + pop3_command_loop, + NULL, + CitadelServicePop3); #ifdef HAVE_OPENSSL - CtdlRegisterServiceHook(config.c_pop3s_port, - NULL, - pop3s_greeting, - pop3_command_loop, - NULL, - CitadelServicePop3S); + CtdlRegisterServiceHook(config.c_pop3s_port, + NULL, + pop3s_greeting, + pop3_command_loop, + NULL, + CitadelServicePop3S); #endif - CtdlRegisterSessionHook(pop3_cleanup_function, EVT_STOP); - + CtdlRegisterSessionHook(pop3_cleanup_function, EVT_STOP); + } + /* return our Subversion id for the Log */ return "$Id$"; }