From 54600fb660168b58ca8ce42ba5d976f42e4ae051 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 26 Apr 2007 21:26:48 +0000 Subject: [PATCH] Moved IMAP LIST/LSUB to a separate source file --- citadel/Makefile.in | 4 +- citadel/imap_list.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ citadel/imap_list.h | 6 ++ citadel/serv_imap.c | 124 +----------------------------- 4 files changed, 192 insertions(+), 125 deletions(-) create mode 100644 citadel/imap_list.c create mode 100644 citadel/imap_list.h diff --git a/citadel/Makefile.in b/citadel/Makefile.in index 213cb4594..9d8e19cea 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -35,7 +35,7 @@ SERV_MODULES=serv_chat.o \ serv_vcard.o vcard.o \ serv_mrtg.o \ serv_imap.o imap_fetch.o imap_misc.o imap_search.o \ - imap_store.o imap_acl.o imap_tools.o \ + imap_store.o imap_acl.o imap_tools.o imap_list.o \ serv_fulltext.o ft_wordbreaker.o crc16.o \ serv_network.o \ serv_listsub.o \ @@ -106,7 +106,7 @@ SOURCES=aidepost.c auth.c base64.c chkpwd.c citadel.c citadel_ipc.c \ serv_sieve.c serv_funambol.c setup.c snprintf.c imap_acl.c \ stress.c support.c sysdep.c tools.c user_ops.c userlist.c \ whobbs.c vcard.c serv_notes.c serv_fulltext.c ft_wordbreaker.c \ - crc16.c journaling.c citadel_dirs.c + crc16.c journaling.c citadel_dirs.c imap_list.c DEP_FILES=$(SOURCES:.c=.d) diff --git a/citadel/imap_list.c b/citadel/imap_list.c new file mode 100644 index 000000000..aca8a6583 --- /dev/null +++ b/citadel/imap_list.c @@ -0,0 +1,183 @@ +/* + * $Id$ + * + * Implements the LIST and LSUB commands. + * + * Copyright (C) 2000-2007 by Art Cancro and others. + * This code is released under the terms of the GNU General Public License. + * + */ + +#include "sysdep.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#include +#include +#include +#include "citadel.h" +#include "server.h" +#include "sysdep_decls.h" +#include "citserver.h" +#include "support.h" +#include "config.h" +#include "serv_extensions.h" +#include "room_ops.h" +#include "user_ops.h" +#include "policy.h" +#include "database.h" +#include "msgbase.h" +#include "tools.h" +#include "internet_addressing.h" +#include "serv_imap.h" +#include "imap_tools.h" +#include "imap_fetch.h" +#include "imap_search.h" +#include "imap_store.h" +#include "imap_acl.h" +#include "imap_misc.h" + +#ifdef HAVE_OPENSSL +#include "serv_crypto.h" +#endif + +/* + * Used by LIST and LSUB to show the floors in the listing + */ +void imap_list_floors(char *verb, char *pattern) +{ + int i; + struct floor *fl; + + for (i = 0; i < MAXFLOORS; ++i) { + fl = cgetfloor(i); + if (fl->f_flags & F_INUSE) { + if (imap_mailbox_matches_pattern + (pattern, fl->f_name)) { + cprintf("* %s (\\NoSelect) \"/\" ", verb); + imap_strout(fl->f_name); + cprintf("\r\n"); + } + } + } +} + + +/* + * Back end for imap_list() + * + * Implementation note: IMAP "subscribed folder" is equivalent to Citadel "known room" + * + * The "user data" field is actually an array of pointers; see below for the breakdown + * + */ +void imap_list_listroom(struct ctdlroom *qrbuf, void *data) +{ + char buf[SIZ]; + int ra; + int yes_output_this_room; + + char **data_for_callback; + char *pattern; + char *verb; + int subscribed_rooms_only; + + /* Here's how we break down the array of pointers passed to us */ + data_for_callback = data; + pattern = data_for_callback[0]; + verb = data_for_callback[1]; + subscribed_rooms_only = (int) data_for_callback[2]; + + /* Only list rooms to which the user has access!! */ + yes_output_this_room = 0; + CtdlRoomAccess(qrbuf, &CC->user, &ra, NULL); + + if (subscribed_rooms_only) { + if (ra & UA_KNOWN) { + yes_output_this_room = 1; + } + } + else { + if ((ra & UA_KNOWN) || ((ra & UA_GOTOALLOWED) && (ra & UA_ZAPPED))) { + yes_output_this_room = 1; + } + } + + if (yes_output_this_room) { + imap_mailboxname(buf, sizeof buf, qrbuf); + if (imap_mailbox_matches_pattern(pattern, buf)) { + cprintf("* %s () \"/\" ", verb); + imap_strout(buf); + cprintf("\r\n"); + } + } +} + + +/* + * Implements the LIST and LSUB commands + */ +void imap_list(int num_parms, char *parms[]) +{ + char pattern[SIZ]; + int subscribed_rooms_only = 0; + char verb[16]; + int i, j; + + char *data_for_callback[3]; + + if (num_parms < 4) { + cprintf("%s BAD arguments invalid\r\n", parms[0]); + return; + } + + /* parms[1] is the IMAP verb being used (e.g. LIST or LSUB) + * This tells us how to behave, and what verb to return back to the caller + */ + safestrncpy(verb, parms[1], sizeof verb); + j = strlen(verb); + for (i=0; if_flags & F_INUSE) { - if (imap_mailbox_matches_pattern - (pattern, fl->f_name)) { - cprintf("* %s (\\NoSelect) \"/\" ", verb); - imap_strout(fl->f_name); - cprintf("\r\n"); - } - } - } -} - - -/* - * Back end for imap_list() - * - * Implementation note: IMAP "subscribed folder" is equivalent to Citadel "known room" - * - * The "user data" field is actually an array of pointers; see below for the breakdown - * - */ -void imap_list_listroom(struct ctdlroom *qrbuf, void *data) -{ - char buf[SIZ]; - int ra; - int yes_output_this_room; - - char **data_for_callback; - char *pattern; - char *verb; - int subscribed_rooms_only; - - /* Here's how we break down the array of pointers passed to us */ - data_for_callback = data; - pattern = data_for_callback[0]; - verb = data_for_callback[1]; - subscribed_rooms_only = (int) data_for_callback[2]; - - /* Only list rooms to which the user has access!! */ - yes_output_this_room = 0; - CtdlRoomAccess(qrbuf, &CC->user, &ra, NULL); - - if (subscribed_rooms_only) { - if (ra & UA_KNOWN) { - yes_output_this_room = 1; - } - } - else { - if ((ra & UA_KNOWN) || ((ra & UA_GOTOALLOWED) && (ra & UA_ZAPPED))) { - yes_output_this_room = 1; - } - } - - if (yes_output_this_room) { - imap_mailboxname(buf, sizeof buf, qrbuf); - if (imap_mailbox_matches_pattern(pattern, buf)) { - cprintf("* %s () \"/\" ", verb); - imap_strout(buf); - cprintf("\r\n"); - } - } -} - - -/* - * Implements the LIST and LSUB commands - */ -void imap_list(int num_parms, char *parms[]) -{ - char pattern[SIZ]; - int subscribed_rooms_only = 0; - char verb[16]; - int i, j; - - char *data_for_callback[3]; - - if (num_parms < 4) { - cprintf("%s BAD arguments invalid\r\n", parms[0]); - return; - } - - /* parms[1] is the IMAP verb being used (e.g. LIST or LSUB) - * This tells us how to behave, and what verb to return back to the caller - */ - safestrncpy(verb, parms[1], sizeof verb); - j = strlen(verb); - for (i=0; i