SOURCES: courier-imap-toplevel.patch (NEW) - for version 4.0.5 - s...

kosmo kosmo at pld-linux.org
Tue Feb 7 13:01:50 CET 2006


Author: kosmo                        Date: Tue Feb  7 12:01:50 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- for version 4.0.5
- see http://www.ricky-chan.co.uk/courier/

---- Files affected:
SOURCES:
   courier-imap-toplevel.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/courier-imap-toplevel.patch
diff -u /dev/null SOURCES/courier-imap-toplevel.patch:1.1
--- /dev/null	Tue Feb  7 13:01:50 2006
+++ SOURCES/courier-imap-toplevel.patch	Tue Feb  7 13:01:45 2006
@@ -0,0 +1,399 @@
+diff -urN courier-imap-4.0.5.orig/imap/imapd.c courier-imap-4.0.5/imap/imapd.c
+--- courier-imap-4.0.5.orig/imap/imapd.c	2005-08-20 15:04:22.000000000 +0200
++++ courier-imap-4.0.5/imap/imapd.c	2006-02-07 12:55:01.000000000 +0100
+@@ -135,6 +135,55 @@
+ dev_t homedir_dev;
+ ino_t homedir_ino;
+ 
++/* function to add INBOX. to names */
++char *tfix(struct  imaptoken *curtoken)
++{
++        char* envp = getenv("IMAP_TOPLEVEL");
++        const int isTop = envp && atoi(envp);
++	unsigned long l = curtoken->tokenbuf_size+6;
++	char *p;
++
++	if(!isTop || strncmp(curtoken->tokenbuf, SHARED ".", sizeof(SHARED ".")-1) == 0 ||
++	    strcasecmp(curtoken->tokenbuf,INBOX) == 0)
++		return NULL;
++
++	/* if inbox. given for uppercase to avoid any issues with namespace */
++	if(strncasecmp(curtoken->tokenbuf,"INBOX.",6)==0)
++	{
++		int i=0;
++		for(;i<strlen(INBOX);i++)
++			(curtoken->tokenbuf)[i] = toupper((curtoken->tokenbuf)[i]);
++	}
++
++	if(l >= curtoken->tokenbuf_size)
++	{
++		p=realloc(curtoken->tokenbuf, l + 256);
++		if(!p)
++			write_error_exit("malloc");
++		curtoken->tokenbuf_size = l+256;
++		curtoken->tokenbuf=p;
++	}
++	p = strdup(curtoken->tokenbuf);
++	if(!p)
++		write_error_exit("malloc");
++	sprintf(curtoken->tokenbuf,"INBOX.%s",p);
++	free(p);
++
++	return curtoken->tokenbuf;
++}
++
++/* Fix response */
++char* rfix(char* text)
++{
++	char* envp = getenv("IMAP_TOPLEVEL");
++	const int isTop = envp && atoi(envp);
++
++	if(isTop && (strncasecmp(text,"INBOX.",6)==0))
++		return (text+6);
++  
++	return text;
++}
++
+ void rfc2045_error(const char *p)
+ {
+ 	write(2, p, strlen(p));
+@@ -570,6 +619,8 @@
+ 	}
+ 	else
+ 	{
++		tfix(curtoken);
++
+ 		if (ok_hierarchy && (mailbox=strrchr(curtoken->tokenbuf,
+ 			HIERCH)) && mailbox[1] == 0)
+ 				*mailbox=0;
+@@ -1698,6 +1749,11 @@
+ 	char *newf;
+ 	FILE *newfp=newsubscribefile(&newf);
+ 	FILE *oldfp;
++        char* envp = getenv("IMAP_TOPLEVEL");
++        const int isTop = envp && atoi(envp);
++
++	if(isTop && !strncmp(f,"INBOX.",6))
++		f+=6;
+ 
+ 	if ((oldfp=fopen(SUBSCRIBEFILE, "r")) != 0)
+ 	{
+@@ -1733,6 +1789,11 @@
+ 	char *newf;
+ 	FILE *newfp=newsubscribefile(&newf);
+ 	FILE *oldfp;
++        char* envp = getenv("IMAP_TOPLEVEL");
++        const int isTop = envp && atoi(envp);
++
++        if(isTop && !strncmp(f,"INBOX.",6))
++                f+=6;
+ 
+ 	if ((oldfp=fopen(SUBSCRIBEFILE, "r")) != 0)
+ 	{
+@@ -2325,7 +2386,7 @@
+ 	writes(") ");
+ 	writes(hiersep);
+ 	writes(" \"");
+-	writeqs(mailbox);
++	writeqs(rfix((char*)mailbox));
+ 	writes("\"");
+ 
+ 	if (flags & (LIST_ACL|LIST_MYRIGHTS|LIST_POSTADDRESS))
+@@ -4075,6 +4136,8 @@
+ 				curtoken->tokentype != IT_ATOM &&
+ 				curtoken->tokentype != IT_NUMBER)
+ 				return (-1);
++			if( (curtoken->tokenbuf)[0] != '*')
++				tfix(curtoken);
+ 			name=my_strdup(curtoken->tokenbuf);
+ 		}
+ 		if (nexttoken()->tokentype != IT_EOL)	return (-1);
+@@ -4117,6 +4180,8 @@
+ 			tok->tokentype != IT_QUOTED_STRING)
+ 			return (-1);
+ 
++		tfix(tok);
++
+ 		if (maildir_info_imap_find(&mi, tok->tokenbuf,
+ 					   getenv("AUTHENTICATED")) < 0)
+ 		{
+@@ -4182,6 +4247,8 @@
+ 			curtoken->tokentype != IT_QUOTED_STRING)
+ 			return (-1);
+ 
++		tfix(curtoken);
++
+ 		if (maildir_info_imap_find(&minfo, curtoken->tokenbuf,
+ 					   getenv("AUTHENTICATED")))
+ 		{
+@@ -4205,7 +4272,7 @@
+ 
+ 		writes("*");
+ 		writes(" QUOTAROOT \"");
+-		writeqs(curtoken->tokenbuf);
++		writeqs(rfix(curtoken->tokenbuf));
+ 		writes("\" \"");
+ 		writes(qroot);
+ 		writes("\"\r\n");
+@@ -4227,6 +4294,8 @@
+ 	{
+ 		curtoken=nexttoken_nouc();
+ 
++		tfix(curtoken);
++
+ 		if (curtoken->tokentype != IT_NUMBER &&
+ 			curtoken->tokentype != IT_ATOM &&
+ 			curtoken->tokentype != IT_QUOTED_STRING)
+@@ -4337,7 +4406,7 @@
+ 
+ 		writes("*");
+ 		writes(" STATUS \"");
+-		writeqs(orig_mailbox);
++		writeqs(rfix(orig_mailbox));
+ 		writes("\" (");
+ 		p="";
+ 		if (get_messages)
+@@ -4411,6 +4480,8 @@
+ 
+ 		curtoken=nexttoken_nouc();
+ 
++		tfix(curtoken);
++
+ 		if (curtoken->tokentype != IT_NUMBER &&
+ 			curtoken->tokentype != IT_ATOM &&
+ 			curtoken->tokentype != IT_QUOTED_STRING)
+@@ -4526,7 +4597,7 @@
+ 		}
+ 		writes(tag);
+ 		writes(" OK \"");
+-		writeqs(orig_mailbox);
++		writeqs(rfix(orig_mailbox));
+ 		writes("\" created.\r\n");
+ 
+ 		/*
+@@ -4568,8 +4639,9 @@
+ 			return (0);
+ 		}
+ 
+-		mailbox_name=my_strdup(curtoken->tokenbuf);
+ 		mailbox=parse_mailbox_error(tag, curtoken, 1, 0);
++                mailbox_name=my_strdup(curtoken->tokenbuf);
++
+ 		if ( mailbox == 0)
+ 		{
+ 			free(mailbox_name);
+@@ -4650,6 +4722,8 @@
+ 
+ 		curtoken=nexttoken_nouc();
+ 
++		tfix(curtoken);
++
+ 		if (curtoken->tokentype != IT_NUMBER &&
+ 		    curtoken->tokentype != IT_ATOM &&
+ 		    curtoken->tokentype != IT_QUOTED_STRING)
+@@ -4694,6 +4768,8 @@
+ 
+ 
+ 		curtoken=nexttoken_nouc();
++		tfix(curtoken);
++
+ 		if (curtoken->tokentype != IT_NUMBER &&
+ 			curtoken->tokentype != IT_ATOM &&
+ 			curtoken->tokentype != IT_QUOTED_STRING)
+@@ -4857,6 +4933,7 @@
+ 	struct maildir_info mi;
+ 
+ 		curtoken=nexttoken_nouc();
++		tfix(curtoken);
+ 		if (curtoken->tokentype != IT_NUMBER &&
+ 			curtoken->tokentype != IT_ATOM &&
+ 			curtoken->tokentype != IT_QUOTED_STRING)
+@@ -4934,6 +5011,8 @@
+ 	struct maildir_info mi;
+ 
+ 		curtoken=nexttoken_nouc();
++		tfix(curtoken);
++
+ 		if (curtoken->tokentype != IT_NUMBER &&
+ 			curtoken->tokentype != IT_ATOM &&
+ 			curtoken->tokentype != IT_QUOTED_STRING)
+@@ -5010,11 +5089,19 @@
+ 
+ 	if (strcmp(curtoken->tokenbuf, "NAMESPACE") == 0)
+ 	{
++		char* envp = getenv("IMAP_TOPLEVEL");
++		const int isTop = envp && atoi(envp);
++
+ 		if (nexttoken()->tokentype != IT_EOL)
+ 			return (-1);
+-		writes("* NAMESPACE ((\"INBOX.\" \".\")) NIL "
++		if(isTop)
++			writes("* NAMESPACE ((\"\" \".\")) NIL "
+ 		       "((\"#shared.\" \".\")(\""
+ 			SHARED ".\" \".\"))\r\n");
++		else
++                        writes("* NAMESPACE ((\"INBOX.\" \".\")) NIL "
++                       "((\"#shared.\" \".\")(\""
++                        SHARED ".\" \".\"))\r\n");
+ 		writes(tag);
+ 		writes(" OK NAMESPACE completed.\r\n");
+ 		return (0);
+@@ -5197,7 +5284,7 @@
+ 		free(mailbox_owner);
+ 
+ 		writes("* ACL \"");
+-		writeqs(curtoken->tokenbuf);
++		writeqs(rfix(curtoken->tokenbuf));
+ 		writes("\"");
+ 		maildir_aclt_list_enum(&l, getacl_cb, NULL);
+ 		writes("\r\n");
+@@ -5263,9 +5350,9 @@
+ 		}
+ 
+ 		writes("* LISTRIGHTS \"");
+-		writeqs(mb);
++		writeqs(rfix(mb));
+ 		writes("\" \"");
+-		writeqs(curtoken->tokenbuf);
++		writeqs(rfix(curtoken->tokenbuf));
+ 		writes("\"");
+ 		free(mb);
+ 
+@@ -5359,7 +5446,7 @@
+ 		}
+ 
+ 		writes("* MYRIGHTS \"");
+-		writeqs(curtoken->tokenbuf);
++		writeqs(rfix(curtoken->tokenbuf));
+ 		writes("\" \"");
+ 
+ 		writeacl1(mb);
+@@ -5924,6 +6011,8 @@
+ 			return (-1);
+ 		}
+ 
++		tfix(curtoken);
++
+ 		mailbox=decode_valid_mailbox(curtoken->tokenbuf, 1);
+ 
+ 		if (!mailbox)
+diff -urN courier-imap-4.0.5.orig/imap/mailboxlist.c courier-imap-4.0.5/imap/mailboxlist.c
+--- courier-imap-4.0.5.orig/imap/mailboxlist.c	2004-10-21 02:45:48.000000000 +0200
++++ courier-imap-4.0.5/imap/mailboxlist.c	2006-02-07 12:55:01.000000000 +0100
+@@ -67,7 +67,7 @@
+ #include	"unicode/unicode.h"
+ #include	"courierauth.h"
+ 
+-static const char rcsid[]="$Id$";
++static const char rcsid[]="$Id$";
+ 
+ static const char hierchs[]={HIERCH, 0};
+ 
+@@ -294,11 +294,11 @@
+ 	if (!have_rights[0])
+ 		return;
+ 
+-	if (match_mailbox(folder, hier, list_options) == 0)
++	if (match_mailbox(folder, hier, list_options) == 0 ||
++	    (!strcasecmp(folder,INBOX) && !strcasecmp(hier,"INBOX.INBOX*")) )
+ 	{
+ 		(void) add_hier(folders, folder);
+ 	}
+-
+ 	hier_entry(folder, hierarchies);
+ }
+ 
+@@ -350,6 +350,8 @@
+ {
+ char	buf[BUFSIZ];
+ FILE	*fp;
++char* envp = getenv("IMAP_TOPLEVEL");
++const int isTop = envp && atoi(envp);
+ 
+ 	fp=fopen(SUBSCRIBEFILE, "r");
+ 	if (fp)
+@@ -371,6 +373,16 @@
+ 					continue;
+ 			}
+ 
++			/* hack to make subscriptions work internally as we store code top level when enabled*/
++			if(isTop && strcmp(buf,"INBOX"))
++			{
++				q = strdup(buf);
++				if(q)
++				{
++					snprintf(buf,sizeof(buf)-1,"INBOX.%s",q);
++					free(q);
++				}
++			}
+ 			folder_entry(buf, hier, flags,
+ 				     folders, hierarchies);
+ 		}
+@@ -400,6 +412,13 @@
+ 					/* A bit too much, that's OK */
+ 			write_error_exit(0);
+ 
++                strcat(strcpy(p, de->d_name), "/cur");
++                if (access(p, 0))
++                {
++                        free(p);
++                        continue;
++                }
++
+ 		strcpy(p, inbox_name);
+ 
+ 		if (strcmp(de->d_name, "."))
+@@ -759,6 +778,10 @@
+ int check_all_folders=0;
+ char hiersepbuf[8];
+ int callback_rc=0;
++/* Top level functions */
++char* envp = getenv("IMAP_TOPLEVEL");
++const int isTop = envp && atoi(envp);
++int found_sub=0;
+ 
+ 	obsolete=getenv("IMAP_CHECK_ALL_FOLDERS");
+ 	if (obsolete && atoi(obsolete))
+@@ -835,6 +858,9 @@
+ 		if (strcmp(hp->hier, INBOX) == 0 || check_all_folders)
+ 			is_interesting=hasnewmsgs(hp->hier);
+ 
++		if (!strncmp(hp->hier,"INBOX.INBOX.",12))
++			found_sub = 1; /* only useful when top level enabled */
++
+ 		strcat(strcat(strcpy(hiersepbuf, "\""), hierchs), "\"");
+ 
+ 		mb_flags=0;
+@@ -853,6 +879,11 @@
+ 			mb_flags |=
+ 				obsolete ? MAILBOX_NOINFERIORS:MAILBOX_NOCHILDREN;
+ 		}
++		else if(isTop && !found_sub)
++		{
++			mb_flags |=
++				obsolete ? MAILBOX_NOINFERIORS:MAILBOX_NOCHILDREN;
++		}
+ 		else
+ 		{
+ 			d->flag=1;
+@@ -878,7 +909,12 @@
+ 		    && hp->flag == 0)
+ 		{
+ 			int mb_flags=MAILBOX_NOSELECT;
++			char* envp = getenv("IMAP_TOPLEVEL");
++			const int isTop = envp && atoi(envp);
+ 
++
++			if(isTop && strncmp(hp->hier,INBOX,sizeof(INBOX)-1))
++			{
+ 			if (!obsolete)
+ 				mb_flags |= MAILBOX_CHILDREN;
+ 
+@@ -896,6 +932,7 @@
+ 						 mb_flags | list_options,
+ 						 void_arg);
+ 			}
++			}
+ 		}
+ 		free(hp);
+ 	}
================================================================


More information about the pld-cvs-commit mailing list