/*
* IMAP server for the Citadel system
*
- * Copyright (C) 2000-2011 by Art Cancro and others.
+ * Copyright (C) 2000-2018 by Art Cancro and others.
* This code is released under the terms of the GNU General Public License.
*
* WARNING: the IMAP protocol is badly designed. No implementation of it
* 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 "imap_misc.h"
#include "ctdl_module.h"
-int IMAPDebugEnabled = 0;
HashList *ImapCmds = NULL;
void registerImapCMD(const char *First, long FLen,
const char *Second, long SLen,
StrBufPlain(Imap->Reply, CKEY(Params[1]));
StrBufUpCase(Imap->Reply);
- IMAP_syslog(LOG_DEBUG, "---- Looking up [%s] -----",
- ChrPtr(Imap->Reply));
+ syslog(LOG_DEBUG, "---- Looking up [%s] -----", ChrPtr(Imap->Reply));
if (GetHash(ImapCmds, SKEY(Imap->Reply), &v))
{
- IMAPM_syslog(LOG_DEBUG, "Found.");
+ syslog(LOG_DEBUG, "Found.");
FlushStrBuf(Imap->Reply);
return (imap_handler_hook *) v;
}
if (num_parms == 1)
{
- IMAPM_syslog(LOG_DEBUG, "NOT Found.");
+ syslog(LOG_DEBUG, "NOT Found.");
FlushStrBuf(Imap->Reply);
return NULL;
}
- IMAP_syslog(LOG_DEBUG, "---- Looking up [%s] -----",
- ChrPtr(Imap->Reply));
+ syslog(LOG_DEBUG, "---- Looking up [%s] -----", ChrPtr(Imap->Reply));
StrBufAppendBufPlain(Imap->Reply, CKEY(Params[2]), 0);
StrBufUpCase(Imap->Reply);
if (GetHash(ImapCmds, SKEY(Imap->Reply), &v))
{
- IMAPM_syslog(LOG_DEBUG, "Found.");
+ syslog(LOG_DEBUG, "Found.");
FlushStrBuf(Imap->Reply);
return (imap_handler_hook *) v;
}
- IMAPM_syslog(LOG_DEBUG, "NOT Found.");
+ syslog(LOG_DEBUG, "NOT Found.");
FlushStrBuf(Imap->Reply);
return NULL;
}
citimap *Imap = CCCIMAP;
if (Imap->selected == 0) {
- IMAPM_syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
+ syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
return;
}
int num_recent = 0;
if (Imap->selected == 0) {
- IMAPM_syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
+ syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
return;
}
imap_do_expunge();
}
- IMAPM_syslog(LOG_DEBUG, "Performing IMAP cleanup hook");
+ syslog(LOG_DEBUG, "Performing IMAP cleanup hook");
imap_free_msgids();
imap_free_transmitted_message();
FreeStrBuf(&Imap->Reply);
if (Imap->Cmd.Params != NULL) free(Imap->Cmd.Params);
free(Imap);
- IMAPM_syslog(LOG_DEBUG, "Finished IMAP cleanup hook");
+ syslog(LOG_DEBUG, "Finished IMAP cleanup hook");
}
IAPuts("* OK [");
imap_output_capability_string();
- IAPrintf("] %s IMAP4rev1 %s ready\r\n", config.c_fqdn, CITADEL);
+ IAPrintf("] %s IMAP4rev1 %s ready\r\n", CtdlGetConfigStr("c_fqdn"), CITADEL);
IUnbuffer();
}
return;
}
case 4:
- if (CtdlLoginExistingUser(NULL, Params[2].Key) == login_ok) {
+ if (CtdlLoginExistingUser(Params[2].Key) == login_ok) {
if (CtdlTryPassword(Params[3].Key, Params[3].len) == pass_ok) {
/* hm, thats not doable by IReply :-( */
IAPrintf("%s OK [", Params[0].Key);
}
else
{
- IReplyPrintf("NO AUTHENTICATE %s failed",
- Params[3].Key);
+ IReplyPrintf("NO AUTHENTICATE %s failed", Params[3].Key);
+ return;
}
}
IReply("BAD Login incorrect");
+ return;
default:
IReply("BAD incorrect number of parameters");
return;
Imap->authstate = imap_as_normal;
if (!IsEmptyStr(ident)) {
- result = CtdlLoginExistingUser(user, ident);
+ result = CtdlLoginExistingUser(ident);
}
else {
- result = CtdlLoginExistingUser(NULL, user);
+ result = CtdlLoginExistingUser(user);
}
if (result == login_ok) {
switch (state){
case imap_as_expecting_username:
StrBufDecodeBase64(Imap->Cmd.CmdBuf);
- CtdlLoginExistingUser(NULL, ChrPtr(Imap->Cmd.CmdBuf));
+ CtdlLoginExistingUser(ChrPtr(Imap->Cmd.CmdBuf));
size_t len = CtdlEncodeBase64(PWBuf, "Password:", 9, 0);
if (PWBuf[len - 1] == '\n') {
PWBuf[len - 1] = '\0';
return;
case imap_as_expecting_multilineusername:
extract_token(PWBuf, ChrPtr(Imap->Cmd.CmdBuf), 1, ' ', sizeof(PWBuf));
- CtdlLoginExistingUser(NULL, ChrPtr(Imap->Cmd.CmdBuf));
+ CtdlLoginExistingUser(ChrPtr(Imap->Cmd.CmdBuf));
IAPuts("+ go ahead\r\n");
Imap->authstate = imap_as_expecting_multilinepassword;
return;
IAPrintf("* %d RECENT\r\n", new);
IAPrintf("* OK [UIDVALIDITY %ld] UID validity status\r\n", GLOBAL_UIDVALIDITY_VALUE);
- IAPrintf("* OK [UIDNEXT %ld] Predicted next UID\r\n", CitControl.MMhighest + 1);
+ IAPrintf("* OK [UIDNEXT %ld] Predicted next UID\r\n", CtdlGetConfigLong("MMhighest") + 1);
/* Technically, \Deleted is a valid flag, but not a permanent flag,
* because we don't maintain its state across sessions. Citadel
long *delmsgs = NULL;
int num_delmsgs = 0;
- IMAPM_syslog(LOG_DEBUG, "imap_do_expunge() called");
+ syslog(LOG_DEBUG, "imap_do_expunge() called");
if (Imap->selected == 0) {
return (0);
}
imap_rescan_msgids();
}
- IMAP_syslog(LOG_DEBUG, "Expunged %d messages from <%s>", num_expunged, CC->room.QRname);
+ syslog(LOG_DEBUG, "Expunged %d messages from <%s>", num_expunged, CC->room.QRname);
return (num_expunged);
}
*/
void imap_create(int num_parms, ConstStr *Params)
{
- struct CitContext *CCC = CC;
int ret;
char roomname[ROOMNAMELEN];
int floornum;
if (strchr(Params[2].Key, '\\') != NULL) {
IReply("NO Invalid character in folder name");
- IMAPM_syslog(LOG_ERR, "invalid character in folder name");
+ syslog(LOG_ERR, "invalid character in folder name");
return;
}
ret = imap_roomname(roomname, sizeof roomname, Params[2].Key);
if (ret < 0) {
IReply("NO Invalid mailbox name or location");
- IMAPM_syslog(LOG_ERR, "invalid mailbox name or location");
+ syslog(LOG_ERR, "invalid mailbox name or location");
return;
}
floornum = (ret & 0x00ff); /* lower 8 bits = floor number */
if (flags & IR_MAILBOX) {
if (strncasecmp(Params[2].Key, "INBOX/", 6)) {
IReply("NO Personal folders must be created under INBOX");
- IMAPM_syslog(LOG_ERR, "not subordinate to inbox");
+ syslog(LOG_ERR, "not subordinate to inbox");
return;
}
}
newroomview = VIEW_BBS;
}
- IMAP_syslog(LOG_INFO, "Create new room <%s> on floor <%d> with type <%d>",
+ syslog(LOG_INFO, "Create new room <%s> on floor <%d> with type <%d>",
roomname, floornum, newroomtype);
ret = CtdlCreateRoom(roomname, newroomtype, "", floornum, 1, 0, newroomview);
CtdlAideMessage(notification_message, "Room Creation Message");
free(notification_message);
}
- IMAPM_syslog(LOG_DEBUG, "imap_create() completed");
+ syslog(LOG_DEBUG, "imap_create() completed");
}
IPutStr(imaproomname, len);
IAPrintf(" (MESSAGES %d ", msgs);
IAPrintf("RECENT %d ", new); /* Initially, new==recent */
- IAPrintf("UIDNEXT %ld ", CitControl.MMhighest + 1);
+ IAPrintf("UIDNEXT %ld ", CtdlGetConfigLong("MMhighest") + 1);
IAPrintf("UNSEEN %d)\r\n", new);
/*
irl->irl_newroom,
irl->irl_newfloor);
if (r != crr_ok) {
- struct CitContext *CCC = CC;
/* FIXME handle error returns better */
- IMAP_syslog(LOG_ERR, "CtdlRenameRoom() error %d", r);
+ syslog(LOG_ERR, "CtdlRenameRoom() error %d", r);
}
irlp = irl;
irl = irl->next;
FlushStrBuf(Imap->Cmd.CmdBuf);
if (CtdlClientGetLine(Imap->Cmd.CmdBuf) < 1) {
- IMAPM_syslog(LOG_ERR, "client disconnected: ending session.");
+ syslog(LOG_ERR, "client disconnected: ending session.");
CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
if (Imap->authstate == imap_as_expecting_password) {
- IMAPM_syslog(LOG_INFO, "<password>");
+ syslog(LOG_INFO, "<password>");
}
else if (Imap->authstate == imap_as_expecting_plainauth) {
- IMAPM_syslog(LOG_INFO, "<plain_auth>");
+ syslog(LOG_INFO, "<plain_auth>");
}
else if ((Imap->authstate == imap_as_expecting_multilineusername) ||
cbmstrcasestr(ChrPtr(Imap->Cmd.CmdBuf), " LOGIN ")) {
- IMAPM_syslog(LOG_INFO, "LOGIN...");
+ syslog(LOG_INFO, "LOGIN...");
}
else {
- IMAP_syslog(LOG_DEBUG, "%s", ChrPtr(Imap->Cmd.CmdBuf));
+ syslog(LOG_DEBUG, "%s", ChrPtr(Imap->Cmd.CmdBuf));
}
pchs = ChrPtr(Imap->Cmd.CmdBuf);
/* debug output the parsed vector */
{
int i;
- IMAP_syslog(LOG_DEBUG, "----- %ld params", Imap->Cmd.num_parms);
+ syslog(LOG_DEBUG, "----- %ld params", Imap->Cmd.num_parms);
for (i=0; i < Imap->Cmd.num_parms; i++) {
if (Imap->Cmd.Params[i].len != strlen(Imap->Cmd.Params[i].Key))
- IMAP_syslog(LOG_DEBUG, "*********** %ld != %ld : %s",
+ syslog(LOG_DEBUG, "*********** %ld != %ld : %s",
Imap->Cmd.Params[i].len,
strlen(Imap->Cmd.Params[i].Key),
Imap->Cmd.Params[i].Key);
else
- IMAP_syslog(LOG_DEBUG, "%ld : %s",
+ syslog(LOG_DEBUG, "%ld : %s",
Imap->Cmd.Params[i].len,
Imap->Cmd.Params[i].Key);
}}
gettimeofday(&tv2, NULL);
total_time = (tv2.tv_usec + (tv2.tv_sec * 1000000)) - (tv1.tv_usec + (tv1.tv_sec * 1000000));
- IMAP_syslog(LOG_DEBUG, "IMAP command completed in %ld.%ld seconds",
+ syslog(LOG_DEBUG, "IMAP command completed in %ld.%ld seconds",
(total_time / 1000000),
(total_time % 1000000)
);
if (IMAP->selected) {
imap_do_expunge(); /* yes, we auto-expunge at logout */
}
- IAPrintf("* BYE %s logging out\r\n", config.c_fqdn);
+ IAPrintf("* BYE %s logging out\r\n", CtdlGetConfigStr("c_fqdn"));
IReply("OK Citadel IMAP session ended.");
CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
return;
const char *CitadelServiceIMAP="IMAP";
const char *CitadelServiceIMAPS="IMAPS";
-void SetIMAPDebugEnabled(const int n)
-{
- IMAPDebugEnabled = n;
-}
/*
* This function is called to register the IMAP extension with Citadel.
*/
if (!threading)
{
- CtdlRegisterDebugFlagHook(HKEY("imapsrv"), SetIMAPDebugEnabled, &IMAPDebugEnabled);
- CtdlRegisterServiceHook(config.c_imap_port,
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_imap_port"),
NULL, imap_greeting, imap_command_loop, NULL, CitadelServiceIMAP);
#ifdef HAVE_OPENSSL
- CtdlRegisterServiceHook(config.c_imaps_port,
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_imaps_port"),
NULL, imaps_greeting, imap_command_loop, NULL, CitadelServiceIMAPS);
#endif
CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP, PRIO_STOP + 30);