#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,
const imap_handler_hook *imap_lookup(int num_parms, ConstStr *Params)
{
+ struct CitContext *CCC = CC;
void *v;
- citimap *Imap = IMAP;
+ citimap *Imap = CCCIMAP;
if (num_parms < 1)
return NULL;
StrBufPlain(Imap->Reply, CKEY(Params[1]));
StrBufUpCase(Imap->Reply);
- syslog(LOG_DEBUG, "---- Looking up [%s] -----",
+ IMAP_syslog(LOG_DEBUG, "---- Looking up [%s] -----",
ChrPtr(Imap->Reply));
if (GetHash(ImapCmds, SKEY(Imap->Reply), &v))
{
- syslog(LOG_DEBUG, "Found.");
+ IMAPM_syslog(LOG_DEBUG, "Found.");
FlushStrBuf(Imap->Reply);
return (imap_handler_hook *) v;
}
if (num_parms == 1)
{
- syslog(LOG_DEBUG, "NOT Found.");
+ IMAPM_syslog(LOG_DEBUG, "NOT Found.");
FlushStrBuf(Imap->Reply);
return NULL;
}
- syslog(LOG_DEBUG, "---- Looking up [%s] -----",
+ IMAP_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))
{
- syslog(LOG_DEBUG, "Found.");
+ IMAPM_syslog(LOG_DEBUG, "Found.");
FlushStrBuf(Imap->Reply);
return (imap_handler_hook *) v;
}
- syslog(LOG_DEBUG, "NOT Found.");
+ IMAPM_syslog(LOG_DEBUG, "NOT Found.");
FlushStrBuf(Imap->Reply);
return NULL;
}
*/
void imap_load_msgids(void)
{
+ struct CitContext *CCC = CC;
struct cdbdata *cdbfr;
- citimap *Imap = IMAP;
+ citimap *Imap = CCCIMAP;
if (Imap->selected == 0) {
- syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
+ IMAPM_syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
return;
}
*/
void imap_rescan_msgids(void)
{
- citimap *Imap = IMAP;
+ struct CitContext *CCC = CC;
+ citimap *Imap = CCCIMAP;
int original_num_msgs = 0;
long original_highest = 0L;
int i, j, jstart;
int num_recent = 0;
if (Imap->selected == 0) {
- syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
+ IMAPM_syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
return;
}
if (cdbfr != NULL) {
msglist = malloc(cdbfr->len + 1);
if (msglist == NULL) {
- syslog(LOG_CRIT, "IMAP: malloc() failed");
+ IMAPM_syslog(LOG_CRIT, "malloc() failed");
CC->kill_me = KILLME_MALLOC_FAILED;
return;
}
*/
void imap_cleanup_function(void)
{
- citimap *Imap = IMAP;
+ struct CitContext *CCC = CC;
+ citimap *Imap = CCCIMAP;
/* Don't do this stuff if this is not a Imap session! */
if (CC->h_command_function != imap_command_loop)
imap_do_expunge();
}
- syslog(LOG_DEBUG, "Performing IMAP cleanup hook");
+ IMAPM_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);
- syslog(LOG_DEBUG, "Finished IMAP cleanup hook");
+ IMAPM_syslog(LOG_DEBUG, "Finished IMAP cleanup hook");
}
*/
int imap_do_expunge(void)
{
- citimap *Imap = IMAP;
+ struct CitContext *CCC = CC;
+ citimap *Imap = CCCIMAP;
int i;
int num_expunged = 0;
long *delmsgs = NULL;
int num_delmsgs = 0;
- syslog(LOG_DEBUG, "imap_do_expunge() called");
+ IMAPM_syslog(LOG_DEBUG, "imap_do_expunge() called");
if (Imap->selected == 0) {
return (0);
}
imap_rescan_msgids();
}
- syslog(LOG_DEBUG, "Expunged %d messages from <%s>", num_expunged, CC->room.QRname);
+ IMAP_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");
- syslog(LOG_DEBUG, "invalid character in folder name");
+ IMAPM_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");
- syslog(LOG_DEBUG, "invalid mailbox name or location");
+ IMAPM_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");
- syslog(LOG_DEBUG, "not subordinate to inbox");
+ IMAPM_syslog(LOG_ERR, "not subordinate to inbox");
return;
}
}
newroomview = VIEW_BBS;
}
- syslog(LOG_INFO, "IMAP: Create new room <%s> on floor <%d> with type <%d>",
- roomname, floornum, newroomtype);
+ IMAP_syslog(LOG_INFO, "Create new room <%s> on floor <%d> with type <%d>",
+ roomname, floornum, newroomtype);
ret = CtdlCreateRoom(roomname, newroomtype, "", floornum, 1, 0, newroomview);
if (ret == 0) {
CtdlAideMessage(notification_message, "Room Creation Message");
free(notification_message);
}
- syslog(LOG_DEBUG, "imap_create() completed");
+ IMAPM_syslog(LOG_DEBUG, "imap_create() completed");
}
irl->irl_newroom,
irl->irl_newfloor);
if (r != crr_ok) {
+ struct CitContext *CCC = CC;
/* FIXME handle error returns better */
- syslog(LOG_ERR, "IMAP: CtdlRenameRoom() error %d", r);
+ IMAP_syslog(LOG_ERR, "CtdlRenameRoom() error %d", r);
}
irlp = irl;
irl = irl->next;
*/
void imap_command_loop(void)
{
+ struct CitContext *CCC = CC;
struct timeval tv1, tv2;
suseconds_t total_time = 0;
citimap *Imap;
const imap_handler_hook *h;
gettimeofday(&tv1, NULL);
- CC->lastcmd = time(NULL);
- Imap = IMAP;
+ CCC->lastcmd = time(NULL);
+ Imap = CCCIMAP;
flush_output();
if (Imap->Cmd.CmdBuf == NULL)
FlushStrBuf(Imap->Cmd.CmdBuf);
if (CtdlClientGetLine(Imap->Cmd.CmdBuf) < 1) {
- syslog(LOG_ERR, "IMAP: client disconnected: ending session.");
+ IMAPM_syslog(LOG_ERR, "client disconnected: ending session.");
CC->kill_me = KILLME_CLIENT_DISCONNECTED;
return;
}
if (Imap->authstate == imap_as_expecting_password) {
- syslog(LOG_INFO, "IMAP: <password>");
+ IMAPM_syslog(LOG_INFO, "<password>");
}
else if (Imap->authstate == imap_as_expecting_plainauth) {
- syslog(LOG_INFO, "IMAP: <plain_auth>");
+ IMAPM_syslog(LOG_INFO, "<plain_auth>");
}
else if ((Imap->authstate == imap_as_expecting_multilineusername) ||
cbmstrcasestr(ChrPtr(Imap->Cmd.CmdBuf), " LOGIN ")) {
- syslog(LOG_INFO, "IMAP: LOGIN...");
+ IMAPM_syslog(LOG_INFO, "LOGIN...");
}
else {
- syslog(LOG_INFO, "IMAP: %s", ChrPtr(Imap->Cmd.CmdBuf));
+ IMAP_syslog(LOG_DEBUG, "%s", ChrPtr(Imap->Cmd.CmdBuf));
}
pchs = ChrPtr(Imap->Cmd.CmdBuf);
/* debug output the parsed vector */
{
int i;
- syslog(LOG_DEBUG, "----- %ld params", Imap->Cmd.num_parms);
+ IMAP_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))
- syslog(LOG_DEBUG, "*********** %ld != %ld : %s",
- Imap->Cmd.Params[i].len,
- strlen(Imap->Cmd.Params[i].Key),
+ IMAP_syslog(LOG_DEBUG, "*********** %ld != %ld : %s",
+ Imap->Cmd.Params[i].len,
+ strlen(Imap->Cmd.Params[i].Key),
Imap->Cmd.Params[i].Key);
else
- syslog(LOG_DEBUG, "%ld : %s",
- Imap->Cmd.Params[i].len,
- Imap->Cmd.Params[i].Key);
+ IMAP_syslog(LOG_DEBUG, "%ld : %s",
+ Imap->Cmd.Params[i].len,
+ Imap->Cmd.Params[i].Key);
}}
#endif
gettimeofday(&tv2, NULL);
total_time = (tv2.tv_usec + (tv2.tv_sec * 1000000)) - (tv1.tv_usec + (tv1.tv_sec * 1000000));
- syslog(LOG_DEBUG, "IMAP command completed in %ld.%ld seconds",
- (total_time / 1000000),
- (total_time % 1000000)
- );
+ IMAP_syslog(LOG_DEBUG, "IMAP command completed in %ld.%ld seconds",
+ (total_time / 1000000),
+ (total_time % 1000000)
+ );
}
void imap_noop (int num_parms, ConstStr *Params)
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,
NULL, imap_greeting, imap_command_loop, NULL, CitadelServiceIMAP);
#ifdef HAVE_OPENSSL
CtdlRegisterServiceHook(config.c_imaps_port,
NULL, imaps_greeting, imap_command_loop, NULL, CitadelServiceIMAPS);
#endif
- CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP);
+ CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP, PRIO_STOP + 30);
CtdlRegisterCleanupHook(imap_cleanup);
}